From a14991a16404c42effee943288b70447a0281a60 Mon Sep 17 00:00:00 2001 From: Caleb Kiptoo Date: Mon, 3 Mar 2025 23:28:30 +0300 Subject: [PATCH] freebie tracker --- lib/debug.py | 26 +++++++- lib/freebies.db | Bin 20480 -> 32768 bytes .../5164d437f2c6_create_freebie_models.py | 45 +++++++++++++ lib/models.py | 59 ++++++++++++++++-- lib/seed.py | 26 ++++++++ 5 files changed, 149 insertions(+), 7 deletions(-) create mode 100644 lib/migrations/versions/5164d437f2c6_create_freebie_models.py diff --git a/lib/debug.py b/lib/debug.py index 4f922eb69..cd2732061 100644 --- a/lib/debug.py +++ b/lib/debug.py @@ -1,9 +1,29 @@ #!/usr/bin/env python3 - +from models import Company, Dev, Freebie from sqlalchemy import create_engine - -from models import Company, Dev +from sqlalchemy.orm import sessionmaker if __name__ == '__main__': engine = create_engine('sqlite:///freebies.db') + Session = sessionmaker(bind=engine) + session = Session() + + # Retrieve objects + dev = session.query(Dev).filter_by(name="Alice").first() + company = session.query(Company).filter_by(name="Google").first() + + # Test received_one() + print(dev.received_one("Laptop")) # output: True + print(dev.received_one("Tablet")) # output: False + + # Test give_away() + freebie = session.query(Freebie).filter_by(item_name="Laptop").first() + dev.give_away(session.query(Dev).filter_by(name="Bob").first(), freebie) + session.commit() + + # Test print_details() + print(freebie.print_details()) # Should show Bob owns a Laptop from Google + + # Test oldest_company() + print(Company.oldest_company(session)) #output: microsoft import ipdb; ipdb.set_trace() diff --git a/lib/freebies.db b/lib/freebies.db index 12beb1c963e832db481e7a7493e3029e691ac4dc..4dd4314b65c05eec264d1409233a393b8be0bb26 100644 GIT binary patch literal 32768 zcmeI)O-~a+7zgl~ZRyfNS)-Ch6T%omLIct8>dC~?EYMhrY^w}J|_IV(D~ zvgNXQa)nSz?lVRRiHLnr?A|sY3PJBg9BEhitYU=RZoZCcKZ!bYhiFml-N=iPo5OFS zU&JXk2tWV=5P$##AOHafTy%lMC#o778>6qHuC-m_#Tw_^Hm`ff!K9%layrW;meV@( zqHHP>whJtk$?2=Q!7>{;mU)y;&oB{odD*O3WzHTajO1Fvkin)^YH+W*4CI}1)vD~9 zoknD|z?(ghhem2WVQjGn`WBnA3vpR1xsl1{jD+Z%757XpC9~7yNm1MdTiG!5)M`e) zeyUR;&J2A;H}p(W&$4z{R{lo^?d(i(@VDEJ``T>Pk$~LB>ohaNPE!6|)2k#acxAire?h%=WgqQC&TG0D3dK?r zl-QL5e_nrD5_8V98m`kiKh0aVJ=@ipnh&b6(NTI3Z;gbwT$lTR&t69UGP`>xwokY< z-UmYgH8ws@4|vyji`msqL==L){!YW^=(OlGDh0c;WA1aS<_)|Y%Rgijr)q3^njVH* z*;plB-nR2*lh^9DQ|UQXe3|uJl=+>!%&auZ-qSrbKNt7Sxvr;{nF4K>z{}fB*y_009U< z00Izz00e|URDAJ&KszGZk@iV@4-yDK00Izz00bZa0SG_<0uX=z1TKt#MnmEw{9&55 ys;*NFd{wRoLgbc0=^D2R)m^8;>*Rx?TvcQ=9L|=ln)}Rh^Sg9L+=K7G{eJ=Wdbo=K delta 99 zcmZo@U}{*vI6+#Fm4Sf)gkgYrqK>gBD}!FVEHD2L1{OXk27X@toqY9tQkw+@mho None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('company_dev', + 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_dev_company_id_companies')), + sa.ForeignKeyConstraint(['dev_id'], ['devs.id'], name=op.f('fk_company_dev_dev_id_devs')), + sa.PrimaryKeyConstraint('company_id', 'dev_id') + ) + 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') + op.drop_table('company_dev') + # ### end Alembic commands ### diff --git a/lib/models.py b/lib/models.py index 2681bee5a..096f3bc22 100644 --- a/lib/models.py +++ b/lib/models.py @@ -1,7 +1,8 @@ -from sqlalchemy import ForeignKey, Column, Integer, String, MetaData +from sqlalchemy import ForeignKey, Column, Integer, String, MetaData, Table from sqlalchemy.orm import relationship, backref from sqlalchemy.ext.declarative import declarative_base +# Naming convention for migrations convention = { "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s", } @@ -9,21 +10,71 @@ Base = declarative_base(metadata=metadata) +# Association Table +company_dev = Table( + 'company_dev', + 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' id = Column(Integer(), primary_key=True) - name = Column(String()) - founding_year = Column(Integer()) + name = Column(String(), nullable=False) + founding_year = Column(Integer(), nullable=False) + + freebies = relationship("Freebie", backref="company") + devs = relationship("Dev", secondary=company_dev, back_populates="companies") def __repr__(self): return f'' + def give_freebie(self, dev, item_name, value): + #Creates a new Freebie instance associated with this company and the given dev. + freebie = Freebie(item_name=item_name, value=value, company=self, dev=dev) + return freebie + + @classmethod + def oldest_company(cls, session): + #Returns the Company instance with the earliest founding year. + return session.query(cls).order_by(cls.founding_year).first() + class Dev(Base): __tablename__ = 'devs' id = Column(Integer(), primary_key=True) - name= Column(String()) + name = Column(String(), nullable=False) + + freebies = relationship("Freebie", backref="dev") + companies = relationship("Company", secondary=company_dev, back_populates="devs") def __repr__(self): return f'' + + def received_one(self, item_name): + #Returns True if the dev has received a Freebie with the given item_name. + return any(freebie.item_name == item_name for freebie in self.freebies) + + def give_away(self, dev, freebie): + #Transfers a freebie to another dev if the freebie belongs to the current dev. + if freebie in self.freebies: + freebie.dev = dev + +class Freebie(Base): + __tablename__ = "freebies" + + id = Column(Integer(), primary_key=True) + item_name = Column(String(), nullable=False) + value = Column(Integer(), nullable=False) + company_id = Column(Integer(), ForeignKey("companies.id")) + dev_id = Column(Integer(), ForeignKey("devs.id")) + + def __repr__(self): + return f"" + + def print_details(self): + #Returns a formatted string with freebie details. + 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..a4fac1696 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,3 +1,29 @@ #!/usr/bin/env python3 # Script goes here! +from models import Base, Company, Dev, Freebie +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker + + +engine = create_engine('sqlite:///freebies.db') +Base.metadata.create_all(engine) + +Session = sessionmaker(bind=engine) +session = Session() + +# Create some Companies +google = Company(name="Google", founding_year=1998) +microsoft = Company(name="Microsoft", founding_year=1975) + +# Create some Devs +alice = Dev(name="Alice") +bob = Dev(name="Bob") + +# Create some Freebies +freebie1 = Freebie(item_name="Laptop", value=1000, company=google, dev=alice) +freebie2 = Freebie(item_name="Headphones", value=200, company=microsoft, dev=bob) +freebie3 = Freebie(item_name="Smartwatch", value=300, company=google, dev=alice) + +session.add_all([google, microsoft, alice, bob, freebie1, freebie2, freebie3]) +session.commit() \ No newline at end of file