diff --git a/Pipfile b/Pipfile index 63c79cd98..0ddf7f003 100644 --- a/Pipfile +++ b/Pipfile @@ -13,4 +13,4 @@ sqlalchemy = "1.4.42" [dev-packages] [requires] -python_full_version = "3.8.13" +python_full_version = "3.8.13" \ No newline at end of file diff --git a/freebies.db b/freebies.db new file mode 100644 index 000000000..1d22a58b0 Binary files /dev/null and b/freebies.db differ diff --git a/lib/alembic.ini b/lib/alembic.ini index 953863ddd..977268dbe 100644 --- a/lib/alembic.ini +++ b/lib/alembic.ini @@ -102,4 +102,4 @@ formatter = generic [formatter_generic] format = %(levelname)-5.5s [%(name)s] %(message)s -datefmt = %H:%M:%S +datefmt = %H:%M:%S \ No newline at end of file diff --git a/lib/debug.py b/lib/debug.py index 4f922eb69..c5d2ff8d2 100644 --- a/lib/debug.py +++ b/lib/debug.py @@ -1,9 +1,35 @@ -#!/usr/bin/env python3 - +# debug.py from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker + +from models import Base, Company, Dev, Freebie + +engine = create_engine('sqlite:///freebies.db') +Base.metadata.create_all(engine) + +Session = sessionmaker(bind=engine) +session = Session() + +# Sample query to test relationships +dev1 = session.query(Dev).filter_by(name='Dev1').first() +print(dev1.companies) # Should print the companies associated with Dev1 + +company1 = session.query(Company).filter_by(name='Company1').first() +print(company1.freebies) # Should print the freebies associated with Company1 + +# Test Company methods +new_dev = Dev(name='NewDev') +new_freebie = company1.give_freebie(new_dev, 'Hat', 15) +session.add(new_dev) +session.add(new_freebie) +session.commit() + +# Print the details of the new freebie +print(new_freebie.print_details()) -from models import Company, Dev +# Test Dev methods +print(dev1.received_one('T-shirt')) # Should return True -if __name__ == '__main__': - engine = create_engine('sqlite:///freebies.db') - import ipdb; ipdb.set_trace() +Dev.give_away(dev1, Freebie) +session.commit() +print(Freebie.dev.name) \ No newline at end of file diff --git a/lib/migrations/env.py b/lib/migrations/env.py index c7aab9656..7c73e75df 100644 --- a/lib/migrations/env.py +++ b/lib/migrations/env.py @@ -76,4 +76,4 @@ def run_migrations_online() -> None: if context.is_offline_mode(): run_migrations_offline() else: - run_migrations_online() + run_migrations_online() \ No newline at end of file diff --git a/lib/migrations/script.py.mako b/lib/migrations/script.py.mako index 55df2863d..37d0cac31 100644 --- a/lib/migrations/script.py.mako +++ b/lib/migrations/script.py.mako @@ -21,4 +21,4 @@ def upgrade() -> None: def downgrade() -> None: - ${downgrades if downgrades else "pass"} + ${downgrades if downgrades else "pass"} \ No newline at end of file diff --git a/lib/migrations/versions/5f72c58bf48c_create_companies_devs.py b/lib/migrations/versions/5f72c58bf48c_create_companies_devs.py index c191bb2f9..87fbadbaa 100644 --- a/lib/migrations/versions/5f72c58bf48c_create_companies_devs.py +++ b/lib/migrations/versions/5f72c58bf48c_create_companies_devs.py @@ -8,14 +8,12 @@ from alembic import op import sqlalchemy as sa - # revision identifiers, used by Alembic. revision = '5f72c58bf48c' down_revision = '7a71dbf71c64' branch_labels = None depends_on = None - def upgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### op.create_table('companies', @@ -31,9 +29,8 @@ def upgrade() -> None: ) # ### end Alembic commands ### - 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/lib/migrations/versions/7a71dbf71c64_create_db.py b/lib/migrations/versions/7a71dbf71c64_create_db.py index 23e0a655b..30c2710f9 100644 --- a/lib/migrations/versions/7a71dbf71c64_create_db.py +++ b/lib/migrations/versions/7a71dbf71c64_create_db.py @@ -21,4 +21,4 @@ def upgrade() -> None: def downgrade() -> None: - pass + pass \ No newline at end of file diff --git a/lib/models.py b/lib/models.py index 2681bee5a..280b56eaf 100644 --- a/lib/models.py +++ b/lib/models.py @@ -1,13 +1,26 @@ -from sqlalchemy import ForeignKey, Column, Integer, String, MetaData -from sqlalchemy.orm import relationship, backref +# models.py +from sqlalchemy import ForeignKey, Column, Integer, String +from sqlalchemy.orm import relationship from sqlalchemy.ext.declarative import declarative_base -convention = { - "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s", -} -metadata = MetaData(naming_convention=convention) +Base = declarative_base() + +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')) + + dev = relationship('Dev', back_populates='freebies') + company = relationship('Company', back_populates='freebies') + + def print_details(self): + return f'{self.dev.name} owns a {self.item_name} from {self.company.name}' -Base = declarative_base(metadata=metadata) class Company(Base): __tablename__ = 'companies' @@ -16,8 +29,18 @@ class Company(Base): name = Column(String()) founding_year = Column(Integer()) - def __repr__(self): - return f'' + freebies = relationship('Freebie', back_populates='company') + devs = relationship('Dev', secondary='freebies', back_populates='companies', overlaps="devs") + + def give_freebie(self, dev, item_name, value): + new_freebie = Freebie(dev=dev, company=self, item_name=item_name, value=value) + return new_freebie + + @classmethod + def oldest_company(cls, session): + oldest = session.query(cls).order_by(cls.founding_year).first() + return oldest + class Dev(Base): __tablename__ = 'devs' @@ -25,5 +48,12 @@ class Dev(Base): id = Column(Integer(), primary_key=True) name= Column(String()) - def __repr__(self): - return f'' + freebies = relationship('Freebie', back_populates='dev') + companies = relationship('Company', secondary='freebies', back_populates='devs', overlaps="devs") + + 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 \ No newline at end of file diff --git a/lib/seed.py b/lib/seed.py index b16becbbb..f67a155b7 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,3 +1,24 @@ -#!/usr/bin/env python3 +# seed.py +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker -# Script goes here! +from models import Base, Company, Dev, Freebie + +engine = create_engine('sqlite:///freebies.db') +Base.metadata.create_all(engine) + +Session = sessionmaker(bind=engine) +session = Session() + +# Sample data +company1 = Company(name='Company1', founding_year=2000) +company2 = Company(name='Company2', founding_year=1995) + +dev1 = Dev(name='Dev1') +dev2 = Dev(name='Dev2') + +freebie1 = Freebie(item_name='T-shirt', value=10, dev=dev1, company=company1) +freebie2 = Freebie(item_name='Sticker', value=5, dev=dev2, company=company2) + +session.add_all([company1, company2, dev1, dev2, freebie1, freebie2]) +session.commit() \ No newline at end of file