more
This commit is contained in:
@ -1,15 +1,6 @@
|
|||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from app import db
|
from app import db
|
||||||
|
|
||||||
class Plant(db.Model):
|
|
||||||
id = db.Column(db.Integer, primary_key=True)
|
|
||||||
name = db.Column(db.String(128), nullable=False)
|
|
||||||
type = db.Column(db.String(64))
|
|
||||||
notes = db.Column(db.Text)
|
|
||||||
is_active = db.Column(db.Boolean, default=True)
|
|
||||||
created_at = db.Column(db.DateTime, default=datetime.utcnow)
|
|
||||||
updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
|
|
||||||
|
|
||||||
|
|
||||||
class Submission(db.Model):
|
class Submission(db.Model):
|
||||||
__tablename__ = 'submission'
|
__tablename__ = 'submission'
|
||||||
@ -44,18 +35,6 @@ class SubmissionImage(db.Model):
|
|||||||
file_path = db.Column(db.String(255), 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):
|
class Plant(db.Model):
|
||||||
__tablename__ = 'plants'
|
__tablename__ = 'plants'
|
||||||
id = db.Column(db.Integer, primary_key=True)
|
id = db.Column(db.Integer, primary_key=True)
|
||||||
@ -72,6 +51,19 @@ class Plant(db.Model):
|
|||||||
foreign_keys='PlantLineage.child_plant_id')
|
foreign_keys='PlantLineage.child_plant_id')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
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 PlantLineage(db.Model):
|
class PlantLineage(db.Model):
|
||||||
__tablename__ = 'plant_lineage'
|
__tablename__ = 'plant_lineage'
|
||||||
id = db.Column(db.Integer, primary_key=True)
|
id = db.Column(db.Integer, primary_key=True)
|
||||||
|
@ -7,7 +7,7 @@ bp = Blueprint('plant', __name__, template_folder='templates')
|
|||||||
|
|
||||||
@bp.route('/plants')
|
@bp.route('/plants')
|
||||||
def index():
|
def index():
|
||||||
plants = Plant.query.order_by(Plant.created_at.desc()).all()
|
plants = Plant.query.order_by(Plant.date_added.desc()).all()
|
||||||
return render_template('plant/index.html', plants=plants)
|
return render_template('plant/index.html', plants=plants)
|
||||||
|
|
||||||
@bp.route('/plants/<int:plant_id>')
|
@bp.route('/plants/<int:plant_id>')
|
||||||
|
2
plugins/submission/__init__.py
Normal file
2
plugins/submission/__init__.py
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
def register():
|
||||||
|
from . import routes
|
49
plugins/submission/models.py
Normal file
49
plugins/submission/models.py
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
from datetime import datetime
|
||||||
|
from app import db
|
||||||
|
|
||||||
|
class Submission(db.Model):
|
||||||
|
__tablename__ = 'submissions'
|
||||||
|
|
||||||
|
id = db.Column(db.Integer, primary_key=True)
|
||||||
|
user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)
|
||||||
|
plant_id = db.Column(db.Integer, db.ForeignKey('plants.id'), nullable=True)
|
||||||
|
common_name = db.Column(db.String(120), nullable=False)
|
||||||
|
scientific_name = db.Column(db.String(120))
|
||||||
|
price = db.Column(db.Float, nullable=False)
|
||||||
|
source = db.Column(db.String(120))
|
||||||
|
timestamp = db.Column(db.DateTime, default=datetime.utcnow)
|
||||||
|
height = db.Column(db.Float)
|
||||||
|
width = db.Column(db.Float)
|
||||||
|
leaf_count = db.Column(db.Integer)
|
||||||
|
potting_mix = db.Column(db.String(255))
|
||||||
|
container_size = db.Column(db.String(120))
|
||||||
|
health_status = db.Column(db.String(50))
|
||||||
|
notes = db.Column(db.Text)
|
||||||
|
images = db.relationship('SubmissionImage', backref='submission', lazy=True)
|
||||||
|
|
||||||
|
|
||||||
|
class SubmissionImage(db.Model):
|
||||||
|
__tablename__ = 'submission_images'
|
||||||
|
|
||||||
|
id = db.Column(db.Integer, primary_key=True)
|
||||||
|
submission_id = db.Column(db.Integer, db.ForeignKey('submissions.id'), nullable=False)
|
||||||
|
file_path = db.Column(db.String(255), nullable=False)
|
||||||
|
is_visible = db.Column(db.Boolean, default=True)
|
||||||
|
|
||||||
|
|
||||||
|
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)
|
6
plugins/submission/plugin.json
Normal file
6
plugins/submission/plugin.json
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"name": "submission",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Plugin to handle user-submitted plant data and images.",
|
||||||
|
"entry_point": "register"
|
||||||
|
}
|
10
plugins/submission/routes.py
Normal file
10
plugins/submission/routes.py
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
from flask import Blueprint, render_template
|
||||||
|
from .models import Submission
|
||||||
|
from app import db
|
||||||
|
|
||||||
|
bp = Blueprint('submission', __name__, url_prefix='/submission')
|
||||||
|
|
||||||
|
@bp.route('/')
|
||||||
|
def index():
|
||||||
|
submissions = Submission.query.order_by(Submission.timestamp.desc()).all()
|
||||||
|
return render_template('submission/index.html', submissions=submissions)
|
9
plugins/submission/templates/submission/index.html
Normal file
9
plugins/submission/templates/submission/index.html
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
{% extends "core_ui/base.html" %}
|
||||||
|
{% block content %}
|
||||||
|
<h2>Submissions</h2>
|
||||||
|
<ul>
|
||||||
|
{% for s in submissions %}
|
||||||
|
<li>{{ s.common_name }} ({{ s.scientific_name or 'N/A' }}) - ${{ s.price }}</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
{% endblock %}
|
Reference in New Issue
Block a user