diff --git a/freebies.db b/freebies.db new file mode 100644 index 000000000..e69de29bb diff --git a/lib/debug.py b/lib/debug.py index 4f922eb69..360541429 100644 --- a/lib/debug.py +++ b/lib/debug.py @@ -1,9 +1,94 @@ #!/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') + Session = sessionmaker(bind=engine) + session = Session() + + + # # Query all companies + # companies = session.query(Company).all() + + # # For each company, print its name and the names of its devs + # for company in companies: + # print(f'Company: {company.name}') + # print('Devs:') + # for dev in company.devs: + # print(f'- {dev.name}') + + # # Query all devs + # devs = session.query(Dev).all() + + # # For each dev, print its name and the names of its companies + # for dev in devs: + # print(f'Dev: {dev.name}') + # print('Companies:') + # for company in dev.companies: + # print(f'- {company.name}') + + + # # For a particular dev what the freebies collected from different companies + # dev = session.query(Dev).filter_by(name='Matthew Grant').first() + + # if dev is not None: + # print(dev.freebies) + # else: + # print("Developer didn't collect freebies.") + + + # # Query all freebies + # freebies = session.query(Freebie).all() + + # for freebie in freebies: + # try: + # print(freebie.print_details()) + # except Exception as e: + # print(f"Error printing details for freebie with id {freebie.id}: {e}") + + # # Query all companies + # companies = session.query(Company).all() + + # for company in companies: + # try: + # # Test oldest_company method + # oldest_company = Company.oldest_company(session) + # print(f"Oldest company: {oldest_company}") + # except Exception as e: + # print(f"Error finding oldest company for company with id {company.id}: {e}") + + # # Query all devs + # devs = session.query(Dev).all() + + + + # Query all devs and freebies + devs = session.query(Dev).all() + freebies = session.query(Freebie).all() + + # Test give_away method for each dev and freebie + for dev in devs: + for freebie in freebies: + try: + # Use a known dev for testing + new_dev = devs[0] # replace with a valid Dev instance + result = dev.give_away(new_dev, freebie) + print(f"Dev {dev.name} gave away {freebie.item_name} to {new_dev.name}: {result}") + except Exception as e: + print(f"Error giving away freebie with id {freebie.id} from dev with id {dev.id} to dev with id {new_dev.id}: {e}") + + # print(dev.received_one('Freebie Name')) + # other_dev = Dev(name='Other Dev') + # session.add(other_dev) + # session.commit() + # print(dev.give_away(other_dev, freebie)) + + # print(Company.oldest_company(session)) + + + import ipdb; ipdb.set_trace() diff --git a/lib/freebies.db b/lib/freebies.db index 12beb1c96..bd808980a 100644 Binary files a/lib/freebies.db and b/lib/freebies.db differ diff --git a/lib/freebies.db-journal b/lib/freebies.db-journal new file mode 100644 index 000000000..c887f5ac2 Binary files /dev/null and b/lib/freebies.db-journal differ diff --git a/lib/migrations/versions/2877be2fa35c_add_company_dev_association_table.py b/lib/migrations/versions/2877be2fa35c_add_company_dev_association_table.py new file mode 100644 index 000000000..b0a270131 --- /dev/null +++ b/lib/migrations/versions/2877be2fa35c_add_company_dev_association_table.py @@ -0,0 +1,34 @@ +"""Add company_dev Association Table + +Revision ID: 2877be2fa35c +Revises: 62e7ec2d7f28 +Create Date: 2024-02-13 00:13:35.567652 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '2877be2fa35c' +down_revision = '62e7ec2d7f28' +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') + ) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('company_devs') + # ### end Alembic commands ### diff --git a/lib/migrations/versions/62e7ec2d7f28_add_freebie_model.py b/lib/migrations/versions/62e7ec2d7f28_add_freebie_model.py new file mode 100644 index 000000000..3eb56c619 --- /dev/null +++ b/lib/migrations/versions/62e7ec2d7f28_add_freebie_model.py @@ -0,0 +1,37 @@ +"""Add Freebie model + +Revision ID: 62e7ec2d7f28 +Revises: 5f72c58bf48c +Create Date: 2024-02-12 23:10:38.211872 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '62e7ec2d7f28' +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.Column('company_id', sa.Integer(), nullable=True), + sa.Column('dev_id', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['company_id'], ['companies.id'], name=op.f('fk_freebies_company_id_companies')), + sa.ForeignKeyConstraint(['dev_id'], ['devs.id'], name=op.f('fk_freebies_dev_id_devs')), + 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/models.py b/lib/models.py index 2681bee5a..1ecc3cb73 100644 --- a/lib/models.py +++ b/lib/models.py @@ -1,4 +1,4 @@ -from sqlalchemy import ForeignKey, Column, Integer, String, MetaData +from sqlalchemy import Table, ForeignKey, Column, Integer, String, MetaData from sqlalchemy.orm import relationship, backref from sqlalchemy.ext.declarative import declarative_base @@ -9,6 +9,14 @@ Base = declarative_base(metadata=metadata) +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' @@ -16,8 +24,43 @@ class Company(Base): name = Column(String()) founding_year = Column(Integer()) + freebies = relationship('Freebie', backref=backref('company')) + + devs = relationship('Dev', secondary=company_dev, back_populates='companies') + + + def give_freebie(self, dev, item_name, value): + freebie = Freebie(item_name=item_name, value=value, dev_id=dev.id, company_id=self.id) + return freebie + + @classmethod + def oldest_company(cls, session): + return session.query(cls).order_by(cls.founding_year).first() + def __repr__(self): return f'' + + + +class Freebie(Base): + __tablename__ = 'freebies' + + id = Column(Integer(), primary_key=True) + item_name = Column(String()) + value= Column(Integer()) + + company_id = Column(Integer(), ForeignKey('companies.id')) + + dev_id = Column(Integer(), ForeignKey('devs.id')) + + def print_details(self): + return f'{self.dev.name} owns a {self.item_name} from {self.company.name}' + + def __repr__(self): + return f'Freebie(id={self.id},' + \ + f'item_name={self.item_name}, ' + \ + f'company_id={self.company_id})' + class Dev(Base): __tablename__ = 'devs' @@ -25,5 +68,18 @@ class Dev(Base): id = Column(Integer(), primary_key=True) name= Column(String()) + freebies = relationship('Freebie', backref=backref('dev')) + + companies = relationship ('Company', secondary = company_dev, back_populates = 'devs') + + def received_one(self, item_name): + return any(freebie.item_name == item_name for freebie in self.freebies) + + def give_away(self, dev, freebie): + if freebie in self.freebies: + freebie.dev_id = dev.id + return True + return False + def __repr__(self): return f'' diff --git a/lib/seed.py b/lib/seed.py index b16becbbb..3f03044c4 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,3 +1,78 @@ #!/usr/bin/env python3 # Script goes here! +from faker import Faker +import random + +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker + +from models import Company, Dev, Freebie + +if __name__ == '__main__': + engine = create_engine('sqlite:///freebies.db') + Session = sessionmaker(bind=engine) + session = Session() + + session.query(Company).delete() + session.query(Dev).delete() + session.query(Freebie).delete() + + fake = Faker() + + item_names = ['hoodie','laptop sticker', + 'flask', 'water bottle', 'T-shirt', + 'key holder', 'pen','bag','notebook', + 'flash disk'] + + devs = [] + for i in range(50): + dev = Dev( + name=fake.name(), + ) + + session.add(dev) + session.commit() + + devs.append(dev) + + companies = [] + for i in range(10): + company = Company( + name = fake.name(), + founding_year=fake.year() + ) + # add and commit individually to get IDs back + + session.add(company) + session.commit() + + companies.append(company) + + + freebies = [] + for i in range(50): + dev = random.choice(devs) + company = random.choice(companies) + + # Create association between dev and company + dev.companies.append(company) + company.devs.append(dev) + + freebie = Freebie( + item_name =random.choice(item_names), + value = random.randint(5,100), + company_id=company.id, + dev_id=dev.id, + ) + + + session.add(freebie) + session.commit() + + freebies.append(freebie) + + session.close() + + + \ No newline at end of file