diff --git a/lib/__pycache__/models.cpython-38.pyc b/lib/__pycache__/models.cpython-38.pyc new file mode 100644 index 000000000..7fffe8e9a 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..d38363d0d 100644 --- a/lib/debug.py +++ b/lib/debug.py @@ -1,9 +1,9 @@ +# lib/debug.py #!/usr/bin/env python3 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() + import ipdb; ipdb.set_trace() \ No newline at end of file diff --git a/lib/freebies.db b/lib/freebies.db index 12beb1c96..36521af56 100644 Binary files a/lib/freebies.db and b/lib/freebies.db differ diff --git a/lib/migrations/__pycache__/env.cpython-38.pyc b/lib/migrations/__pycache__/env.cpython-38.pyc new file mode 100644 index 000000000..ee0376573 Binary files /dev/null and b/lib/migrations/__pycache__/env.cpython-38.pyc differ diff --git a/lib/migrations/versions/508a007b637b_create_freebies_table.py b/lib/migrations/versions/508a007b637b_create_freebies_table.py new file mode 100644 index 000000000..6cda31e25 --- /dev/null +++ b/lib/migrations/versions/508a007b637b_create_freebies_table.py @@ -0,0 +1,37 @@ +"""create freebies table + +Revision ID: 508a007b637b +Revises: 5f72c58bf48c +Create Date: 2025-05-28 11:31:48.344806 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '508a007b637b' +down_revision = '5f72c58bf48c' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('freebies') + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('freebies', + sa.Column('id', sa.INTEGER(), nullable=True), + sa.Column('item_name', sa.TEXT(), nullable=False), + sa.Column('value', sa.INTEGER(), nullable=False), + sa.Column('dev_id', sa.INTEGER(), nullable=False), + sa.Column('company_id', sa.INTEGER(), nullable=False), + sa.ForeignKeyConstraint(['company_id'], ['companies.id'], ), + sa.ForeignKeyConstraint(['dev_id'], ['devs.id'], ), + sa.PrimaryKeyConstraint('id') + ) + # ### end Alembic commands ### diff --git a/lib/migrations/versions/7534e3cc22fb_create_freebies_table.py b/lib/migrations/versions/7534e3cc22fb_create_freebies_table.py new file mode 100644 index 000000000..eb158dff4 --- /dev/null +++ b/lib/migrations/versions/7534e3cc22fb_create_freebies_table.py @@ -0,0 +1,37 @@ +"""create freebies table + +Revision ID: 7534e3cc22fb +Revises: 508a007b637b +Create Date: 2025-05-28 13:47:49.191153 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '7534e3cc22fb' +down_revision = '508a007b637b' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + 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(), nullable=True), + sa.Column('company_id', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['company_id'], ['companies.id'], ), + sa.ForeignKeyConstraint(['dev_id'], ['devs.id'], ), + sa.PrimaryKeyConstraint('id') + ) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('freebies') + # ### end Alembic commands ### diff --git a/lib/migrations/versions/__pycache__/508a007b637b_create_freebies_table.cpython-38.pyc b/lib/migrations/versions/__pycache__/508a007b637b_create_freebies_table.cpython-38.pyc new file mode 100644 index 000000000..5e67ead3e Binary files /dev/null and b/lib/migrations/versions/__pycache__/508a007b637b_create_freebies_table.cpython-38.pyc differ diff --git a/lib/migrations/versions/__pycache__/5f72c58bf48c_create_companies_devs.cpython-38.pyc b/lib/migrations/versions/__pycache__/5f72c58bf48c_create_companies_devs.cpython-38.pyc new file mode 100644 index 000000000..50408c4a9 Binary files /dev/null and b/lib/migrations/versions/__pycache__/5f72c58bf48c_create_companies_devs.cpython-38.pyc differ diff --git a/lib/migrations/versions/__pycache__/7534e3cc22fb_create_freebies_table.cpython-38.pyc b/lib/migrations/versions/__pycache__/7534e3cc22fb_create_freebies_table.cpython-38.pyc new file mode 100644 index 000000000..6b139da69 Binary files /dev/null and b/lib/migrations/versions/__pycache__/7534e3cc22fb_create_freebies_table.cpython-38.pyc differ diff --git a/lib/migrations/versions/__pycache__/7a71dbf71c64_create_db.cpython-38.pyc b/lib/migrations/versions/__pycache__/7a71dbf71c64_create_db.cpython-38.pyc new file mode 100644 index 000000000..f0dada2c8 Binary files /dev/null and b/lib/migrations/versions/__pycache__/7a71dbf71c64_create_db.cpython-38.pyc differ diff --git a/lib/models.py b/lib/models.py index 2681bee5a..54d270f18 100644 --- a/lib/models.py +++ b/lib/models.py @@ -1,13 +1,10 @@ -from sqlalchemy import ForeignKey, Column, Integer, String, MetaData +# lib/models.py +from sqlalchemy import ForeignKey from sqlalchemy.orm import relationship, backref from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy import Column, Integer, String -convention = { - "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s", -} -metadata = MetaData(naming_convention=convention) - -Base = declarative_base(metadata=metadata) +Base = declarative_base() class Company(Base): __tablename__ = 'companies' @@ -16,14 +13,55 @@ class Company(Base): name = Column(String()) founding_year = Column(Integer()) + freebies = relationship('Freebie', backref='company') + devs = relationship('Dev', secondary='freebies', viewonly=True) + def __repr__(self): return f'' + + def give_freebie(self, dev, item_name, value): + freebie = Freebie( + item_name=item_name, + value=value, + dev_id=dev.id, + company_id=self.id + ) + 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', backref='dev') + companies = relationship('Company', secondary='freebies', viewonly=True) 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): + if freebie.dev == self: + freebie.dev = dev + +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'' + + def print_details(self): + return f"{self.dev.name} owns a {self.item_name} from {self.company.name}" \ No newline at end of file diff --git a/lib/seed.py b/lib/seed.py index b16becbbb..84e937243 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,3 +1,34 @@ +# lib/seed.py #!/usr/bin/env python3 -# Script goes here! +from models import Company, Dev, Freebie +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker + +engine = create_engine('sqlite:///freebies.db') +Session = sessionmaker(bind=engine) +session = Session() + +# Clear existing data +session.query(Company).delete() +session.query(Dev).delete() +session.query(Freebie).delete() + +# Seed companies +google = Company(name="Google", founding_year=1998) +facebook = Company(name="Facebook", founding_year=2004) +amazon = Company(name="Amazon", founding_year=1994) + +# Seed devs +john = Dev(name="John") +sarah = Dev(name="Sarah") +mike = Dev(name="Mike") + +# Seed freebies +freebie1 = Freebie(item_name="T-shirt", value=20, dev=john, company=google) +freebie2 = Freebie(item_name="Sticker", value=5, dev=sarah, company=facebook) +freebie3 = Freebie(item_name="Laptop", value=1000, dev=mike, company=amazon) +freebie4 = Freebie(item_name="Water Bottle", value=15, dev=john, company=amazon) + +session.add_all([google, facebook, amazon, john, sarah, mike, freebie1, freebie2, freebie3, freebie4]) +session.commit() \ No newline at end of file