From fbc1f74cad7dd2a03c4d217c5ef58f5ecafc1276 Mon Sep 17 00:00:00 2001 From: Marvin-Kabugi Date: Sun, 4 Jun 2023 15:05:20 +0300 Subject: [PATCH] completed assignment --- lib/debug.py | 46 +++++++++++- lib/freebies.db | Bin 20480 -> 57344 bytes .../2dfb7ef6c89c_added_methods_to_models.py | 28 ++++++++ .../d94b79d72883_updated_freebie_model.py | 33 +++++++++ ...a9ca4_add_company_dev_association_table.py | 46 ++++++++++++ lib/models.py | 68 +++++++++++++++++- lib/seed.py | 67 ++++++++++++++++- 7 files changed, 283 insertions(+), 5 deletions(-) create mode 100644 lib/migrations/versions/2dfb7ef6c89c_added_methods_to_models.py create mode 100644 lib/migrations/versions/d94b79d72883_updated_freebie_model.py create mode 100644 lib/migrations/versions/eb9fd7da9ca4_add_company_dev_association_table.py diff --git a/lib/debug.py b/lib/debug.py index 4f922eb69..a4553f825 100644 --- a/lib/debug.py +++ b/lib/debug.py @@ -1,9 +1,51 @@ #!/usr/bin/env python3 from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker -from models import Company, Dev +from models import Company, Dev, Freebie if __name__ == '__main__': engine = create_engine('sqlite:///freebies.db') - import ipdb; ipdb.set_trace() + Session = sessionmaker(bind=engine) + session = Session() + + freebie = session.query(Freebie).first() + print('_' * 50 + 'Freebie' + '_' * 50) + print(freebie) + print(freebie.dev) + dev2 = freebie.dev + print(freebie.company) + print(freebie.print_details()) + # print('_' * 100) + + company = session.query(Company).first() + print('_' * 50 + 'Company' + '_' * 50) + dev = session.query(Dev).first() + company.give_freebie(dev2, 'bike', 4000) + session.add(dev2) + session.commit() + print(dev2) + print(dev.freebies) + print(company) + print(company.freebies) + print(company.devs) + print(Company.oldest_compay()) + # print('_' * 100) + + # dev = session.query(Dev).first() + freebie2 = session.query(Freebie).filter(Freebie.item_name == 'bike', Freebie.id == 151).first() + print('_' * 50 + 'Dev' + '_' * 50) + print(dev) + print(dev.freebies) + print(dev.companies) + print(dev.received_one('playstation')) + print(dev.give_away(dev2, freebie2)) + session.add(freebie2) + session.commit() + # print('_' * 100) + print(dev2.freebies) + print(company.devs) + session.close() + + import pdb; pdb.set_trace() diff --git a/lib/freebies.db b/lib/freebies.db index 12beb1c963e832db481e7a7493e3029e691ac4dc..efcdd703d29a06b5b45f4d1321a30c20c95ac6db 100644 GIT binary patch literal 57344 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 MFa?+be+dQt2Y9g6j{pDw delta 115 zcmZoTz}&Eaae|Z(11kdq7y~IVV4kRBBnA}Gi None: + # ### commands auto generated by Alembic - please adjust! ### + pass + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + pass + # ### end Alembic commands ### diff --git a/lib/migrations/versions/d94b79d72883_updated_freebie_model.py b/lib/migrations/versions/d94b79d72883_updated_freebie_model.py new file mode 100644 index 000000000..6d725abb0 --- /dev/null +++ b/lib/migrations/versions/d94b79d72883_updated_freebie_model.py @@ -0,0 +1,33 @@ +"""updated Freebie model + +Revision ID: d94b79d72883 +Revises: 5f72c58bf48c +Create Date: 2023-06-04 00:03:54.393439 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'd94b79d72883' +down_revision = '5f72c58bf48c' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('freebies', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('item_name', sa.String(), nullable=True), + sa.Column('value', sa.Integer(), nullable=True), + sa.PrimaryKeyConstraint('id') + ) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('freebies') + # ### end Alembic commands ### diff --git a/lib/migrations/versions/eb9fd7da9ca4_add_company_dev_association_table.py b/lib/migrations/versions/eb9fd7da9ca4_add_company_dev_association_table.py new file mode 100644 index 000000000..cb742dced --- /dev/null +++ b/lib/migrations/versions/eb9fd7da9ca4_add_company_dev_association_table.py @@ -0,0 +1,46 @@ +"""add company-dev association table + +Revision ID: eb9fd7da9ca4 +Revises: d94b79d72883 +Create Date: 2023-06-04 00:46:57.198671 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'eb9fd7da9ca4' +down_revision = 'd94b79d72883' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('company_devs', + sa.Column('company_id', sa.Integer(), nullable=False), + sa.Column('dev_id', sa.Integer(), nullable=False), + sa.ForeignKeyConstraint(['company_id'], ['companies.id'], name=op.f('fk_company_devs_company_id_companies')), + sa.ForeignKeyConstraint(['dev_id'], ['devs.id'], name=op.f('fk_company_devs_dev_id_devs')), + sa.PrimaryKeyConstraint('company_id', 'dev_id') + ) + with op.batch_alter_table('freebies', schema=None) as batch_op: + batch_op.add_column(sa.Column('dev_id', sa.Integer(), nullable=True)) + batch_op.add_column(sa.Column('company_id', sa.Integer(), nullable=True)) + batch_op.create_foreign_key(batch_op.f('fk_freebies_company_id_companies'), 'companies', ['company_id'], ['id']) + batch_op.create_foreign_key(batch_op.f('fk_freebies_dev_id_devs'), 'devs', ['dev_id'], ['id']) + + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table('freebies', schema=None) as batch_op: + batch_op.drop_constraint(batch_op.f('fk_freebies_dev_id_devs'), type_='foreignkey') + batch_op.drop_constraint(batch_op.f('fk_freebies_company_id_companies'), type_='foreignkey') + batch_op.drop_column('company_id') + batch_op.drop_column('dev_id') + + op.drop_table('company_devs') + # ### end Alembic commands ### diff --git a/lib/models.py b/lib/models.py index 2681bee5a..105737496 100644 --- a/lib/models.py +++ b/lib/models.py @@ -1,5 +1,5 @@ -from sqlalchemy import ForeignKey, Column, Integer, String, MetaData -from sqlalchemy.orm import relationship, backref +from sqlalchemy import ForeignKey, Column, Integer, String, MetaData, Table, create_engine +from sqlalchemy.orm import relationship, backref, sessionmaker from sqlalchemy.ext.declarative import declarative_base convention = { @@ -8,6 +8,17 @@ metadata = MetaData(naming_convention=convention) Base = declarative_base(metadata=metadata) +engine = create_engine('sqlite:///freebies.db') +Session = sessionmaker(bind=engine) +session = Session() + +company_dev = Table( + 'company_devs', + Base.metadata, + Column('company_id', ForeignKey('companies.id'), primary_key=True), + Column('dev_id', ForeignKey('devs.id'), primary_key=True), + extend_existing=True +) class Company(Base): __tablename__ = 'companies' @@ -15,6 +26,24 @@ class Company(Base): id = Column(Integer(), primary_key=True) name = Column(String()) founding_year = Column(Integer()) + freebies = relationship('Freebie', backref='company') + devs = relationship('Dev', secondary=company_dev, back_populates='companies') + + @classmethod + def oldest_compay(cls): + return session.query(Company).order_by(Company.founding_year.asc()).first() + + def give_freebie(self, dev, item_name, value): + freebie = Freebie( + item_name = item_name, + value = value, + dev_id = dev.id, + company_id = self.id + ) + dev.companies.append(self) + session.add(freebie) + # session.add(dev) + session.commit() def __repr__(self): return f'' @@ -24,6 +53,41 @@ class Dev(Base): id = Column(Integer(), primary_key=True) name= Column(String()) + freebies = relationship('Freebie', backref='dev') + companies = relationship('Company', secondary=company_dev, back_populates='devs') + + def received_one(self, item_name): + for freebie in self.freebies: + if freebie.item_name == item_name: + return True + else: + return False + + def give_away(self, dev, freebie): + if freebie.dev == self: + freebie.dev = dev + + # session.add(freebie) + # session.commit() def __repr__(self): return f'' + + +class Freebie(Base): + __tablename__ = 'freebies' + + id = Column(Integer(), primary_key=True) + item_name = Column(String()) + value = Column(Integer()) + + dev_id = Column(Integer(), ForeignKey('devs.id')) + company_id = Column(Integer(), ForeignKey('companies.id')) + + def print_details(self): + return f'{self.dev} owns a ' + \ + f'{self.item_name} from {self.company}' + + + def __repr__(self) -> str: + return f'