From 396eaaf0ee9e53fcea4cc5df182575cd28c5bf38 Mon Sep 17 00:00:00 2001 From: Alex Date: Sat, 24 May 2025 09:03:46 +0300 Subject: [PATCH] First commit --- freebies.db | Bin 0 -> 16384 bytes lib/__init__.py | 0 lib/__pycache__/__init__.cpython-38.pyc | Bin 0 -> 168 bytes lib/__pycache__/models.cpython-38.pyc | Bin 0 -> 3504 bytes lib/debug.py | 30 ++++++++++++- lib/migrations/create_tables.py | 10 +++++ lib/models.py | 57 +++++++++++++++++++++--- lib/seed.py | 28 ++++++++++++ 8 files changed, 116 insertions(+), 9 deletions(-) create mode 100644 freebies.db create mode 100644 lib/__init__.py create mode 100644 lib/__pycache__/__init__.cpython-38.pyc create mode 100644 lib/__pycache__/models.cpython-38.pyc create mode 100644 lib/migrations/create_tables.py diff --git a/freebies.db b/freebies.db new file mode 100644 index 0000000000000000000000000000000000000000..b21bf1567585c05691ccb6473f208965844a6704 GIT binary patch literal 16384 zcmeI&F>ljA6bJA-+rmvC9930iigIHt0Sg}hoNz4>sRNFS=wvy`rC3eu%5@@j3=$uM zZ-m6ez|>Db#l(y+#tE@RyHe?YlKoCk=X=k;n=Ex~Be^dt?2Q#nbb9ES3uh(^a1wkNn}w|jyYS>CEv!ZGhUo;VaPclsW8j(fewJWHo? z=10Ly@^`k|d1bpQxd^6nSu9tHv0V6@4OC_n&(4GBvXm`v^v3NT+3pE{ElzkV99!zi zPTv`LuAMc*Cue@qqMw&g;esFZUC}*s)MKqYZ*f-~2v;~AG2p8;w`{lR&(EhB($>D4 z1zUS>7OMhPYowX={e8N$R@|zxy7VpPyq|v(--c4PmiMVyZ#L;tuBxniSWmRAdh7HJ z=UOg0iRaNcj86Sa8604=Lf8*>l?4n4KmY;|fB*y_009U<00Izz z00jPXfnD7s4N5D-iBma@g`k0__}w3=sVoL?8o3AjbiSi&=m~3PUi1CZpd>RzYL`RY5zU-bLFgYVw| zuJ6C;InFQCSp6Dk+(gkoKnO>$)X7-DG9K{E4cx2|G_q#UWHiRpR@M&MnHPAr?WUc~ z4}8=cqM5LuE1R+_T8~)JlfLYUHfsG(9N~%1Lq~LE|A89}(Dp?a?XGRFq1_XGwEMO_ z6ob3Ycf^bOI)vfD0D5 zvLTy-3-=KZTBx@lu)w1}{C1>I<`pfN(+#?nF@s)Z#Go$+mH9ApO~QC$?V*GE6)}Vv zubB3&BAZ6}%yeQ~Nu<7a%1n2vk}OiQ@Bnsg-%(QTCepO4IkU%CqcnYQBxEW}xn8L0 zew3eb1^76a6X`gDEg4$%M|BtF7K$D~2zKJ!cm4~={OCdtcW2(&T4*wQ%(kIHgRD)z zTBegzNBsq>9)GsEUu1GKi}Gaiwmg<;G0kAs&A1S96Iy7weq(bwEBA|heR^YkQt7>3 zDtK9{%{1BF%rG_88`GKb!cfVn3d3hfD-PkX`Ea4dMm-qQ1E@c$w@~aohNzUz2|sa9 za2vrMHE^iloH;?JXT!hUj2oS)fGWObIM5H=HZc4 zFi4?a(Qh%E!>&n~QnZH`A4=?JCt+a@vRBvyb&BnHkG|{E;78`5z zA~v|VeS?;hvum^TR`=Z*UnNKq?8DIbVF;uifptRD3&X>sC|!*7!-{08rXnXR($w%o zC?XK`0*SXsv`Jhi@d}C8AWRo5r!^>OzYuCnJ>FCmQ>n_CdY@)3L1=4)MAe7rp=g4V z#~QrHJp2u~=Xx$@K8l?aWBA;6#%N!n`wtndv%+Nlg2}oF6gD7$wfYs81%rymg0%&U zxgZ0p{5`dXbLvxCwY;K)(HnuY!DpFOES=8T2(DWsrs1K>RB$NwW@(&s%Jg99F|01!3 z-jX@~iGepzEITilgA;EMYk01r@fhXYM_#&#qQ8RpL)NJCApBA;gh;`WYE~^|NNDva zJ9_AVKWwTA{_qh?x)o25Wh>s8w*?V=BIdp2`$)v^sDq4Rokr}iOl1hwNNL<3o7lWT zDb1ZK0U6ER(c5p%`FIbd(31#S@I;u1z^@!JL%oV&H%ZsafJSK*JxM);I15pHV1tzP^bYb}UmvDX8t=<& zrs$v*yj!SKc4r35NgIXAsxV5~ZSc~{i2SzPSoxnpb!aK{tuuW^0n;@8jjYthMho={ ja+m0DysawWZ&TQ?bnr48vYyKw{{M#SbDs~d4X^zMG?3c7 literal 0 HcmV?d00001 diff --git a/lib/debug.py b/lib/debug.py index 4f922eb69..4c194e204 100644 --- a/lib/debug.py +++ b/lib/debug.py @@ -1,9 +1,35 @@ #!/usr/bin/env python3 from sqlalchemy import create_engine - -from models import Company, Dev +from sqlalchemy.orm import sessionmaker +from lib.models import Base, Freebie, Company, Dev if __name__ == '__main__': engine = create_engine('sqlite:///freebies.db') + Session = sessionmaker(bind=engine) + session = Session() import ipdb; ipdb.set_trace() + + dev = session.query(Dev).first() + print("Dev:", dev) + print("Dev's Freebies:", dev.freebies) + print("Dev's Freebies Companies:", dev.companies) + + company = session.query(Company).first() + print("Company:", company) + print("Company's Freebies:", company.freebies) + print("Company's Freebies Devs:", company.devs) + + alice = session.query(Dev).filter_by(name="Alice").first() +print(alice.companies) +print(alice.received_one("USB Drive")) +print(alice.received_one("Notebook")) + +freebie = session.query(Freebie).filter_by(item_name="Mug").first() +print(freebie.print_details()) + + +bob = session.query(Dev).filter_by(name="Bob").first() +alice.give_away(bob, freebie) +session.commit() +print(freebie.print_details()) \ No newline at end of file diff --git a/lib/migrations/create_tables.py b/lib/migrations/create_tables.py new file mode 100644 index 000000000..f582112b1 --- /dev/null +++ b/lib/migrations/create_tables.py @@ -0,0 +1,10 @@ +import os +import sys +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) +from sqlalchemy import create_engine, Column, Integer, String, MetaData +from lib.models import Base, Freebie, Company, Dev + +engine = create_engine('sqlite:///freebies.db') + +Base.metadata.create_all(engine) +print("Tables created successfully.") \ No newline at end of file diff --git a/lib/models.py b/lib/models.py index 2681bee5a..6917638a5 100644 --- a/lib/models.py +++ b/lib/models.py @@ -12,18 +12,61 @@ class Company(Base): __tablename__ = 'companies' - id = Column(Integer(), primary_key=True) - name = Column(String()) - founding_year = Column(Integer()) + id = Column(Integer, primary_key=True) + name = Column(String) + founding_year = Column(Integer) + freebies = relationship("Freebie", backref="company", cascade="all, delete-orphan") def __repr__(self): - return f'' + return f"" + + def give_freebie(self, dev, item_name, value): + return Freebie(item_name=item_name, value=value, dev=dev, company=self) + + @classmethod + def oldest_company(cls, session): + return session.query(cls).order_by(cls.founding_year).first() + + @property + def devs(self): + return list({freebie.dev for freebie in self.freebies}) + class Dev(Base): __tablename__ = 'devs' - id = Column(Integer(), primary_key=True) - name= Column(String()) + id = Column(Integer, primary_key=True) + name = Column(String) + + freebies = relationship("Freebie", backref="dev", cascade="all, delete-orphan") def __repr__(self): - return f'' + return f"" + + @property + def companies(self): + return list({freebie.company for freebie in self.freebies}) + + def received_one(self, item_name): + return any(f.item_name == item_name for f in self.freebies) + + def give_away(self, dev, freebie): + if freebie in self.freebies: + 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}" diff --git a/lib/seed.py b/lib/seed.py index b16becbbb..9e40d23e6 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,3 +1,31 @@ #!/usr/bin/env python3 # Script goes here! +from sqlalchemy.orm import sessionmaker +from sqlalchemy import create_engine +from lib.models import Company, Dev, Freebie, Base + +engine = create_engine('sqlite:///lib/freebies.db') +Session = sessionmaker(bind=engine) +session = Session() + + +session.query(Freebie).delete() +session.query(Company).delete() +session.query(Dev).delete() + +c1 = Company(name="TechCorp", founding_year=1999) +c2 = Company(name="InnovateX", founding_year=2005) + + +d1 = Dev(name="Alice") +d2 = Dev(name="Bob") + + +f1 = c1.give_freebie(d1, "USB Drive", 15) +f2 = c1.give_freebie(d2, "Notebook", 10) +f3 = c2.give_freebie(d1, "Mug", 8) + +session.add_all([c1, c2, d1, d2, f1, f2, f3]) +session.commit() +print("Seed data added.")