diff --git a/database.py b/database.py new file mode 100644 index 000000000..650bbe969 --- /dev/null +++ b/database.py @@ -0,0 +1,10 @@ +# database.py + +from sqlalchemy import create_engine +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import sessionmaker + +# SQLite DB file will live in ./db/development.sqlite +engine = create_engine("sqlite:///db/development.sqlite") +Session = sessionmaker(bind=engine) +Base = declarative_base() diff --git a/lib/database.py b/lib/database.py new file mode 100644 index 000000000..f736e1ea0 --- /dev/null +++ b/lib/database.py @@ -0,0 +1,10 @@ + + +from sqlalchemy import create_engine +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import sessionmaker + + +engine = create_engine("sqlite:///db/development.sqlite") +Session = sessionmaker(bind=engine) +Base = declarative_base() diff --git a/migrations/003_create_freebies.py b/migrations/003_create_freebies.py new file mode 100644 index 000000000..392de77c4 --- /dev/null +++ b/migrations/003_create_freebies.py @@ -0,0 +1,14 @@ +# migrations/003_create_freebies.py + +from sqlalchemy import Column, Integer, String, ForeignKey +from database import Base + +class Freebie(Base): + __tablename__ = 'freebies' + + id = Column(Integer, primary_key=True) + item_name = Column(String, nullable=False) + value = Column(Integer, nullable=False) + + dev_id = Column(Integer, ForeignKey('devs.id'), nullable=False) + company_id = Column(Integer, ForeignKey('companies.id'), nullable=False) diff --git a/models/__init__.py b/models/__init__.py new file mode 100644 index 000000000..d9144bc4e --- /dev/null +++ b/models/__init__.py @@ -0,0 +1,5 @@ +# models/__init__.py + +from models.company import Company +from models.dev import Dev +from models.freebie import Freebie diff --git a/models/company.py b/models/company.py new file mode 100644 index 000000000..a224e7abf --- /dev/null +++ b/models/company.py @@ -0,0 +1,41 @@ +# models/company.py + +from sqlalchemy import Column, Integer, String +from sqlalchemy.orm import relationship +from database import Base +from models.freebie import Freebie +from models.dev import Dev + +class Company(Base): + __tablename__ = 'companies' + + id = Column(Integer, primary_key=True) + name = Column(String, nullable=False) + founding_year = Column(Integer, nullable=False) + + # All Freebie objects this company has given: + freebies = relationship("Freebie", back_populates="company", cascade="all, delete-orphan") + + # All Dev objects who have collected freebies from this company: + devs = relationship("Dev", secondary="freebies", back_populates="companies", viewonly=True) + + @classmethod + def oldest_company(cls, session): + """ + Returns the Company instance with the earliest founding_year. + Needs an active SQLAlchemy session passed in. + """ + return session.query(cls).order_by(cls.founding_year.asc()).first() + + def give_freebie(self, session, dev, item_name, value): + """ + Creates and persists a new Freebie belonging to this Company for the given Dev. + - session: SQLAlchemy Session + - dev: Dev instance + - item_name: string + - value: int + """ + new_freebie = Freebie(item_name=item_name, value=value, dev=dev, company=self) + session.add(new_freebie) + session.commit() + return new_freebie diff --git a/models/dev.py b/models/dev.py new file mode 100644 index 000000000..ff485789b --- /dev/null +++ b/models/dev.py @@ -0,0 +1,39 @@ +# models/dev.py + +from sqlalchemy import Column, Integer, String +from sqlalchemy.orm import relationship +from database import Base +from models.freebie import Freebie +from models.company import Company + +class Dev(Base): + __tablename__ = 'devs' + + id = Column(Integer, primary_key=True) + name = Column(String, nullable=False) + + # All Freebie objects this dev has collected: + freebies = relationship("Freebie", back_populates="dev", cascade="all, delete-orphan") + + # All Company objects this dev has collected freebies from: + companies = relationship("Company", secondary="freebies", back_populates="devs", viewonly=True) + + def received_one(self, item_name): + """ + Returns True if this Dev has any Freebie whose item_name matches the argument. + """ + return any(f.item_name == item_name for f in self.freebies) + + def give_away(self, session, other_dev, freebie): + """ + Transfers `freebie` from this Dev to other_dev if it currently belongs to this Dev. + - session: SQLAlchemy Session + - other_dev: Dev instance + - freebie: Freebie instance + """ + if freebie.dev_id == self.id: + freebie.dev = other_dev + session.add(freebie) + session.commit() + return True + return False diff --git a/models/freebie.py b/models/freebie.py new file mode 100644 index 000000000..f730aef3f --- /dev/null +++ b/models/freebie.py @@ -0,0 +1,25 @@ +# models/freebie.py + +from sqlalchemy import Column, Integer, String, ForeignKey +from sqlalchemy.orm import relationship +from database import Base + +class Freebie(Base): + __tablename__ = 'freebies' + + id = Column(Integer, primary_key=True) + item_name = Column(String, nullable=False) + value = Column(Integer, nullable=False) + + dev_id = Column(Integer, ForeignKey('devs.id'), nullable=False) + company_id = Column(Integer, ForeignKey('companies.id'), nullable=False) + + # RELATIONSHIPS + dev = relationship("Dev", back_populates="freebies") + company = relationship("Company", back_populates="freebies") + + def print_details(self): + """ + Returns: " owns a from " + """ + return f"{self.dev.name} owns a {self.item_name} from {self.company.name}" diff --git a/seed.py b/seed.py new file mode 100644 index 000000000..1bd00f4a4 --- /dev/null +++ b/seed.py @@ -0,0 +1,44 @@ +# seed.py + +import os +from database import Session, engine, Base +from models.company import Company +from models.dev import Dev +from models.freebie import Freebie + +def seed_data(): + # Ensure the directory for the SQLite file exists + os.makedirs(os.path.dirname("db/development.sqlite"), exist_ok=True) + + # Re-create all tables + Base.metadata.drop_all(engine) + Base.metadata.create_all(engine) + + session = Session() + + # Create Companies + apple = Company(name="Apple", founding_year=1976) + google = Company(name="Google", founding_year=1998) + microsoft = Company(name="Microsoft", founding_year=1975) + + # Create Devs + alice = Dev(name="Alice") + bob = Dev(name="Bob") + carol = Dev(name="Carol") + + session.add_all([apple, google, microsoft, alice, bob, carol]) + session.commit() + + # Create Freebies + f1 = Freebie(item_name="Sticker Pack", value=5, dev=alice, company=google) + f2 = Freebie(item_name="T-shirt", value=20, dev=bob, company=apple) + f3 = Freebie(item_name="Mug", value=12, dev=carol, company=microsoft) + + session.add_all([f1, f2, f3]) + session.commit() + session.close() + + print("Seeding complete.") + +if __name__ == '__main__': + seed_data()