diff --git a/Pipfile b/Pipfile index 63c79cd98..8c72fbd4a 100644 --- a/Pipfile +++ b/Pipfile @@ -13,4 +13,4 @@ sqlalchemy = "1.4.42" [dev-packages] [requires] -python_full_version = "3.8.13" +python_version = "3.12" diff --git a/lib/migrations/versions/20231001_create_freebies.py b/lib/migrations/versions/20231001_create_freebies.py new file mode 100644 index 000000000..ca08f1439 --- /dev/null +++ b/lib/migrations/versions/20231001_create_freebies.py @@ -0,0 +1,31 @@ +"""create freebies + +Revision ID: 20231001 +Revises: 5f72c58bf48c +Create Date: 2023-10-01 15:00:00 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '20231001' +down_revision = '5f72c58bf48c' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + op.create_table('freebies', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('item_name', sa.String(), nullable=True), + sa.Column('value', sa.Integer(), nullable=True), + sa.Column('dev_id', sa.Integer(), sa.ForeignKey('devs.id'), nullable=False), + sa.Column('company_id', sa.Integer(), sa.ForeignKey('companies.id'), nullable=False), + sa.PrimaryKeyConstraint('id') + ) + + +def downgrade() -> None: + op.drop_table('freebies') diff --git a/lib/models.py b/lib/models.py index 2681bee5a..20b514f38 100644 --- a/lib/models.py +++ b/lib/models.py @@ -19,6 +19,28 @@ class Company(Base): def __repr__(self): return f'' + # Relationship attributes + freebies = relationship('Freebie', back_populates='company') + devs = relationship('Dev', secondary='freebies', back_populates='companies') + + # Aggregate methods + def give_freebie(self, session, dev, item_name, value): + """Create a new Freebie instance associated with this company and the given dev.""" + freebie = Freebie( + item_name=item_name, + value=value, + dev_id=dev.id, + company_id=self.id + ) + session.add(freebie) + session.commit() + return freebie + + @classmethod + def oldest_company(cls, session): + """Return the Company instance with the earliest founding year.""" + return session.query(cls).order_by(cls.founding_year).first() + class Dev(Base): __tablename__ = 'devs' @@ -27,3 +49,42 @@ class Dev(Base): def __repr__(self): return f'' + + # Relationship attributes + freebies = relationship('Freebie', back_populates='dev') + companies = relationship('Company', secondary='freebies', back_populates='devs') + + # Aggregate methods + def received_one(self, item_name): + """Return True if any of the freebies associated with the dev has that item_name.""" + return any(freebie.item_name == item_name for freebie in self.freebies) + + def give_away(self, session, dev, freebie): + """Change the freebie's dev to be the given dev if the freebie belongs to this dev.""" + if freebie.dev == self: + freebie.dev = dev + session.add(freebie) + session.commit() + return True + return False + +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'' + + # Relationship attributes + dev = relationship('Dev', back_populates='freebies') + company = relationship('Company', back_populates='freebies') + + # Aggregate methods + def print_details(self): + """Return a string formatted as: {dev name} owns a {freebie item_name} from {company name}.""" + 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..1a27c600c 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,3 +1,57 @@ #!/usr/bin/env python3 -# Script goes here! +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker +from models import Company, Dev, Freebie + +if __name__ == '__main__': + engine = create_engine('sqlite:///lib/freebies.db') + Session = sessionmaker(bind=engine) + session = Session() + + # Clear existing data + try: + session.query(Freebie).delete() + except: + pass # Table might not exist yet + try: + session.query(Company).delete() + except: + pass # Table might not exist yet + try: + session.query(Dev).delete() + except: + pass # Table might not exist yet + + # Create companies + google = Company(name="Google", founding_year=1998) + microsoft = Company(name="Microsoft", founding_year=1975) + apple = Company(name="Apple", founding_year=1976) + amazon = Company(name="Amazon", founding_year=1994) + + # Create devs + alice = Dev(name="Alice") + bob = Dev(name="Bob") + charlie = Dev(name="Charlie") + diana = Dev(name="Diana") + + # Create freebies + freebies = [ + Freebie(item_name="T-shirt", value=15, dev=alice, company=google), + Freebie(item_name="Stickers", value=5, dev=alice, company=microsoft), + Freebie(item_name="Water Bottle", value=20, dev=bob, company=apple), + Freebie(item_name="Laptop Sleeve", value=25, dev=bob, company=amazon), + Freebie(item_name="USB Drive", value=10, dev=charlie, company=google), + Freebie(item_name="Notebook", value=8, dev=charlie, company=microsoft), + Freebie(item_name="Pen", value=3, dev=diana, company=apple), + Freebie(item_name="Backpack", value=40, dev=diana, company=amazon), + ] + + # Add all objects to session + session.add_all([google, microsoft, apple, amazon]) + session.add_all([alice, bob, charlie, diana]) + session.add_all(freebies) + + # Commit the changes + session.commit() + print("Database seeded successfully!")