diff --git a/freebies.db b/freebies.db new file mode 100644 index 000000000..c661b8c6c Binary files /dev/null and b/freebies.db differ diff --git a/lib/__pycache__/models.cpython-38.pyc b/lib/__pycache__/models.cpython-38.pyc new file mode 100644 index 000000000..071d41053 Binary files /dev/null and b/lib/__pycache__/models.cpython-38.pyc differ diff --git a/lib/freebies.db b/lib/freebies.db index 12beb1c96..03de8b78e 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..46d0e2a52 Binary files /dev/null and b/lib/migrations/__pycache__/env.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..2f170ac91 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__/7a71dbf71c64_create_db.cpython-38.pyc b/lib/migrations/versions/__pycache__/7a71dbf71c64_create_db.cpython-38.pyc new file mode 100644 index 000000000..8e0a74f81 Binary files /dev/null and b/lib/migrations/versions/__pycache__/7a71dbf71c64_create_db.cpython-38.pyc differ diff --git a/lib/migrations/versions/__pycache__/a050fe785c50_new_table.cpython-38.pyc b/lib/migrations/versions/__pycache__/a050fe785c50_new_table.cpython-38.pyc new file mode 100644 index 000000000..1dabb8dfa Binary files /dev/null and b/lib/migrations/versions/__pycache__/a050fe785c50_new_table.cpython-38.pyc differ diff --git a/lib/migrations/versions/__pycache__/ee7bfee3b064_autogenerate_freebie_migrations.cpython-38.pyc b/lib/migrations/versions/__pycache__/ee7bfee3b064_autogenerate_freebie_migrations.cpython-38.pyc new file mode 100644 index 000000000..a39cbe57c Binary files /dev/null and b/lib/migrations/versions/__pycache__/ee7bfee3b064_autogenerate_freebie_migrations.cpython-38.pyc differ diff --git a/lib/migrations/versions/a050fe785c50_new_table.py b/lib/migrations/versions/a050fe785c50_new_table.py new file mode 100644 index 000000000..ce93d9e23 --- /dev/null +++ b/lib/migrations/versions/a050fe785c50_new_table.py @@ -0,0 +1,45 @@ +"""new table + +Revision ID: a050fe785c50 +Revises: ee7bfee3b064 +Create Date: 2025-03-21 12:10:42.250410 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'a050fe785c50' +down_revision = 'ee7bfee3b064' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('companies_devs', + sa.Column('company_id', sa.Integer(), nullable=False), + sa.Column('dev_id', sa.Integer(), nullable=False), + sa.ForeignKeyConstraint(['company_id'], ['companies.id'], name=op.f('fk_companies_devs_company_id_companies')), + sa.ForeignKeyConstraint(['dev_id'], ['devs.id'], name=op.f('fk_companies_devs_dev_id_devs')), + sa.PrimaryKeyConstraint('company_id', 'dev_id') + ) + op.create_table('freebies', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('item_name', sa.String(length=255), 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') + op.drop_table('companies_devs') + # ### end Alembic commands ### diff --git a/lib/migrations/versions/ee7bfee3b064_autogenerate_freebie_migrations.py b/lib/migrations/versions/ee7bfee3b064_autogenerate_freebie_migrations.py new file mode 100644 index 000000000..7b939ec5f --- /dev/null +++ b/lib/migrations/versions/ee7bfee3b064_autogenerate_freebie_migrations.py @@ -0,0 +1,24 @@ +"""autogenerate freebie migrations + +Revision ID: ee7bfee3b064 +Revises: 5f72c58bf48c +Create Date: 2025-03-21 12:09:00.961192 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'ee7bfee3b064' +down_revision = '5f72c58bf48c' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + pass + + +def downgrade() -> None: + pass diff --git a/lib/models.py b/lib/models.py index 2681bee5a..64474c522 100644 --- a/lib/models.py +++ b/lib/models.py @@ -1,4 +1,4 @@ -from sqlalchemy import ForeignKey, Column, Integer, String, MetaData +from sqlalchemy import ForeignKey, Column, Integer, String, MetaData, ForeignKeyConstraint,Table from sqlalchemy.orm import relationship, backref from sqlalchemy.ext.declarative import declarative_base @@ -9,21 +9,130 @@ Base = declarative_base(metadata=metadata) + +# #Association table + +companies_devs = Table( + 'companies_devs', Base.metadata, + Column('company_id', Integer, ForeignKey('companies.id'), primary_key=True), + Column('dev_id', Integer, ForeignKey('devs.id'), primary_key=True) +) + + class Company(Base): __tablename__ = 'companies' + #one-to-many relationship + freebie=relationship('Freebie',backref='company') + + + # Many-to-many relationship with Dev + devs = relationship("Dev", secondary=companies_devs, back_populates="companies") + + id = Column(Integer(), primary_key=True) name = Column(String()) founding_year = Column(Integer()) + def __init__(self, name, founding_year): + self.name = name + self.founding_year = founding_year + self.freebies = [] # To store all freebies associated with this company + + + # Method to give a freebie to a developer + def give_freebie(self, dev, item_name, value): + freebie = Freebie(item_name=item_name, value=value, dev=dev, company=self) + self.freebies.append(freebie) + return freebie + + + # Method to return all freebies given by this company + def get_freebies(self): + return self.freebies + + + # Method to return all developers who have collected freebies from this company + def devs(self): + return set(freebie.dev for freebie in self.freebies) + + # Class method to get the oldest company + @classmethod + def oldest_company(cls, companies): + #Find and return the company with the earliest founding year + return min(companies, key=lambda company: company.founding_year) + def __repr__(self): return f'' class Dev(Base): __tablename__ = 'devs' + +#one-to-many relationship + freebies=relationship('Freebie',backref='dev') + + + # Many-to-many relationship with Company + companies = relationship("Company", secondary=companies_devs, back_populates="devs") + id = Column(Integer(), primary_key=True) name= Column(String()) + def __init__(self, name): + self.name = name + self.freebies=[] + + # Method to check if the dev has received a specific freebie item + def received_one(self, item_name): + # Check if any freebie associated with this dev has the given item_name + return any(freebie.item_name == item_name for freebie in self.freebies) + + + + def give_away(self,dev,freebie): + if freebie.dev == self: + # If the freebie belongs to the current developer, change its ownership + freebie.dev = dev + dev.freebies.append(freebie) # Add the freebie to the new dev's list + # remove the freebie from the current dev's list + if freebie in self.freebies: + self.freebies.remove(freebie) + return True + return False + + + + # Method to return all the companies that gave freebies to this developer + def companies(self): + return set(freebie.company for freebie in self.freebies) + def __repr__(self): return f'' + +class Freebie(Base): + __tablename__='freebies' + id=Column(Integer(),primary_key=True) + item_name=Column(String(255)) + value=Column(Integer) + + +#foriegnkey to dev and company + dev_id=Column(Integer,ForeignKey('devs.id')) + company_id=Column(Integer,ForeignKey('companies.id')) + + def __init__(self, item_name, value, dev, company): + self.item_name = item_name + self.value = value + self.dev = dev + self.company = company + + def print_details(self): + # Format and return the string as specified + return f"{self.dev.name} owns a {self.item_name} from {self.company.name}." + + + + def __repr__(self): + return f"" + diff --git a/lib/seed.py b/lib/seed.py index b16becbbb..005174a96 100644 --- a/lib/seed.py +++ b/lib/seed.py @@ -1,3 +1,96 @@ #!/usr/bin/env python3 # Script goes here! +from models import Company,Dev,Freebie,Base +from sqlalchemy.orm import sessionmaker +from sqlalchemy import create_engine + +engine = create_engine('sqlite:///freebies.db') + + +Base.metadata.create_all(engine) + +Session = sessionmaker(bind=engine) +session = Session() + +#creating a session +session.query(Company).delete() +session.query(Dev).delete() +session.query(Freebie).delete() + +#seed data to dev table +dev1 = Dev(name="Alice") +dev2 = Dev(name="Bob") +dev3 = Dev(name="Mary") +dev4 = Dev(name="James") +dev5 = Dev(name="Mark") + +#seed data to company table +company1 = Company(name="Tech Corp", founding_year=2000) +company2 = Company(name="Code Masters", founding_year=2010) +company3 = Company(name="Flat Iron", founding_year=2009) +company4 = Company(name="Google", founding_year=2011) +company5 = Company(name="Microsoft", founding_year=2019) + + +#seed data to freebies table +freebie1 = Freebie(item_name="T-shirt", value=20, dev=dev1, company=company1) +freebie2 = Freebie(item_name="Sticker Pack", value=5, dev=dev2, company=company2) +freebie3 = Freebie(item_name="Mug", value=25, dev=dev1, company=company3) +freebie4= Freebie(item_name="Book", value=30, dev=dev3, company=company2) +freebie5= Freebie(item_name="Pen", value=13, dev=dev3, company=company4) +freebie6 = Freebie(item_name="Watch", value=26, dev=dev2, company=company1) +freebie7 = Freebie(item_name="Bag", value=6, dev=dev4, company=company3) +freebie8 = Freebie(item_name="Mouse", value=19, dev=dev4, company=company5) +freebie9 = Freebie(item_name="Keyboard", value=28, dev=dev5, company=company5) +freebie10 = Freebie(item_name="File", value=17, dev=dev5, company=company4) + + +# Add Freebie instances to the session +session.add_all([freebie1, freebie2, freebie3, freebie4, freebie5, freebie6, freebie7, freebie8, freebie9, freebie10]) + +# Commit the Freebie objects to the database +session.commit() + +#Add and commit the data +session.bulk_save_objects([dev1,dev2,dev3,dev4,dev5,company1,company2,company3,company4,company5,freebie1,freebie2,freebie3, + freebie4,freebie5,freebie6,freebie7,freebie8,freebie9,freebie10]) + + +session.commit() + + +print("Devs:") +for dev in session.query(Dev).all(): + print(dev) + +print("\nCompanies:") +for company in session.query(Company).all(): + print(f"{company.name} (Founded: {company.founding_year})") + +print("\nFreebies:") +for freebie in session.query(Freebie).all(): + print(f"{freebie.item_name} (Value: {freebie.value})") + print(f" Dev: {freebie.dev.name}") + print(f" Company: {freebie.company.name}") + + +# Function of printing details +freebies = [freebie1, freebie2, freebie3, freebie4, freebie5, freebie6, freebie7, freebie8, freebie9, freebie10] + +for freebie in freebies: + print(freebie.print_details()) + + + +for freebie in freebies: + print(freebie.print_details()) + +# Example of finding the oldest company +companies = [company1, company2, company3, company4, company5] +oldest = Company.oldest_company(companies) +print(f"The oldest company is {oldest.name}, founded in {oldest.founding_year}.") + + + +