diff --git a/lib/debug.py b/lib/debug.py index 4f922eb69..a30adc333 100644 --- a/lib/debug.py +++ b/lib/debug.py @@ -1,9 +1,54 @@ #!/usr/bin/env python3 from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker -from models import Company, Dev +from models import Company, Dev, Freebie, Base if __name__ == '__main__': engine = create_engine('sqlite:///freebies.db') + Session = sessionmaker(bind=engine) + session = Session() + import ipdb; ipdb.set_trace() + + + +company1 = Company(name="Agape Tech", founding_year=2000) +company2 = Company(name="Mawingu Internet", founding_year=2010) +dev1 = Dev(name="Michell") +dev2 = Dev(name="Wambui") + +# Add them to the session +session.add(company1) +session.add(company2) +session.add(dev1) +session.add(dev2) + +# Commit the changes to the database +session.commit() + + +companies = session.query(Company).all() +devs = session.query(Dev).all() + + +print("Companies:", companies) +print("Developers:", devs) + +# giving freebies +company1.give_freebie(dev1, "Laptop", 2) +company1.give_freebie(dev2, "Tablet", 2) + +company2.give_freebie(dev1, "Water Bottle", 1) +company2.give_freebie(dev1, "Smart Watch", 2) + +session.commit() + + + +# Check dev1's freebies +print(dev1.freebies) + + +session.close() diff --git a/lib/freebies.db b/lib/freebies.db index 12beb1c96..71e52d7a1 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..37a08cd21 100644 --- a/lib/models.py +++ b/lib/models.py @@ -1,3 +1,4 @@ +from sqlalchemy import create_engine, func from sqlalchemy import ForeignKey, Column, Integer, String, MetaData from sqlalchemy.orm import relationship, backref from sqlalchemy.ext.declarative import declarative_base @@ -16,14 +17,64 @@ class Company(Base): name = Column(String()) founding_year = Column(Integer()) + # Relationships + freebies = relationship('Freebie', back_populates='company',overlaps='devs') + devs = relationship('Dev', secondary='freebies', back_populates='companies', overlaps='freebies') + + def __repr__(self): return f'' + + # Additional methods + @classmethod + def oldest_company(cls, session): + return session.query(cls).order_by(cls.founding_year).first() + + def give_freebie(self, session, dev, item_name, value): + freebie = Freebie(dev_id=dev.id, company_id=self.id, item_name=item_name, value=value) + session.add(freebie) + session.commit() + + class Dev(Base): __tablename__ = 'devs' id = Column(Integer(), primary_key=True) name= Column(String()) + freebies = relationship('Freebie', back_populates='dev', overlaps="companies") + companies = relationship('Company', secondary='freebies', back_populates='devs', overlaps="freebies") + + 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, session): + if freebie.dev == self: + freebie.dev = dev + session.commit() + else: + raise ValueError("Cannot give away user item that does not belong to you.") + + +class Freebie(Base): + __tablename__ = 'freebies' + + id = Column(Integer, primary_key=True) + item_name = Column(String, nullable=False) + value = Column(Integer, nullable=False) + + # Foreign keys + dev_id = Column(Integer, ForeignKey('devs.id'), nullable=False) + company_id = Column(Integer, ForeignKey('companies.id'), nullable=False) + + # Relationships + dev = relationship("Dev", back_populates="freebies") + company = relationship("Company", back_populates="freebies") + + def __repr__(self): + return f"" \ No newline at end of file diff --git a/lib/seed.py b/lib/seed.py index b16becbbb..e269c9c55 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,3 +1,47 @@ #!/usr/bin/env python3 # Script goes here! +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker +from models import Base, Dev, Company, Freebie + +# Set up the database connection and session +engine = create_engine('sqlite:///freebies.db') +Base.metadata.create_all(engine) # Creates the tables in the database + +Session = sessionmaker(bind=engine) +session = Session() + +# Creating some sample companies +company1 = Company(name="Agape Tech", founding_year=2000) +company2 = Company(name="Mawingu Internet", founding_year=2010) + +# Creating some sample devs +dev1 = Dev(name="Michell") +dev2 = Dev(name="Wambui") + +# Add companies and devs to the session +session.add(company1) +session.add(company2) +session.add(dev1) +session.add(dev2) + +# Commit the session to save devs and companies +session.commit() + +# Assigning freebies to devs +freebie1 = Freebie(dev_id=dev1.id, company_id=company1.id, item_name="Laptop", value=1000) +freebie2 = Freebie(dev_id=dev2.id, company_id=company1.id, item_name="Tablet ", value=500) +freebie3 = Freebie(dev_id=dev1.id, company_id=company2.id, item_name="WaterBottle", value=150) +freebie4 = Freebie(dev_id=dev1.id, company_id=company2.id, item_name="SmartWatch", value=150) + +# Add freebies to the session +session.add(freebie1) +session.add(freebie2) +session.add(freebie3) +session.add(freebie4) + +# Commit the session to save the freebies +session.commit() + +print("Seed data has been added to the database.")