diff --git a/ereuse_devicehub/inventory/models.py b/ereuse_devicehub/inventory/models.py new file mode 100644 index 00000000..ad725faf --- /dev/null +++ b/ereuse_devicehub/inventory/models.py @@ -0,0 +1,33 @@ +from uuid import uuid4 + +from citext import CIText +from sqlalchemy import Boolean, Column +from sqlalchemy.dialects.postgresql import UUID +from sqlalchemy.orm import backref, relationship +from teal.db import CASCADE_OWN + +from ereuse_devicehub.db import db +from ereuse_devicehub.resources.models import Thing + + +class Transfer(Thing): + """ + The transfer is a transfer of possession of devices between + a user and a code (not system user) + """ + + id = Column(UUID(as_uuid=True), primary_key=True, default=uuid4) + code = Column(CIText(), default='', nullable=False) + closed = Boolean(default=False) + date = Column(db.TIMESTAMP(timezone=True)) + description = Column(CIText(), default='', nullable=True) + lot_id = db.Column( + UUID(as_uuid=True), + db.ForeignKey('lot.id', use_alter=True, name='lot_trade'), + nullable=True, + ) + lot = relationship( + 'Lot', + backref=backref('transfer', lazy=True, uselist=False, cascade=CASCADE_OWN), + primaryjoin='Transfer.lot_id == Lot.id', + ) diff --git a/ereuse_devicehub/migrations/versions/054a3aea9f08_transfer.py b/ereuse_devicehub/migrations/versions/054a3aea9f08_transfer.py new file mode 100644 index 00000000..a6b4767e --- /dev/null +++ b/ereuse_devicehub/migrations/versions/054a3aea9f08_transfer.py @@ -0,0 +1,92 @@ +"""transfer + +Revision ID: 054a3aea9f08 +Revises: 8571fb32c912 +Create Date: 2022-05-27 11:07:18.245322 + +""" +import citext +import sqlalchemy as sa +from alembic import context, op +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision = '054a3aea9f08' +down_revision = '8571fb32c912' +branch_labels = None +depends_on = None + + +def get_inv(): + INV = context.get_x_argument(as_dictionary=True).get('inventory') + if not INV: + raise ValueError("Inventory value is not specified") + return INV + + +def upgrade(): + # creating transfer table + op.create_table( + 'transfer', + sa.Column( + 'updated', + sa.TIMESTAMP(timezone=True), + server_default=sa.text('CURRENT_TIMESTAMP'), + nullable=False, + ), + sa.Column( + 'created', + sa.TIMESTAMP(timezone=True), + server_default=sa.text('CURRENT_TIMESTAMP'), + nullable=False, + ), + sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False), + sa.Column('code', citext.CIText(), nullable=False), + sa.Column('closed', sa.Boolean(), nullable=False), + sa.Column( + 'description', + citext.CIText(), + nullable=False, + comment='A comment about the action.', + ), + sa.Column('date', sa.TIMESTAMP(timezone=True), nullable=True), + sa.Column('lot_id', postgresql.UUID(as_uuid=True), nullable=True), + sa.ForeignKeyConstraint(['lot_id'], [f'{get_inv()}.lot.id']), + sa.PrimaryKeyConstraint('id'), + schema=f'{get_inv()}', + ) + + # creating index + op.create_index( + op.f('ix_transfer_created'), + 'transfer', + ['created'], + unique=False, + schema=f'{get_inv()}', + ) + op.create_index( + op.f('ix_transfer_updated'), + 'transfer', + ['updated'], + unique=False, + schema=f'{get_inv()}', + ) + op.create_index( + 'ix_transfer_id', + 'transfer', + ['id'], + unique=False, + postgresql_using='hash', + schema=f'{get_inv()}', + ) + + +def downgrade(): + op.drop_index( + op.f('ix_transfer_created'), table_name='transfer', schema=f'{get_inv()}' + ) + op.drop_index( + op.f('ix_transfer_updated'), table_name='transfer', schema=f'{get_inv()}' + ) + op.drop_index(op.f('ix_transfer_id'), table_name='transfer', schema=f'{get_inv()}') + op.drop_table('transfer', schema=f'{get_inv()}')