changes
This commit is contained in:
Binary file not shown.
28
migrations/versions/551167211686_auto.py
Normal file
28
migrations/versions/551167211686_auto.py
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
"""auto
|
||||||
|
|
||||||
|
Revision ID: 551167211686
|
||||||
|
Revises: 80cf84342c5f
|
||||||
|
Create Date: 2025-06-09 18:13:54.600906
|
||||||
|
|
||||||
|
"""
|
||||||
|
from alembic import op
|
||||||
|
import sqlalchemy as sa
|
||||||
|
|
||||||
|
|
||||||
|
# revision identifiers, used by Alembic.
|
||||||
|
revision = '551167211686'
|
||||||
|
down_revision = '80cf84342c5f'
|
||||||
|
branch_labels = None
|
||||||
|
depends_on = None
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade():
|
||||||
|
# ### commands auto generated by Alembic - please adjust! ###
|
||||||
|
pass
|
||||||
|
# ### end Alembic commands ###
|
||||||
|
|
||||||
|
|
||||||
|
def downgrade():
|
||||||
|
# ### commands auto generated by Alembic - please adjust! ###
|
||||||
|
pass
|
||||||
|
# ### end Alembic commands ###
|
@ -1,3 +1,5 @@
|
|||||||
|
# plugins/plant/routes.py
|
||||||
|
|
||||||
from uuid import uuid4
|
from uuid import uuid4
|
||||||
from flask import (
|
from flask import (
|
||||||
Blueprint,
|
Blueprint,
|
||||||
@ -12,7 +14,12 @@ from app import db
|
|||||||
from .models import Plant, PlantCommonName, PlantScientificName
|
from .models import Plant, PlantCommonName, PlantScientificName
|
||||||
from .forms import PlantForm
|
from .forms import PlantForm
|
||||||
from plugins.media.models import Media
|
from plugins.media.models import Media
|
||||||
from plugins.media.utils import save_media_file, delete_media_file, rotate_media_file, generate_image_url
|
from plugins.media.utils import (
|
||||||
|
save_media_file,
|
||||||
|
delete_media_file,
|
||||||
|
rotate_media_file,
|
||||||
|
generate_image_url
|
||||||
|
)
|
||||||
|
|
||||||
bp = Blueprint(
|
bp = Blueprint(
|
||||||
'plant',
|
'plant',
|
||||||
@ -21,9 +28,7 @@ bp = Blueprint(
|
|||||||
template_folder='templates'
|
template_folder='templates'
|
||||||
)
|
)
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------
|
# Make generate_image_url available in all plant templates
|
||||||
# Make generate_image_url available in all templates
|
|
||||||
# -----------------------------------------------------------------------------
|
|
||||||
@bp.app_context_processor
|
@bp.app_context_processor
|
||||||
def inject_image_helper():
|
def inject_image_helper():
|
||||||
return dict(generate_image_url=generate_image_url)
|
return dict(generate_image_url=generate_image_url)
|
||||||
@ -85,7 +90,8 @@ def create():
|
|||||||
if form.mother_uuid.data != 'N/A'
|
if form.mother_uuid.data != 'N/A'
|
||||||
else None
|
else None
|
||||||
),
|
),
|
||||||
custom_slug=form.custom_slug.data,
|
# ← HERE: convert blank slug to NULL
|
||||||
|
custom_slug=(form.custom_slug.data.strip() or None),
|
||||||
notes=form.notes.data,
|
notes=form.notes.data,
|
||||||
data_verified=form.data_verified.data,
|
data_verified=form.data_verified.data,
|
||||||
is_active=form.is_active.data,
|
is_active=form.is_active.data,
|
||||||
@ -101,16 +107,17 @@ def create():
|
|||||||
@bp.route('/<uuid:uuid_val>', methods=['GET'])
|
@bp.route('/<uuid:uuid_val>', methods=['GET'])
|
||||||
@login_required
|
@login_required
|
||||||
def detail(uuid_val):
|
def detail(uuid_val):
|
||||||
plant = Plant.query.filter_by(uuid=str(uuid_val)).first_or_404()
|
plant = Plant.query.filter_by(uuid=uuid_val).first_or_404()
|
||||||
return render_template('plant/detail.html', plant=plant)
|
return render_template('plant/detail.html', plant=plant)
|
||||||
|
|
||||||
# ─── EDIT ─────────────────────────────────────────────────────────────────────
|
# ─── EDIT ─────────────────────────────────────────────────────────────────────
|
||||||
@bp.route('/<uuid:uuid_val>/edit', methods=['GET', 'POST'])
|
@bp.route('/<uuid:uuid_val>/edit', methods=['GET', 'POST'])
|
||||||
@login_required
|
@login_required
|
||||||
def edit(uuid_val):
|
def edit(uuid_val):
|
||||||
plant = Plant.query.filter_by(uuid=str(uuid_val)).first_or_404()
|
plant = Plant.query.filter_by(uuid=uuid_val).first_or_404()
|
||||||
form = PlantForm()
|
form = PlantForm()
|
||||||
|
|
||||||
|
# Populate dropdowns (same as in create)
|
||||||
form.plant_type.choices = [
|
form.plant_type.choices = [
|
||||||
('plant', 'Plant'),
|
('plant', 'Plant'),
|
||||||
('cutting', 'Cutting'),
|
('cutting', 'Cutting'),
|
||||||
@ -136,7 +143,7 @@ def edit(uuid_val):
|
|||||||
form.common_name.data = plant.common_id
|
form.common_name.data = plant.common_id
|
||||||
form.scientific_name.data = plant.scientific_id
|
form.scientific_name.data = plant.scientific_id
|
||||||
form.mother_uuid.data = plant.mother_uuid or 'N/A'
|
form.mother_uuid.data = plant.mother_uuid or 'N/A'
|
||||||
form.custom_slug.data = plant.custom_slug
|
form.custom_slug.data = plant.custom_slug or ''
|
||||||
form.notes.data = plant.notes
|
form.notes.data = plant.notes
|
||||||
form.data_verified.data = plant.data_verified
|
form.data_verified.data = plant.data_verified
|
||||||
form.is_active.data = getattr(plant, 'is_active', True)
|
form.is_active.data = getattr(plant, 'is_active', True)
|
||||||
@ -150,7 +157,8 @@ def edit(uuid_val):
|
|||||||
if form.mother_uuid.data != 'N/A'
|
if form.mother_uuid.data != 'N/A'
|
||||||
else None
|
else None
|
||||||
)
|
)
|
||||||
plant.custom_slug = form.custom_slug.data
|
# ← HERE as well
|
||||||
|
plant.custom_slug = (form.custom_slug.data.strip() or None)
|
||||||
plant.notes = form.notes.data
|
plant.notes = form.notes.data
|
||||||
plant.data_verified = form.data_verified.data
|
plant.data_verified = form.data_verified.data
|
||||||
plant.is_active = form.is_active.data
|
plant.is_active = form.is_active.data
|
||||||
|
Reference in New Issue
Block a user