From 10a76238aa98b89eaf0241efe2fed5958127634f Mon Sep 17 00:00:00 2001 From: Stephan Kerkman Date: Thu, 28 May 2026 21:46:25 +0200 Subject: [PATCH] feat: add plant_card view and URL --- plants/templates/plants/plant_card.html | 9 +++++++++ plants/tests/test_views.py | 22 ++++++++++++++++++++++ plants/urls.py | 1 + plants/views/plants.py | 9 ++++++++- 4 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 plants/templates/plants/plant_card.html diff --git a/plants/templates/plants/plant_card.html b/plants/templates/plants/plant_card.html new file mode 100644 index 0000000..5eb3d04 --- /dev/null +++ b/plants/templates/plants/plant_card.html @@ -0,0 +1,9 @@ +{% extends "plants/base.html" %} +{% block title %}Plant card — {{ plant.name }} — PlantDB{% endblock %} +{% block content %} +
+ ← {{ plant.name }} +
Plant card
+
+ +{% endblock %} diff --git a/plants/tests/test_views.py b/plants/tests/test_views.py index 38e01a9..cbf73ef 100644 --- a/plants/tests/test_views.py +++ b/plants/tests/test_views.py @@ -219,6 +219,28 @@ class TestPlantDelete: assert not Plant.objects.filter(pk=plant.pk).exists() +@pytest.mark.django_db +class TestPlantCard: + def test_returns_200(self, client): + plant = Plant.objects.create(name='Fern') + resp = client.get(reverse('plant_card', args=[plant.pk])) + assert resp.status_code == 200 + + def test_404_for_missing_plant(self, client): + resp = client.get(reverse('plant_card', args=[9999])) + assert resp.status_code == 404 + + def test_context_contains_plant(self, client): + plant = Plant.objects.create(name='Fern') + resp = client.get(reverse('plant_card', args=[plant.pk])) + assert resp.context['plant'] == plant + + def test_uses_plant_card_template(self, client): + plant = Plant.objects.create(name='Fern') + resp = client.get(reverse('plant_card', args=[plant.pk])) + assert 'plants/plant_card.html' in [t.name for t in resp.templates] + + @pytest.mark.django_db class TestPruningCalendar: def test_returns_200(self, client): diff --git a/plants/urls.py b/plants/urls.py index 75a8cab..11af1ed 100644 --- a/plants/urls.py +++ b/plants/urls.py @@ -8,6 +8,7 @@ urlpatterns = [ path('plants//', plants.plant_detail, name='plant_detail'), path('plants//edit/', plants.plant_edit, name='plant_edit'), path('plants//delete/', plants.plant_delete, name='plant_delete'), + path('plants//card/', plants.plant_card, name='plant_card'), path('plants//log-pruning/', plants.log_pruning, name='log_pruning'), path('plants//upload-photo/', plants.upload_photo, name='upload_photo'), path('photos//set-thumbnail/', plants.set_thumbnail, name='set_thumbnail'), diff --git a/plants/views/plants.py b/plants/views/plants.py index 3476380..a466382 100644 --- a/plants/views/plants.py +++ b/plants/views/plants.py @@ -2,7 +2,7 @@ from datetime import date from django.shortcuts import render, get_object_or_404, redirect from django.views.decorators.csrf import ensure_csrf_cookie from django.views.decorators.http import require_POST -from plants.models import Plant, Species, PruningLog, PlantPhoto +from plants.models import Plant, Species, PruningLog, PlantPhoto, PlantCardPhoto from plants.forms import PlantForm, PruningLogForm from plants.utils.pruning import pruning_status @@ -114,6 +114,13 @@ def plant_delete(request, pk): return render(request, 'plants/plant_confirm_delete.html', {'plant': plant}) +def plant_card(request, pk): + plant = get_object_or_404( + Plant.objects.prefetch_related('card_photos'), pk=pk + ) + return render(request, 'plants/plant_card.html', {'plant': plant}) + + @require_POST def upload_photo(request, pk): plant = get_object_or_404(Plant.objects.prefetch_related('photos'), pk=pk)