diff --git a/lib/freebies.db b/database.db similarity index 74% rename from lib/freebies.db rename to database.db index 12beb1c96..c67504236 100644 Binary files a/lib/freebies.db and b/database.db differ diff --git a/lib/__pycache__/models.cpython-38.pyc b/lib/__pycache__/models.cpython-38.pyc new file mode 100644 index 000000000..164103ad1 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..cc372a8a0 100644 --- a/lib/debug.py +++ b/lib/debug.py @@ -1,9 +1,53 @@ #!/usr/bin/env python3 from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker +from models import Company, Dev, Freebie , Base + +# Create an SQLite database engine and initialize the database +engine = create_engine('sqlite:///database.db') + +Base.metadata.create_all(engine) + +# Create a session to interact with the database +Session = sessionmaker(bind=engine) +session = Session() -from models import Company, Dev if __name__ == '__main__': - engine = create_engine('sqlite:///freebies.db') import ipdb; ipdb.set_trace() + + + company1= Company(name = "R&B Ltd.", founding_year = 2011) + company2= Company(name = "Momanyi B&G Ltd.", founding_year = 1999) + company3= Company(name = "Kiango Kenya Ltd.", founding_year = 1989) + company4= Company(name = "Boyani Ltd.", founding_year = 2013) + + dev1= Dev(name= "Rose B. Momanyi") + dev2= Dev(name= "Vincent A. Asumari") + dev3= Dev(name= "Josiah O. Ombasa") + dev4= Dev(name= "Diana B. Ondieki") + + session.add_all([company1, company2, company3, company4, dev1, dev2, dev3, dev4]) + session.commit() + + + # Assign freebies to developers from specific companies + company1.give_freebie(dev1, "Laptop", 1) + company1.give_freebie(dev2, "smartwatch", 2) + + company2.give_freebie(dev1, "notebook", 3) + company2.give_freebie(dev2, "Headphones", 4) + + + + company3.give_freebie(dev3, "biro", 3) + + company4.give_freebie(dev4, "notebook", 1) + + freebies = session.query(Freebie).all() + for freebie in freebies: + print(freebie.print_details()) + + print(dev1.received_one("Laptop")) + print(dev1.received_one("smart watch")) \ No newline at end of file diff --git a/lib/models.py b/lib/models.py index 2681bee5a..4eee525af 100644 --- a/lib/models.py +++ b/lib/models.py @@ -1,29 +1,66 @@ from sqlalchemy import ForeignKey, Column, Integer, String, MetaData -from sqlalchemy.orm import relationship, backref -from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import relationship, 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()) + freebies = relationship('Freebie', back_populates='company', cascade="all, delete-orphan") + devs = relationship('Dev', secondary='freebies', back_populates='companies', overlaps="freebies,dev") + def __repr__(self): return f'' + def give_freebie(self, dev, item_name, value): + freebie = Freebie(item_name=item_name, value=value, dev=dev, company=self) + return freebie + + @classmethod + def oldest_company(cls, session): + return session.query(cls).order_by(cls.founding_year).first() + class Dev(Base): __tablename__ = 'devs' - id = Column(Integer(), primary_key=True) - name= Column(String()) + name = Column(String()) + + freebies = relationship('Freebie', back_populates='dev', cascade="all, delete-orphan") + companies = relationship('Company', secondary='freebies', back_populates='devs', overlaps="freebies,company") 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("You cannot give away freebies that don't belong to you.") + +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', overlaps="companies,devs") + company = relationship('Company', back_populates='freebies', overlaps="companies,devs") + + 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..93721405c 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,3 +1,50 @@ #!/usr/bin/env python3 # Script goes here! + +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker +from models import Company, Dev, Freebie, Base + + +engine = create_engine('sqlite:///database.db') +Base.metadata.create_all(engine) +Session = sessionmaker(bind=engine) +session = Session() + + +company1= Company(name = "R&B Ltd.", founding_year = 2011) +company2= Company(name = "Momanyi B&G Ltd.", founding_year = 1999) +company3= Company(name = "Kiango Kenya Ltd.", founding_year = 1989) +company4= Company(name = "Boyani Ltd.", founding_year = 2013) +company5= Company(name = "Rose Ltd.", founding_year = 2010) + + +dev1= Dev(name= "Rose B. Momanyi") +dev2= Dev(name= "Vincent A. Asumari") +dev3= Dev(name= "Josiah O. Ombasa") +dev4= Dev(name= "Diana B. Ondieki") +dev5= Dev(name= "Cecilia M. Wairimu") + + + +session.add_all([company1, company2, company3, company4, company5, dev1, dev2, dev3, dev4, dev5]) +session.commit() + + +# Give freebies +session.add_all([ + company1.give_freebie(dev1, "Laptop", 1), + company1.give_freebie(dev2, "Stylus", 2), + company2.give_freebie(dev1, "iPad", 3), + company2.give_freebie(dev2, "Headphones", 4), + company3.give_freebie(dev3, "Phone", 5), + company4.give_freebie(dev4, "Tablet", 6), + company5.give_freebie(dev5, "Stethoscope", 2) + +]) +session.commit() + +# Print all freebies +for freebie in session.query(Freebie).all(): + print(freebie.print_details())