diff --git a/app/core/models.py b/app/core/models.py index 65245b7..6465a2a 100644 --- a/app/core/models.py +++ b/app/core/models.py @@ -48,3 +48,80 @@ class SubmissionImage(db.Model): id = db.Column(db.Integer, primary_key=True) submission_id = db.Column(db.Integer, db.ForeignKey('submission.id'), nullable=False) file_path = db.Column(db.String(255), nullable=False) + + +class PlantCommonName(db.Model): + __tablename__ = 'plants_common' + id = db.Column(db.Integer, primary_key=True) + name = db.Column(db.String(120), unique=True, nullable=False) + + +class PlantScientificName(db.Model): + __tablename__ = 'plants_scientific' + id = db.Column(db.Integer, primary_key=True) + name = db.Column(db.String(255), unique=True, nullable=False) + + +class Plant(db.Model): + __tablename__ = 'plants' + id = db.Column(db.Integer, primary_key=True) + common_name_id = db.Column(db.Integer, db.ForeignKey('plants_common.id')) + scientific_name_id = db.Column(db.Integer, db.ForeignKey('plants_scientific.id')) + parent_id = db.Column(db.Integer, db.ForeignKey('plants.id'), nullable=True) + is_dead = db.Column(db.Boolean, default=False) + date_added = db.Column(db.DateTime, default=datetime.utcnow) + created_by_user_id = db.Column(db.Integer, db.ForeignKey('users.id')) + + # Relationships + updates = db.relationship('PlantUpdate', backref='plant', lazy=True) + lineage = db.relationship('PlantLineage', backref='child', lazy=True, + foreign_keys='PlantLineage.child_plant_id') + + +class PlantLineage(db.Model): + __tablename__ = 'plant_lineage' + id = db.Column(db.Integer, primary_key=True) + parent_plant_id = db.Column(db.Integer, db.ForeignKey('plants.id'), nullable=False) + child_plant_id = db.Column(db.Integer, db.ForeignKey('plants.id'), nullable=False) + + +class PlantOwnershipLog(db.Model): + __tablename__ = 'plant_ownership_log' + id = db.Column(db.Integer, primary_key=True) + plant_id = db.Column(db.Integer, db.ForeignKey('plants.id'), nullable=False) + user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False) + date_acquired = db.Column(db.DateTime, default=datetime.utcnow) + date_relinquished = db.Column(db.DateTime, nullable=True) + + +class PlantUpdate(db.Model): + __tablename__ = 'plant_updates' + id = db.Column(db.Integer, primary_key=True) + plant_id = db.Column(db.Integer, db.ForeignKey('plants.id'), nullable=False) + update_type = db.Column(db.String(100)) + description = db.Column(db.Text) + created_at = db.Column(db.DateTime, default=datetime.utcnow) + images = db.relationship('UpdateImage', backref='update', lazy=True) + + +class UpdateImage(db.Model): + __tablename__ = 'update_images' + id = db.Column(db.Integer, primary_key=True) + update_id = db.Column(db.Integer, db.ForeignKey('plant_updates.id'), nullable=False) + file_path = db.Column(db.String(255), nullable=False) + + +class ImageHeart(db.Model): + __tablename__ = 'image_hearts' + id = db.Column(db.Integer, primary_key=True) + user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False) + submission_image_id = db.Column(db.Integer, db.ForeignKey('submission_images.id'), nullable=False) + created_at = db.Column(db.DateTime, default=datetime.utcnow) + + +class FeaturedImage(db.Model): + __tablename__ = 'featured_images' + id = db.Column(db.Integer, primary_key=True) + submission_image_id = db.Column(db.Integer, db.ForeignKey('submission_images.id'), nullable=False) + override_text = db.Column(db.String(255), nullable=True) + is_featured = db.Column(db.Boolean, default=True) diff --git a/docker-compose.yml b/docker-compose.yml index 8c49605..2966a23 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -32,6 +32,9 @@ services: echo '[✔] Waiting for MySQL to be ready...' until nc -z ${MYSQL_HOST} ${MYSQL_PORT}; do sleep 1; done + echo '[ℹ] Autogenerating migration...' + flask db migrate -m 'auto' || echo '[ℹ] No changes detected.' + echo '[✔] Running DB migrations...' flask db upgrade