diff --git a/lib/freebies.db b/lib/freebies.db index 12beb1c96..144f3e3c1 100644 Binary files a/lib/freebies.db and b/lib/freebies.db differ diff --git a/lib/migrations/versions/8a2c3bd0abcd_create_freebies_table.py b/lib/migrations/versions/8a2c3bd0abcd_create_freebies_table.py new file mode 100644 index 000000000..d74bf8e55 --- /dev/null +++ b/lib/migrations/versions/8a2c3bd0abcd_create_freebies_table.py @@ -0,0 +1,27 @@ +"""create freebies table + +Revision ID: 8a2c3bd0abcd +Revises: 5f72c58bf48c +Create Date: 2025-12-08 +""" + +from alembic import op +import sqlalchemy as sa + +revision = '8a2c3bd0abcd' +down_revision = '5f72c58bf48c' # <-- only the hash, not the filename +branch_labels = None +depends_on = None + +def upgrade(): + op.create_table( + 'freebies', + sa.Column('id', sa.Integer(), primary_key=True), + sa.Column('item_name', sa.String()), + sa.Column('value', sa.Integer()), + sa.Column('dev_id', sa.Integer(), sa.ForeignKey('devs.id')), + sa.Column('company_id', sa.Integer(), sa.ForeignKey('companies.id')) + ) + +def downgrade(): + op.drop_table('freebies') diff --git a/lib/models.py b/lib/models.py index 2681bee5a..a3fd218eb 100644 --- a/lib/models.py +++ b/lib/models.py @@ -1,29 +1,65 @@ -from sqlalchemy import ForeignKey, Column, Integer, String, MetaData +from sqlalchemy import Column, Integer, String, ForeignKey from sqlalchemy.orm import relationship, backref from sqlalchemy.ext.declarative import declarative_base -convention = { - "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s", -} -metadata = MetaData(naming_convention=convention) - -Base = declarative_base(metadata=metadata) +Base = declarative_base() class Company(Base): - __tablename__ = 'companies' + __tablename__ = "companies" + + id = Column(Integer, primary_key=True) + name = Column(String) + founding_year = Column(Integer) + + # Relationships + freebies = relationship("Freebie", backref="company") + + @property + def devs(self): + return list({freebie.dev for freebie in self.freebies}) - id = Column(Integer(), primary_key=True) - name = Column(String()) - founding_year = Column(Integer()) + def give_freebie(self, dev, item_name, value): + from models import Freebie + freebie = Freebie(item_name=item_name, value=value, dev=dev, company=self) + 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' + __tablename__ = "devs" + + id = Column(Integer, primary_key=True) + name = Column(String) + + # Relationships + freebies = relationship("Freebie", backref="dev") + + @property + def companies(self): + return list({freebie.company for freebie in self.freebies}) + + def received_one(self, item_name): + return any(fb.item_name == item_name for fb in self.freebies) + + def give_away(self, new_dev, freebie): + if freebie.dev == self: + freebie.dev = new_dev + return True + return False + + +class Freebie(Base): + __tablename__ = "freebies" + + id = Column(Integer, primary_key=True) + item_name = Column(String) + value = Column(Integer) - id = Column(Integer(), primary_key=True) - name= Column(String()) + 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..66475c873 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,3 +1,36 @@ #!/usr/bin/env python3 -# Script goes here! +from models import Company, Dev, Freebie +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker +from models import Base + +engine = create_engine("sqlite:///freebies.db") +Session = sessionmaker(bind=engine) +session = Session() + +# Clear tables +session.query(Freebie).delete() +session.query(Dev).delete() +session.query(Company).delete() + +# Create sample data +c1 = Company(name="Flatiron", founding_year=2012) +c2 = Company(name="Google", founding_year=1998) + +d1 = Dev(name="Jonah") +d2 = Dev(name="Alice") + +session.add_all([c1, c2, d1, d2]) +session.commit() + +# Give freebies using method +fb1 = c1.give_freebie(d1, "Laptop Sticker", 2) +fb2 = c1.give_freebie(d2, "T-Shirt", 15) +fb3 = c2.give_freebie(d1, "Water Bottle", 12) + +session.add_all([fb1, fb2, fb3]) +session.commit() + +print("Seed complete!") +