diff --git a/lib/freebies.db b/lib/freebies.db index 12beb1c96..74be8072d 100644 Binary files a/lib/freebies.db and b/lib/freebies.db differ diff --git a/lib/migrations/versions/c18164ee181f_create_freebies_table.py b/lib/migrations/versions/c18164ee181f_create_freebies_table.py new file mode 100644 index 000000000..06dd27cae --- /dev/null +++ b/lib/migrations/versions/c18164ee181f_create_freebies_table.py @@ -0,0 +1,31 @@ +"""create freebies table + +Revision ID: c18164ee181f +Revises: 5f72c58bf48c +Create Date: 2025-09-28 22:16:43.088396 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'c18164ee181f' +down_revision = '5f72c58bf48c' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + 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"), nullable=False), + sa.Column("company_id", sa.Integer(), sa.ForeignKey("companies.id"), nullable=False), + ) + + +def downgrade() -> None: + op.drop_table("freebies") diff --git a/lib/models.py b/lib/models.py index 2681bee5a..a960710e0 100644 --- a/lib/models.py +++ b/lib/models.py @@ -6,24 +6,73 @@ "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s", } metadata = MetaData(naming_convention=convention) - Base = declarative_base(metadata=metadata) class Company(Base): - __tablename__ = 'companies' + __tablename__ = "companies" id = Column(Integer(), primary_key=True) name = Column(String()) founding_year = Column(Integer()) + freebies = relationship( + "Freebie", + backref=backref("company"), + cascade="all, delete-orphan", + ) + + @property + def devs(self): + return list({f.dev for f in self.freebies if f.dev is not None}) + + def give_freebie(self, dev, item_name, value): + return Freebie(item_name=item_name, value=value, company=self, dev=dev) + + @classmethod + def oldest_company(cls, session): + return session.query(cls).order_by(cls.founding_year.asc()).first() + def __repr__(self): - return f'' + return f"" class Dev(Base): - __tablename__ = 'devs' + __tablename__ = "devs" id = Column(Integer(), primary_key=True) - name= Column(String()) + name = Column(String()) + + freebies = relationship("Freebie", backref=backref("dev")) + + @property + def companies(self): + return list({f.company for f in self.freebies if f.company is not None}) + + def received_one(self, item_name): + return any(f.item_name == item_name for f in self.freebies) + + def give_away(self, other_dev, freebie): + if freebie in self.freebies: + freebie.dev = other_dev + return True + return False + + def __repr__(self): + return f"" + +class Freebie(Base): + __tablename__ = "freebies" + + id = Column(Integer(), primary_key=True) + item_name = Column(String(), nullable=False) + value = Column(Integer(), nullable=False) + + dev_id = Column(Integer(), ForeignKey("devs.id"), nullable=False) + company_id = Column(Integer(), ForeignKey("companies.id"), nullable=False) + + def print_details(self): + d = self.dev.name if self.dev else "Unknown Dev" + c = self.company.name if self.company else "Unknown Company" + return f"{d} owns a {self.item_name} from {c}" def __repr__(self): - return f'' + return f"" \ No newline at end of file diff --git a/lib/seed.py b/lib/seed.py index b16becbbb..dc9d39f62 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,3 +1,38 @@ #!/usr/bin/env python3 -# Script goes here! +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker + +from models import Base, Company, Dev, Freebie + +DB_URL = "sqlite:///freebies.db" + +def main(): + engine = create_engine(DB_URL, echo=False) + Session = sessionmaker(bind=engine) + session = Session() + + acme = Company(name="Acme", founding_year=1901) + initech = Company(name="Initech", founding_year=1989) + umbrella = Company(name="Umbrella", founding_year=1968) + + alice = Dev(name="Alice") + bob = Dev(name="Bob") + chris = Dev(name="Chris") + + session.add_all([acme, initech, umbrella, alice, bob, chris]) + session.commit() + + f1 = acme.give_freebie(alice, "Sticker Pack", 5) + f2 = acme.give_freebie(bob, "T-Shirt", 20) + f3 = initech.give_freebie(alice, "Mug", 12) + f4 = umbrella.give_freebie(chris, "Hoodie", 45) + + session.add_all([f1, f2, f3, f4]) + session.commit() + + print("Seeded!") + +if __name__ == "__main__": + main() +