From 11810a0484d1b9c302458cf17a996b527ce68b95 Mon Sep 17 00:00:00 2001 From: Quinn Sissler Date: Tue, 21 Feb 2023 21:19:39 -0500 Subject: [PATCH] completed challenge --- lib/debug.py | 7 +- lib/freebies.db | Bin 20480 -> 24576 bytes ...c90_add_freebie_model_and_relationships.py | 37 +++++++++ lib/models.py | 71 ++++++++++++++++- lib/seed.py | 73 ++++++++++++++++++ 5 files changed, 185 insertions(+), 3 deletions(-) create mode 100644 lib/migrations/versions/bc8c8dc27c90_add_freebie_model_and_relationships.py 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 271836bca14f8d717e3d32909043488fb274d1cb..67c9389504a6803c34249d91dcc45e170c4b3c20 100644 GIT binary patch literal 24576 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 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) +