- Location model: plants now FK to Location instead of free-text CharField - Data migration 0004 converts existing location strings to Location objects - PlantForm uses ModelChoiceField dropdown + inline "add new location" text field - PlantPhoto model: multiple photos per plant with is_thumbnail flag - Plant.thumbnail_url property: picks marked thumbnail, falls back to first photo then legacy photo field - Photo gallery partial: upload, set thumbnail (★), delete (✕) with HTMX swaps on #photo-gallery - plant_detail: uses thumbnail_url for hero image, pruning history section removed - plant_list search updated: location__name__icontains instead of location__icontains - Three new URL routes: upload_photo, set_thumbnail, delete_photo - All 53 tests updated and passing Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
18 lines
1.1 KiB
Python
18 lines
1.1 KiB
Python
from django.urls import path
|
|
from plants.views import dashboard, plants, pruning, species
|
|
|
|
urlpatterns = [
|
|
path('', dashboard.dashboard, name='dashboard'),
|
|
path('plants/', plants.plant_list, name='plant_list'),
|
|
path('plants/add/', plants.plant_add, name='plant_add'),
|
|
path('plants/<int:pk>/', plants.plant_detail, name='plant_detail'),
|
|
path('plants/<int:pk>/edit/', plants.plant_edit, name='plant_edit'),
|
|
path('plants/<int:pk>/delete/', plants.plant_delete, name='plant_delete'),
|
|
path('plants/<int:pk>/log-pruning/', plants.log_pruning, name='log_pruning'),
|
|
path('plants/<int:pk>/upload-photo/', plants.upload_photo, name='upload_photo'),
|
|
path('photos/<int:photo_pk>/set-thumbnail/', plants.set_thumbnail, name='set_thumbnail'),
|
|
path('photos/<int:photo_pk>/delete/', plants.delete_photo, name='delete_photo'),
|
|
path('pruning/', pruning.pruning_calendar, name='pruning_calendar'),
|
|
path('species/search/', species.species_search, name='species_search'),
|
|
path('species/select/', species.species_select, name='species_select'),
|
|
]
|