From 691be1f64de805fdca2c749de0d2a94cebdddffa Mon Sep 17 00:00:00 2001 From: MACKENA05 Date: Wed, 5 Mar 2025 20:41:21 +0300 Subject: [PATCH 1/2] freebie tracker --- lib/__pycache__/models.cpython-38.pyc | Bin 0 -> 2194 bytes lib/debug.py | 33 +++++++- lib/freebies.db | Bin 20480 -> 24576 bytes lib/migrations/__pycache__/env.cpython-38.pyc | Bin 0 -> 1691 bytes ...93f_add_relationship_between_the_tables.py | 46 +++++++++++ ...orrected_the_foreign_key_att_and_added_.py | 28 +++++++ .../6585dc1bb536_added_pragma_constrait.py | 28 +++++++ .../89f835402024_added_pragma_constrait.py | 28 +++++++ ...tionship_between_the_tables.cpython-38.pyc | Bin 0 -> 1639 bytes ..._foreign_key_att_and_added_.cpython-38.pyc | Bin 0 -> 828 bytes ...bf48c_create_companies_devs.cpython-38.pyc | Bin 0 -> 1070 bytes ...b536_added_pragma_constrait.cpython-38.pyc | Bin 0 -> 757 bytes .../7a71dbf71c64_create_db.cpython-38.pyc | Bin 0 -> 705 bytes ...2024_added_pragma_constrait.cpython-38.pyc | Bin 0 -> 757 bytes ...9039a_create_freebies_table.cpython-38.pyc | Bin 0 -> 978 bytes ...the_junction_tableand_used_.cpython-38.pyc | Bin 0 -> 1093 bytes .../a7048d69039a_create_freebies_table.py | 33 ++++++++ ...d6c_removed_the_junction_tableand_used_.py | 34 +++++++++ lib/models.py | 72 +++++++++++++++++- lib/seed.py | 42 +++++++++- 20 files changed, 336 insertions(+), 8 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/0f87c94b093f_add_relationship_between_the_tables.py create mode 100644 lib/migrations/versions/2b10743f6218_corrected_the_foreign_key_att_and_added_.py create mode 100644 lib/migrations/versions/6585dc1bb536_added_pragma_constrait.py create mode 100644 lib/migrations/versions/89f835402024_added_pragma_constrait.py create mode 100644 lib/migrations/versions/__pycache__/0f87c94b093f_add_relationship_between_the_tables.cpython-38.pyc create mode 100644 lib/migrations/versions/__pycache__/2b10743f6218_corrected_the_foreign_key_att_and_added_.cpython-38.pyc create mode 100644 lib/migrations/versions/__pycache__/5f72c58bf48c_create_companies_devs.cpython-38.pyc create mode 100644 lib/migrations/versions/__pycache__/6585dc1bb536_added_pragma_constrait.cpython-38.pyc create mode 100644 lib/migrations/versions/__pycache__/7a71dbf71c64_create_db.cpython-38.pyc create mode 100644 lib/migrations/versions/__pycache__/89f835402024_added_pragma_constrait.cpython-38.pyc create mode 100644 lib/migrations/versions/__pycache__/a7048d69039a_create_freebies_table.cpython-38.pyc create mode 100644 lib/migrations/versions/__pycache__/b3011e952d6c_removed_the_junction_tableand_used_.cpython-38.pyc create mode 100644 lib/migrations/versions/a7048d69039a_create_freebies_table.py create mode 100644 lib/migrations/versions/b3011e952d6c_removed_the_junction_tableand_used_.py diff --git a/lib/__pycache__/models.cpython-38.pyc b/lib/__pycache__/models.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dda5032a9e9f7d47af1b2392defbb642babbd9d5 GIT binary patch literal 2194 zcmb7FOK;mo5ayB;Um|76j`QkEEz*Y$wgLpbq=pgHMv9_{FLrxapdcvi$YMlN%91uJ zp*Q8~Ur+>SkNzJ$^xErQdno!Ba%pE)lC2^zniAOI&hG5)%zX3hej7!Bf#2`b-%kH@ z4C4<{);}ASC)mngQ3yk@%*YvMxyjAk;#O{RJFoFt?rKH8=Pzh@d3`)VIGf zL|ue04H3fj+~T)Uk3<9YhSu+(z9E{ZH?@8jwx73tz6YDXFg&kyY;-pN!bpsctAeLv z3F&F^4NR4DFwV~MLb+cT6`X=p&T%Ev;#7Ihph^ytDp9qQq?dt;`Vx`~Vkl120y>ro zC1gpJj*D`bPL$hA`XdPg6_!wzIGQITkR7I)0{U4Z(efPPUQz;%*%kayadR-5eK8ot zAAeTS32~9+&?!;vYoFqW*CV(wNC_fdx9niva1DAJ_s7LK6y(foyL^$Q6+G^Cy8{W( zOQGBqJ+!rZX(8}%FUQCPM%Jf%tba9Bo?t6aP=LXiFt{lgx4?$l9Pt&_g~=V%+_`~h zd5dxE`49*jQDwrpuy`Fc#1nBec_;!=e`)YYgor_;+=FpGNs1}=`?`bfom?_rpU5;% zBtK=}r4J+rLCy2m<<-kPR*k`3|mn{e5>h&Y_zlzEC9HLnuepc+!0~ zraDQwlObXnKkD|!0^s=PRs zFp+Wm5&3DNFxafQ^lNuDdDLl;CHWV}Du`p;;0$XfR$&~!I7_nSOcXClWT8rmUlNs- znF>kx%DbdRgYj7*sB)%|Na@p;VgXz#SYOR_U~ynv=-Dj#pNTvxuT zozv8fNbS>6D+VpMTtlnz)@Ts|@>3GD8+S0;I2Alt-Zt33nIcq`pJV$sMOc$HO`XQ0 z&V3%>9i3$TA>>ni!dl5_j^cxCNSB0%f;XdlaJJ1S@KvT^r#@qj6J`I0I7OT6MVzZV?T#0!@1AzpZEtkL`->L_n- laYgOZJzNq`97Y{0kAHdn9X{rYY-n^Ory#MbpZ|f!A`hcI$ zreuUr7?UNvSh$jr(dGVAReg;j${qp_RP~Lrr?z(nw-j-Zmxf8Wh$F-6u*vuLaN}kO zI295eKN6#vY!*LJ1KPA%+heS0F@KV!vY~5roz%6`U7Z}MLoG2^vI5p?IJC#eea$G} z){F%bkM*g&&d74Lt}p2$p~dqX59h~vo*4R~Zs^srUL&KLd8?KG4{qAHF+TEdl9iL-X~kdgX?55k zo;QVPCY{EE{Aglf>oCM&A#so3XeO7#12%d(HXa{@;j4t5Q2E?N*hlakKEwXoRPr6H z%!m@o3!1&wp~QFX^}uqS=(m(0q4Pr7vwGC*)?C|(9;R?8m8fkq&#yDH6a6~o9U%Ax zhj74oAE9(w6w#%M>sTi3kP3G*hbn@Ia+>3i3iHej1@jw6^C7TyJ7h#)8^I6w0-s<9 zwmIh+&}2kLS&U<~z~T(gKP#ps8C}2_KcE5gNXZQXn}Hyn5oL5PlsPeIQm5s|1px#Z v&EgoY`yI;*{23vMWt79QSk(?VJMQl!N~tJy9V%xhP7$v?s$p_$bC delta 214 zcmZoTz}T>Wae}lUD+2=q2*UvLL>*&MRtCLzSzi7h3@m(74E((OJNfGQq&5o*EaMeV zW?>f>6=iJHEJ;ktNli&DD+XcK$twH-3e4={^74$0sbHz({M>@Xyv)>MID=*K6#g9M zMoq@adwH}NnI^yBsRxo7yf&Q7K-)P$F4*Mog`dYX&D<#2)FLU(#3Ff9z!!cYWC31~ SGJ(y44)^&dPLO6pZ&Xp4f{s9DnXHT+ifr-X>_OsuI-|x+{jg1t+^ULo)PmkLO z{pu#SpAaUG;WaZ^v(C5CXk#@?Sr=w~9xpeqk^YWvyg(SKnD^a3 zYkh$Rz26`%G{AK_5t8qhY9gjE+u>>|6wfBQEV6vP8ZF9Ff;NE_%g^iq$k84(9R6d? zZKYN2%&i{`LI>V`c+F!NELviQukj_a!92V`Hevw_StKxPT|x3TShlXw%f6T5YY6g7 z^gj9=9ip!giy_>EegZ}hD@6)1)zpeo86p(fEhiHR0q>HcWPF&W1fHXrFr*2-(%cX` z<8JCAC#S;B$h2EV(~5{BTr{&F4uke~6qvi$7<@$PvctoJq*&Z4o}yD#0E_h@o07M7HiT~u~u^m*TW zBdN@1yf`0LS{~Kuf@)eAdoFq1QncV~5Y-{5>P<`al-sP}mNIH-y&;9=n#yb}6f<>? z2`YJRvvOh0!62#Q=HBZ~e~Jp_G*B(w0u1WTtE%X(n{SUf;FeiUm7%%YSNCQ687|K2`*#myDxs z8xQQ)AXsGaGO&0aUIVx`nzvYR6<(qXv;;g~zITZ&bmRrL9f$E1^s-Hs=?dXw*}aSK zEtp;J#m~S0Ka$mdKz^d2kU*ZvxuRN>z*<9%Bf^0N#H^WpMKU#}%!SuEY!p-n?zI8` zRwt}s=-z^15Y+KP^NBdCJFew(3C4~FVV&L>Y6`chxnf*r)MR67^Vz|mr$e|m-G`y> zy5gJ0alO;jJQGT+*L37|wGS#OpMo3zU2$=GNc5Jo_$Wg6OX}_CTNj1%Jm8;P4h`2V0}QET=%@bl3!}9TatX zb3ILhKJ)~jFUBHo0`@s?t{!DwAUTfWabF;e(OzP*2re=z^$}= lf None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('companyDevs', + 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_companyDevs_company_id_companies')), + sa.ForeignKeyConstraint(['dev_id'], ['devs.id'], name=op.f('fk_companyDevs_dev_id_devs')), + sa.PrimaryKeyConstraint('company_id', 'dev_id') + ) + with op.batch_alter_table('freebies', schema=None) as batch_op: + batch_op.add_column(sa.Column('dev_id', sa.Integer(), nullable=True)) + batch_op.add_column(sa.Column('company_id', sa.Integer(), nullable=True)) + batch_op.create_foreign_key(batch_op.f('fk_freebies_dev_id_devs'), 'devs', ['dev_id'], ['id']) + batch_op.create_foreign_key(batch_op.f('fk_freebies_company_id_companies'), 'companies', ['company_id'], ['id']) + + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table('freebies', schema=None) as batch_op: + batch_op.drop_constraint(batch_op.f('fk_freebies_company_id_companies'), type_='foreignkey') + batch_op.drop_constraint(batch_op.f('fk_freebies_dev_id_devs'), type_='foreignkey') + batch_op.drop_column('company_id') + batch_op.drop_column('dev_id') + + op.drop_table('companyDevs') + # ### end Alembic commands ### diff --git a/lib/migrations/versions/2b10743f6218_corrected_the_foreign_key_att_and_added_.py b/lib/migrations/versions/2b10743f6218_corrected_the_foreign_key_att_and_added_.py new file mode 100644 index 000000000..062a6c0da --- /dev/null +++ b/lib/migrations/versions/2b10743f6218_corrected_the_foreign_key_att_and_added_.py @@ -0,0 +1,28 @@ +"""corrected the foreign key att and added an Integer value i companyDev table + +Revision ID: 2b10743f6218 +Revises: 0f87c94b093f +Create Date: 2025-03-05 15:08:58.052821 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '2b10743f6218' +down_revision = '0f87c94b093f' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + pass + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + pass + # ### end Alembic commands ### diff --git a/lib/migrations/versions/6585dc1bb536_added_pragma_constrait.py b/lib/migrations/versions/6585dc1bb536_added_pragma_constrait.py new file mode 100644 index 000000000..5212c92e8 --- /dev/null +++ b/lib/migrations/versions/6585dc1bb536_added_pragma_constrait.py @@ -0,0 +1,28 @@ +"""added pragma constrait + +Revision ID: 6585dc1bb536 +Revises: 89f835402024 +Create Date: 2025-03-05 16:07:51.278940 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '6585dc1bb536' +down_revision = '89f835402024' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + pass + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + pass + # ### end Alembic commands ### diff --git a/lib/migrations/versions/89f835402024_added_pragma_constrait.py b/lib/migrations/versions/89f835402024_added_pragma_constrait.py new file mode 100644 index 000000000..b5b363566 --- /dev/null +++ b/lib/migrations/versions/89f835402024_added_pragma_constrait.py @@ -0,0 +1,28 @@ +"""added pragma constrait + +Revision ID: 89f835402024 +Revises: 2b10743f6218 +Create Date: 2025-03-05 16:06:59.556811 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '89f835402024' +down_revision = '2b10743f6218' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + pass + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + pass + # ### end Alembic commands ### diff --git a/lib/migrations/versions/__pycache__/0f87c94b093f_add_relationship_between_the_tables.cpython-38.pyc b/lib/migrations/versions/__pycache__/0f87c94b093f_add_relationship_between_the_tables.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ca20509a91641371c1b766db830da84c4e54d629 GIT binary patch literal 1639 zcmZWpPjBNy6!+MU?KtVSo2_6~1Xw~GB9uDYG`rgfAw;VcD?|kg2$TcX#BY+g^*_c= zSE+y#*NP7Shvc~5gwHTnPF(l^aN*6^*=Cm+&C|^LKl9#izS-GvH5}i6@W<@H*0ew6 zVS5;O_!w95DH71e8W7N9lIUZd$h{F8V-w7A0~%usjIoW&0Rybx3E1HLVvd{jsR=Hg zTrj@Ux~=Pd|R*i}@Zg7@@n#s`*Nc9T{~^$gO0P&$h%xI}7e$gk2SLZ${RpvZ*9@QPNRa){<|vq4uTrO#2Rd z0PA<}T(rV0$!WSgV^@W6>q8L16MQl!UBt00p|F5mA@jOjDMYL|j9~oU^fK5o-|SJb z-l875F;kkbYa3lCtAp39D%XJ&3unq1o1obXELaiFSwg=SZ=%75FV&=frEMyzMXRNp^v)unY<54=Jem!s+;&*(uu5QMc$FhO~{_7>ha#kV<97I z`X1TG>5_e&OK!I%>>z+F3<6=(m?e`ath&`Leu!x-5wYYQ)D#Y{KUJ|K9b@sTKUVBa zI8Ct)5xFczOaseV3Pq5mswOJVR&FXwm7w!slEEToAIWdA*h6C4ZQ__FQPa57`418Y B%{c%7 literal 0 HcmV?d00001 diff --git a/lib/migrations/versions/__pycache__/2b10743f6218_corrected_the_foreign_key_att_and_added_.cpython-38.pyc b/lib/migrations/versions/__pycache__/2b10743f6218_corrected_the_foreign_key_att_and_added_.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f0ab0de82025c8f39481d198292398c848c752e6 GIT binary patch literal 828 zcmah{y^hmB5cXf<#Fro>D!Oe`%`(S*^X3*t+$uZ`a8w)I0_S z71F&4&)}AdSD<1X0&&M!Gn!8`{&r@+{Wu&37FvD%ee>v8){h3X%|-AA-Mq!Xt=Qr= zcZ6Lyv12#6E8N)QUfkiGxXazxNAGc$cfZ)&=e^Hf+&`i|4-f_1y|YGVpT4C^Ye*~L zq{@J-m4)=KMtAMO9V1G27kE7W*nv=2`J-(%f*W+>Vc^!C^<>{ZS-Okp z6n=dTGgUxXu=E}z3s+$7D^-T?mCogcg=NMJ&{>!&4m8b}5Fj^T!g60_N{-9fc&!1F z9LAMyD0C?DBrNicW)DQ2l`J0iXzaX2oy!2C;~+h=s^T}UhZpuTOu2W z7tJpCR4mKUJ&gZfSa-1Pv}-H#u~7H9dXxw1mk9q-_c0%x)jp+MrIgk_6Hp|1s+*(h zz&r>h(hQ1y?HE?~^zjAM!-kEXV4|5!Gb&gD!qfqW5+pZN$;0rvIi@wxL6yT)z1M}} XTLIUNe&#s_&mY)5&$ADo`>gvLZgkTv literal 0 HcmV?d00001 diff --git a/lib/migrations/versions/__pycache__/5f72c58bf48c_create_companies_devs.cpython-38.pyc b/lib/migrations/versions/__pycache__/5f72c58bf48c_create_companies_devs.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9d4860bddd91ead46a7d4a3cc0d28807fb53e652 GIT binary patch literal 1070 zcma)5O>fgc5cS%Q?YIdlr9vDdaf(E6nvbSL2qC3HREP>uxcFjiyqm<--gS4KqHsi9 z`wuuYM}7%su6yOgfj@viF#b>*2@b5aNld>+YQ9Ab--hWBgIFICv5E7+^y`&ZCoXs{F;2Ah z*1NM%P@K_L$deSah{}5{LeHh^zNF`oj5uo@9gbVW*{Bx|52mxhL0IlkIc|;cXpc;1 zqrGr{;7&@MLjW7Mdfi^X)9rWmhONEfxVt~@b?-kI42B2$uKNuN(Ar4pJU#Xso5+4+ z6A_MBf@Vv>!aQSh2D08XZoeN)}T=H!YCp&h}0lrT}ABbOclAb zh`vVa8Y*#||HG-WOrTx^8tccZenp_tBk}|;@33VY<7rHl$#6nnspgC?8Hw0DSWzsL zne*JXg$^~SMkzy(6$!e;%9`+anJ{G^v5d~CP}WH%AX)9c5K)4~>KR>4IFp&c5z9Vl zVjFM@^W(x>@Pv8^4o@k=-XWEz8Be|EJkQ5oy1yi=IP0YS z&P-4`jc5n30YZ3jH1(2bE^r17A-!`d^3IUnrg%YB!4(fdUf=z6rR-%2sf6Cj6}t^a z(=D`9JkC$kD%Z|0u>(7QNuBq7A@v>waK3<722m?qOGtWf1yjN@=Yla<(llgbg* zkD{76U~uhD1!mzQfF7W+R4$<@Wkd#?6_pm>`RB!)hY2Ukm_9;)FLPN*WBXcX>}Nx|VGwymOT8fg7BbL4 z&$L_*b*;&b%m_^|!yfd)J{X}z%LW7b-!!nm{$hrMM>YV5m;=TY8=ri>@D7rx{Cq6XMlt94OchQqFMIP5CYk-o%gFN>tP(G88r z1ubO~0J~!M+T}fyJz_`r{nguv9KD<;H&}3QgX*RdrT1RQwAga5+;N4`+)D&tlE}fMO52o=PiiZQKqOIATRg)& zP7~QYT|4SF<5{x9{7~zP*S36|cRgy{{tygxA*`6 literal 0 HcmV?d00001 diff --git a/lib/migrations/versions/__pycache__/7a71dbf71c64_create_db.cpython-38.pyc b/lib/migrations/versions/__pycache__/7a71dbf71c64_create_db.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3670aafb5514f28a9128534504948a53da4286bb GIT binary patch literal 705 zcmah`y>8nu5T<@?$!c5_$k0`*2ZvT%*?d+VH)RUdU+Iqx&xQ{#@zdPQJ#{oh6@%#Jc)*|F*NBZU~<^ePOl4(V&WvkK2==kw`oK8@lqidVCE6~||B zv{=leAoztk$;2|YY_82ozZz~16|`Gb=UqPjdo z%8XX!MzI#V*Yp8YHwI1ns?)=uQl6bPJL7E|Oy_XgiM0`krF_KyccccGc5J2>d3az( zTz;zerC%cbS9*l;F#jmHF3S(&TuX%py=f{DC5*oN z)p?N$mVwYF;Lt$Lbt>zSl8EZ=pl{c@hWe*wXY BseAwc literal 0 HcmV?d00001 diff --git a/lib/migrations/versions/__pycache__/89f835402024_added_pragma_constrait.cpython-38.pyc b/lib/migrations/versions/__pycache__/89f835402024_added_pragma_constrait.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..71f65abd0ed8ae4f51431890b30f4a4d8fba884e GIT binary patch literal 757 zcmah{y^hmB5MKXW?D%pBiHgo`ikzJvhg^gZ;!=PFS8$?nvs!y6v30iBx9c1VH8oGb z3*4LV4BJxi3RH}J2XV((`)NPT?zc1F_|w^$M=;d;AG*(S_)K}J{z9JqONND!5O4}R# zFpym0QZ@o7*W})~x+l^>c7)&Gf=rYUlq|i0iUk``H;t%+4?^bEjs(CAjx5Zj-Z4LiaZI*d?#6hzNp|1WNVNL`aRIjPx{~|{paU- zebCOn#=9JzwUy(H2{Gjm@&E0~0UkSc*4w$5&_gahSDo~8q<^K`|7m=x9ZI=KDb)@u zpiJ^qwohwM-4?7!Gbj(*R7|__ao+l@Rij6mNLHm8Em#7D(jJEzDz2!gy5eQ~Os}AB e23=L|%Tn-t0k7I=siz3GGcsJ;HoDJxGWY{LledZh literal 0 HcmV?d00001 diff --git a/lib/migrations/versions/__pycache__/a7048d69039a_create_freebies_table.cpython-38.pyc b/lib/migrations/versions/__pycache__/a7048d69039a_create_freebies_table.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..34ba8bd55f4e48ada1e62101c36e9d7105baa78f GIT binary patch literal 978 zcmZuv&2G~`5VqHj?YJp|0$1c~kW!~f-Lw%xNU0DNP$3GJT&#_EnwZ*av+ERvGuOTW zhvvwe@Cd))dy4-8HFQ3jianDz{(e1VQ> zQ;q42Bzj7wL@(DyVoXhDPFt)swU{xraXQRk)>oa`%=uzY+fCGFE=Ddh&b02<=R6WX z3-Hbbz$^yo6?B$>>%N7{SjHLmPL9VO9rgDQ*}+kNctqA8>WLBL`Mm%B(D3*dp z<&8}%m73s`uh13Rwa)Z{d@vX($hEoFuuk*JsE`&SEkvxph~1oNkZX&PwZ3klh8pVO zoGRx=2}NS|9J6rvGD%8NR68yp4LMEWooZduWC>kc5X?b!Y8AsuJVhi`)+9@oDOdIh zFJKNrS!aca`CL7CBjS{b)k|1SGA;{2V_tmI#69Gx+^;Ktk)`0LG`avz{bP_9MV9-o zv+_Rm^97X<4*e)&5Jn4{B*5n&{d`p{GTzIFy{3X5awCQClX&K*@m$aX8!G)v5M^hj zzbSs$RB%&$UCM60QuZ>(s|@a!ig(ay#L{=F;rtdQ`cH$(&ssI;4le2jt@TD?aw;rD zyQEgmWg^S#$8II4S37u2wORIwSMNW_-BNZKvMdTiWzz)GSsXQ-@?%1i zXaVU;lnEGaIK%#M-0P2e{joDRnvD9B;qc)8y`w>Y zXxl$wVx_AJ#Im{9-t8>fyB(p#;G|e_8p$_ymqc$0C*K28C|4?0w<_SK00w9-S`kaL zfNo}Fop%vOP$X>3S>~5Od{wv!snY!VtATsO7zz8?CXlvBaT65lj{=%;D^<#VjELn7wBvN6*z+?@{ z%XU=&8asfq^H$w6i$BNXR8qa{=2cm8`t b>tV|9Dj| 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.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/b3011e952d6c_removed_the_junction_tableand_used_.py b/lib/migrations/versions/b3011e952d6c_removed_the_junction_tableand_used_.py new file mode 100644 index 000000000..0efd90754 --- /dev/null +++ b/lib/migrations/versions/b3011e952d6c_removed_the_junction_tableand_used_.py @@ -0,0 +1,34 @@ +"""removed the junction tableand used freebies table as the junction table + +Revision ID: b3011e952d6c +Revises: 6585dc1bb536 +Create Date: 2025-03-05 18:30:22.748102 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'b3011e952d6c' +down_revision = '6585dc1bb536' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('companyDevs') + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('companyDevs', + sa.Column('company_id', sa.INTEGER(), nullable=False), + sa.Column('dev_id', sa.INTEGER(), nullable=False), + sa.ForeignKeyConstraint(['company_id'], ['companies.id'], ), + sa.ForeignKeyConstraint(['dev_id'], ['devs.id'], ), + sa.PrimaryKeyConstraint('company_id', 'dev_id') + ) + # ### end Alembic commands ### diff --git a/lib/models.py b/lib/models.py index 2681bee5a..df43a32d8 100644 --- a/lib/models.py +++ b/lib/models.py @@ -1,14 +1,23 @@ -from sqlalchemy import ForeignKey, Column, Integer, String, MetaData -from sqlalchemy.orm import relationship, backref +from sqlalchemy import ForeignKey, Column, Integer, String, MetaData, Table,create_engine +from sqlalchemy.orm import relationship, backref,sessionmaker from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.sql import text + + convention = { "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s", } metadata = MetaData(naming_convention=convention) +engine = create_engine('sqlite:///freebies.db') + +Session = sessionmaker(bind=engine) +session = Session() + Base = declarative_base(metadata=metadata) +#company model class class Company(Base): __tablename__ = 'companies' @@ -16,14 +25,73 @@ class Company(Base): name = Column(String()) founding_year = Column(Integer()) + #many to many rel with Dev using Freebie as the junction table + devs = relationship('Dev', secondary = 'freebies', backref = 'companies') + + #one to many rel with Freebie + freebies = relationship('Freebie', backref = 'company') + def __repr__(self): return f'' + + #giving out freebies + def give_freebie(self,dev,item_name,value): + new_freebie = Freebie(item_name = item_name, value=value, dev = dev, company = self) + session.add(new_freebie) + session.commit() + return new_freebie + #method to get the earliest founded company + @classmethod + def oldest_company(cls): + old_company = session.query(cls).order_by(cls.founding_year).first() + return old_company + + +#Dev class model class Dev(Base): __tablename__ = 'devs' id = Column(Integer(), primary_key=True) name= Column(String()) + #one to many relationship with Freebie + freebies = relationship('Freebie', backref = 'dev') + + def __repr__(self): return f'' + + def received_one(self,item_name): + for freebie in self.freebies: + if freebie.item_name == item_name: + return True + return False + + def give_away(self,dev,freebie): + if freebie.dev == self: + freebie.dev = dev + session.commit() + + + + #Freebie class model +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}." + + +Base.metadata.create_all(engine) + + diff --git a/lib/seed.py b/lib/seed.py index b16becbbb..7881dd7d3 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,3 +1,41 @@ -#!/usr/bin/env python3 +# # !/usr/bin/env python3 -# Script goes here! +# # Script goes here! +from models import Company,Dev, Freebie,session,Base,engine +from models import session +from sqlalchemy.sql import text + +Base.metadata.create_all(engine) + +session.execute(text('PRAGMA foreign_keys = ON')) + +#clearing existing data +session.query(Freebie).delete() +session.query(Company).delete() +session.query(Dev).delete() + +#creating instances of company +company1 = Company(name='BallersTech', founding_year= 2018) +company2 = Company(name='CrimackSoln', founding_year = 2020) +company3 = Company (name= 'Alpha solution', founding_year=2025) + +#creating instances of dev +dev1 = Dev(name='Cris Jeff') +dev2 = Dev(name='Ann Mercy') +dev3 = Dev(name = 'Monicah Mackena') + + +#creating instances of freebies +freebie1 = Freebie(item_name = 'Notebooks',value = 15, dev = dev1,company=company1) +freebie2 = Freebie(item_name = 'Tshirts', value = 20, dev=dev1, company = company2) +freebie3 = Freebie(item_name="Wristbands", value=10, dev=dev2, company=company2) +freebie4 = Freebie(item_name="Water Bottle", value=15, dev=dev2, company=company3) +freebie5 = Freebie(item_name="Stickers", value=25, dev=dev3, company=company1) + + +#adding to database and saving +session.add_all([company1, company2, company3, dev1, dev2, dev3, freebie1, freebie2, freebie3, freebie4]) + +session.commit() + +print('Data added successfuly') \ No newline at end of file From f37c1b7917dfd880af81c829c58475168e5250d0 Mon Sep 17 00:00:00 2001 From: MACKENA05 Date: Wed, 5 Mar 2025 23:09:06 +0300 Subject: [PATCH 2/2] added test cases --- freebies.db | Bin 0 -> 16384 bytes lib/__pycache__/models.cpython-38.pyc | Bin 2194 -> 3195 bytes lib/debug.py | 29 ++++++++++++++++++++++---- lib/freebies.db | Bin 24576 -> 24576 bytes lib/models.py | 2 +- 5 files changed, 26 insertions(+), 5 deletions(-) create mode 100644 freebies.db diff --git a/freebies.db b/freebies.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&!4Seo`3(Eor+$UJG{0F&Ctd0QUVy`$o#Aq3=QlI^uWr{j zFy8w1`-2>_{}8i2Y%sU+RNsMcgR{)YS;TTPGIJ}kayzo~R@BO!$jRNvWu#+fUfzz{ zxgYs?C+g@mD+}^&)YWr4>*X8K2Iej9q%7)-mgsZ$DT_9R%e^xeZHbQ9;%%&45|_@5 zXj^o}CilVbd}8np51tr25Ibj9bQye?_rUiw{~GuW-Ur{;{1vhDVDs7QV(U4>|2FrG z!PbA_i7{}Mf3K7xJt+PzX3Du!X2*G<+)s;I90;kLy;`Qlf$}~Rb#gbU6VVQK$5l1r$xX(LJjHt^4-o?8oHh7P3 zJfZLVypOnSD)&yAPm^L6wI_N4lkdM^sxy^op2%5zgg{w$#fkEk9u3T>T?u&2A(w;=<;34?SwXl~)TgQx0&aCT}uFusOw-&nB48qM1`7uJM7uv@Ugrm)bv z650L>L%xZxe)w{DSmt7wBj%z=hId7ERF~7?XC+}L8BPxo=lJ??QgRVb4wEbcYD6`h z&g#RmxHi3hZQ;nZTGAGBn5E-k4(+Vkoz9dO$5KpX9RHf^G(ikD?=S4yT?!|Zqsu|D zbMR=-ev3(MoSLWBDg5K?sr}fl*)#Lhrfk5>dTub|)P~3AXke>00F!I9sn$u79Sdb~ zaU!o^n}ID~!%MjfSSu^xTsb)7Jgo;U`6~$J+eFA#`5V&h6yj05@KB#uLqd`T2b2d3 zA=z1ZAO`C*pLuM)y>xP2?Lr9YG|oeK6-;eBgOkt6J>!9exBc9B%ud;!@q&$D;XBY# zt%t`#;$Tb3g^b5D)!i?T3r@K+6Nyx<{Zv-GtD;VsapaT+4J*k_NqZ|Z<&q*S ze?jCLkv6T{2va356aN;G0WEe=Z>kDeepqt(0WA||*GNe07RU~sY8%93w%J1je5+># zre}MO$+X4zmQ@e#{nPdUJStXdxJV7dmBcMlzI>SA*L-oR|4L&-6)nrxxDa(^yAq?ib#2#?D` z{1uvu{6K6dKl)_fy2^xXS`M0%&3Eur1Ql2YJ7L)s6aq7*)Hf;hxv^)+_n`orbn;S? z$akBCRZ9PvRxh5IYU|8Q9woC+Ag!q87_iM@^DfzTE*&ADzo+m2K;$}+KN2AuHK^r> zG+UvX0KEp~kBGfNWMzP!g|tRcq3v`LU!d0tEYI>BEt^1gVVvW3jOACtt?qfcx9J&m zxHEQUqPs2mmgWQQa94LYbUf;C+(+;`4SFdx8#K>dj$GYM`8;SU3pM7H{~xO9Ky>`* z(^Y!{+8ElD^-T+#+oSpRy{6rT?|q8e9ga|1ZiI6`^uy1ofZss(8UTERHC>c{7X4p9 zV~PI$V$)RyP@XLZ&Cgp*2!=91TSZOOq$Y~DwXoA^?DWF&QBj3SICsK*S>~Z)yXYwz zbh?;n3#rq*%tF=09iXUVjw?%=RsV+C($<}&trs*#gN;{4-Rf*i>>D|VPn`0|Ule}K zo1*$L8TT>}QhoX-nbZe4FQI5tm8gpZ1f$J=b11uSTphWS6+@=eb~eK38i|7QP< Ge*Z@bea4&s delta 779 zcma))zi-n(6vumZe$gl2=L%KU?6-9F9Wm<#Y9Veu5I1Cg2}6hWyIgIrXsd-U%B=6 zaX)H`>$szf2oX0BHll)9LsStc(y01}9_;NFOo^9$s>g2Hrsot=XU0jl0r%OpHr0j` z1)$6^N=yMzrb_4eGpF}NF!nNI;TsxmgfEhO%CZ1$I!;60a^SpV)C%$E*^rLIBI&AP`?a8A&$9 SQI4iL+g5|-S~c*OeD^neL6wyN diff --git a/lib/debug.py b/lib/debug.py index d8bb30321..1f1e34d85 100644 --- a/lib/debug.py +++ b/lib/debug.py @@ -18,7 +18,7 @@ company = session.query(Company).filter_by(name='BallersTech').first() print(F"Company: {company.name}") -print('Devs who have collected freebies from {company.name}:') +print(f"Devs who have collected freebies from {company.name}:") for dev in company.devs: print({dev.name}) @@ -28,7 +28,28 @@ print(f"Collected by Dev: {freebie.dev.name}") print(f"Provided by Company: {freebie.company.name}") +#Testing aggregate methods -# if __name__ == '__main__': -# engine = create_engine('sqlite:///freebies.db') -# import ipdb; ipdb.set_trace() +# Test Freebie.print_details() +freebie = session.query(Freebie).first() +print(freebie.print_details()) + +#testing company give_freebie() +company = session.query(Company).first() +dev = session.query(Dev).first() +new_freebie = company.give_freebie(dev,'Bags',2) +print(new_freebie) + +#Testing the oldest company() +print(Company.oldest_company()) + +#Test Dev received one() +dev = session.query(Dev).first() +print(dev.received_one("Notebook")) + +#testing give_away +dev1 = session.query(Dev).first() +dev2 = session.query(Dev).filter_by(name= 'Ann Mercy').first() +freebie = session.query(Freebie).first() +dev1.give_away(dev2,freebie) +print(freebie.dev.name) \ No newline at end of file diff --git a/lib/freebies.db b/lib/freebies.db index e54b0807ba3e5c5c08fa107c4a9ef57497ebd7b1..c4f931255bc4ee2db8b6b95f5530c4978757e54b 100644 GIT binary patch delta 211 zcmZoTz}Rqrae_3Xz(g5mMuCk9OY{}^_!SuWtNHKppWxrfKcByk{~doGeBUUkyvQ6LWDYknhYOj*iOk_Z;s`RbF~~DAa{A?$ qq$cI(XBYD`@w2fp$O3H(F3C*JPAw{Cojl*(Ux=R_O_X7gg8~48fGY0* delta 65 zcmV-H0KWf#zyW~30gxL329X>?0S2*Pq%RHy51#-J?hoA$$Pcj(pR*AVjSrKbKTi@6 X0R{jc0SO6CZ**m1Z*OaJ528RIkfRe% diff --git a/lib/models.py b/lib/models.py index df43a32d8..30fa81173 100644 --- a/lib/models.py +++ b/lib/models.py @@ -86,7 +86,7 @@ class Freebie(Base): company_id = Column(Integer(),ForeignKey('companies.id')) def __repr__(self): - return f'' + return f'Freebie (Item Name: {self.item_name} \n Value: {self.value})' def print_details(self): return f"{self.dev.name} owns a {self.item_name} from {self.company.name}."