diff --git a/lib/debug.py b/lib/debug.py index 4f922eb69..ab6b5f08c 100644 --- a/lib/debug.py +++ b/lib/debug.py @@ -2,8 +2,13 @@ from sqlalchemy import create_engine -from models import Company, Dev +from sqlalchemy.orm import sessionmaker + + +from models import Company, Dev, Freebie 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..5b415fa39 100644 Binary files a/lib/freebies.db and b/lib/freebies.db differ diff --git a/lib/migrations/versions/22a3b8201236_give_away_try.py b/lib/migrations/versions/22a3b8201236_give_away_try.py new file mode 100644 index 000000000..32f5708c0 --- /dev/null +++ b/lib/migrations/versions/22a3b8201236_give_away_try.py @@ -0,0 +1,28 @@ +"""give_away try + +Revision ID: 22a3b8201236 +Revises: 70197d70e7b5 +Create Date: 2023-05-11 14:21:18.002440 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '22a3b8201236' +down_revision = '70197d70e7b5' +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/295886a7a51f_cls_in_oldest_company.py b/lib/migrations/versions/295886a7a51f_cls_in_oldest_company.py new file mode 100644 index 000000000..afb88026b --- /dev/null +++ b/lib/migrations/versions/295886a7a51f_cls_in_oldest_company.py @@ -0,0 +1,28 @@ +"""cls in oldest_company + +Revision ID: 295886a7a51f +Revises: 6cc3e65a0d7e +Create Date: 2023-05-11 12:59:39.156913 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '295886a7a51f' +down_revision = '6cc3e65a0d7e' +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/2bf8ba1d8850_trying_setting_freebie_id.py b/lib/migrations/versions/2bf8ba1d8850_trying_setting_freebie_id.py new file mode 100644 index 000000000..ddb85cbec --- /dev/null +++ b/lib/migrations/versions/2bf8ba1d8850_trying_setting_freebie_id.py @@ -0,0 +1,28 @@ +"""trying setting Freebie.id + +Revision ID: 2bf8ba1d8850 +Revises: c712f403afd6 +Create Date: 2023-05-11 12:46:32.041625 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '2bf8ba1d8850' +down_revision = 'c712f403afd6' +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/2c2ff2e7a22f_fix_args.py b/lib/migrations/versions/2c2ff2e7a22f_fix_args.py new file mode 100644 index 000000000..21c8ce139 --- /dev/null +++ b/lib/migrations/versions/2c2ff2e7a22f_fix_args.py @@ -0,0 +1,28 @@ +"""fix args + +Revision ID: 2c2ff2e7a22f +Revises: 295886a7a51f +Create Date: 2023-05-11 13:37:21.423223 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '2c2ff2e7a22f' +down_revision = '295886a7a51f' +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/4866d9558fde_add_freebies_table.py b/lib/migrations/versions/4866d9558fde_add_freebies_table.py new file mode 100644 index 000000000..bf3f660fd --- /dev/null +++ b/lib/migrations/versions/4866d9558fde_add_freebies_table.py @@ -0,0 +1,37 @@ +"""add freebies table + +Revision ID: 4866d9558fde +Revises: a32e60ac241e +Create Date: 2023-05-11 11:24:51.693097 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '4866d9558fde' +down_revision = 'a32e60ac241e' +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('company_id', sa.Integer(), nullable=True), + sa.Column('dev_id', sa.Integer(), nullable=True), + sa.Column('item_name', sa.String(), nullable=True), + sa.Column('value', 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/52c0650c3daf_self_arg_for_print_details.py b/lib/migrations/versions/52c0650c3daf_self_arg_for_print_details.py new file mode 100644 index 000000000..059fb45bd --- /dev/null +++ b/lib/migrations/versions/52c0650c3daf_self_arg_for_print_details.py @@ -0,0 +1,28 @@ +"""self arg for print_details + +Revision ID: 52c0650c3daf +Revises: f2fd9cbf71e8 +Create Date: 2023-05-11 11:57:57.214857 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '52c0650c3daf' +down_revision = 'f2fd9cbf71e8' +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/5fdbfdd88f7f_give_away_better_code.py b/lib/migrations/versions/5fdbfdd88f7f_give_away_better_code.py new file mode 100644 index 000000000..2307c08dc --- /dev/null +++ b/lib/migrations/versions/5fdbfdd88f7f_give_away_better_code.py @@ -0,0 +1,28 @@ +"""give_away better code + +Revision ID: 5fdbfdd88f7f +Revises: 22a3b8201236 +Create Date: 2023-05-11 14:26:11.065418 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '5fdbfdd88f7f' +down_revision = '22a3b8201236' +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/6cc3e65a0d7e_made_oldest_company_a_class_method.py b/lib/migrations/versions/6cc3e65a0d7e_made_oldest_company_a_class_method.py new file mode 100644 index 000000000..d3c4d576a --- /dev/null +++ b/lib/migrations/versions/6cc3e65a0d7e_made_oldest_company_a_class_method.py @@ -0,0 +1,28 @@ +"""made oldest_company a class method + +Revision ID: 6cc3e65a0d7e +Revises: 79e914f63417 +Create Date: 2023-05-11 12:58:09.056455 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '6cc3e65a0d7e' +down_revision = '79e914f63417' +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/70197d70e7b5_wrote_received_one_hope_it_works.py b/lib/migrations/versions/70197d70e7b5_wrote_received_one_hope_it_works.py new file mode 100644 index 000000000..09ee0c23e --- /dev/null +++ b/lib/migrations/versions/70197d70e7b5_wrote_received_one_hope_it_works.py @@ -0,0 +1,28 @@ +"""wrote received_one hope it works + +Revision ID: 70197d70e7b5 +Revises: 7db381407e3c +Create Date: 2023-05-11 14:14:22.611393 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '70197d70e7b5' +down_revision = '7db381407e3c' +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/79e914f63417_oldest_company.py b/lib/migrations/versions/79e914f63417_oldest_company.py new file mode 100644 index 000000000..a3701e635 --- /dev/null +++ b/lib/migrations/versions/79e914f63417_oldest_company.py @@ -0,0 +1,28 @@ +"""oldest_company + +Revision ID: 79e914f63417 +Revises: 2bf8ba1d8850 +Create Date: 2023-05-11 12:56:41.021847 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '79e914f63417' +down_revision = '2bf8ba1d8850' +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/7db381407e3c_received_one_try.py b/lib/migrations/versions/7db381407e3c_received_one_try.py new file mode 100644 index 000000000..867fd4c73 --- /dev/null +++ b/lib/migrations/versions/7db381407e3c_received_one_try.py @@ -0,0 +1,28 @@ +"""received_one try + +Revision ID: 7db381407e3c +Revises: 90acc6fbf936 +Create Date: 2023-05-11 14:11:34.632909 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '7db381407e3c' +down_revision = '90acc6fbf936' +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/8ca3b0acbfe3_altered_print_details.py b/lib/migrations/versions/8ca3b0acbfe3_altered_print_details.py new file mode 100644 index 000000000..aeb106091 --- /dev/null +++ b/lib/migrations/versions/8ca3b0acbfe3_altered_print_details.py @@ -0,0 +1,28 @@ +"""altered print_details + +Revision ID: 8ca3b0acbfe3 +Revises: c371c22f4225 +Create Date: 2023-05-11 11:54:20.506360 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '8ca3b0acbfe3' +down_revision = 'c371c22f4225' +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/90acc6fbf936_update_oldest_company.py b/lib/migrations/versions/90acc6fbf936_update_oldest_company.py new file mode 100644 index 000000000..c4c08a33b --- /dev/null +++ b/lib/migrations/versions/90acc6fbf936_update_oldest_company.py @@ -0,0 +1,28 @@ +"""update oldest_company + +Revision ID: 90acc6fbf936 +Revises: da71e1a22656 +Create Date: 2023-05-11 13:58:07.825636 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '90acc6fbf936' +down_revision = 'da71e1a22656' +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/a32e60ac241e_add_freebie.py b/lib/migrations/versions/a32e60ac241e_add_freebie.py new file mode 100644 index 000000000..435e6aafc --- /dev/null +++ b/lib/migrations/versions/a32e60ac241e_add_freebie.py @@ -0,0 +1,24 @@ +"""add Freebie + +Revision ID: a32e60ac241e +Revises: 5f72c58bf48c +Create Date: 2023-05-11 11:20:04.968121 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'a32e60ac241e' +down_revision = '5f72c58bf48c' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + op.create_table('freebies') + + +def downgrade() -> None: + op.drop_table('freebies') diff --git a/lib/migrations/versions/aae63ddbde0b_give_away_added_dev_id.py b/lib/migrations/versions/aae63ddbde0b_give_away_added_dev_id.py new file mode 100644 index 000000000..8fd64d5fc --- /dev/null +++ b/lib/migrations/versions/aae63ddbde0b_give_away_added_dev_id.py @@ -0,0 +1,28 @@ +"""give_away added dev.id + +Revision ID: aae63ddbde0b +Revises: 5fdbfdd88f7f +Create Date: 2023-05-11 14:28:30.603566 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'aae63ddbde0b' +down_revision = '5fdbfdd88f7f' +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/b335d574067b_give_freebie.py b/lib/migrations/versions/b335d574067b_give_freebie.py new file mode 100644 index 000000000..f0df9bad8 --- /dev/null +++ b/lib/migrations/versions/b335d574067b_give_freebie.py @@ -0,0 +1,28 @@ +"""give_freebie + +Revision ID: b335d574067b +Revises: 2c2ff2e7a22f +Create Date: 2023-05-11 13:42:46.336445 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'b335d574067b' +down_revision = '2c2ff2e7a22f' +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/c371c22f4225_add_print_details_method_to_freebie.py b/lib/migrations/versions/c371c22f4225_add_print_details_method_to_freebie.py new file mode 100644 index 000000000..7304dce0f --- /dev/null +++ b/lib/migrations/versions/c371c22f4225_add_print_details_method_to_freebie.py @@ -0,0 +1,28 @@ +"""add print_details method to Freebie + +Revision ID: c371c22f4225 +Revises: 4866d9558fde +Create Date: 2023-05-11 11:41:27.792032 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'c371c22f4225' +down_revision = '4866d9558fde' +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/c712f403afd6_company_give_freebie.py b/lib/migrations/versions/c712f403afd6_company_give_freebie.py new file mode 100644 index 000000000..28bb5b0b9 --- /dev/null +++ b/lib/migrations/versions/c712f403afd6_company_give_freebie.py @@ -0,0 +1,28 @@ +"""Company give_freebie + +Revision ID: c712f403afd6 +Revises: 52c0650c3daf +Create Date: 2023-05-11 12:35:47.186602 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'c712f403afd6' +down_revision = '52c0650c3daf' +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/da71e1a22656_give_freebie_returns_instance.py b/lib/migrations/versions/da71e1a22656_give_freebie_returns_instance.py new file mode 100644 index 000000000..83e5b7685 --- /dev/null +++ b/lib/migrations/versions/da71e1a22656_give_freebie_returns_instance.py @@ -0,0 +1,28 @@ +"""give_freebie returns instance + +Revision ID: da71e1a22656 +Revises: b335d574067b +Create Date: 2023-05-11 13:51:56.500350 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'da71e1a22656' +down_revision = 'b335d574067b' +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/f2fd9cbf71e8_adjust_again.py b/lib/migrations/versions/f2fd9cbf71e8_adjust_again.py new file mode 100644 index 000000000..01124362f --- /dev/null +++ b/lib/migrations/versions/f2fd9cbf71e8_adjust_again.py @@ -0,0 +1,28 @@ +"""adjust again + +Revision ID: f2fd9cbf71e8 +Revises: 8ca3b0acbfe3 +Create Date: 2023-05-11 11:56:52.222755 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'f2fd9cbf71e8' +down_revision = '8ca3b0acbfe3' +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..edbef156c 100644 --- a/lib/models.py +++ b/lib/models.py @@ -1,6 +1,12 @@ -from sqlalchemy import ForeignKey, Column, Integer, String, MetaData -from sqlalchemy.orm import relationship, backref +from sqlalchemy import ForeignKey, Column, Integer, String, MetaData, create_engine +from sqlalchemy.orm import relationship, backref, sessionmaker from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.ext.associationproxy import association_proxy + + +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,6 +15,27 @@ Base = declarative_base(metadata=metadata) +class Freebie(Base): + __tablename__ = 'freebies' + def __init__(self, company_id, dev_id, item_name, value, id = None): + self.id = id + self.company_id = Column(Integer(), ForeignKey('companies.id')) + self.dev_id = Column(Integer(), ForeignKey('devs.id')) + self.item_name = item_name + self.value = value + + id=Column(Integer(), primary_key=True) + company_id = Column(Integer(), ForeignKey('companies.id')) + dev_id = Column(Integer(), ForeignKey('devs.id')) + item_name=Column(String()) + value=Column(Integer()) + + def print_details(self): + return f'{self.dev.name} owns a {self.item_name} from {self.company.name}' + + def __repr__(self): + return f'' + class Company(Base): __tablename__ = 'companies' @@ -16,14 +43,43 @@ class Company(Base): name = Column(String()) founding_year = Column(Integer()) + freebies = relationship('Freebie', backref='company') + devs = association_proxy('freebies', 'dev', + creator=lambda dv: Freebie(dev=dv)) + def give_freebie(self, dev, item_name, value): + #creates a new freebie instance associated with THIS company and the given dev + return Freebie(self.id, dev.id, item_name, value) + @classmethod + def oldest_company(cls): + oldest= session.query(cls).order_by(cls.founding_year).first() + return oldest def __repr__(self): return f'' + + + class Dev(Base): __tablename__ = 'devs' id = Column(Integer(), primary_key=True) name= Column(String()) + freebies = relationship('Freebie', backref='dev') + companies = association_proxy('freebies', 'company', + creator=lambda cm: Freebie(company=cm)) + + def received_one(self, item_name): + #if any freebies' item names are the item_name return True, else False + for freebie in self.freebies: + return freebie.item_name == item_name + + def give_away(self, dev, freebie): + #updates given freebie's dev to be the given dev iff freebie's current dev is the one that the method is being called on + if freebie.dev_id == self.id: + freebie.dev_id = dev.id + return freebie.dev_id def __repr__(self): return f'' + + diff --git a/lib/seed.py b/lib/seed.py index b16becbbb..457f04df0 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,3 +1,54 @@ #!/usr/bin/env python3 -# Script goes here! +from random import choice as rc + +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker +import random +from models import Company, Dev, Freebie + +engine = create_engine('sqlite:///freebies.db') +Session = sessionmaker(bind=engine) +session = Session() + + + +def delete_records(): + session.query(Company).delete() + session.query(Freebie).delete() + session.query(Dev).delete() + session.commit() + +def create_records(): + companies = [ + Company( + name= 'Bob', + founding_year = random.randint(1900, 2023) + ) for i in range(100)] + freebies = [ + Freebie( + company_id = random.randint(1,100), + dev_id = random.randint(1, 500), + item_name='item', + value=random.randint(0, 60), + ) for i in range(1000)] + devs = [ + Dev( + name= "Devonne" + ) for i in range(500)] + session.add_all(companies + freebies + devs) + session.commit() + return companies, freebies, devs + +def relate_records(companies, freebies, devs): + for freebie in freebies: + freebie.dev = rc(devs) + freebie.company = rc(companies) + + session.add_all(freebies) + session.commit() + +if __name__ == '__main__': + delete_records() + companies, freebies, devs = create_records() + relate_records(companies, freebies, devs) \ No newline at end of file