From 4fddbab5c4aed9030637c26d2138c17eb9865687 Mon Sep 17 00:00:00 2001 From: Rose Momanyi Date: Mon, 26 May 2025 00:54:29 +0300 Subject: [PATCH 1/5] Created a model to create freebie table. --- database.db | Bin 0 -> 16384 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 database.db diff --git a/database.db b/database.db new file mode 100644 index 0000000000000000000000000000000000000000..c1d2b6be2f890ce93ecd058fed219d0d8d09038b GIT binary patch literal 16384 zcmeI#&1%9x5C`zY2vUpKi+B>}XrT1c7icQ0m8P*>(}IT*qFGC*(c%|)w9rEzrtjFS zX-tz+y~}@L**K0n<8O1>-h=5c1dXP%z+KR#a;B)Naz&&liWbg%IOCE1tj1sLSvBQi z^;rrNw9=PSo|Q}Cf&l>tKmY;|fB*y_009U<00M^u-k-HXwN_ICLwaF-sQlog{d(^RP)@Gcnu1(gXX`WLUUWmY%xPhQ2gEwysE`uv~ycBV| z40vMYBpb-ca2mY1lXWI~&pUSp@6#>oQ^WUknc3`GJ)0Y0aT>ikaZ66LrCjFJ>T=d; zTk>a(D6SJ{EykJEWIfvE9M~@D$B7<8l+?aSLTc|MSr#bj!(5?Ssi+%$%PT9(sijz> ze*PuRYGzT2`sP$ERO@whBeqp`J?tKGsd~Hco^#9=9Zi=L&!4 Date: Mon, 26 May 2025 00:54:45 +0300 Subject: [PATCH 2/5] Created debug file. --- lib/debug.py | 41 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/lib/debug.py b/lib/debug.py index 4f922eb69..c7d22c5e7 100644 --- a/lib/debug.py +++ b/lib/debug.py @@ -1,9 +1,46 @@ #!/usr/bin/env python3 from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker +from models import Company, Dev, Freebie , Base + +# Create an SQLite database engine and initialize the database +engine = create_engine('sqlite:///database.db') + +Base.metadata.create_all(engine) + +# Create a session to interact with the database +Session = sessionmaker(bind=engine) +session = Session() -from models import Company, Dev if __name__ == '__main__': - engine = create_engine('sqlite:///freebies.db') import ipdb; ipdb.set_trace() + + + company1= Company(name = "R&B Ltd.", founding_year = 2011) + company2= Company(name = "Momanyi B&G Ltd.", founding_year = 1999) + company3= Company(name = "Kiango Kenya Ltd.", founding_year = 1989) + company4= Company(name = "Boyani Ltd.", founding_year = 2013) + + dev1= Dev(name= "Rose B. Momanyi") + dev2= Dev(name= "Vincent A. Asumari") + dev3= Dev(name= "Josiah O. Ombasa") + dev4= Dev(name= "Diana B. Ondieki") + + session.add_all([company1, company2, company3, company4, dev1, dev2, dev3, dev4]) + session.commit() + + # Assign freebies to developers from specific companies + company1.give_freebie(dev1, "Laptop", 1) + company1.give_freebie(dev2, "smartwatch", 2) + + company2.give_freebie(dev1, "notebook", 3) + company2.give_freebie(dev2, "Headphones", 4) + + freebies = session.query(Freebie).all() + for freebie in freebies: + print(freebie.print_details()) + + print(dev1.received_one("Laptop")) + print(dev1.received_one("smart watch")) \ No newline at end of file From c279d6fcfccf42651d63fe58a84fa311a97d276c Mon Sep 17 00:00:00 2001 From: Rose Momanyi Date: Mon, 26 May 2025 01:03:38 +0300 Subject: [PATCH 3/5] Created models --- lib/models.py | 49 +++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 43 insertions(+), 6 deletions(-) diff --git a/lib/models.py b/lib/models.py index 2681bee5a..4eee525af 100644 --- a/lib/models.py +++ b/lib/models.py @@ -1,29 +1,66 @@ 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", } metadata = MetaData(naming_convention=convention) - Base = declarative_base(metadata=metadata) class Company(Base): __tablename__ = 'companies' - id = Column(Integer(), primary_key=True) name = Column(String()) founding_year = Column(Integer()) + freebies = relationship('Freebie', back_populates='company', cascade="all, delete-orphan") + devs = relationship('Dev', secondary='freebies', back_populates='companies', overlaps="freebies,dev") + def __repr__(self): return f'' + def give_freebie(self, dev, item_name, value): + freebie = Freebie(item_name=item_name, value=value, dev=dev, company=self) + return freebie + + @classmethod + def oldest_company(cls, session): + 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()) + + freebies = relationship('Freebie', back_populates='dev', cascade="all, delete-orphan") + companies = relationship('Company', secondary='freebies', back_populates='devs', overlaps="freebies,company") def __repr__(self): return f'' + + 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.dev == self: + freebie.dev = dev + session.commit() + else: + raise ValueError("You cannot give away freebies that don't belong to you.") + +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', overlaps="companies,devs") + company = relationship('Company', back_populates='freebies', overlaps="companies,devs") + + def __repr__(self): + return f'' + + def print_details(self): + return f"{self.dev.name} owns a {self.item_name} from {self.company.name}" From 218e69a329fece8cada25cbb3f5397d2916ed420 Mon Sep 17 00:00:00 2001 From: Rose Momanyi Date: Mon, 26 May 2025 01:04:23 +0300 Subject: [PATCH 4/5] Added data to seed file. --- lib/seed.py | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/lib/seed.py b/lib/seed.py index b16becbbb..f190b024d 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,3 +1,43 @@ #!/usr/bin/env python3 # Script goes here! + +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker +from models import Company, Dev, Freebie, Base + + +engine = create_engine('sqlite:///database.db') +Base.metadata.create_all(engine) +Session = sessionmaker(bind=engine) +session = Session() + + +company1= Company(name = "R&B Ltd.", founding_year = 2011) +company2= Company(name = "Momanyi B&G Ltd.", founding_year = 1999) +company3= Company(name = "Kiango Kenya Ltd.", founding_year = 1989) +company4= Company(name = "Boyani Ltd.", founding_year = 2013) + + +dev1= Dev(name= "Rose B. Momanyi") +dev2= Dev(name= "Vincent A. Asumari") +dev3= Dev(name= "Josiah O. Ombasa") +dev4= Dev(name= "Diana B. Ondieki") + +session.add_all([company1, company2, company3, company4, dev1, dev2, dev3, dev4]) +session.commit() + +# Give freebies +session.add_all([ + company1.give_freebie(dev1, "Laptop", 1), + company1.give_freebie(dev2, "Stylus", 2), + company2.give_freebie(dev1, "iPad", 3), + company2.give_freebie(dev2, "Headphones", 4), + company3.give_freebie(dev3, "Phone", 5), + company4.give_freebie(dev4, "Tablet", 6) +]) +session.commit() + +# Print all freebies +for freebie in session.query(Freebie).all(): + print(freebie.print_details()) From 8ebfbfe5704f63874f4a05b9dc5bf12baf8dfa0a Mon Sep 17 00:00:00 2001 From: Rose Momanyi Date: Mon, 26 May 2025 01:45:11 +0300 Subject: [PATCH 5/5] Refactored Code --- database.db | Bin 16384 -> 16384 bytes lib/__pycache__/models.cpython-38.pyc | Bin 0 -> 3269 bytes lib/debug.py | 7 +++++++ lib/freebies.db | Bin 20480 -> 0 bytes lib/seed.py | 11 +++++++++-- 5 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 lib/__pycache__/models.cpython-38.pyc delete mode 100644 lib/freebies.db diff --git a/database.db b/database.db index c1d2b6be2f890ce93ecd058fed219d0d8d09038b..c675042367b32ac8bb654870b44f32a8a3c65d8f 100644 GIT binary patch delta 430 zcmXYt&n`nz5XR^HyUk7Lph^UBL}DW<9ziQ1T4{r@b+jjXqP?f-y-n1nUDl4oPGV(8 zBGLz7V{Jns#Kzh}Jb^>aYQEoOX1>A<2_!v^gp^|14r0O3I>ZAT{IP=ecV63oFh8yZ!Xc}J^zDpX1825g(4sDnr@rQ}lBsH(adA`IsK zZgc(rHh;auumkvwANb^6af9pvJMJ5GJRFXBFhdC0jC54CVbRt!6#_jE#vI*Jdlemd zoX3R+qYf0xHqe5x1ovRt=~b;twO;M1& diff --git a/lib/__pycache__/models.cpython-38.pyc b/lib/__pycache__/models.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..164103ad1cbdf399d19da125c52954c9fae55826 GIT binary patch literal 3269 zcmb7G&yU;273PqXL}?|h)^?I2O9j07 z|2e-qnl&x!ds5aP7s@@nY7W6I&QdF50n6;b&YZx>+`!FhL5=$s7#7n zjgqnMaS^AHM8~NJ4Y0!O%_b_Ppw=fV!^&>Cmf z84J9sAFU>A=<*t`^Tve}Y(ev2JH}gl>%tA%yv;l3R?y*HzKw5JZ1W!9Ij1#x{2Huy zT{rF***MClx*3~BBGjjsOmB^4l0|YFp1`b)hf;{cMCe8}X8QbEl%}_RE>cm7-9nB> zQGRLb?qL+4gyUj7fq{j>@JPiG7utCsPPKPbt)gb_W$QK?t|O#@Bgf zJ+dwtL9acT2nqWXk_#CgPIc#~nB<(;G8K{3wWCC;5;S$<6cMC^QlQU^c)LZ)g(^WX z6TGiu)5^&9?A0aS%^?T<9dZfTH;7{XT*ushW4FnltJ(#4-nSdqC>C7nx>Ewr6* zNiLGVBJn#C4HBjW|3f(W2E}CmeqJ;#!o+OZ3O_FFYl0>IU5ka>~5Rx1!{{Zo+ zB+{Aas>13Tsn`8qO?9a?keDSL(k=U$20bjJRHDrNG~?87gLi62LKUX(s12|xNen)=H? z@XJwD`n<^BE&W3z+5Ffq3x8Tn27SlGk**_DvZU0l&ncDtS;|88-L>>(EI9zA7a~A6 zO-iEOZWC$`!UBWp;Lxl?r(OL&=x@tAw8Hx&J|ICpy`s1LJ*ijxUQt_i=*L?mJ|eMC z!rv4o9Em3sri#+ztn3+Z;KA@ z1dQ%gxEFMx(XF7;w&`|&+dywY{2ktfAGa%FQ#PxJK5KB~v_ZmW?TX5{89*~9nRQoP zRKgYFky4nXJY3~0hSu_-HXYT37Mba)a1;4Zz@6`EfZ$RAe^^}-{F!~bN&r~fg!$W; z_>*~nyt0b(#S&M!;3vV5zvvEOK$v1hw+Zw()MG&5R^j=@*SYc|e^y6S7nzUfyhUhC zB{1Nq^8Oe&-N8L7FGG&2Uy`bi*I>S~gt;-|pnvV91NF)*MBJbbPlO2%T8qq!c2%Ja zR)f%l@gE7RzbW1%l>(Pov009A2k0S=yC_L!1gNB2>PZ@<@knG-NqevHh#W2J5W0Ic zXi&(k!a^L?K)AdY%Ps0~|AgCCRYgp>AtXNrQG0t;+1@9YDk?y4u%2UE_WxXmN@wpz H@0I@pI{MQs literal 0 HcmV?d00001 diff --git a/lib/debug.py b/lib/debug.py index c7d22c5e7..cc372a8a0 100644 --- a/lib/debug.py +++ b/lib/debug.py @@ -31,6 +31,7 @@ session.add_all([company1, company2, company3, company4, dev1, dev2, dev3, dev4]) session.commit() + # Assign freebies to developers from specific companies company1.give_freebie(dev1, "Laptop", 1) company1.give_freebie(dev2, "smartwatch", 2) @@ -38,6 +39,12 @@ company2.give_freebie(dev1, "notebook", 3) company2.give_freebie(dev2, "Headphones", 4) + + + company3.give_freebie(dev3, "biro", 3) + + company4.give_freebie(dev4, "notebook", 1) + freebies = session.query(Freebie).all() for freebie in freebies: print(freebie.print_details()) diff --git a/lib/freebies.db b/lib/freebies.db deleted file mode 100644 index 12beb1c963e832db481e7a7493e3029e691ac4dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20480 zcmeI&O^ee&7{KwFzF1pn<7FubvU6Ezs0i-5xEH}#f-cssn~lPrLYhn^*d%LT7ClM* zR(>mw9!*MiX#;!kCgneLnrEhT=9yn|d1x=rhtWc-Nji)Dg*p-sg_PozQbLG&(X-3C zRkQb65$6}V5#JTo#Z&Kb+xR1DokzlG8^1a~vVevF0tg_000IagfB*srAn+dv1hqzY zZ%?kwg+HF^P+!mUULQEN<=V=%UJq@R&!}Fj8HMU}TKj zvYf$N%gM(doYVJ~bE)3hm#P?X}SvN2_&+waSt&2={ZRLA2e@UHc29;HcXSlP;~^kJS~@ii}5#y1GP zqeF8`XmB>Va2+edQ>7KWt1p4t0^3+GlY3dY*FEn`5hbDiHvc-!s(8;|F4FbbD=+q} zG?CZx_w$FXopova7TJr200IagfB*srAb