feat: add plant_card view and URL
This commit is contained in:
parent
3b8ebd6454
commit
10a76238aa
4 changed files with 40 additions and 1 deletions
9
plants/templates/plants/plant_card.html
Normal file
9
plants/templates/plants/plant_card.html
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
{% extends "plants/base.html" %}
|
||||||
|
{% block title %}Plant card — {{ plant.name }} — PlantDB{% endblock %}
|
||||||
|
{% block content %}
|
||||||
|
<div class="d-flex align-items-center gap-2 mb-3">
|
||||||
|
<a href="{% url 'plant_detail' plant.pk %}" class="btn btn-sm btn-outline-secondary">← {{ plant.name }}</a>
|
||||||
|
<h5 class="mb-0">Plant card</h5>
|
||||||
|
</div>
|
||||||
|
<div id="card-gallery"></div>
|
||||||
|
{% endblock %}
|
||||||
|
|
@ -219,6 +219,28 @@ class TestPlantDelete:
|
||||||
assert not Plant.objects.filter(pk=plant.pk).exists()
|
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
|
@pytest.mark.django_db
|
||||||
class TestPruningCalendar:
|
class TestPruningCalendar:
|
||||||
def test_returns_200(self, client):
|
def test_returns_200(self, client):
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ urlpatterns = [
|
||||||
path('plants/<int:pk>/', plants.plant_detail, name='plant_detail'),
|
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>/edit/', plants.plant_edit, name='plant_edit'),
|
||||||
path('plants/<int:pk>/delete/', plants.plant_delete, name='plant_delete'),
|
path('plants/<int:pk>/delete/', plants.plant_delete, name='plant_delete'),
|
||||||
|
path('plants/<int:pk>/card/', plants.plant_card, name='plant_card'),
|
||||||
path('plants/<int:pk>/log-pruning/', plants.log_pruning, name='log_pruning'),
|
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('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>/set-thumbnail/', plants.set_thumbnail, name='set_thumbnail'),
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ from datetime import date
|
||||||
from django.shortcuts import render, get_object_or_404, redirect
|
from django.shortcuts import render, get_object_or_404, redirect
|
||||||
from django.views.decorators.csrf import ensure_csrf_cookie
|
from django.views.decorators.csrf import ensure_csrf_cookie
|
||||||
from django.views.decorators.http import require_POST
|
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.forms import PlantForm, PruningLogForm
|
||||||
from plants.utils.pruning import pruning_status
|
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})
|
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
|
@require_POST
|
||||||
def upload_photo(request, pk):
|
def upload_photo(request, pk):
|
||||||
plant = get_object_or_404(Plant.objects.prefetch_related('photos'), pk=pk)
|
plant = get_object_or_404(Plant.objects.prefetch_related('photos'), pk=pk)
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue