diff --git a/lib/models.py b/lib/models.py index 2681bee5a..f74a99f2a 100644 --- a/lib/models.py +++ b/lib/models.py @@ -1,5 +1,5 @@ -from sqlalchemy import ForeignKey, Column, Integer, String, MetaData -from sqlalchemy.orm import relationship, backref +from sqlalchemy import ForeignKey, Column, Integer, String, MetaData, create_engine +from sqlalchemy.orm import relationship, backref , sessionmaker from sqlalchemy.ext.declarative import declarative_base convention = { @@ -8,22 +8,75 @@ metadata = MetaData(naming_convention=convention) Base = declarative_base(metadata=metadata) +engine = create_engine('sqlite:///db/companies_devs.db', echo=True) +Session = sessionmaker(bind=engine) + +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')) + + dev = relationship("Dev", back_populates="freebies") + company = relationship("Company", back_populates="freebies") + + def dev(self): + return self.dev + + def company(self): + return self.company + + def print_details(self): + return f"{self.dev.name} owns a {self.item_name} from {self.company.name}." + class Company(Base): __tablename__ = 'companies' - id = Column(Integer(), primary_key=True) + id = Column(Integer, primary_key=True) name = Column(String()) - founding_year = Column(Integer()) + founding_year = Column(Integer) + + freebies = relationship("Freebie", back_populates="company") + + def freebies(self): + return self.freebies + + def devs(self): + return [freebie.dev for freebie in self.freebies] + + def give_freebie(self, dev, item_name, value): + freebie = Freebie(dev=dev, company=self, item_name=item_name, value=value) + return freebie + + @classmethod + def oldest_company(cls): + return min(cls.query.all(), key=lambda company: company.founding_year) - def __repr__(self): - return f'' 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", back_populates="dev") + + def freebies(self): + return self.freebies + + 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, dev, freebie): + if freebie.dev == self: + freebie.dev = dev + - def __repr__(self): - return f'' +Base.metadata.create_all(engine) \ No newline at end of file diff --git a/lib/seed.py b/lib/seed.py index b16becbbb..7dedfcc7c 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,3 +1,39 @@ #!/usr/bin/env python3 # Script goes here! +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker +from faker import Faker +from models import Base, Company, Dev, Freebie + + +fake = Faker() + + +engine = create_engine('sqlite:///db/companies_devs.db') +Base.metadata.bind = engine +DBSession = sessionmaker(bind=engine) +session = DBSession() + + +companies = [Company(name=fake.company(), founding_year=fake.year()) for _ in range(5)] +session.add_all(companies) +session.commit() + + +devs = [Dev(name=fake.name()) for _ in range(10)] +session.add_all(devs) +session.commit() + + +freebies = [ + Freebie( + item_name=fake.word(), + value=fake.random_int(min=1, max=1000), + dev=fake.random_element(elements=devs), + company=fake.random_element(elements=companies) + ) for _ in range(20) +] +session.add_all(freebies) +session.commit() +