From 81d06f905b6ce3f95cae29e6f3bf027406f07383 Mon Sep 17 00:00:00 2001 From: Scolastica Nzyoki Date: Wed, 5 Mar 2025 06:57:56 +0300 Subject: [PATCH 1/3] freebies --- freebies.db | Bin 0 -> 16384 bytes lib/__pycache__/models.cpython-38.pyc | Bin 0 -> 3367 bytes lib/debug.py | 19 +++++- lib/migration.py | 12 ++++ lib/models.py | 82 ++++++++++++++++++++++++-- lib/seed.py | 64 ++++++++++++++++++++ 6 files changed, 172 insertions(+), 5 deletions(-) create mode 100644 freebies.db create mode 100644 lib/__pycache__/models.cpython-38.pyc create mode 100644 lib/migration.py diff --git a/freebies.db b/freebies.db new file mode 100644 index 0000000000000000000000000000000000000000..531fa82868f1f75ce62bc6a2db115ff2e7796ea8 GIT binary patch literal 16384 zcmeI(F>ljA6bJA-+r-puI0Tf4p~^!Dk*J6Pz5r?DhKe{TZa@?XMNV>wtT=IHClwis z#K4DPW2&9p=ezUISuS>Vo|OH8q;?qfya7F6 zml@~mArWKDQq@p(T6EPpe$1yIoX}eA-u~OPO3>5qn21DLH7F2(00bZa0SG_<0uX=z z1R!vl!0VT~nOR%oZ_)#=5y*BVWy6>8v^9#ZU8vbqD{Pc)nno#SE%`0ls?_X~?NX&$ zqsr5A`7WvOK=$f=uP5nQ!7V;2xJhu|3x;x@`L=CH<>x9`W)+IJ^v+L)LcZd@(0V@%w)6t zK#pfQTEkICo15<_e8PQPoU|Pd`z^oUsgI-=9lw?Tt|r-=8{#7qf5cDmO?6Np009U< z00Izz00bZa0SG_<0uVT}0>Us@R&)Gj6vknDV7_104VKYrG7dcRi=`QCRdduY4(5*) zZm=6#DGWP-G(S!D|A$Qc7T?8Zad>7g5DS9<1Rwwb2tWV=5P$##AOHafoMVBsp|hK1 zFN#LA?RDgeuCuHigne>`arcU*vvtRdy7Xe$?8>MiqfVNu6E^%HpprL`@nrw6-p&6d zzKRb5Z|9%m?-DK@0uX=z1Rwwb2tWV=5P$##&WOMzBgHbD^OE|@Mto7zuInjwM;(u! w@{<#`WI)gF>-se<#cp%H)EPhIr#=6b3@#W~d5YcQOWg6AjWF!eb`)C1U#au;X8-^I literal 0 HcmV?d00001 diff --git a/lib/__pycache__/models.cpython-38.pyc b/lib/__pycache__/models.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fb00978f5a47a08066bec4fd882080821481c9f6 GIT binary patch literal 3367 zcma)9TW=f36`t7}cgZD1xwd;jFLYcdVOom@(l%|Q8fs)XZG-AXP97Er7OS11w9;Pa zSxPPm`bh@b7yW`FK-@RK^;fk2VP5;xzYr8izcWipV&DKCV$RNe&h0yM_-VJ>W+?ys z*S`h?7GC6Wnz!;+;YWTEL_yJx z+GfngSSRXmCOzSt^C*;o4265aqpt8oE8|g5y0RyHjBLoZ+zzu(pelw0%Alt$buJAD5LAxbK7nysj~gZFR3JJ|Kr2cx5^kfRzFN=8DSjV80{QB~fb zynlbm)BULe$5M^*>|j(>Lgw|>WTyQ%R&t`^_=m)S1;Y5ezr1m4HJK8~R)vg3)$sfa zG^XsFJ$I&jVJ++hTX4ZIoagSs`O;drFF9vu*)N&-I_B#_GHY+>=m1_=7;n<i0j-YjYpJ`OTF=u5Vg1BpLD2knf^nl)@MMOBnPe zhbq{yjV~1N+`_196k+YNS9}j*yn`LueF_D@B$X0U#RoIp9apENARNtPqO?2C6!7~V z*22N;G_Tdq(2l$+7ZMZX3D+d-HN(K5@o-vN`ykBn_-&Hv_DZVtg?qzIatm^^IM(er zhPRv|48%H&$sTWG}k4CjO`F zuWStT3hRXrcjb=|YR|ceLTjwjM%qNyG8-4{^Zs-A`Z4<(JFz|k)Sp^{?K5>BD_(H} z&7q~Otp~cbg5!sny5_9G_Mt50Unc6|ALvx#%V8Fq-zD~yOeN4N;;NKe+j*5HdHrzf zatDsK5yDsc9ni@p8W{gE7m;e{!Mr->V~nhH)c@usDT%i##0!aRwE8PF476=TJLu@d zQ|~Ph`C`PrWt6iCX7Gpx!{i6Y?wuR)#pULA7JzS=0ri*(Afm z8Dok19nBMbzhP?~m~fOlOJ;w2Bk$PST@h`bJ}uQ({1EByXbqf*}Ryh!EdR(S>z-4P+@s zH4vV+p!<3&6Z5c%pp+%SS_bKtpk4#U8(=ute%vGzOB@^T{5BkuqAq=Ox$g?gbla*> zn~b)LT2t7iEaI3WkDz?QqI?2hn?}B%*B5z(Kd7FS^&lC{y}?*j#bD?(0n0>fgCBZ~ zUl(L_7wM64&S{e6^_VUtgdlaewPJH^#oqA78@rvk`5xU&N2=e0MD67pMrbh}XNaxXBu|fIF>5Zi=}hv>1`U+)s1``n zyIQ$bsiI*hplSM}qVOMuX|KuBn|B@Dud-l8kC=8oLPp-a3C5euV{wNzUy-+Hp}*a{ ey${L0Ce#l2O&;1l-ad<2UpqElL92hSf9L;9dD?sc literal 0 HcmV?d00001 diff --git a/lib/debug.py b/lib/debug.py index 4f922eb69..5de2d36aa 100644 --- a/lib/debug.py +++ b/lib/debug.py @@ -1,9 +1,26 @@ #!/usr/bin/env python3 from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker -from models import Company, Dev +from models import Company, Dev, Freebie, Base if __name__ == '__main__': engine = create_engine('sqlite:///freebies.db') + Session = sessionmaker(bind=engine) + session = Session() + + print("Debug session begins...") + print(f'Companies:{session.query(Company).all()}') + print(f'Devs: {session.query(Dev).all()}') + print(f'Freebies: {session.query(Freebie).all()}') + print("Debug session ends.") + + + + import ipdb; ipdb.set_trace() + + + + diff --git a/lib/migration.py b/lib/migration.py new file mode 100644 index 000000000..275a54637 --- /dev/null +++ b/lib/migration.py @@ -0,0 +1,12 @@ +from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, ForeignKey +from models import Base + +def migrate(): + engine =create_engine('sqlite:///freebies.db') + + Base.metadata.create_all(engine) + + print("Migration completed successfullly!") + +if __name__ == '__main__': + migrate() \ No newline at end of file diff --git a/lib/models.py b/lib/models.py index 2681bee5a..0db3af205 100644 --- a/lib/models.py +++ b/lib/models.py @@ -1,12 +1,15 @@ -from sqlalchemy import ForeignKey, Column, Integer, String, MetaData -from sqlalchemy.orm import relationship, backref -from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy import ForeignKey, Column, Integer, String, MetaData,create_engine +from sqlalchemy.orm import relationship,sessionmaker,declarative_base +from sqlalchemy.orm import registry + +#create engine +engine =create_engine('sqlite:///freebies.db') +Session =sessionmaker(bind=engine) 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): @@ -16,8 +19,35 @@ class Company(Base): name = Column(String()) founding_year = Column(Integer()) + #relationship with freebie + freebies=relationship('Freebie',back_populates='company') + + #relationship with dev through Freebie + devs=relationship('Dev',secondary='freebies',back_populates='companies',overlaps='freebies') + def __repr__(self): return f'' + + def give_freebie(self, dev,item_name,value): + session=Session() + new_freebie=Freebie( + item_name=item_name, + value=value, + company=self, + dev=dev + ) + session.add(new_freebie) + session.commit() + session.close() + return new_freebie + @classmethod + def oldest_company(cls): + session=Session() + oldest=session.query(cls).order_by(cls.founding_year).first() + session.close() + return oldest + + class Dev(Base): __tablename__ = 'devs' @@ -25,5 +55,49 @@ class Dev(Base): id = Column(Integer(), primary_key=True) name= Column(String()) + + #relationship with Freebie + freebies=relationship('Freebie',back_populates='dev') + + #relationship with company through Freebie + companies=relationship('Company',secondary='freebies',back_populates='devs') + + + 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,recipient_dev,freebie): + session=Session() + if freebie in self.freebies: + freebie.dev_id=recipient_dev + session.commit() + session.close() + return True + session.close() + #else: + 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')) + + #relationship with Dev and company through freebie + 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..cbef51517 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,3 +1,67 @@ #!/usr/bin/env python3 # Script goes here! + +from sqlalchemy import create_engine +from models import Company, Dev, Freebie, Base +from sqlalchemy.orm import sessionmaker + + +engine=create_engine('sqlite:///freebies.db') +Session=sessionmaker(bind=engine) +session=Session() + +#clear existing data +session.query(Freebie).delete() +session.query(Dev).delete() +session.query(Company).delete() +session.commit() + +# Create companies +google=Company(name='Google',founding_year=1998) +microsoft=Company(name='Microsoft',founding_year=1975) +tesla=Company(name='Tesla',founding_year=2003) +meta=Company(name='Meta',founding_year=2015) + +#Add companies to the session +session.add_all([google, meta, tesla, microsoft]) +session.commit() + +#create devs +bill_gates=Dev(name="Bill Gates") +mark_zuckerberg=Dev(name="Mark Zuckerberg") +larry_page=Dev(name="Larry Page") +elon_musk=Dev(name="Elon Musk") + +#Add devs to the session +session.add_all([bill_gates, mark_zuckerberg, elon_musk, larry_page]) +session.commit() + +#Create freebies +# bill_gates.freebies.append(Freebie(item_name="Macbook Pro",value=10, company_id=microsoft.id)) +# larry_page.freebies.append(Freebie(item_name="google pixel",value=5, company_id=google.id)) +# elon_musk.freebies.append(Freebie(item_name="Tesla Model X", company_id=tesla.id)) +# mark_zuckerberg.freebies.append(Freebie(item_name="games", value=8, company_id=meta.id)) + +freebies=[ + Freebie(item_name="Macbook Pro",value=10, company=microsoft, dev=bill_gates), + Freebie(item_name="google pixel",value=5, company=google, dev=larry_page), + Freebie(item_name="Tesla Model X",value=50, company=tesla, dev=elon_musk), + Freebie(item_name="Games", value=8, company=meta, dev=mark_zuckerberg) +] + +#Add freebies to the session +session.add_all(freebies) +session.commit() + +#Print test data +print(f"All companies: {session.query(Company).all()}") +print(f"All devs: {session.query(Dev).all()}") +print(f"All freebies: {session.query(Freebie).all()}") +print(f"Bill Gates' freebies: {session.query(Freebie).filter(Freebie.devs.any(Dev.name=='Bill Gates')).all()}") +print(f"Freebies for Google: {session.query(Freebie).filter(Freebie.companies.any(Company.name=='Google')).all()}") +session.close() + + + + From 499c62b21a0dcca988c1e4bd1e0ee165714e2bd1 Mon Sep 17 00:00:00 2001 From: Scolastica Nzyoki Date: Thu, 6 Mar 2025 14:22:24 +0300 Subject: [PATCH 2/3] Corrected seed.py file to output expected results --- freebies.db | Bin 16384 -> 16384 bytes lib/__pycache__/models.cpython-38.pyc | Bin 3367 -> 3390 bytes lib/models.py | 6 +++--- lib/seed.py | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/freebies.db b/freebies.db index 531fa82868f1f75ce62bc6a2db115ff2e7796ea8..6829605e6b94afea7625f1d209ce752eb6ca90cd 100644 GIT binary patch delta 19 acmZo@U~Fh$oFL68H&Mo!QEp?x0($^C$_2~- delta 19 acmZo@U~Fh$oFL7}HBrWyk!xeZ0($^Bo&}@; diff --git a/lib/__pycache__/models.cpython-38.pyc b/lib/__pycache__/models.cpython-38.pyc index fb00978f5a47a08066bec4fd882080821481c9f6..2b5cc562fff43efdfa40fe75eed699783d653a89 100644 GIT binary patch delta 200 zcmZ23wNHvSl$V!_0SJVePNwhN$h(4xc_nky<{eC}%v@|hVFw^Cj+y+PQDbsGn+PjM z3TH3N)*>mO%;bwq2AjFr_cAdGOg_meJ=vCxld%e@*l4l>m$Ft0M=x^}Un*}3 zX9{BqJDA6x!j;0^!Vo2p!jr-aqyf*CaVCuef$C{^(%=jSFCB<5wN7VD&>mKAF< k6^R2aDUt>e0ubwrHeclGU}WZF55XOI8qo>*nw>R6wVZ`7KSK+6z&urAT5}}8_b}|H#vh#hp9+x^E$3WjLbZYJd=xg LOo5iK' diff --git a/lib/seed.py b/lib/seed.py index cbef51517..a0ddade03 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -58,8 +58,8 @@ print(f"All companies: {session.query(Company).all()}") print(f"All devs: {session.query(Dev).all()}") print(f"All freebies: {session.query(Freebie).all()}") -print(f"Bill Gates' freebies: {session.query(Freebie).filter(Freebie.devs.any(Dev.name=='Bill Gates')).all()}") -print(f"Freebies for Google: {session.query(Freebie).filter(Freebie.companies.any(Company.name=='Google')).all()}") +print(f"Bill Gates' freebies: {session.query(Freebie).join(Dev).filter(Dev.name=='Bill Gates').all()}") +print(f"Freebies for Google: {session.query(Freebie).join(Company).filter(Company.name=='Google').all()}") session.close() From 45116c42195008345ceecc4679735ae83dd94329 Mon Sep 17 00:00:00 2001 From: Scolastica Nzyoki Date: Thu, 6 Mar 2025 14:56:50 +0300 Subject: [PATCH 3/3] updated the models.py file --- freebies.db | Bin 16384 -> 16384 bytes lib/__pycache__/models.cpython-38.pyc | Bin 3390 -> 3405 bytes lib/migration.py | 4 ++++ lib/models.py | 4 ++-- 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/freebies.db b/freebies.db index 6829605e6b94afea7625f1d209ce752eb6ca90cd..bd49a546bacccab6cd646975bea146d1dcd7936e 100644 GIT binary patch delta 19 acmZo@U~Fh$oFL7pH&Mo!QEy|y0($^Dx&`b2 delta 19 acmZo@U~Fh$oFL68H&Mo!QEp?x0($^C$_2~- diff --git a/lib/__pycache__/models.cpython-38.pyc b/lib/__pycache__/models.cpython-38.pyc index 2b5cc562fff43efdfa40fe75eed699783d653a89..1cf198aa9842b9b3203fc683421017c0a829a03a 100644 GIT binary patch delta 90 zcmdldbykWul$V!_0SKadPo{6*$ZN+X%ay{>%N)g@!kxm?!Vo2p!kfYeqygBdgh qCTDQzvhXG6=T4r*CBt9Emy%jmtOMj0B<5wNPQJioy!i!J7!v>>NEvYe delta 75 zcmX>rwNHvSl$V!_0SJVePNwhN$ZN+X%bvo~%N)g@!j;0^!Vo2p!jr-aqyf*CaV cCueZ!vhpYA=O#{`$t5%SB9qbP?_6O_0KH8U#sB~S diff --git a/lib/migration.py b/lib/migration.py index 275a54637..dec024ccb 100644 --- a/lib/migration.py +++ b/lib/migration.py @@ -4,8 +4,12 @@ def migrate(): engine =create_engine('sqlite:///freebies.db') + print(f"Tables before migration:{Base.metadata.tables.keys()}") + Base.metadata.create_all(engine) + print(f"Tables after migration: {Base.metadata.tables.keys()}") + print("Migration completed successfullly!") if __name__ == '__main__': diff --git a/lib/models.py b/lib/models.py index c1dbcd875..a7734565b 100644 --- a/lib/models.py +++ b/lib/models.py @@ -93,8 +93,8 @@ class Freebie(Base): company_id=Column(Integer, ForeignKey('companies.id')) #relationship with Dev and company through freebie - dev=relationship('Dev',back_populates='freebies',overlaps='comapanies,devs') - company=relationship('Company',back_populates='freebies', overlaps='comapanies,devs') + dev=relationship('Dev',back_populates='freebies',overlaps='companies,devs') + company=relationship('Company',back_populates='freebies', overlaps='devs,companies') def __repr__(self): return f''