From 070f07a2a771402d68f6b927d0c6d28f0cf9d21a Mon Sep 17 00:00:00 2001 From: Peter Bwire Date: Wed, 28 May 2025 13:50:58 +0300 Subject: [PATCH] Final commit --- lib/__pycache__/models.cpython-38.pyc | Bin 0 -> 2893 bytes lib/debug.py | 6 +- lib/freebies.db | Bin 20480 -> 24576 bytes lib/migrations/__pycache__/env.cpython-38.pyc | Bin 0 -> 1691 bytes .../508a007b637b_create_freebies_table.py | 37 ++++++++++++ .../7534e3cc22fb_create_freebies_table.py | 37 ++++++++++++ ...b637b_create_freebies_table.cpython-38.pyc | Bin 0 -> 1112 bytes ...bf48c_create_companies_devs.cpython-38.pyc | Bin 0 -> 1069 bytes ...c22fb_create_freebies_table.cpython-38.pyc | Bin 0 -> 1114 bytes .../7a71dbf71c64_create_db.cpython-38.pyc | Bin 0 -> 704 bytes lib/models.py | 54 +++++++++++++++--- lib/seed.py | 33 ++++++++++- 12 files changed, 155 insertions(+), 12 deletions(-) create mode 100644 lib/__pycache__/models.cpython-38.pyc create mode 100644 lib/migrations/__pycache__/env.cpython-38.pyc create mode 100644 lib/migrations/versions/508a007b637b_create_freebies_table.py create mode 100644 lib/migrations/versions/7534e3cc22fb_create_freebies_table.py create mode 100644 lib/migrations/versions/__pycache__/508a007b637b_create_freebies_table.cpython-38.pyc create mode 100644 lib/migrations/versions/__pycache__/5f72c58bf48c_create_companies_devs.cpython-38.pyc create mode 100644 lib/migrations/versions/__pycache__/7534e3cc22fb_create_freebies_table.cpython-38.pyc create mode 100644 lib/migrations/versions/__pycache__/7a71dbf71c64_create_db.cpython-38.pyc diff --git a/lib/__pycache__/models.cpython-38.pyc b/lib/__pycache__/models.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7fffe8e9ac5cceb8cf52efb673d46ffdbe14574b GIT binary patch literal 2893 zcmb7GOK;mo5Z)yzzC_7N^JtqsqBcMQwY8KsXnHZ+AP!O#1$;@`1A&&HxGRe`AM!43 zM}l&)f%cML&<043{wMtny!Mp85cJTQB_+#70wgQ!Xl5VeyuKO!(rUQ`#y>CbjQ_R> z`4@%NVSsQKraT0~2%`x}sZS~LTB4=8ucwA@C|OS$sp*@FH{hJ*TdD2aspC78aPye> z?vI2un0Z2&$=ze!Z-Q(w8)RF_9>@-JL3WkgV$Fx7=e>k?lO8SI2f5(!PWCgO_O#Ly zJPC_9&*V6sl-4ke_5>fnu@2)=5(?NmzVqz{Iozk*75pf!dX|Ttq zrS(8?K8$&3RcEHBRA7Kg{XRb|?NPNWPc`3>Jjyc$7k&FM=0|y!Od|?M7Xx`6<`zuZ z2Eyo^?2^C0z-Kxrq;JohjasGdE4m4)7+IKd{Fgi#of7c@+>(q+%7n>1!VKFd*CQM}-Dp`=ZHrMBL7fqy$J~f^ga|4Xj zwtGhD#05_Sw5@C$hRFdhO~wy{n3ZnrW#D_7Xu*?84cLZwA6XqviI0F2AERj1mMFJW znYMUxu)2V8*fa>2L=hSRb&$`3LI=^jjZD9Xkt7P0^c=}{s}OL8dzMi(`2=LzGo z2x>3ffR|PQ&}P>b`kp_s4S5U!Lth3#=>`GB@gPCo3xfTFFsXN1K~RK4$OUy!V6X%f zA0qG_!bWlx$rnh_YHIFaW{T}rVpBtF zQ_WgE+e9?gyhyjpC zqKPafn&=`~LxQ?1`^9^}y(@?t8vx3#K=cT7fWX|j=puCK*Dx3O^5D)Hwl1b2Vhw{L zD{TEiMt~`%o!E%3`%u%4sVX4nR9)on?Zw48`K|MW0w~F!WKa8*P_nNv$Y603PC#8l zWI={%{afNQV8u5`RD2bzoQ)lx@y8Rfc?&iq>SO>&W;aoF!6Oc+V?mzr{zj5VVInvC z%Nv;ZP-&G@0oaJ<3drj5>O~cFSD%9cTKK1P@g))ZV=<6NbGKlsq?>EI0M$KBbmnxf z1<*QcGka9Uxu;h;bm2l}>{%XH#;URq9);6y@tLaFK@!hesK;_|ySFC3!be~z#X6Ec zk~hK&6|FK0zX2*>eTUo~BxgD-y{=OACTvQ~*&0g=BTuQixdn!E{2KcK;w1K6zUduM>U*oU#ysATyR80^Bk6#B5L>)4NBMaPwAjjAu( z-TWw%-LN||yCadO-JVgE3so~!N5Y2wI;58^_?*a!fbk-X6L}AgE!4caQ1jf0cgd+` zFBE9G_yh@BR3+B;$h|J7u-sw7t>zRYcZYVMKC57E_u8c^_meP*#yp*>$NTNGg?=v5 zs!d?B`PWx=_~W9#@--;X)hmF&R#O`H;3K6fv#J!U`uiG9OM9d0XPaoBYU3WL>Cr2i KsdcV*F8>eyHCK`V literal 0 HcmV?d00001 diff --git a/lib/debug.py b/lib/debug.py index 4f922eb69..d38363d0d 100644 --- a/lib/debug.py +++ b/lib/debug.py @@ -1,9 +1,9 @@ +# lib/debug.py #!/usr/bin/env python3 from sqlalchemy import create_engine - -from models import Company, Dev +from models import Company, Dev, Freebie if __name__ == '__main__': engine = create_engine('sqlite:///freebies.db') - import ipdb; ipdb.set_trace() + import ipdb; ipdb.set_trace() \ No newline at end of file diff --git a/lib/freebies.db b/lib/freebies.db index 12beb1c963e832db481e7a7493e3029e691ac4dc..36521af562c905a0f946255e5a6da8e2f6737d5d 100644 GIT binary patch delta 528 zcmZozz}Rqrae}lUHvac%~^vQA$99}KL#oDBTD{5$#T`J{L`H#Sb@ zF=^ssWfzx~Wo*tbNleN~O)E-GP0CCyhS6-!L9UJ=t_mTJPCl**P|?Ybd@@d%C8@db zd5O8H3So{x&K{0IItpBzWr;bZsS2KcA+GMOV1bm>viQstWRc|j+=9fsN}%ZE_k1$R zAYE?$L9U+eehS{Mks1hTO@$y=H`gFnKWEoq1&A=vVG0_VDVpe-Ahw`r0183Wa%pas z;=3itV{U3}l4_isY-E&{v`OI$zZ9|nFEG5A`L8hWf8u|_e`T|vz%hO+K4umMSthr{ zW^S|SN0@QzvUx$O4 znL#`_u_!Tvor#%2)HgFbm7NjD@XF7~1F2`>-^RfIf&Ui&3I1(B9n1K=1X$P@q!}3* zgG(}#vr~&$nVAKc*?_h%GWsMIl;jsMzhGh#VPa!YW#nWGPb^6-QgF&IDalFYXX0Z7 Q>Ez@L(Jju%EGiKJ0P*sP-~a#s delta 120 zcmZoTz}T>Wae}lUD+2=q2*UvLL>*&MRtCLzSzi7h3@m(74E((OJNfGQq&5o*EaTlQ r#dk}P$285{DB08^Db2(pd6U8yej#K5UXW1&K-Ks8Cr*%NL*)VhkJ1_o diff --git a/lib/migrations/__pycache__/env.cpython-38.pyc b/lib/migrations/__pycache__/env.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ee03765731890bf20752bed6e9b011bf781869a8 GIT binary patch literal 1691 zcmZvc&2J+$6u|A7$xJdy(+}9yiUasoBB3CGc25W`Eg&sI)l#|wMMxuO>?BS-o?v_W zv1(7t0S?tloH?XN{-xo_i8D6@f@e>%ZGnl#dG@p4hu`nbvyF`u!Snks@6V3g2>t3N zx1SIukKr{x!oU#25*2uav6BNC6yYfJatLxXio6`jRuPY4jCedxMhQ>mZPq&O=+8KI z@{8tlEIUOyN?}(z?~Zz`#gd;eYqQRG(P(2eOIa6YeI742uaW+qZ@fSlshIcOKWlx7 z2EE@PE;PV(IuVlZmue!WFx%m3DiqHqx-7DMy&5gbQi3*t70b`;0m#uFH5~q9&26Ps z?#!(p3_=IqeR$1d7%W<1hOhA@vcWvOKsI6l3t1#EYh6L|HdwZ<(aXM<;%f-gn)NRQ8GSEQv%P?Oc>GxUukZLopCpH zk&{zlXJlR(ODK7E__^Ot6(g#I6-7Sr>AwR<%4#~hSs`GN<~d(jI+om@nsLnuHRO~_ zIV5E7oS0*=SO_)s4jW4(*W5?zkDPMCO0{bVKjDff&KX4U@!m&IpAcJ;F_=4{LOKtt zO!ldi5P!K2f5^{xURnP3fOz-35Y~H}3TM$+?cJAd&3iPt77I(t$}TFqGWxu4zLiww zGhUnzD=m-ebU`&Oj6IjUZYf%DHi+sFRQ0B%ddh89a7!7rwBC@ya!qA67K)j=#{`u; zw^_Nc=3tQ2adYqWrawi6avG?XZUF{$=T%j7*Uh)b9B|95rpnOV?W_B`QrS(B2UxpC z`x)ui;O~#^8_m01oeUS}_5HgCvK0|;!gjL*1L~zX!h!$Af5u6Q^*va<18e{b&W#85 z8xSnAco|qc53d1S8_ioRxC$@P1zG~0FWQO2Z8x|YLSWrh2(CNy1E+96G{fs4 z)%X6*fxpj3pfYd3fRX^G073Lu9D5*8fP%l{2yl1{w1cftUzSs#aXM@Q)((m~y}6zy zK_7Yo&=+HoHv#*cw^nJo&uQj*XcW6ok~BJYcG~L>YBF;KdcXCiFl%Hpci>i9K0%*b i`vXu_l7HyFtUjGy(8KUXE`c=e;key@(7)ft?cg5}y3n8i literal 0 HcmV?d00001 diff --git a/lib/migrations/versions/508a007b637b_create_freebies_table.py b/lib/migrations/versions/508a007b637b_create_freebies_table.py new file mode 100644 index 000000000..6cda31e25 --- /dev/null +++ b/lib/migrations/versions/508a007b637b_create_freebies_table.py @@ -0,0 +1,37 @@ +"""create freebies table + +Revision ID: 508a007b637b +Revises: 5f72c58bf48c +Create Date: 2025-05-28 11:31:48.344806 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '508a007b637b' +down_revision = '5f72c58bf48c' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('freebies') + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('freebies', + sa.Column('id', sa.INTEGER(), nullable=True), + sa.Column('item_name', sa.TEXT(), nullable=False), + sa.Column('value', sa.INTEGER(), nullable=False), + sa.Column('dev_id', sa.INTEGER(), nullable=False), + sa.Column('company_id', sa.INTEGER(), nullable=False), + sa.ForeignKeyConstraint(['company_id'], ['companies.id'], ), + sa.ForeignKeyConstraint(['dev_id'], ['devs.id'], ), + sa.PrimaryKeyConstraint('id') + ) + # ### end Alembic commands ### diff --git a/lib/migrations/versions/7534e3cc22fb_create_freebies_table.py b/lib/migrations/versions/7534e3cc22fb_create_freebies_table.py new file mode 100644 index 000000000..eb158dff4 --- /dev/null +++ b/lib/migrations/versions/7534e3cc22fb_create_freebies_table.py @@ -0,0 +1,37 @@ +"""create freebies table + +Revision ID: 7534e3cc22fb +Revises: 508a007b637b +Create Date: 2025-05-28 13:47:49.191153 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '7534e3cc22fb' +down_revision = '508a007b637b' +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'], ), + sa.ForeignKeyConstraint(['dev_id'], ['devs.id'], ), + 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/migrations/versions/__pycache__/508a007b637b_create_freebies_table.cpython-38.pyc b/lib/migrations/versions/__pycache__/508a007b637b_create_freebies_table.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5e67ead3eb8aeffa3a0e6d2f8eea13cf6c018d50 GIT binary patch literal 1112 zcmZuwOK;Oa5cb-R?YK#VphDtAt~sPm^Jt?8A*8g03MoP*NGKP}_D&PS`oY>sm7Y14 zf54$R@>BQ=d*#HP1LDN^(KZ#VwWIkykLT@o^|~qH`Stx^@l=(h9~sy_3W67SlUFFH zG?OTyG9!UJlS!s4Oqr=vomFUMrcq_4<29&4wXcNg)cCBwgU-%_Ny663&XO0Uu zN9b$R>~^|?c4yG;4x9V?qu&0gKiuo}`@_zGY5v6gr4|u#6i;TgZO@3dJfexlAzkv& z%f8q?Sue(TlLm@Zx+aut2zEijisXqfZfa@CTt*9FQXa*2Uf4H@Ye?nd&y}@^0=O=opQ(f2;5@6YX$zC zJ1I6Uu~xvd4kp%ik#^B<`zFUCt-W|H^ks~nQh1bAmgOzU+(7wH`E?}o@~==S%1`AF z3YAm&THQ!EX7!7bGZkbi$Y{5WUfSF-#y?E;K69YPw>PBvKtjT(q{N~BYHLpIg2 z`Lzkh-Iavw(<#o+2$zgy>m;gv3V|Iu0i1}+%3(_o8ikeZQ(<~h5If--^~+kJ;~MTE z($OMQT1GL(TG_gMkU~xzp^YQ93__uwPNv5%kI#fUJ$^qGyC)F`e;&Su^%(n)yl5*Vcr6QHGhDX!rXFP80{Brf*a-E~rhBjO1E zfJ1ZSFD*w-oVg(oj2~(v!GX1QJTp7t@rEaDD$WSo~Hc>1%FmFZ4-IaPwy< zh~!8_CQ2m7ilfN6u12b(5zVQQnxhldF>sqiCHg0s7{q+9IrYk_6ALYisHakU=k0mG zz{{W&BysA|5cq=@ffcu`m#_+Xn9$bo(WEt+jr+mq(4P$tgYpFUq&4=&J>t*Cz2IPI zO-r031e>(_-Tt7{9dvr5R&O-v9!&b({fEQh=ha!_MWg=(FnM#yQxzsii7OH(z3r`I_HT39L9;1q>JeN9AHu9z> zmpJDC;Z#`~QZFHm^%GIQB2XwHd5V`e=`xBuKLVjqFNRm5IZKw5gmmt%!DB+pd2Sm_ z!5T!PY=fH>2@3awK24%!OoeewGnfMt`f0{6S=@fX!q{W$=dhk8lxNHfY4%xSHxZ{0 zKR(!tBnI2R2pQN%u!1N_W1yKGBn0eq;c@5;3d0Q+UK9bH1Gm$4wn%6v9du?4zz?B= z(7_vEb`<({9L|}S;XH7A1uP#7Zg2O_tqQoJ!OhFtPuId&rkG0LR^G6?C?rLf_ln2- zsp+L|{$lz0U!Bg!zUcHlRLV|oQLw~BxDgykc_YAD)D$*4tGl9qg4Q&Vbt7$)i@ zxuC_x?xV>y6p~`e><+%$JHl{Xk_4_R3@?J%4}%JopGRI4EFfO921W{#RsV@-=78?C z=`)W83l~QKA}%ZfDNw@Qgcg++-}&do%tvuTmJvLb5ufj((2Ry`YMNX;>W$q$#qbxU literal 0 HcmV?d00001 diff --git a/lib/migrations/versions/__pycache__/7534e3cc22fb_create_freebies_table.cpython-38.pyc b/lib/migrations/versions/__pycache__/7534e3cc22fb_create_freebies_table.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6b139da69fd1a551fe429df77aaff426ba477d59 GIT binary patch literal 1114 zcmZuwKX21O6!+PV?YK!mP{f8JwhXEBr)k;G`vWXO5hkp8d^l2SKlQ=9gbUjGBYazSrpt{k{Isx5uTK zL$oz&_By>myEAC__M6@QXm>c;J=p0Ubi0GTZC_*jN{dJ}NlzxVP0O;jX%Vj&9I`oQ zLH@_)sv{WV5tk@3<%&>}sh>5fX6lu`QZP^byH+q2WGcuQw~V>IbH`W@nCgAz%AnOL zq4t!lat{Wz5N)lIN!1luRj~&O*0XjZt(!_pHKa$Fg~jGklowT2!wh1Vc`%y@TaAVIt#R$TGS8o`>2szILI?gnWP>kog1{DVQsA5AeR4OGfO zS&?g>(xrgr3Qi{>Hx(*<_TL<~-_3;Gd#&xca>07$9aW9q^p|=dZAaa9fvy3)TbRGq(RTwzV zFVe{tn$ny0TAhun(dJZOw-a^V=ZuXyXIJFXBmj299<}R7CZ@zr@aL;vG!^>ULn+YT z;vRX^R#9y%B?&Znk|-4{`lpp6Kl7C51y%>8%T(Fo=^xd+ua=x>Cek`D5}szr urE&mUtU)GCJ%|_mGb2I6)CX1eW!1or4RI@4^^)P`j|H~#`~PpF0f literal 0 HcmV?d00001 diff --git a/lib/models.py b/lib/models.py index 2681bee5a..54d270f18 100644 --- a/lib/models.py +++ b/lib/models.py @@ -1,13 +1,10 @@ -from sqlalchemy import ForeignKey, Column, Integer, String, MetaData +# lib/models.py +from sqlalchemy import ForeignKey from sqlalchemy.orm import relationship, backref from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy import Column, Integer, String -convention = { - "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s", -} -metadata = MetaData(naming_convention=convention) - -Base = declarative_base(metadata=metadata) +Base = declarative_base() class Company(Base): __tablename__ = 'companies' @@ -16,14 +13,55 @@ class Company(Base): name = Column(String()) founding_year = Column(Integer()) + freebies = relationship('Freebie', backref='company') + devs = relationship('Dev', secondary='freebies', viewonly=True) + def __repr__(self): return f'' + + def give_freebie(self, dev, item_name, value): + freebie = Freebie( + item_name=item_name, + value=value, + dev_id=dev.id, + company_id=self.id + ) + 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', backref='dev') + companies = relationship('Company', secondary='freebies', viewonly=True) 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): + if freebie.dev == self: + freebie.dev = dev + +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')) + + def __repr__(self): + return f'' + + def print_details(self): + return f"{self.dev.name} owns a {self.item_name} from {self.company.name}" \ No newline at end of file diff --git a/lib/seed.py b/lib/seed.py index b16becbbb..84e937243 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,3 +1,34 @@ +# lib/seed.py #!/usr/bin/env python3 -# Script goes here! +from models import Company, Dev, Freebie +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker + +engine = create_engine('sqlite:///freebies.db') +Session = sessionmaker(bind=engine) +session = Session() + +# Clear existing data +session.query(Company).delete() +session.query(Dev).delete() +session.query(Freebie).delete() + +# Seed companies +google = Company(name="Google", founding_year=1998) +facebook = Company(name="Facebook", founding_year=2004) +amazon = Company(name="Amazon", founding_year=1994) + +# Seed devs +john = Dev(name="John") +sarah = Dev(name="Sarah") +mike = Dev(name="Mike") + +# Seed freebies +freebie1 = Freebie(item_name="T-shirt", value=20, dev=john, company=google) +freebie2 = Freebie(item_name="Sticker", value=5, dev=sarah, company=facebook) +freebie3 = Freebie(item_name="Laptop", value=1000, dev=mike, company=amazon) +freebie4 = Freebie(item_name="Water Bottle", value=15, dev=john, company=amazon) + +session.add_all([google, facebook, amazon, john, sarah, mike, freebie1, freebie2, freebie3, freebie4]) +session.commit() \ No newline at end of file