diff --git a/lib/__pycache__/models.cpython-38.pyc b/lib/__pycache__/models.cpython-38.pyc new file mode 100644 index 000000000..73fa6c066 Binary files /dev/null and b/lib/__pycache__/models.cpython-38.pyc differ diff --git a/lib/alembic.ini b/lib/alembic.ini index 953863ddd..a76567e6c 100644 --- a/lib/alembic.ini +++ b/lib/alembic.ini @@ -55,7 +55,7 @@ version_path_separator = os # Use os.pathsep. Default configuration used for ne # are written from script.py.mako # output_encoding = utf-8 -sqlalchemy.url = sqlite:///freebies.db +sqlalchemy.url = sqlite:///lib/freebies.db [post_write_hooks] diff --git a/lib/debug.py b/lib/debug.py index 4f922eb69..5611d23db 100644 --- a/lib/debug.py +++ b/lib/debug.py @@ -1,9 +1,73 @@ #!/usr/bin/env python3 from sqlalchemy import create_engine - -from models import Company, Dev +from sqlalchemy.orm import sessionmaker +from models import Base, Company, Dev, Freebie if __name__ == '__main__': - engine = create_engine('sqlite:///freebies.db') + engine = create_engine('sqlite:///lib/freebies.db') + Base.metadata.create_all(engine) + Session = sessionmaker(bind=engine) + session = Session() + + companies = session.query(Company).all() + devs = session.query(Dev).all() + freebies = session.query(Freebie).all() + + print("-----Testing Freebie Tracker-----") + + print(f"Total Companies: {len(companies)}") + print(f"Total Devs: {len(devs)}") + print(f"Total Freebies: {len(freebies)}") + + print(f"\nFirst company: {companies[0].name}") + print(f" First company's freebies: {[freebie.item_name for freebie in companies[0].freebies]}") + print(f" First company's devs: {[dev.name for dev in companies[0].devs]}") + + print(f"\nFirst dev: {devs[0].name}") + print(f" First dev's freebies: {[freebie.item_name for freebie in devs[0].freebies]}") + print(f" First dev's companies: {[company.name for company in devs[0].companies]}") + + print(f"\nFirst freebie details: {freebies[0].print_details()}") + + print(f"\nOldest company: {Company.oldest_company(session).name} (founded {Company.oldest_company(session).founding_year})") + print(f"Does {devs[0].name} have a Diary? {devs[0].received_one('Diary')}") + print(f"Does {devs[0].name} have a Umbrella? {devs[0].received_one('Umbrella')}") + + + moringa = session.query(Company).filter_by(name="Moringa").first() + anne = session.query(Dev).filter_by(name="Anne").first() + + print(f"\nGive freebie: {moringa.name} giving 'Notebook' to {anne.name}") + print(f" Anne's freebies before: {[freebie.item_name for freebie in anne.freebies]}") + + new_freebie = moringa.give_freebie(anne, "Water Bottle", 300, session) + + session.refresh(anne) + print(f" Anne's freebies after: {[freebie.item_name for freebie in anne.freebies]}") + print(f" New freebie added: {new_freebie.print_details()}") + session.commit() + + + andrew = session.query(Dev).filter_by(name="Andrew").first() + frank = session.query(Dev).filter_by(name="Frank").first() + + andrew_freebie = session.query(Freebie).filter_by(dev_id=andrew.id).first() + + print(f"\nGive Away: {andrew.name} giving '{andrew_freebie.item_name}' to {frank.name}") + print(f" Andrew's freebies before: {[freebie.item_name for freebie in andrew.freebies]}") + print(f" Frank's freebies before: {[freebie.item_name for freebie in frank.freebies]}") + print(f" Freebie owner before: {andrew_freebie.dev.name}") + + result = andrew.give_away(frank, andrew_freebie, session) + + session.refresh(andrew) + session.refresh(frank) + session.refresh(andrew_freebie) + + print(f"\n Andrew's freebies after: {[freebie.item_name for freebie in andrew.freebies]}") + print(f" frank's freebies after: {[freebie.item_name for freebie in frank.freebies]}") + print(f" Freebie new owner: {andrew_freebie.dev.name}") + session.commit() + import ipdb; ipdb.set_trace() diff --git a/lib/freebies.db b/lib/freebies.db index 12beb1c96..d33e94dfc 100644 Binary files a/lib/freebies.db and b/lib/freebies.db differ diff --git a/lib/migrations/versions/0a8c798ff248_create_freebies_table.py b/lib/migrations/versions/0a8c798ff248_create_freebies_table.py new file mode 100644 index 000000000..7f02e8afb --- /dev/null +++ b/lib/migrations/versions/0a8c798ff248_create_freebies_table.py @@ -0,0 +1,37 @@ +"""Create freebies table + +Revision ID: 0a8c798ff248 +Revises: 5f72c58bf48c +Create Date: 2025-05-24 16:16:06.410337 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '0a8c798ff248' +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('dev_id', sa.Integer(), nullable=True), + sa.Column('company_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..bdf0d19b0 100644 --- a/lib/models.py +++ b/lib/models.py @@ -1,6 +1,5 @@ from sqlalchemy import ForeignKey, Column, Integer, String, MetaData -from sqlalchemy.orm import relationship, backref -from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import relationship, declarative_base convention = { "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s", @@ -15,15 +14,71 @@ class Company(Base): id = Column(Integer(), primary_key=True) name = Column(String()) founding_year = Column(Integer()) + + freebies = relationship('Freebie', back_populates='company') def __repr__(self): return f'' + + def give_freebie(self, dev, item_name, value, session): + new_freebie = Freebie( + dev=dev, + company=self, + item_name=item_name, + value=value + ) + session.add(new_freebie) + return new_freebie + + @classmethod + def oldest_company(cls, session): + result = session.query(cls).order_by(cls.founding_year.asc()).first() + return result + + @property + def devs(self): + return list(set([freebie.dev for freebie in self.freebies])) class Dev(Base): __tablename__ = 'devs' id = Column(Integer(), primary_key=True) name= Column(String()) + + freebies = relationship('Freebie', back_populates='dev') def __repr__(self): return f'' + + @property + def companies(self): + return list(set([freebie.company for freebie in self.freebies])) + + def received_one(self, item_name): + return any(freebie.item_name == item_name for freebie in self.freebies) + + def give_away(self, dev, freebie, session): + if freebie in self.freebies: + freebie.dev = dev + session.add(freebie) + return True + return False + +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')) + + dev = relationship('Dev', back_populates='freebies') + company = relationship('Company', back_populates='freebies') + + 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..583a25a09 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,3 +1,44 @@ #!/usr/bin/env python3 -# Script goes here! +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker +from models import Base, Company, Dev, Freebie + +engine = create_engine('sqlite:///lib/freebies.db') +Base.metadata.create_all(engine) +Session = sessionmaker(bind=engine) +session = Session() + +session.query(Company).delete() +session.query(Dev).delete() +session.query(Freebie).delete() +session.commit() + +moringa = Company(name="Moringa", founding_year=2014) +safaricom = Company(name="Safaricom", founding_year=1997) +britam = Company(name="Britam", founding_year=1965) +microsoft = Company(name="Microsoft", founding_year=1975) + +session.add_all([moringa, safaricom, britam, microsoft]) +session.commit() + +anne = Dev(name="Anne") +frank = Dev(name="Frank") +andrew = Dev(name="Andrew") +thomas = Dev(name="Thomas") + +session.add_all([anne, frank, andrew, thomas]) +session.commit() + +freebies = [ + Freebie(dev_id=anne.id, company_id=moringa.id, item_name="Diary", value=300), + Freebie(dev_id=anne.id, company_id=safaricom.id, item_name="Mug", value=100), + Freebie(dev_id=frank.id, company_id=moringa.id, item_name="Umbrella", value=500), + Freebie(dev_id=frank.id, company_id=britam.id, item_name="Notebook", value=300), + Freebie(dev_id=andrew.id, company_id=microsoft.id, item_name="Hood", value=500), + Freebie(dev_id=thomas.id, company_id=britam.id, item_name="Bag", value=1000), + Freebie(dev_id=thomas.id, company_id=moringa.id, item_name="Phone", value=20000) +] +session.add_all(freebies) +session.commit() +session.close()