From 73cc21e30895bda466135daefc39be344ce8bb15 Mon Sep 17 00:00:00 2001 From: Naftaly Ngeru Date: Mon, 17 Mar 2025 12:28:53 +0300 Subject: [PATCH] Completed code-challenge --- freebies.db | Bin 0 -> 16384 bytes lib/__pycache__/models.cpython-38.pyc | Bin 0 -> 3276 bytes lib/freebies.db | Bin 20480 -> 24576 bytes lib/migrations/__pycache__/env.cpython-38.pyc | Bin 0 -> 1691 bytes .../0b2998a43f48_create_freebies_table.py | 35 +++++++++++++++ .../versions/7a71dbf71c64_create_db.py | 11 ++++- ...43f48_create_freebies_table.cpython-38.pyc | Bin 0 -> 1040 bytes ...bf48c_create_companies_devs.cpython-38.pyc | Bin 0 -> 1044 bytes .../7a71dbf71c64_create_db.cpython-38.pyc | Bin 0 -> 1019 bytes lib/models.py | 40 ++++++++++++++++++ lib/seed.py | 29 +++++++++++++ 11 files changed, 113 insertions(+), 2 deletions(-) create mode 100644 freebies.db 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/0b2998a43f48_create_freebies_table.py create mode 100644 lib/migrations/versions/__pycache__/0b2998a43f48_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__/7a71dbf71c64_create_db.cpython-38.pyc diff --git a/freebies.db b/freebies.db new file mode 100644 index 0000000000000000000000000000000000000000..c1d2b6be2f890ce93ecd058fed219d0d8d09038b GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/lib/migrations/versions/0b2998a43f48_create_freebies_table.py b/lib/migrations/versions/0b2998a43f48_create_freebies_table.py new file mode 100644 index 000000000..17be2b0b2 --- /dev/null +++ b/lib/migrations/versions/0b2998a43f48_create_freebies_table.py @@ -0,0 +1,35 @@ +"""create freebies table + +Revision ID: 0b2998a43f48 +Revises: 5f72c58bf48c +Create Date: 2025-03-17 11:40:27.355752 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '0b2998a43f48' +down_revision = '5f72c58bf48c' +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(), primary_key=True), + sa.Column('item_name', sa.String(), nullable=False), + sa.Column('value', sa.Integer(), nullable=False), + sa.Column('dev_id', sa.Integer(), sa.ForeignKey('devs.id')), + sa.Column('company_id', sa.Integer(), sa.ForeignKey('companies.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/7a71dbf71c64_create_db.py b/lib/migrations/versions/7a71dbf71c64_create_db.py index 23e0a655b..da79c5ef5 100644 --- a/lib/migrations/versions/7a71dbf71c64_create_db.py +++ b/lib/migrations/versions/7a71dbf71c64_create_db.py @@ -17,8 +17,15 @@ def upgrade() -> None: - pass + op.create_table( + 'freebies', + sa.Column('id', sa.Integer(), primary_key=True), + sa.Column('item_name', sa.String(), nullable=False), + sa.Column('value', sa.Integer(), nullable=False), + sa.Column('dev_id', sa.Integer(), sa.ForeignKey('devs.id', ondelete='CASCADE')), + sa.Column('company_id', sa.Integer(), sa.ForeignKey('companies.id', ondelete='CASCADE')) + ) def downgrade() -> None: - pass + op.drop_table('freebies') diff --git a/lib/migrations/versions/__pycache__/0b2998a43f48_create_freebies_table.cpython-38.pyc b/lib/migrations/versions/__pycache__/0b2998a43f48_create_freebies_table.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f12a9948543c59bff15b5109f962ff4e55759e18 GIT binary patch literal 1040 zcmZuw&2G~`5cXee$4M$wP|v>RkUC8orHv3mYE@BzdY~XAU#zuvl9<|Sv+D$f zhvvvj@ES;aLgK_L^u+k5Y9!dzj(5J@ot^o<_4{7WQLyn}KNmlAMfqJiyA3hrB@Xcl z4OM)Fs#HtVRP!~poa>418`SVywB?&r_bnVY)v5VSr53fn7=F9)+SEbMq58Gb@7(4Q z2U37L=Kx_0!YxRcfaAP{bu8kHxtHfNcNmUNPfy74cz%3RuYj1jllgQMO-@1tBj>CR zbB?iQ?r1og42I*u(bPRUnjH^kqv_#zGMP?Bj`IieSNf{dvi!>L?nd^zyAg4V$)Q+r z7L_M<+a5Y+I7E)7Q0`Q!7TQOhYK3-ZY!$52_^MY(3y~HgCbb&GZuT_Dole^|g4U$Y zR^8%BL_0fZw?wxl@~j|dy(?)yuqCyazQasAIgeAqH^B{TWIHY(4H!w`0+(#IN|KUO z*;-8+(mczORm!Aw z$qHBim*#cBW44gaMaCgsu-CBpuJC<4U735~EwdCnM&{ld5(+P05&>iH1HjGL%QwX` zV}pD=XzCgioJ2Rky(A93G+uC0;8PIZ8hH68gtseO&}8?(NuB0lzLC}{$DkA)?t!L$>vQ4wk ztjfVfSCnij8b3hW??@{MXch&5v`7MJ7)MP^@hKrmw1jlSd$?2Dy!jVouM8JFx*;bl uS_UXDBtkkAa$r;h8LJAb?)h(8_VYBOs{~%C7{6l1u)3;k7;4q^z20A*C=xsX 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..6f1f7148a4248033dc0f6222fe882a0858116f78 GIT binary patch literal 1044 zcma)5&x_MQ6wV}Rl4e_3)#-k0~jFL~K)+6t`K@4qg7Yl`wM54IQNl!vgz zV=zRSDFhKULa{niQSNJzHq(hdtC8BwAll4?Z4r$apAj*M^--VItEf(Fh-{*rDy^M& z=K-fUqfU^-DP|!RcO616gl#{k7oi9f<{TeQoZ)=j3xXx zIL%g^1$o8x%Bh;d79YT5$|WKwQ{QMr&D2YMqrjm0C#}fTAX9^kag{NvJ5}b=AnFEf zYN*7q{tu_B(t&yfXsn;e`W1mv4ap;D-eRjL!hS@h&Tvd$$mTp*F%q(cx2Bj&J?FV) zausHfjZy|LD+*MBr7=ySRm`M$%rd&5TpFhthhn+^jE6Di>nC(QO_<0y4q5g^;d_8n zm> zg?mAHuD@`%CGx61ucr0#DGt)LG*>B<5_&V&kvv$IF;G7#^T53t0O?Z-)v|Te$dU+?ZPLj8*XzUJzLIxD$XMu1xp&Qc@u6*i&wvcZ03O8b?9@$e*ljzZ)6kDt>UO;LUo%KFerc}7dT zAOXrm0Tr}JjkSrU7JEI?Ck7ak2Iv!$mPN}39U5O%Fv0p_Oq#W3Lz6TI^fRUFT)q!D zvK%|$JI-rdgd$9n&dJfJbHEPz;GZA#gZ;;q1;wc2j4S#Pof&oZcJ~Io-9fKE?DU7D z-Qj3B+!^-w_XmB)`Au;uT~%snb~Ku2oQT?Sl?l zu3Z}|g)%U%^b%(gK!tfi)SI+^)7mKbl~q~OKHtBq5~FJi#sF~ z)lfC{ZaKHr?Hm4puz&hpyy~*wo3yF=y;AEgXs6sDw5wIsaDb;-Rg2pMtKEH~$tI+q zk}`%zq>7?~ipn37?6#!kd5{L4CoL9X?1w?^Q+$kA6wEMQ@*)Ch^ZFN%8-+XXR`oec wf|*Bs#z;s9FvA3dmnLOm' @@ -25,5 +34,36 @@ class Dev(Base): id = Column(Integer(), primary_key=True) name= Column(String()) + freebies = relationship("Freebie", back_populates = "dev") + + @property + def companies(self): + return {freebie.company for freebie in self.freebies} + + 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 in self.freebies: + freebie.dev = dev + def __repr__(self): return f'' + +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") + company = relationship("Company", back_populates="freebies") + + def print_details(self): + return f"{self.dev.name} owns a {self.item_name} from {self.company.name}." + + def __repr__(self): + return f'' diff --git a/lib/seed.py b/lib/seed.py index b16becbbb..e28bc3b1a 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,3 +1,32 @@ #!/usr/bin/env python3 # Script goes here! +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker +from models import Base, Company, Dev, Freebie + +# Connect to the database +engine = create_engine('sqlite:///freebies.db') +Session = sessionmaker(bind=engine) +session = Session() + +# Create tables +Base.metadata.create_all(engine) + +# Seed data +company1 = Company(name="Microsoft", founding_year=1994) +company2 = Company(name="IBM", founding_year=1987) + +dev1 = Dev(name="Naftaly") +dev2 = Dev(name="Maureen") + +freebie1 = Freebie(item_name="Gift-card", value=10, dev_id=dev1.id, company_id=company1.id) +freebie2 = Freebie(item_name="Trophy", value=2, dev_id=dev2.id, company_id=company2.id) +freebie3 = Freebie(item_name="Mug", value=15, dev_id=dev1.id, company_id=company2.id) + + +# Add to session +session.add_all([company1, company2, dev1, dev2, freebie1, freebie2, freebie3]) +session.commit() + +print("Congratulations!! Database seeded successfully!") \ No newline at end of file