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 %}
+
+
+{% 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)