diff --git a/lib/debug.py b/lib/debug.py index 4f922eb69..23e7b5f62 100644 --- a/lib/debug.py +++ b/lib/debug.py @@ -1,9 +1,14 @@ #!/usr/bin/env python3 from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker + + +from models import Company, Dev, Freebie -from models import Company, Dev if __name__ == '__main__': engine = create_engine('sqlite:///freebies.db') + Session = sessionmaker(bind=engine) + session = Session() import ipdb; ipdb.set_trace() diff --git a/lib/freebies.db b/lib/freebies.db index 271836bca..67c938950 100644 Binary files a/lib/freebies.db and b/lib/freebies.db differ diff --git a/lib/migrations/versions/bc8c8dc27c90_add_freebie_model_and_relationships.py b/lib/migrations/versions/bc8c8dc27c90_add_freebie_model_and_relationships.py new file mode 100644 index 000000000..196f3c417 --- /dev/null +++ b/lib/migrations/versions/bc8c8dc27c90_add_freebie_model_and_relationships.py @@ -0,0 +1,37 @@ +"""Add Freebie model and relationships + +Revision ID: bc8c8dc27c90 +Revises: ee905476242e +Create Date: 2023-02-21 17:29:50.582018 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'bc8c8dc27c90' +down_revision = 'ee905476242e' +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'], ), + sa.ForeignKeyConstraint(['dev_id'], ['devs.id'], ), + 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 8bc917b0c..848601c5f 100644 --- a/lib/models.py +++ b/lib/models.py @@ -1,10 +1,19 @@ #!/usr/bin/env python3 -from sqlalchemy import (Column, String, Integer) +from sqlalchemy import (Column, String, Integer, ForeignKey) +from sqlalchemy.orm import relationship from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.ext.associationproxy import association_proxy +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker + Base = declarative_base() +engine = create_engine('sqlite:///freebies.db') +Session = sessionmaker(bind=engine) +session = Session() + class Company(Base): __tablename__ = 'companies' @@ -12,8 +21,29 @@ class Company(Base): name = Column(String()) founding_year = Column(Integer()) + freebies = relationship('Freebie', backref='company') + devs = association_proxy('freebies', 'dev', + creator=lambda dv: Freebie(dev=dv)) + def __repr__(self): - return f'' + return f'' + + def give_freebie(self, dev, item_name, value): + new_freebie = Freebie( + item_name = item_name, + value = value, + company_id = self.id, + dev_id = dev.id + ) + session.add(new_freebie) + session.commit() + return new_freebie + + @classmethod + def oldest_company(cls): + oldest_company = session.query(cls).order_by('founding_year')[0] + return oldest_company + class Dev(Base): __tablename__ = 'devs' @@ -21,5 +51,42 @@ class Dev(Base): id = Column(Integer(), primary_key=True) name= Column(String()) + freebies = relationship('Freebie', backref='dev') + companies = association_proxy('freebies', 'company', + creator=lambda cm: Freebie(company=cm)) + def __repr__(self): return f'' + + def recieved_one(self, item_name): + for freebie in self.freebies: + if item_name == freebie.item_name: + return True + else: + return False + + def give_away(self, dev, freebie): + if freebie in self.freebies: + session.query(Freebie).filter(Freebie.id == freebie.id).update( + {Freebie.dev_id: dev.id}) + session.commit() + + +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 __repr__(self): + return f'' + + def print_details(self): + return f'{self.dev.name} owns a {self.item_name} from {self.company.name}.' + + diff --git a/lib/seed.py b/lib/seed.py index b16becbbb..b0ed268fe 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,3 +1,76 @@ #!/usr/bin/env python3 +from faker import Faker +import random +from random import choice as rc +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker + +engine = create_engine('sqlite:///freebies.db') +Session = sessionmaker(bind=engine) +session = Session() # Script goes here! +fake = Faker() +print("Seeding companies...") +from models import Company + +def create_companies(): + companies = [ + Company( + name=fake.company(), + founding_year=random.randint(1950, 2022) + ) + for i in range(50)] + session.add_all(companies) + session.commit() + return companies + +print("Seeding companies...") +from models import Dev + +def create_devs(): + devs = [ + Dev( + name=fake.company(), + ) + for i in range(50)] + session.add_all(devs) + session.commit() + return devs + +print("Seeding freebies...") +from models import Freebie + +def create_freebies(): + freebies = [ + Freebie( + item_name=fake.name(), + value=random.randint(1, 10) + ) + for i in range(100)] + session.add_all(freebies) + session.commit() + return freebies + +def delete_records(): + session.query(Company).delete() + session.query(Dev).delete() + session.query(Freebie).delete() + session.commit() + +def relate_one_to_many(companies, devs, freebies): + for freebie in freebies: + freebie.company = rc(companies) + freebie.dev = rc(devs) + + session.add_all(freebies) + session.commit() + return companies, devs, freebies + +if __name__ == '__main__': + delete_records() + companies = create_companies() + devs = create_devs() + freebies = create_freebies() + relate_one_to_many(companies, devs, freebies) +