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 12beb1c96..13a7e6872 100644 Binary files a/lib/freebies.db and b/lib/freebies.db differ 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 000000000..7a5fe0909 Binary files /dev/null and b/lib/your_database.db differ