diff --git a/app/__pycache__/models.cpython-38.pyc b/app/__pycache__/models.cpython-38.pyc new file mode 100644 index 000000000..fc1ff4210 Binary files /dev/null and b/app/__pycache__/models.cpython-38.pyc differ diff --git a/app/debug.py b/app/debug.py index 4f922eb69..f95db6cd5 100644 --- a/app/debug.py +++ b/app/debug.py @@ -1,7 +1,6 @@ #!/usr/bin/env python3 from sqlalchemy import create_engine - from models import Company, Dev if __name__ == '__main__': diff --git a/app/freebie-tracker.db b/app/freebie-tracker.db new file mode 100644 index 000000000..e69de29bb diff --git a/app/freebies.db b/app/freebies.db index 271836bca..047316d64 100644 Binary files a/app/freebies.db and b/app/freebies.db differ diff --git a/app/migrations/versions/19f2ebb7599b_first_init.py b/app/migrations/versions/19f2ebb7599b_first_init.py new file mode 100644 index 000000000..be930e120 --- /dev/null +++ b/app/migrations/versions/19f2ebb7599b_first_init.py @@ -0,0 +1,24 @@ +"""First Init + +Revision ID: 19f2ebb7599b +Revises: ee905476242e +Create Date: 2022-12-16 10:35:33.186324 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '19f2ebb7599b' +down_revision = 'ee905476242e' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + pass + + +def downgrade() -> None: + pass diff --git a/app/migrations/versions/39020a3533b7_added_all_models.py b/app/migrations/versions/39020a3533b7_added_all_models.py new file mode 100644 index 000000000..8da7ef94d --- /dev/null +++ b/app/migrations/versions/39020a3533b7_added_all_models.py @@ -0,0 +1,56 @@ +"""Added All models + +Revision ID: 39020a3533b7 +Revises: 19f2ebb7599b +Create Date: 2022-12-16 10:36:10.825371 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '39020a3533b7' +down_revision = '19f2ebb7599b' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('company_devs', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('company_id', sa.Integer(), nullable=True), + sa.Column('dev_id', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['company_id'], ['companies.id'], ), + sa.ForeignKeyConstraint(['dev_id'], ['devs.id'], ), + sa.PrimaryKeyConstraint('id') + ) + 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('company_id', sa.Integer(), nullable=True), + sa.Column('dev_id', sa.Integer(), nullable=True), + sa.Column('created_at', sa.DateTime(), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=True), + sa.Column('updated_at', sa.DateTime(), nullable=True), + sa.ForeignKeyConstraint(['company_id'], ['companies.id'], ), + sa.ForeignKeyConstraint(['dev_id'], ['devs.id'], ), + sa.PrimaryKeyConstraint('id') + ) + op.add_column('companies', sa.Column('created_at', sa.DateTime(), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=True)) + op.add_column('companies', sa.Column('updated_at', sa.DateTime(), nullable=True)) + op.add_column('devs', sa.Column('created_at', sa.DateTime(), server_default=sa.text('(CURRENT_TIMESTAMP)'), nullable=True)) + op.add_column('devs', sa.Column('updated_at', sa.DateTime(), nullable=True)) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('devs', 'updated_at') + op.drop_column('devs', 'created_at') + op.drop_column('companies', 'updated_at') + op.drop_column('companies', 'created_at') + op.drop_table('freebies') + op.drop_table('company_devs') + # ### end Alembic commands ### diff --git a/app/migrations/versions/c4d7867d81f5_create_freebies_db.py b/app/migrations/versions/c4d7867d81f5_create_freebies_db.py index da258dc89..c61fec0f1 100644 --- a/app/migrations/versions/c4d7867d81f5_create_freebies_db.py +++ b/app/migrations/versions/c4d7867d81f5_create_freebies_db.py @@ -21,4 +21,4 @@ def upgrade() -> None: def downgrade() -> None: - pass + pass \ No newline at end of file diff --git a/app/migrations/versions/ee905476242e_add_companies_devs_tables.py b/app/migrations/versions/ee905476242e_add_companies_devs_tables.py index 3adc1353f..eeb11a391 100644 --- a/app/migrations/versions/ee905476242e_add_companies_devs_tables.py +++ b/app/migrations/versions/ee905476242e_add_companies_devs_tables.py @@ -36,4 +36,4 @@ def downgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### op.drop_table('devs') op.drop_table('companies') - # ### end Alembic commands ### + # ### end Alembic commands ### \ No newline at end of file diff --git a/app/models.py b/app/models.py index 8bc917b0c..981a2ea56 100644 --- a/app/models.py +++ b/app/models.py @@ -1,25 +1,156 @@ #!/usr/bin/env python3 -from sqlalchemy import (Column, String, Integer) +from sqlalchemy import create_engine, func +from sqlalchemy import ForeignKey, Table, Column, Integer, String, DateTime +from sqlalchemy.orm import relationship, backref, sessionmaker from sqlalchemy.ext.declarative import declarative_base + +engine = create_engine('sqlite:///freebies.db') +# engine = create_engine('sqlite:///freebie-tracker.db') + Base = declarative_base() + +company_dev = Table( + 'company_devs', + Base.metadata, + Column('id', Integer(), primary_key=True), + Column('company_id', ForeignKey('companies.id')), + Column('dev_id', ForeignKey('devs.id')), + extend_existing=True, +) + + +## far left + class Company(Base): __tablename__ = 'companies' id = Column(Integer(), primary_key=True) name = Column(String()) founding_year = Column(Integer()) + created_at = Column(DateTime(), server_default=func.now()) + updated_at = Column(DateTime(), onupdate=func.now()) + devs = relationship('Dev', secondary=company_dev, back_populates='companies') + freebies = relationship('Freebie', backref=backref('company')) def __repr__(self): - return f'' + return f'' + + def give_freebie(self ,dev, item_name, value): + # creates a new Freebie instance associated with this company and the given dev + Session = sessionmaker(bind=engine) + session = Session() + freebie = Freebie(item_name=item_name,value=value) + freebie.dev = dev + freebie.company = self + session.add(freebie) + session.commit() + + + + @classmethod + def oldest_company(cls): + # returns the Company instance with the earliest founding year. + # ipdb.set_trace() + Session = sessionmaker(bind=engine) + session = Session() + old_company = session.query(Company).all()[0] + return old_company + + + + + + + +## far right class Dev(Base): __tablename__ = 'devs' id = Column(Integer(), primary_key=True) name= Column(String()) + created_at = Column(DateTime(), server_default=func.now()) + updated_at = Column(DateTime(), onupdate=func.now()) + companies = relationship('Company', secondary=company_dev, back_populates='devs') + freebies = relationship('Freebie', backref=backref('dev')) + + def __init__(self, name): + self.name = name + + def __repr__(self): + return f'' # - delete this next time!! + # return f'' - use this next time!! + + def received_one(self,item_name): + # Dev.received_one(item_name) accepts an item_name (string) and returns True if any of the freebies associated with the dev has that item_name, otherwise returns False. + for d in self.freebies: + if d.item_name == item_name: + print(''' + + TRUEEEEEE + + ''') + return True + return False + + + def give_away(self,dev, freebie): + ### + ### + #-- broken need to fix!!! + ### + ### + # Dev.give_away(dev, freebie) accepts a Dev instance and a Freebie instance, changes the freebie's dev to be the given dev; your code should only make the change if the freebie belongs to the dev who's giving it away + Session = sessionmaker(bind=engine) + session = Session() + # # dev = self + #freebie = session.query(Freebie).filter_by(dev_id=dev.id).first() + print(''' + + + + ******** HEY IM HERE!!!!!!!!!!!!!!!!!! ******** + + + + + ''') + print(freebie) + + session.add(dev) + session.commit() + + dev_just_added = session.query(Dev).order_by(Dev.id.desc()).first() + + freebie.dev_id = dev_just_added.id + session.commit() + + + + +## join table +class Freebie(Base): + __tablename__ = 'freebies' + + id = Column(Integer(), primary_key=True) + + item_name= Column(String()) + value = Column(Integer()) + company_id = Column(Integer(), ForeignKey('companies.id')) + dev_id = Column(Integer(), ForeignKey('devs.id')) + created_at = Column(DateTime(), server_default=func.now()) + updated_at = Column(DateTime(), onupdate=func.now()) + def __repr__(self): - return f'' + 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/app/seed.py b/app/seed.py index b16becbbb..ac1838280 100644 --- a/app/seed.py +++ b/app/seed.py @@ -1,3 +1,46 @@ #!/usr/bin/env python3 # Script goes here! +# from faker import Faker +import random +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker + +from models import Company +from models import Dev +from models import Freebie + + +# fake = Faker() + +if __name__ == '__main__': + + engine = create_engine('sqlite:///freebies.db') + Session = sessionmaker(bind=engine) + session = Session() + + session.query(Company).delete() + session.query(Dev).delete() + session.query(Freebie).delete() + session.commit() + + # company + + ibm = Company(name="IBM", founding_year=1911) + fi_school = Company(name="Flatiron School ", founding_year=2012) + # dev + + malcome = Dev(name="Malcome") + nick = Dev(name="Nick") + + # Freebie + book = Freebie(item_name="Book", value=12, company_id=1, dev_id=1) + planer = Freebie(item_name="Planer", value=13, company_id=2, dev_id=1) + + # got = Freebie(item_name="Game of Thrones", value=6, company_id=1, dev_id=1) + + # pen = Freebie(item_name="Pen", value=5, company_id=1, dev_id=1) + + session.bulk_save_objects([ibm,fi_school,malcome,nick,book,planer ]) + + session.commit() diff --git a/playground.py b/playground.py new file mode 100644 index 000000000..4e64f2f96 --- /dev/null +++ b/playground.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python3 + +# Script goes here! +# from faker import Faker +import random +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker + +from models import Company +from models import Dev +from models import Freebie + + +# fake = Faker() + +if __name__ == '__main__': + + engine = create_engine('sqlite:///freebies.db') + Session = sessionmaker(bind=engine) + session = Session() + + session.query(Company).delete() + session.query(Dev).delete() + session.query(Freebie).delete() + session.commit() + + # company + + ibm = Company(name="IBM", founding_year=1911) + fi_school = Company(name="Flatiron School ", founding_year=2012) + wework = Company(name="WeWork ", founding_year=2016) + dd = Company(name="Dunkin Donuts", founding_year=2019) + # dev + + malcome = Dev(name="Malcome") + nick = Dev(name="Nick") + + # Freebie + book = Freebie(item_name="Book", value=12, company_id=1, dev_id=1) + planer = Freebie(item_name="Planer", value=13, company_id=2, dev_id=1) + + # got = Freebie(item_name="Game of Thrones", value=6, company_id=1, dev_id=1) + + # pen = Freebie(item_name="Pen", value=5, company_id=1, dev_id=1) + + session.bulk_save_objects([ibm,fi_school,malcome,nick,book,planer ]) + + session.commit() + +##### + +# put the following in the ipdb! + +# 1-- Company.give_freebie(dev, item_name, value) +dev = Dev(name="Bob") +item_name = "T-shirt" +value = 2 +Company.give_freebie(dev, item_name, value)