diff --git a/freebies.db b/freebies.db new file mode 100644 index 000000000..b21bf1567 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__/__init__.cpython-38.pyc b/lib/__pycache__/__init__.cpython-38.pyc new file mode 100644 index 000000000..797de8fe2 Binary files /dev/null and b/lib/__pycache__/__init__.cpython-38.pyc differ diff --git a/lib/__pycache__/models.cpython-38.pyc b/lib/__pycache__/models.cpython-38.pyc new file mode 100644 index 000000000..c3c3ae349 Binary files /dev/null and b/lib/__pycache__/models.cpython-38.pyc differ diff --git a/lib/debug.py b/lib/debug.py index 4f922eb69..4c194e204 100644 --- a/lib/debug.py +++ b/lib/debug.py @@ -1,9 +1,35 @@ #!/usr/bin/env python3 from sqlalchemy import create_engine - -from models import Company, Dev +from sqlalchemy.orm import sessionmaker +from lib.models import Base, Freebie, Company, Dev if __name__ == '__main__': engine = create_engine('sqlite:///freebies.db') + Session = sessionmaker(bind=engine) + session = Session() import ipdb; ipdb.set_trace() + + dev = session.query(Dev).first() + print("Dev:", dev) + print("Dev's Freebies:", dev.freebies) + print("Dev's Freebies Companies:", dev.companies) + + company = session.query(Company).first() + print("Company:", company) + print("Company's Freebies:", company.freebies) + print("Company's Freebies Devs:", company.devs) + + alice = session.query(Dev).filter_by(name="Alice").first() +print(alice.companies) +print(alice.received_one("USB Drive")) +print(alice.received_one("Notebook")) + +freebie = session.query(Freebie).filter_by(item_name="Mug").first() +print(freebie.print_details()) + + +bob = session.query(Dev).filter_by(name="Bob").first() +alice.give_away(bob, freebie) +session.commit() +print(freebie.print_details()) \ No newline at end of file diff --git a/lib/migrations/create_tables.py b/lib/migrations/create_tables.py new file mode 100644 index 000000000..f582112b1 --- /dev/null +++ b/lib/migrations/create_tables.py @@ -0,0 +1,10 @@ +import os +import sys +sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) +from sqlalchemy import create_engine, Column, Integer, String, MetaData +from lib.models import Base, Freebie, Company, Dev + +engine = create_engine('sqlite:///freebies.db') + +Base.metadata.create_all(engine) +print("Tables created successfully.") \ No newline at end of file diff --git a/lib/models.py b/lib/models.py index 2681bee5a..6917638a5 100644 --- a/lib/models.py +++ b/lib/models.py @@ -12,18 +12,61 @@ class Company(Base): __tablename__ = 'companies' - id = Column(Integer(), primary_key=True) - name = Column(String()) - founding_year = Column(Integer()) + id = Column(Integer, primary_key=True) + name = Column(String) + founding_year = Column(Integer) + freebies = relationship("Freebie", backref="company", cascade="all, delete-orphan") def __repr__(self): - return f'' + return f"" + + def give_freebie(self, dev, item_name, value): + return Freebie(item_name=item_name, value=value, dev=dev, company=self) + + @classmethod + def oldest_company(cls, session): + return session.query(cls).order_by(cls.founding_year).first() + + @property + def devs(self): + return list({freebie.dev for freebie in self.freebies}) + class Dev(Base): __tablename__ = 'devs' - id = Column(Integer(), primary_key=True) - name= Column(String()) + id = Column(Integer, primary_key=True) + name = Column(String) + + freebies = relationship("Freebie", backref="dev", cascade="all, delete-orphan") def __repr__(self): - return f'' + return f"" + + @property + def companies(self): + return list({freebie.company for freebie in self.freebies}) + + def received_one(self, item_name): + return any(f.item_name == item_name for f in self.freebies) + + def give_away(self, dev, freebie): + if freebie in self.freebies: + freebie.dev = dev + + +class Freebie(Base): + __tablename__ = 'freebies' + + id = Column(Integer, primary_key=True) + item_name = Column(String) + value = Column(Integer) + + 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..9e40d23e6 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,3 +1,31 @@ #!/usr/bin/env python3 # Script goes here! +from sqlalchemy.orm import sessionmaker +from sqlalchemy import create_engine +from lib.models import Company, Dev, Freebie, Base + +engine = create_engine('sqlite:///lib/freebies.db') +Session = sessionmaker(bind=engine) +session = Session() + + +session.query(Freebie).delete() +session.query(Company).delete() +session.query(Dev).delete() + +c1 = Company(name="TechCorp", founding_year=1999) +c2 = Company(name="InnovateX", founding_year=2005) + + +d1 = Dev(name="Alice") +d2 = Dev(name="Bob") + + +f1 = c1.give_freebie(d1, "USB Drive", 15) +f2 = c1.give_freebie(d2, "Notebook", 10) +f3 = c2.give_freebie(d1, "Mug", 8) + +session.add_all([c1, c2, d1, d2, f1, f2, f3]) +session.commit() +print("Seed data added.")