From e8371d4b19659a105038b17aeb9aa06c3993e4b9 Mon Sep 17 00:00:00 2001 From: Daniel Kipngetich Date: Sat, 24 May 2025 09:59:44 +0300 Subject: [PATCH 1/4] updates1 models.py --- lib/models.py | 59 +++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 55 insertions(+), 4 deletions(-) diff --git a/lib/models.py b/lib/models.py index 2681bee5a..7cbebbad1 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}" \ No newline at end of file From fd36ae6d2eed15baeea8f93726c95394e2e6908a Mon Sep 17 00:00:00 2001 From: Daniel Kipngetich Date: Mon, 26 May 2025 15:41:26 +0300 Subject: [PATCH 2/4] updates1 debug.py --- lib/debug.py | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/lib/debug.py b/lib/debug.py index 4f922eb69..63f0213eb 100644 --- a/lib/debug.py +++ b/lib/debug.py @@ -1,9 +1,31 @@ #!/usr/bin/env python3 +#!/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() From d0e6b2a6af5c6f9018190ae230177b3b7692c038 Mon Sep 17 00:00:00 2001 From: Daniel Kipngetich Date: Mon, 26 May 2025 15:45:40 +0300 Subject: [PATCH 3/4] updates1 seed.py --- lib/seed.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/lib/seed.py b/lib/seed.py index b16becbbb..f448ce935 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() From bc9631c81e6915ba05081de90e1a76395c564042 Mon Sep 17 00:00:00 2001 From: Daniel Kipngetich Date: Tue, 27 May 2025 06:45:33 +0300 Subject: [PATCH 4/4] freebie complete --- lib/debug.py | 2 +- lib/freebies.db | Bin 20480 -> 32768 bytes lib/seed.py | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/debug.py b/lib/debug.py index 63f0213eb..b2a1a24ae 100644 --- a/lib/debug.py +++ b/lib/debug.py @@ -6,7 +6,7 @@ from sqlalchemy.orm import sessionmaker if __name__ == '__main__': - engine = create_engine('sqlite:///freebies.db') + engine = create_engine('sqlite:///lib/freebies.db') Session = sessionmaker(bind=engine) session = Session() diff --git a/lib/freebies.db b/lib/freebies.db index 12beb1c963e832db481e7a7493e3029e691ac4dc..75686556c20968ca1e811c25ef2c1b98d3b7345e 100644 GIT binary patch literal 32768 zcmeI)(QDH{90%~bq-)k`7g0x`OEi*MmpDzY>rOsLPs zxv`X6W%**+ST{^o+$^)=okC%OiROSeEYEImb~k6P-pIv|?%4GXKk_`sZ!~Rh*XoCr z(W-oBpyjri-^iKw*)8Kfn{%sK*=u#PSSp)2kq)apw8A8Gi`bu)~yp)(ktz4q@G`{$0>8t{kJ6$e)@nCzF}{3?;5t zf$c6>`vf!_kZLqV=qPq)0~8snV6t^+3rk;!)^H*iP_7RU)=A}TV3kKguC;- zcS6-N)6;a1N9J4HUA;s^B@r9%NAn*HTJt+z)%6}&yWDPt6MsxLS*m5`=jnc`n~h!P zjf(47JG|9)eQ#h_iDfo$Q08}dn&ovG;qyMXbTJ#d9V1WYKm@D#&|xvKNIdbRTvd{p zt@-0-buifCK!Ym&(014MX;Gp2XCi)3AOHafKmY;|fB*y_009U<00Iyg5`l55%r4h1 zUv!qQRBD&5IPy(?tpA5(a&Z|DfB*y_009U<00Izz00bZafkOdZolQm8|MLBRMSoB9 zFX9&p1Rwwb2tWV=5P$##AOHafKmY>&r+}^`$h5NIIxWBL*8=V3Ntz&&%DV4AsB`VD zT>q>32cmz~KZy+r1Rwwb2tWV=5P$##AOHafKmY>&r$9eq0b9p_fsN~FwUm2w; z$>i#;!{z#4eCZzw1Rwwb2tWV=5P$##AOHafKmYgBD}!FVEHD2L1{OXk27X@toqY9tQkw+@mho