From 953dc219aebdb7933aa5fb74e5afed2f479e704f Mon Sep 17 00:00:00 2001 From: victor Date: Wed, 6 Dec 2023 15:50:01 +0300 Subject: [PATCH 1/2] added faker --- lib/__pycache__/models.cpython-310.pyc | Bin 0 -> 1324 bytes lib/freebies.db | Bin 20480 -> 24576 bytes .../__pycache__/env.cpython-310.pyc | Bin 0 -> 1841 bytes .../2547436a6056_create_freebie_table.py | 37 ++++++++++++++ ...1aa4cc_add_freebies_relationship_to_dev.py | 28 +++++++++++ ...f48c_create_companies_devs.cpython-310.pyc | Bin 0 -> 1048 bytes .../7a71dbf71c64_create_db.cpython-310.pyc | Bin 0 -> 677 bytes ...87_add_freebies_relationship_to_company.py | 28 +++++++++++ .../fa9d3b8d84c4_create_freebie_table.py | 28 +++++++++++ lib/models.py | 20 +++++++- lib/seed.py | 45 ++++++++++++++++++ 11 files changed, 184 insertions(+), 2 deletions(-) create mode 100644 lib/__pycache__/models.cpython-310.pyc create mode 100644 lib/migrations/__pycache__/env.cpython-310.pyc create mode 100644 lib/migrations/versions/2547436a6056_create_freebie_table.py create mode 100644 lib/migrations/versions/58de0c1aa4cc_add_freebies_relationship_to_dev.py create mode 100644 lib/migrations/versions/__pycache__/5f72c58bf48c_create_companies_devs.cpython-310.pyc create mode 100644 lib/migrations/versions/__pycache__/7a71dbf71c64_create_db.cpython-310.pyc create mode 100644 lib/migrations/versions/fa0b8465e187_add_freebies_relationship_to_company.py create mode 100644 lib/migrations/versions/fa9d3b8d84c4_create_freebie_table.py diff --git a/lib/__pycache__/models.cpython-310.pyc b/lib/__pycache__/models.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..35ebbdd96956dfc8c690e4ba5d24429fa9b14b03 GIT binary patch literal 1324 zcma)6J#XAb5Zxtt$B*Nk&yMruIEhmP@D(~5aF+;%5g7@LAZo0N&4S0BlNfPHdPp67 zLOQwiFEIQA{Fk;(Z&~{8tbpJ{1jomkan&iFEgar2GlBR z!8+^H^PktJ>c@v&wkknYnSn)1Fz@eCkFGsb0uVu~VI~#5O=qYBmDkkxBfwG znylK|Fz+`7v`6oyoitdO47chOwz(W!&3lqt9MJk_Mn=oO#Gm3V-TBU?itgcgxWB9U z;G=v(wLIp7|F%%B-wXVbPJMiyoYV%AO_6ssCeL64W!)GWJ;`eg$>XHib|-bU*F4@^ zBfzSFy$(qOz@#iz$ucpNR<_G#YXhYa8dT~t?#UrDljrkY56e%%!^MO%xfi8uq!bl6 zBe9f?m3n!WmAlAPU21a)k!MAw+d75D5u>||rtA8w(k$5)GQ_Vrz=I9UR}80QVp=Vm zKzMTIL^6`G(?@O=_7SE3A7OWLhC4Z3V$ymVHtiAKq7pZ1hqo!pYK`{k$OF7X5Sc*y zoXzzp{S-XjefHlYa~{))0k08$!=XO@E$_Z#b446}&+v-5o2mMN^1h(e@;{bOR1s0^ zKU~ah)V?gUGCu*cMOJxmMPGePK0CWkTGnXL=fr>`_XZJo)h!3l7(-5ot{)$=TGso8 qUU#ok-@|~Eo*rh#2K$%4qbK|@T4wRSn9EptuJ>=`M$X*18~q3I2Q*Fq literal 0 HcmV?d00001 diff --git a/lib/freebies.db b/lib/freebies.db index 12beb1c963e832db481e7a7493e3029e691ac4dc..72ce91d04fe01c170b40c25b7a4a34dd172f014d 100644 GIT binary patch delta 1136 zcmaKr&2Jk;7{+J6v;LUZjuV9@4H*tqYc)oo_CUqScD8ZqG%b!rR8(Y*cPH7A*R#>? zI+j7m0f{4Oq5nXI#2UP!hjiz0;|CXW3_ul8aow z)p0h~w@BN$bLq@bB^~Fw({Z+%&Nj*9)O?A1)&H45VqB3NJvlz#IOBV+>4_)pm#ZEv z;wRtck`N#E~^d712(B`yZ)F)$vf89 zbE=N2>JAMCEUMiIeG!Mk`k|=kXi05w&kZAH{g$HSpoQQm9K(+ozJyQVKD-A4?m|m4 zt-^FRr=iQOFbF1OhX(_R5Q>tmp^J@(3XhX@8VME^XEgNE8ajKMGwI#}z{@TP9kTE@=`Tjl7GxQ7}&yX79-}TG9$eRyk1^FjLFxDYvb7;U2ci iS{6>iJtk43c{PXCj6C+~fYszKDcLUV(l~iTRsRJg_9OuS delta 118 zcmZoTz}T>Wae}lUD+2=q2*UvLL>*&MRtCLzSzi7h3@m(74E((OJNfGQq&5o*EaTlQ q#dlkfE6v;}+0-H_&BS8!fBA3xf(U*xFUTMPpxXQV6DLTsp>hFx#Tq>T diff --git a/lib/migrations/__pycache__/env.cpython-310.pyc b/lib/migrations/__pycache__/env.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f837e6f67b0d9088b18038faf25682c80b4a042f GIT binary patch literal 1841 zcmZux&5ztP6t^>(%uMEEw}n z3nAfdsTN|1qw}DaLP5IFWszo^*{~{0iPj#@Sa@Q0Q4jBM15KpC)>>uG*``rc@G!_- z?B;tEmK@QX9@FQ<2J6l79C@G7{I)Wce_LM%16qEvguq(E%jb)sD_wXCPo~xXx5@!_q${)#f+)~!d)#(gFk37quvV1PV?^=Nd z#tl0FDR&sVbI8nNQB^`MeZbZe%QX0G{gwk@d8w{i2K%6x0?09odv|U>xX*0K=ICyp z3+W=9RC1R~iTRhC^mpJ1WVMBB3G?Bh5Y|Uq3g^*S?ZcOD&POzv7L{dXZL8XzIDI-X zKS?gL6%>a%wU&ELTyf0{V-F=XUBwH?ld$QasoAnzFTth-Se|pso3RuYG?(dIsN6K8 zTyP1QP0Pxf-K5tzawKReE~K z3Du5vzZ3ld{{H%Qx+)8p?u*QpdU_AfQI=H!%1$%9|LLu1b%|fI|a4BQyn%J-wl_Z;OR03GasUeMKOfFx@9cWFCW)T@@_!ss|Dn)*g%Co_n+z1!qC}Lpcy(BG zkVdR-*z%S`+?X;G-sS+S5Epo(E#=N|a0A2P85kx(6IB`(;z=`b4^Sr2*^DWv^p~PlRhi+AWx0dn&hVieQ%hSVC zZ#zE@nEIR(=TTr{!;=&oFZCs7a8PW8gGh7XeGK{Y{0vRT;V3}R1T>`4KXHVTMsMOU zrkCGLUI*PPul2{cBnfm6f4j+cGm+&IIkDVnlh+PfO?-M(ZLz+L9#XHEi>yuF*S~#I zvU})L$K)n*52G|Xa(?<79=BCG9Q*jqmM|OWr*6ZU5`D40&i?0UswI5kUVZZsiV+zF XBRUGA(3LcbA{zJOOZ|&6je~yyonG@< literal 0 HcmV?d00001 diff --git a/lib/migrations/versions/2547436a6056_create_freebie_table.py b/lib/migrations/versions/2547436a6056_create_freebie_table.py new file mode 100644 index 000000000..a35fa6754 --- /dev/null +++ b/lib/migrations/versions/2547436a6056_create_freebie_table.py @@ -0,0 +1,37 @@ +"""Create Freebie table + +Revision ID: 2547436a6056 +Revises: fa9d3b8d84c4 +Create Date: 2023-12-06 15:36:40.060181 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '2547436a6056' +down_revision = 'fa9d3b8d84c4' +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('company_id', sa.Integer(), nullable=True), + sa.Column('dev_id', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['company_id'], ['companies.id'], name=op.f('fk_freebies_company_id_companies')), + sa.ForeignKeyConstraint(['dev_id'], ['devs.id'], name=op.f('fk_freebies_dev_id_devs')), + 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/58de0c1aa4cc_add_freebies_relationship_to_dev.py b/lib/migrations/versions/58de0c1aa4cc_add_freebies_relationship_to_dev.py new file mode 100644 index 000000000..5eaf5e6a3 --- /dev/null +++ b/lib/migrations/versions/58de0c1aa4cc_add_freebies_relationship_to_dev.py @@ -0,0 +1,28 @@ +"""Add freebies relationship to Dev + +Revision ID: 58de0c1aa4cc +Revises: fa0b8465e187 +Create Date: 2023-12-06 15:41:07.352450 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '58de0c1aa4cc' +down_revision = 'fa0b8465e187' +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__/5f72c58bf48c_create_companies_devs.cpython-310.pyc b/lib/migrations/versions/__pycache__/5f72c58bf48c_create_companies_devs.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1ac1fb138839870395f497afe3eb3e06b20167eb GIT binary patch literal 1048 zcma)5O>fgc5cOAV$4w9_72;@#QzTO7vndfmNU4x2qzKWTajJ165_=lJBg@7^_D^6o|et#%} zCOE|>G=+An6TL9ro5U!LTWhNklUQHOU8IJQ8b<89h*O=ZBDXd%w)(cFmpJbK;Z#`` z60RYM^{K4i(I<_ByvFWax=Pb%o`SS!l)qTo?Ni?13#M4X-ZaT6?A2EjUs z3&w*pSVPM43}_L=j6l#2@=dX1w4L|c3l1<(pp7W;2jD@P%!4es;!%OZi(n00-2f5n zixgJ1-gO+RPLA`9bXGa05_qJvd5p$34t4doy7kkxOV9nqk8tZRQPsWPiTVVcQq-+p z$$}D9RGU+NfcxA=(=tl(Ji=LCQg_cn>8VO&ov<6aE9@yQg@wj59_Ua7;vVmT$KyMmn9V5B7QFBAgGI=9L(a|7h0Fa!31va-@JGU(p zJKV`#aPtdr@`-j&yAKp5;C*xRKu10VI-=m*k@@uN$68`JVh9zb?{MD?jp)L+>nvQA zs~D>LRa`G$olbDbLV9~jU+X(rc)hqzqD2zLX&9&3BF)nDDvg)RB&PI-)<@=+vPHj9 zm*>^gMB=!UU2QVXP4`P~wf}TA0J$TN*5;8&PqQcZ^}x2GMYeD1QAoDNJ#x{v*o~|f zfGlDCVcd!?>XYbRB32DXqb%zOl#DkOYnxB99Ceoi+oLq?4(wcAar%$~s;mB>yj`!; z0bdwdwg%Udf!_YBU0xWq69a$iK2cvEr~t&5?pXGv$uk3&Qw?)ln$9=#sq%^fL|qih zD>=4RQ%m!>qQhri@_LKyLD@s8eEDZ&YG!H{PqdO{S8oemR>%iM0ekFVC`5OZe|+v= ffk$orO)Fr>@wFMo@LYpSE 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/fa9d3b8d84c4_create_freebie_table.py b/lib/migrations/versions/fa9d3b8d84c4_create_freebie_table.py new file mode 100644 index 000000000..1b00519ec --- /dev/null +++ b/lib/migrations/versions/fa9d3b8d84c4_create_freebie_table.py @@ -0,0 +1,28 @@ +"""Create Freebie table + +Revision ID: fa9d3b8d84c4 +Revises: 5f72c58bf48c +Create Date: 2023-12-06 15:22:46.316514 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'fa9d3b8d84c4' +down_revision = '5f72c58bf48c' +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/models.py b/lib/models.py index 2681bee5a..04b0dd763 100644 --- a/lib/models.py +++ b/lib/models.py @@ -1,5 +1,5 @@ from sqlalchemy import ForeignKey, Column, Integer, String, MetaData -from sqlalchemy.orm import relationship, backref +from sqlalchemy.orm import relationship from sqlalchemy.ext.declarative import declarative_base convention = { @@ -16,6 +16,8 @@ class Company(Base): name = Column(String()) founding_year = Column(Integer()) + freebies = relationship('Freebie', back_populates='company') + def __repr__(self): return f'' @@ -23,7 +25,21 @@ class Dev(Base): __tablename__ = 'devs' id = Column(Integer(), primary_key=True) - name= Column(String()) + name = Column(String()) + + freebies = relationship('Freebie', back_populates='dev') def __repr__(self): return f'' + +class Freebie(Base): + __tablename__ = 'freebies' + + id = Column(Integer(), primary_key=True) + item_name = Column(String()) + value = Column(Integer()) + company_id = Column(Integer(), ForeignKey('companies.id')) + dev_id = Column(Integer(), ForeignKey('devs.id')) + + company = relationship('Company', back_populates='freebies') + dev = relationship('Dev', back_populates='freebies') diff --git a/lib/seed.py b/lib/seed.py index b16becbbb..0e86db81f 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,3 +1,48 @@ #!/usr/bin/env python3 # Script goes here! +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker +from models import Base, Company, Dev, Freebie +from faker import Faker + +# Replace 'sqlite:///your_database.db' with your actual database URL +DATABASE_URL = 'sqlite:///freebies.db' +engine = create_engine(DATABASE_URL) + +# Create the tables +Base.metadata.create_all(engine) + +# Create a session +Session = sessionmaker(bind=engine) +session = Session() + +# Create Faker instance +fake = Faker() + +# Populate Companies +for _ in range(5): # Create 5 companies + company = Company(name=fake.company(), founding_year=fake.year()) + session.add(company) + +# Populate Devs +for _ in range(10): # Create 10 devs + dev = Dev(name=fake.name()) + session.add(dev) + +# Populate Freebies +for _ in range(20): # Create 20 freebies + freebie = Freebie( + item_name=fake.word(), + value=fake.random_int(min=1, max=100), + company_id=fake.random_int(min=1, max=5), # Assuming 5 companies were created + dev_id=fake.random_int(min=1, max=10), # Assuming 10 devs were created + ) + session.add(freebie) + +# Commit the changes +session.commit() + +# Close the session +session.close() + From c153e37f7801326e3cc84b12e7820f3cdf9cb355 Mon Sep 17 00:00:00 2001 From: victor Date: Wed, 6 Dec 2023 16:51:55 +0300 Subject: [PATCH 2/2] completed assignments --- lib/freebies.db | Bin 24576 -> 24576 bytes lib/models.py | 27 ++++++++++++++++----------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/lib/freebies.db b/lib/freebies.db index 72ce91d04fe01c170b40c25b7a4a34dd172f014d..c135cdab989fbf5dd0a144349cceea6a17f8faad 100644 GIT binary patch delta 1535 zcmXw2TWnNC7(TZ>htoYXvlo|3OWRWcu|fqDlsmLr5DKlNRqG98c6Zo4_Uz1N=A5nD z1Q#E8!+`X`C*vhPn3$*pH6}*wgHOh&B*YglBx-ym@Zhum>1iMTneYGp@B99lOH2Bt zCH-2Tj^El?*71$=AMV(k!3CJ|rMF_r&f5D&NxAEnh`P^CD z&E+g@$e0w8ap9ljRp;Llv9xW*8Cna%kd92pO0h6>{_wG-jT+Oe!_;>FnTBXmr4S=oVJ4$a*B)BoSz3gOFLwwo!k9MU}w_rCKO{-%8v7o zpG_vr20UUC`p06`Se`Ho(113Tb9=DI(vBF%V+IgFoEGye)ex~ngY#?2O|+k^03k>Z zs*R@LHD{@~#?rPLGcCreY-F-prC{h5aV%}nGiF72f%&ITmz|}>t4HFa1L&4U?vmfh z59AB-0l7vl5>8$wC&)gsnUsi*@8LW6NBkB32ruF;p2N@Mal8u;;4JzN{e^BptZ$+& z88Edi6I3+=&iq+gV}*WG+cv5iA!GjWpdK?RXmO*djg&h)Y6R4OO7I05GL`Q$wc$xB z>r}GHFNajl<$K`>$OQLSv&e6NqiI%QV8)*ivPOAfJxn;of~et_yG*ue5>kF0;L^iU zUV~f(FRTUJgy1x4Q0`CAs;H%EwB8VGfoUakfc9zjL zlLZV+EB5@Epb48(2$|Z@glKSov>k-B=z*dYC98QYpe$fUd7XtYKMV^!KyzYo>gg}d zgWlmq=gjaK{3(7PUx!`2ieJJL_z)h!KF(tk-A8|;+vq#=8G098M_trH6iuU1v>Rxb)r*J2gPPR_FM<0&Tj8}fkZ6dtp+L4YXHWKqy$iewzJ z3))=WjU)|t!0T3SXChPA;W5OLhWU(*cdU+TGu{in9!-VT0~z+1YqBG@mWPI}xL}zU z*`B(r3LXLDu!FXx=mwK)zu}@s(okp}RJjHkPRk~%1+;ACA6{1If`PaS^O3ydY$g!tb6j(57VrZbdRWH=98Z zraklUN6uLpGPG>i4R~9GZFbo7{50rLMC(lx4W?)XFY;){%nqb(YhsUO$a$hj*-4ptP<6LhBH&qNt#MxKocOY{ZU`1=|7Kl0z^Kf=F-e*u60WlCJr4n5H z9t`~N`S0+b;@`@@h<^fqEq@+=48I3Zg%1B@5C1*PB7A!%vj=Db1$y~5?~QY21OV8_ B9##MV diff --git a/lib/models.py b/lib/models.py index 04b0dd763..f1e9a6e94 100644 --- a/lib/models.py +++ b/lib/models.py @@ -1,4 +1,4 @@ -from sqlalchemy import ForeignKey, Column, Integer, String, MetaData +from sqlalchemy import Column, Integer, String, MetaData from sqlalchemy.orm import relationship from sqlalchemy.ext.declarative import declarative_base @@ -17,10 +17,19 @@ class Company(Base): founding_year = Column(Integer()) freebies = relationship('Freebie', back_populates='company') + devs = relationship('Dev', secondary='freebies', back_populates='companies') def __repr__(self): return f'' + def give_freebie(self, dev, item_name, value): + new_freebie = Freebie(item_name=item_name, value=value, company=self, dev=dev) + return new_freebie + + @classmethod + def oldest_company(cls, session): + return session.query(cls).order_by(cls.founding_year).first() + class Dev(Base): __tablename__ = 'devs' @@ -28,18 +37,14 @@ class Dev(Base): name = Column(String()) freebies = relationship('Freebie', back_populates='dev') + companies = relationship('Company', secondary='freebies', back_populates='devs') def __repr__(self): return f'' -class Freebie(Base): - __tablename__ = 'freebies' - - id = Column(Integer(), primary_key=True) - item_name = Column(String()) - value = Column(Integer()) - company_id = Column(Integer(), ForeignKey('companies.id')) - dev_id = Column(Integer(), ForeignKey('devs.id')) + def received_one(self, item_name): + return any(freebie.item_name == item_name for freebie in self.freebies) - company = relationship('Company', back_populates='freebies') - dev = relationship('Dev', back_populates='freebies') + def give_away(self, other_dev, freebie): + if freebie.dev == self: + freebie.dev = other_dev