diff --git a/freebies.db b/freebies.db new file mode 100644 index 000000000..9c74b0ff8 Binary files /dev/null and b/freebies.db differ diff --git a/lib/__init__.py b/lib/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/lib/__pycache__/models.cpython-312.pyc b/lib/__pycache__/models.cpython-312.pyc new file mode 100644 index 000000000..909ca1835 Binary files /dev/null and b/lib/__pycache__/models.cpython-312.pyc differ diff --git a/lib/debug.py b/lib/debug.py index 4f922eb69..2558675d5 100644 --- a/lib/debug.py +++ b/lib/debug.py @@ -1,9 +1,24 @@ #!/usr/bin/env python3 from sqlalchemy import create_engine - +from sqlalchemy.orm import sessionmaker from models import Company, Dev -if __name__ == '__main__': - engine = create_engine('sqlite:///freebies.db') - import ipdb; ipdb.set_trace() +# Setup DB and session +engine = create_engine('sqlite:///freebies.db') +Session = sessionmaker(bind=engine) +session = Session() + +alice = session.query(Dev).filter_by(name="Alice").first() +openai = session.query(Company).filter_by(name="OpenAI").first() + +print(alice.freebies[0].print_details()) + + +openai.give_freebie(alice, "USB Drive", 30) + +print(alice.received_one("USB Drive")) # Expected: True + +bob = session.query(Dev).filter_by(name="Bob").first() +freebie_to_give = alice.freebies[0] +alice.give_away(bob, freebie_to_give) \ No newline at end of file diff --git a/lib/models.py b/lib/models.py index 2681bee5a..e6574d6b5 100644 --- a/lib/models.py +++ b/lib/models.py @@ -18,6 +18,13 @@ class Company(Base): def __repr__(self): return f'' + + def give_freebie(self, dev, item_name, value): + from sqlalchemy.orm import object_session + session = object_session(self) + freebie = Freebie(item_name=item_name, value=value, company=self, dev=dev) + session.add(freebie) + session.commit() class Dev(Base): __tablename__ = 'devs' @@ -27,3 +34,31 @@ class Dev(Base): def __repr__(self): return f'' + + def received_one(self, item_name): + return any(freebie.item_name == item_name for freebie in self.freebies) + + def give_away(self, dev, freebie): + from sqlalchemy.orm import object_session + if freebie in self.freebies: + freebie.dev = dev + session = object_session(freebie) + session.commit() + +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')) + + company = relationship('Company', backref=backref('freebies', lazy=True)) + dev = relationship('Dev', backref=backref('freebies', lazy=True)) + + 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..a3bc61a74 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,3 +1,41 @@ #!/usr/bin/env python3 # Script goes here! +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker +from models import Base, Company, Dev, Freebie + + + +# Setup database +engine = create_engine('sqlite:///freebies.db') +Base.metadata.create_all(engine) +Session = sessionmaker(bind=engine) +session = Session() + +# Clear any existing data (optional during development) +session.query(Freebie).delete() +session.query(Dev).delete() +session.query(Company).delete() + +# Create companies +c1 = Company(name="OpenAI", founding_year=2015) +c2 = Company(name="Google", founding_year=1998) +c3 = Company(name="Apple", founding_year=1976) + +# Create developers +d1 = Dev(name="Alice") +d2 = Dev(name="Bob") +d3 = Dev(name="Charlie") + +# Create freebies +f1 = Freebie(item_name="T-shirt", value=20, company=c1, dev=d1) +f2 = Freebie(item_name="Sticker", value=5, company=c2, dev=d2) +f3 = Freebie(item_name="Water Bottle", value=15, company=c1, dev=d3) +f4 = Freebie(item_name="Notebook", value=10, company=c3, dev=d1) + +# Add and commit +session.add_all([c1, c2, c3, d1, d2, d3, f1, f2, f3, f4]) +session.commit() + +print("🌱 Seeded database successfully!")