feat: add upload_card_photo view and URL
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
a97bb77f32
commit
5e91983783
4 changed files with 38 additions and 0 deletions
1
plants/templates/plants/partials/card_gallery.html
Normal file
1
plants/templates/plants/partials/card_gallery.html
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
<div class="mb-3"></div>
|
||||||
|
|
@ -241,6 +241,33 @@ class TestPlantCard:
|
||||||
assert 'plants/plant_card.html' in [t.name for t in resp.templates]
|
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
|
@pytest.mark.django_db
|
||||||
class TestPruningCalendar:
|
class TestPruningCalendar:
|
||||||
def test_returns_200(self, client):
|
def test_returns_200(self, client):
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ urlpatterns = [
|
||||||
path('plants/<int:pk>/card/', plants.plant_card, name='plant_card'),
|
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('plants/<int:pk>/card-photos/upload/', plants.upload_card_photo, name='upload_card_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'),
|
||||||
path('photos/<int:photo_pk>/delete/', plants.delete_photo, name='delete_photo'),
|
path('photos/<int:photo_pk>/delete/', plants.delete_photo, name='delete_photo'),
|
||||||
path('pruning/', pruning.pruning_calendar, name='pruning_calendar'),
|
path('pruning/', pruning.pruning_calendar, name='pruning_calendar'),
|
||||||
|
|
|
||||||
|
|
@ -122,6 +122,15 @@ def plant_card(request, pk):
|
||||||
return render(request, 'plants/plant_card.html', {'plant': plant})
|
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
|
@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