From 1dd68c0fc64134a1070dfa4e6ea228e98c6b57ec Mon Sep 17 00:00:00 2001 From: Chadwick Koo Date: Mon, 26 May 2025 13:05:04 +0300 Subject: [PATCH] Modified files --- lib/debug.py | 9 ++- lib/freebies.db | Bin 20480 -> 24576 bytes .../c7db35e85e04_add_freebies_model.py | 37 +++++++++ lib/models.py | 76 ++++++++++++++++++ lib/seed.py | 59 +++++++++++++- lib/your_database.db | Bin 0 -> 16384 bytes 6 files changed, 178 insertions(+), 3 deletions(-) create mode 100644 lib/migrations/versions/c7db35e85e04_add_freebies_model.py create mode 100644 lib/your_database.db diff --git a/lib/debug.py b/lib/debug.py index 4f922eb69..08beb98c5 100644 --- a/lib/debug.py +++ b/lib/debug.py @@ -1,8 +1,15 @@ #!/usr/bin/env python3 from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker +from models import Company, Dev, Freebie +from models import Base -from models import Company, Dev +engine = create_engine('sqlite:///freebies.db') +Base.metadata.create_all(engine) + +Session = sessionmaker(bind=engine) +session = Session() if __name__ == '__main__': engine = create_engine('sqlite:///freebies.db') diff --git a/lib/freebies.db b/lib/freebies.db index 12beb1c963e832db481e7a7493e3029e691ac4dc..13a7e68720e48334fee24b62d76e3ed88f029b31 100644 GIT binary patch delta 865 zcmaJ;&1(}u9G(4)3A;N9L<;>J6=?&h3T@F-Ws`1W(WYe^gn|+#*-5i>Kf-<_)XP?( z2QQ*j!ISjhsW)2?>`6R{Cr=(!#J@nHc<|_Kwx#XGfo10Re($~Co1M)aX7fGsbSNhS z07Uv7FaB9^YCr~8x{qb}7YNb;fHHiiM9QFa@aEy1H2vtlkQx{nVYcJ|H!RZf2x*wa zKi)yub3y@)dDF1A8~7OFL^qV<8MYj?1- zQ8$g#s6o0E+5W8zN3p8BR9&g*DwUzudi{8G{X~0oq`A=ilCCXOs_3@1I&nfMAYGf+ zbgf#}R!{=R3-HY$#=%I&x!pqh5bS0YffrjHyTqj;WjP*PV3*t2MitKuJE<3WHs&q2P0KPn{t@~LF+5P&a!Bp{A}V9c zpmL`_p>LT_eMyq-0(c02!cXu3?$Ts0VWbEgxKuTpu0>FZSeC-mTD2R*L#uA+tmQcl zTwTOL&?Y@p2?I0E_8`l0V4PlO9W6Euw?}mn!-26H_AtGZWyRAna1Fp;@H_krKfpcs z8a{_xuuH+yYkxF53nMurg7XZ+1fk~`ydbBO(ho@I9?Q$;lCov`?QwxsQX&|jWP&|w z<08vTVqB-wLECeClZudZTPCp#jpHRg>4pydC(9X51UV+nIBtQ@vLYCwJ~kP|e&~_Q ToRDQiFhbileHIh1ky-8^-|FT1 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/versions/c7db35e85e04_add_freebies_model.py b/lib/migrations/versions/c7db35e85e04_add_freebies_model.py new file mode 100644 index 000000000..9387c6d38 --- /dev/null +++ b/lib/migrations/versions/c7db35e85e04_add_freebies_model.py @@ -0,0 +1,37 @@ +"""Add freebies model + +Revision ID: c7db35e85e04 +Revises: 5f72c58bf48c +Create Date: 2025-05-26 11:23:56.892453 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'c7db35e85e04' +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(), 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/models.py b/lib/models.py index 2681bee5a..f1e6efbe8 100644 --- a/lib/models.py +++ b/lib/models.py @@ -16,14 +16,90 @@ class Company(Base): name = Column(String()) founding_year = Column(Integer()) + # one-to-many to + freebies = relationship( + 'Freebie', + back_populates='company', + cascade='all, delete-orphan' + ) + # many-to-many s + devs = relationship( + 'Dev', + secondary='freebies', + back_populates='companies' + ) + + def give_freebie(self, dev, item_name, value): + freebie = Freebie(item_name=item_name, value=value, company=self, dev=dev) + return freebie + + @classmethod + def oldest_company(cls, session): + return session.query(cls).order_by(cls.founding_year).first() + + def __repr__(self): return f'' + class Dev(Base): __tablename__ = 'devs' id = Column(Integer(), primary_key=True) name= Column(String()) + # one-to-many + freebies = relationship( + 'Freebie', + back_populates='dev', + cascade='all, delete-orphan' + ) + # many-to-many + companies = relationship( + 'Company', + secondary='freebies', + back_populates='devs' + ) + + def received_one(self, item_name): + # Loop through each freebie this dev owns + for freebie in self.freebies: + # If we find one whose name matches, return True immediately + if freebie.item_name == item_name: + return True + # If we finished the loop without finding a match, return False + return False + + def give_away(self, dev, freebie): + if freebie in self.freebies: + freebie.dev = dev + return freebie + return None + 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')) + + + 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'Freebie(id={self.id}, ' + \ + f'item_name={self.item_name}, ' + \ + f'value={self.value})' + diff --git a/lib/seed.py b/lib/seed.py index b16becbbb..8b187df4a 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,3 +1,58 @@ -#!/usr/bin/env python3 +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker +from faker import Faker +import random -# Script goes here! +from models import Base, Company, Dev, Freebie # make sure your models.py or wherever Base/models are defined + +# Set up database +engine = create_engine('sqlite:///freebies.db') # or whatever your database is +Session = sessionmaker(bind=engine) +session = Session() + +# Create tables (if not already created) +Base.metadata.create_all(engine) + +# Initialize Faker +faker = Faker() + +# Optional: Clear existing data +session.query(Freebie).delete() +session.query(Dev).delete() +session.query(Company).delete() +session.commit() + +# Create random companies +companies = [] +for _ in range(5): + company = Company( + name=faker.company(), + founding_year=random.randint(1900, 2024) + ) + session.add(company) + companies.append(company) + +# Create random devs +devs = [] +for _ in range(5): + dev = Dev( + name=faker.name() + ) + session.add(dev) + devs.append(dev) + +session.commit() # Commit so companies/devs have IDs + +# Create random freebies linking devs + companies +for _ in range(10): + freebie = Freebie( + item_name=faker.word(), + value=random.randint(1, 100), + company=random.choice(companies), + dev=random.choice(devs) + ) + session.add(freebie) + +session.commit() + +print("✅ Database seeded with random data!") diff --git a/lib/your_database.db b/lib/your_database.db new file mode 100644 index 0000000000000000000000000000000000000000..7a5fe090937c9b3d5b2f3ae88193132bedb34f8e GIT binary patch literal 16384 zcmeI#K~KUk6bJB)kq|KiFN71}9a&<$_ywFxK_U(<(}aUr26Sc-hM7RZ5fcx77{8+} zFpwGHPX0}rjBLK>z{}fB*y_009U<00Izzz#)N;XCqgxRP@in#P1D75DU=@#d|Vl zZO$y0k!xMI7$s4vLglJnSVos$et#K?>Mk)S7w+cy?h!I?jtiX>eH z`s2}?AI-gO5fvSXSt@eRn|BuP(k<&!EgYCC%WgXzms@gj3SPZrN#3^P`cdwJ>TS-N z4M+XIwoNdJvpVCJfg4OCgIqcS5#dm5hb5yy!+0W$4rINldm%QqQ>c$T1 zD*a#5v}PJ5Z!S*tT)A4+7h*ZfW=org%+7q9@Sbx_Pa2G;(IAXoyt(k>-$(g(HR^6I zFa2l`fB*y_009U<00Izz00bZa0SFwi0Pg=se7M*e1Rwwb2tWV=5P$##AOHafKwvF^ d`#(Mf2tWV=5P$##AOHafKmY;|fWYw!`~Z