diff --git a/.gitignore b/.gitignore index 1fcadf3de..ef1b6ac6c 100644 --- a/.gitignore +++ b/.gitignore @@ -46,6 +46,7 @@ jspm_packages # Virtual env metadata .venv +.vscode # pytest cache .pytest_cache diff --git a/lib/__pycache__/models.cpython-38.pyc b/lib/__pycache__/models.cpython-38.pyc new file mode 100644 index 000000000..5ad215753 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..a13e4697c 100644 --- a/lib/debug.py +++ b/lib/debug.py @@ -1,9 +1,15 @@ #!/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 -if __name__ == '__main__': - engine = create_engine('sqlite:///freebies.db') - import ipdb; ipdb.set_trace() +if __name__ == "__main__": + engine = create_engine("sqlite:///freebies.db") + Session = sessionmaker(bind=engine) + session = Session() + + import ipdb + + ipdb.set_trace() diff --git a/lib/freebies.db b/lib/freebies.db index 12beb1c96..7da7c9aa8 100644 Binary files a/lib/freebies.db and b/lib/freebies.db differ diff --git a/lib/migrations/versions/0aef27113b29_generate_new_seed.py b/lib/migrations/versions/0aef27113b29_generate_new_seed.py new file mode 100644 index 000000000..8141b2d9d --- /dev/null +++ b/lib/migrations/versions/0aef27113b29_generate_new_seed.py @@ -0,0 +1,28 @@ +"""generate new seed + +Revision ID: 0aef27113b29 +Revises: 42926826b376 +Create Date: 2023-08-07 14:54:54.165035 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '0aef27113b29' +down_revision = '42926826b376' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + pass + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + pass + # ### end Alembic commands ### diff --git a/lib/migrations/versions/42926826b376_create_seed.py b/lib/migrations/versions/42926826b376_create_seed.py new file mode 100644 index 000000000..b52f009b8 --- /dev/null +++ b/lib/migrations/versions/42926826b376_create_seed.py @@ -0,0 +1,28 @@ +"""create seed + +Revision ID: 42926826b376 +Revises: 71c68f233f42 +Create Date: 2023-08-07 14:41:35.629937 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '42926826b376' +down_revision = '71c68f233f42' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + pass + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + pass + # ### end Alembic commands ### diff --git a/lib/migrations/versions/595c4ef42041_updates_seed.py b/lib/migrations/versions/595c4ef42041_updates_seed.py new file mode 100644 index 000000000..a7f62fce4 --- /dev/null +++ b/lib/migrations/versions/595c4ef42041_updates_seed.py @@ -0,0 +1,28 @@ +"""updates seed + +Revision ID: 595c4ef42041 +Revises: b1f8203fe609 +Create Date: 2023-08-07 22:30:29.516700 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '595c4ef42041' +down_revision = 'b1f8203fe609' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + pass + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + pass + # ### end Alembic commands ### diff --git a/lib/migrations/versions/71c68f233f42_add_freebie_model.py b/lib/migrations/versions/71c68f233f42_add_freebie_model.py new file mode 100644 index 000000000..7432d672d --- /dev/null +++ b/lib/migrations/versions/71c68f233f42_add_freebie_model.py @@ -0,0 +1,37 @@ +"""Add Freebie model + +Revision ID: 71c68f233f42 +Revises: 5f72c58bf48c +Create Date: 2023-08-07 13:55:36.900290 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '71c68f233f42' +down_revision = '5f72c58bf48c' +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'], name=op.f('fk_freebies_company_id_companies')), + sa.ForeignKeyConstraint(['dev_id'], ['devs.id'], name=op.f('fk_freebies_dev_id_devs')), + 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/b1f8203fe609_modifies_dev.py b/lib/migrations/versions/b1f8203fe609_modifies_dev.py new file mode 100644 index 000000000..0e3ab01b7 --- /dev/null +++ b/lib/migrations/versions/b1f8203fe609_modifies_dev.py @@ -0,0 +1,28 @@ +"""modifies dev + +Revision ID: b1f8203fe609 +Revises: 0aef27113b29 +Create Date: 2023-08-07 15:19:39.694027 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'b1f8203fe609' +down_revision = '0aef27113b29' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + pass + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + pass + # ### end Alembic commands ### diff --git a/lib/models.py b/lib/models.py index 2681bee5a..f3cbda0de 100644 --- a/lib/models.py +++ b/lib/models.py @@ -1,6 +1,14 @@ from sqlalchemy import ForeignKey, Column, Integer, String, MetaData from sqlalchemy.orm import relationship, backref from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.ext.associationproxy import association_proxy +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker +from sqlalchemy import desc + +engine = create_engine("sqlite:///freebies.db") +Session = sessionmaker(bind=engine) +session = Session() convention = { "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s", @@ -9,21 +17,85 @@ Base = declarative_base(metadata=metadata) + class Company(Base): - __tablename__ = 'companies' + __tablename__ = "companies" id = Column(Integer(), primary_key=True) name = Column(String()) founding_year = Column(Integer()) + freebies = relationship("Freebie", backref=backref("company")) + devs = association_proxy("freebies", "dev", creator=lambda dev: Freebie(dev=dev)) + + def give_freebie(self, dev, item_name, value): + new_freebie = Freebie(item_name=item_name, value=value) + new_freebie.company = self + new_freebie.dev = dev + + print( + f"{new_freebie.dev}, {new_freebie.item_name}, {new_freebie.value}, {new_freebie.company}" + ) + + @classmethod + def oldest_company(cls): + oldest_company = ( + session.query(Company).order_by(desc(Company.founding_year)).first() + ) + + return oldest_company + def __repr__(self): - return f'' + return f"" + class Dev(Base): - __tablename__ = 'devs' + __tablename__ = "devs" + + id = Column(Integer(), primary_key=True) + name = Column(String()) + + freebies = relationship("Freebie", backref=backref("dev")) + companies = association_proxy( + "freebies", "company", creator=lambda comp: Freebie(company=comp) + ) + + def received_one(self, item_name): + print(f"Checking for {item_name} in freebies:") + for freebie in self.freebies: + print(f"- {freebie.item_name}") + if freebie.item_name == item_name: + return True + return False + + def give_away(self, dev, freebie): + if freebie in self.freebies: + freebie.dev = dev + session.commit() + return freebie.dev + + def __repr__(self): + return f"" + + +class Freebie(Base): + __tablename__ = "freebies" id = Column(Integer(), primary_key=True) - name= Column(String()) + 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'' + return f"" + + @classmethod + def print_details(cls): + freebies = session.query(Freebie).all() + details = [] + for freebie in freebies: + detail = f"{freebie.dev.name} owns a {freebie.item_name} from {freebie.company.name}" + details.append(detail) + return "\n".join(details) diff --git a/lib/seed.py b/lib/seed.py index b16becbbb..f3793ddd8 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,3 +1,96 @@ #!/usr/bin/env python3 # Script goes here! +import random +from faker import Faker +from random import random as rc +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker +from models import Company, Dev, Freebie + +engine = create_engine("sqlite:///freebies.db") +Session = sessionmaker(bind=engine) +session = Session() + +fake = Faker() + +company_name = [ + "Amazon", + "Apple", + "Google", + "PlayStation", + "Microsoft", + "Meta", + "TikTok", + "Netflix", + "FlatIron", + "Spotify", +] + +item = [ + "t-shirt", + "backpack", + "lanyard", + "laptop case", + "sticker", + "pen", + "cup", + "bumper sticker", + "headphones", + "phone case", +] + + +def delete_records(): + session.query(Company).delete() + session.query(Dev).delete() + session.query(Freebie).delete() + session.commit() + + +def create_companies(): + companies = [] + for i in range(10): + company = Company(name=random.choice(company_name), founding_year=fake.year()) + session.add(company) + session.commit() + companies.append(company) + return companies + + +def create_devs(): + devs = [] + for i in range(50): + dev = Dev(name=fake.name()) + session.add(dev) + session.commit() + devs.append(dev) + return devs + + +def create_freebies(): + freebies = [] + for i in range(100): + freebie = Freebie(item_name=random.choice(item), value=random.randint(0, 60)) + session.add(freebie) + session.commit() + freebies.append(freebie) + return freebies + + +def relate_one_to_many(companies, devs, freebies): + for freebie in freebies: + freebie.dev = random.choice(devs) + freebie.company = random.choice(companies) + + session.add_all(freebies) + session.commit() + return companies, devs, freebies + + +if __name__ == "__main__": + delete_records() + companies = create_companies() + devs = create_devs() + freebies = create_freebies() + companies, devs, freebies = relate_one_to_many(companies, devs, freebies)