diff --git a/lib/__pycache__/models.cpython-38.pyc b/lib/__pycache__/models.cpython-38.pyc new file mode 100644 index 000000000..ed80ee333 Binary files /dev/null and b/lib/__pycache__/models.cpython-38.pyc differ diff --git a/lib/database.db b/lib/database.db new file mode 100644 index 000000000..e69de29bb diff --git a/lib/debug.py b/lib/debug.py index 4f922eb69..15558ce5d 100644 --- a/lib/debug.py +++ b/lib/debug.py @@ -1,9 +1,11 @@ #!/usr/bin/env python3 - +from sqlalchemy.orm import sessionmaker from sqlalchemy import create_engine - -from models import Company, Dev +from models import Company, Dev, Freebie if __name__ == '__main__': engine = create_engine('sqlite:///freebies.db') - import ipdb; ipdb.set_trace() + Session = sessionmaker(bind=engine) + session = Session() + + import ipdb; ipdb.set_trace() \ No newline at end of file diff --git a/lib/freebies.db b/lib/freebies.db index 12beb1c96..b3ccb0503 100644 Binary files a/lib/freebies.db and b/lib/freebies.db differ diff --git a/lib/models.py b/lib/models.py index 2681bee5a..3be7fe198 100644 --- a/lib/models.py +++ b/lib/models.py @@ -1,29 +1,79 @@ from sqlalchemy import ForeignKey, Column, Integer, String, MetaData -from sqlalchemy.orm import relationship, backref +from sqlalchemy.orm import relationship 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) 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, nullable=False, unique=True) + founding_year = Column(Integer, nullable=False) + + freebies = relationship("Freebie", back_populates="company") def __repr__(self): - return f'' + return f'' + + @property + def devs(self): + return {freebie.dev for freebie in self.freebies} + + 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() class Dev(Base): __tablename__ = 'devs' - id = Column(Integer(), primary_key=True) - name= Column(String()) + id = Column(Integer, primary_key=True) + name = Column(String, nullable=False, unique=True) + + freebies = relationship("Freebie", back_populates="dev") def __repr__(self): return f'' + + @property + def companies(self): + return {freebie.company for freebie in self.freebies} + + def received_one(self, item_name): + return any(freebie.item_name == item_name for freebie 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, nullable=False) + value = Column(Integer, nullable=False) + + company_id = Column(Integer, ForeignKey('companies.id'), nullable=False) + dev_id = Column(Integer, ForeignKey('devs.id'), nullable=False) + + company = relationship("Company", back_populates="freebies") + dev = relationship("Dev", back_populates="freebies") + + 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..a12943753 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,3 +1,51 @@ #!/usr/bin/env python3 -# Script goes here! +from sqlalchemy.orm import sessionmaker +from sqlalchemy import create_engine +from models import Base, Company, Dev, Freebie + + +engine = create_engine("sqlite:///freebies.db") +Base.metadata.create_all(engine) +Session = sessionmaker(bind=engine) +session = Session() + + +session.query(Freebie).delete() +session.query(Company).delete() +session.query(Dev).delete() +session.commit() + +company1 = Company(name="Rubics", founding_year=2000) + +company2 = Company(name="Steelmugs", founding_year=2010) + +dev1 = Dev(name="Leo") +dev2 = Dev(name="Eli") + +freebie1 = Freebie(item_name="Plate", value=10, company=company1, dev=dev1) +freebie2 = Freebie(item_name="Mug", value=5, company=company2, dev=dev2) + + +session.add_all([company1, company2, dev1, dev2, freebie1, freebie2]) +session.commit() + + +print("\n- All Companies:") +for company in session.query(Company).all(): + print(f"{company.id}: {company.name}, Founded: {company.founding_year}") + + +print("\n- All Devs:") +for dev in session.query(Dev).all(): + print(f"{dev.id}: {dev.name}") + + +print("\n- All Freebies:") +for freebie in session.query(Freebie).all(): + print(f"{freebie.id}: {freebie.item_name} (Value: {freebie.value}), Given by {freebie.company.name} to {freebie.dev.name}") + +session.close() + +print("\nDatabase seeded successfully!") +