diff --git a/plants/templates/plants/partials/card_gallery.html b/plants/templates/plants/partials/card_gallery.html new file mode 100644 index 0000000..4e9c7ac --- /dev/null +++ b/plants/templates/plants/partials/card_gallery.html @@ -0,0 +1 @@ +
diff --git a/plants/tests/test_views.py b/plants/tests/test_views.py index cbf73ef..a92cfa2 100644 --- a/plants/tests/test_views.py +++ b/plants/tests/test_views.py @@ -241,6 +241,33 @@ class TestPlantCard: assert 'plants/plant_card.html' in [t.name for t in resp.templates] +@pytest.mark.django_db +class TestUploadCardPhoto: + def test_upload_creates_card_photo(self, client): + from django.core.files.uploadedfile import SimpleUploadedFile + from plants.models import PlantCardPhoto + plant = Plant.objects.create(name='Fern') + image = SimpleUploadedFile('card.jpg', b'\xff\xd8\xff\xe0' + b'\x00' * 100, content_type='image/jpeg') + resp = client.post(reverse('upload_card_photo', args=[plant.pk]), {'image': image}) + assert resp.status_code == 200 + assert PlantCardPhoto.objects.filter(plant=plant).count() == 1 + + def test_upload_blocked_at_max_3(self, client): + from django.core.files.uploadedfile import SimpleUploadedFile + from plants.models import PlantCardPhoto + plant = Plant.objects.create(name='Fern') + for i in range(3): + PlantCardPhoto.objects.create(plant=plant, image=f'plants/cards/card{i}.jpg') + image = SimpleUploadedFile('card_extra.jpg', b'\xff\xd8\xff\xe0' + b'\x00' * 100, content_type='image/jpeg') + client.post(reverse('upload_card_photo', args=[plant.pk]), {'image': image}) + assert PlantCardPhoto.objects.filter(plant=plant).count() == 3 + + def test_returns_card_gallery_partial(self, client): + plant = Plant.objects.create(name='Fern') + resp = client.post(reverse('upload_card_photo', args=[plant.pk]), {}) + assert resp.templates[0].name == 'plants/partials/card_gallery.html' + + @pytest.mark.django_db class TestPruningCalendar: def test_returns_200(self, client): diff --git a/plants/urls.py b/plants/urls.py index 11af1ed..1a4c5cb 100644 --- a/plants/urls.py +++ b/plants/urls.py @@ -11,6 +11,7 @@ urlpatterns = [ 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('plants//card-photos/upload/', plants.upload_card_photo, name='upload_card_photo'), path('photos//set-thumbnail/', plants.set_thumbnail, name='set_thumbnail'), path('photos//delete/', plants.delete_photo, name='delete_photo'), path('pruning/', pruning.pruning_calendar, name='pruning_calendar'), diff --git a/plants/views/plants.py b/plants/views/plants.py index 7f228fc..3786468 100644 --- a/plants/views/plants.py +++ b/plants/views/plants.py @@ -122,6 +122,15 @@ def plant_card(request, pk): return render(request, 'plants/plant_card.html', {'plant': plant}) +@require_POST +def upload_card_photo(request, pk): + plant = get_object_or_404(Plant, pk=pk) + if request.FILES.get('image') and plant.card_photos.count() < 3: + PlantCardPhoto.objects.create(plant=plant, image=request.FILES['image']) + plant = Plant.objects.prefetch_related('card_photos').get(pk=pk) + return render(request, 'plants/partials/card_gallery.html', {'plant': plant}) + + @require_POST def upload_photo(request, pk): plant = get_object_or_404(Plant.objects.prefetch_related('photos'), pk=pk)