.
This commit is contained in:
+38
-2
@@ -1,6 +1,8 @@
|
||||
from django.shortcuts import render, get_object_or_404, redirect
|
||||
from django.http import HttpResponse, HttpResponseBadRequest
|
||||
from django.template.loader import render_to_string
|
||||
import io
|
||||
import zipfile
|
||||
import os
|
||||
from .models import Dinosaur, BackgroundImage
|
||||
from .forms import DinosaurBulkFormSet
|
||||
@@ -62,6 +64,9 @@ def card_list(request):
|
||||
'current_order': order,
|
||||
}
|
||||
|
||||
# Total (or filtered) card count for UI summary
|
||||
context['card_count'] = qs.count()
|
||||
|
||||
if is_htmx(request):
|
||||
return render(request, 'cards/_cards_list.html', context)
|
||||
return render(request, 'cards/list.html', context)
|
||||
@@ -158,6 +163,35 @@ def background_list(request):
|
||||
return render(request, 'cards/backgrounds_list.html', {'backgrounds': backgrounds, 'form': form})
|
||||
|
||||
|
||||
def backgrounds_download_all(request):
|
||||
"""Provide a ZIP archive download containing all uploaded background images.
|
||||
|
||||
Creates the ZIP in-memory and returns it as an attachment. Skips missing
|
||||
files gracefully.
|
||||
"""
|
||||
backgrounds = BackgroundImage.objects.all()
|
||||
buffer = io.BytesIO()
|
||||
with zipfile.ZipFile(buffer, 'w', compression=zipfile.ZIP_DEFLATED) as zf:
|
||||
for bg in backgrounds:
|
||||
if not getattr(bg, 'image', None):
|
||||
continue
|
||||
try:
|
||||
filepath = bg.image.path
|
||||
except Exception:
|
||||
# If storage backend doesn't expose a local path, skip.
|
||||
continue
|
||||
if not os.path.exists(filepath):
|
||||
continue
|
||||
arcname = os.path.basename(bg.image.name) if getattr(bg.image, 'name', None) else f'background-{bg.pk}'
|
||||
# Prefix with id to avoid duplicate names
|
||||
arcname = f"{bg.pk}_{arcname}"
|
||||
zf.write(filepath, arcname)
|
||||
buffer.seek(0)
|
||||
resp = HttpResponse(buffer.getvalue(), content_type='application/zip')
|
||||
resp['Content-Disposition'] = 'attachment; filename=backgrounds.zip'
|
||||
return resp
|
||||
|
||||
|
||||
def background_create(request):
|
||||
if request.method != 'POST':
|
||||
return HttpResponseBadRequest('Only POST allowed')
|
||||
@@ -222,7 +256,8 @@ def cards_overview(request):
|
||||
qs = Dinosaur.objects.order_by('name')
|
||||
# Use a modelformset so the template renders the management form
|
||||
formset = DinosaurBulkFormSet(queryset=qs)
|
||||
return render(request, 'cards/bulk_edit.html', {'formset': formset, 'backgrounds': backgrounds})
|
||||
card_count = qs.count()
|
||||
return render(request, 'cards/bulk_edit.html', {'formset': formset, 'backgrounds': backgrounds, 'card_count': card_count})
|
||||
|
||||
|
||||
def cards_bulk_update(request):
|
||||
@@ -243,7 +278,8 @@ def cards_bulk_update(request):
|
||||
return redirect('cards:overview')
|
||||
# If invalid, re-render the overview with errors
|
||||
backgrounds = BackgroundImage.objects.all()
|
||||
return render(request, 'cards/bulk_edit.html', {'formset': formset, 'backgrounds': backgrounds})
|
||||
card_count = qs.count()
|
||||
return render(request, 'cards/bulk_edit.html', {'formset': formset, 'backgrounds': backgrounds, 'card_count': card_count})
|
||||
|
||||
|
||||
def cards_bulk_create_images(request):
|
||||
|
||||
Reference in New Issue
Block a user