This commit is contained in:
Ross
2025-12-05 22:31:16 +00:00
parent ceea07d0b3
commit 322c22f14e
4 changed files with 4 additions and 70 deletions
+1 -1
View File
@@ -52,7 +52,7 @@
<div class="buttons" style="margin-top:0.6rem"> <div class="buttons" style="margin-top:0.6rem">
<button class="button is-small is-info" hx-get="{% url 'cards:edit' card.pk %}" hx-target="#htmx-form" hx-swap="innerHTML">Edit</button> <button class="button is-small is-info" hx-get="{% url 'cards:edit' card.pk %}" hx-target="#htmx-form" hx-swap="innerHTML">Edit</button>
<button class="button is-small is-primary" hx-get="{% url 'cards:preview' card.pk %}" hx-target="#modal-root" hx-swap="innerHTML">Preview</button> <button class="button is-small is-primary" hx-get="{% url 'cards:preview' card.pk %}" hx-target="#modal-root" hx-swap="innerHTML">Preview</button>
<button class="button is-small" hx-post="{% url 'cards:import' card.pk %}" hx-target="#htmx-form" hx-swap="innerHTML">Import Facts</button>
<button class="button is-small is-danger" hx-post="{% url 'cards:delete' card.pk %}" hx-confirm="Delete this card?" hx-target="#card-{{ card.pk }}" hx-swap="outerHTML">Delete</button> <button class="button is-small is-danger" hx-post="{% url 'cards:delete' card.pk %}" hx-confirm="Delete this card?" hx-target="#card-{{ card.pk }}" hx-swap="outerHTML">Delete</button>
</div> </div>
</div> </div>
+1 -2
View File
@@ -8,8 +8,6 @@ urlpatterns = [
path('create/', views.card_create, name='create'), path('create/', views.card_create, name='create'),
path('<int:pk>/edit/', views.card_edit, name='edit'), path('<int:pk>/edit/', views.card_edit, name='edit'),
path('<int:pk>/delete/', views.card_delete, name='delete'), path('<int:pk>/delete/', views.card_delete, name='delete'),
path('<int:pk>/import/', views.import_facts_for_card, name='import'),
path('<int:pk>/import/apply/', views.apply_import_for_card, name='import_apply'),
path('preview/<int:pk>/', views.preview_card, name='preview'), path('preview/<int:pk>/', views.preview_card, name='preview'),
path('backgrounds/', views.background_list, name='backgrounds'), path('backgrounds/', views.background_list, name='backgrounds'),
path('backgrounds/create/', views.background_create, name='background_create'), path('backgrounds/create/', views.background_create, name='background_create'),
@@ -21,4 +19,5 @@ urlpatterns = [
path('export-table/', views.export_table, name='export_table'), path('export-table/', views.export_table, name='export_table'),
path('import/paste/', views.import_from_paste, name='import_paste'), path('import/paste/', views.import_from_paste, name='import_paste'),
path('import/apply/', views.apply_bulk_import, name='import_apply_bulk'), path('import/apply/', views.apply_bulk_import, name='import_apply_bulk'),
] ]
+1 -66
View File
@@ -6,11 +6,7 @@ from .models import Dinosaur, BackgroundImage
from .forms import DinosaurBulkFormSet from .forms import DinosaurBulkFormSet
from .forms import DinosaurForm from .forms import DinosaurForm
from .forms import BackgroundImageForm from .forms import BackgroundImageForm
from .llm import fetch_dinosaur_structured
from decimal import Decimal from decimal import Decimal
import json
import csv
from io import StringIO
def is_htmx(request): def is_htmx(request):
@@ -220,68 +216,6 @@ def preview_card(request, pk):
return render(request, 'cards/preview.html', {'card': card, 'background': background}) return render(request, 'cards/preview.html', {'card': card, 'background': background})
def import_facts_for_card(request, pk):
"""Call an LLM to fetch suggested facts/stats for a single card and
return an HTMX fragment showing a preview and an apply button."""
card = get_object_or_404(Dinosaur, pk=pk)
if request.method != 'POST':
return HttpResponseBadRequest('Only POST allowed')
try:
suggestion = fetch_dinosaur_structured(card.name)
except Exception as e:
# Return a small fragment with the error so HTMX can render it in the form area
return HttpResponse(render_to_string('cards/_import_preview.html', {'card': card, 'error': str(e)}, request=request))
# normalize fields for the template
context = {'card': card, 'suggestion': suggestion}
return HttpResponse(render_to_string('cards/_import_preview.html', context, request=request))
def apply_import_for_card(request, pk):
card = get_object_or_404(Dinosaur, pk=pk)
if request.method != 'POST':
return HttpResponseBadRequest('Only POST allowed')
# Read submitted values (form uses plain names)
def _get_float(name):
v = request.POST.get(name)
if not v:
return None
try:
return float(v)
except Exception:
return None
speed = _get_float('speed_kmh')
weight = _get_float('weight_kg')
height = _get_float('height_m')
intelligence = _get_float('intelligence_score')
facts_text = request.POST.get('facts', '')
if speed is not None:
card.speed = int(round(speed))
if weight is not None:
card.weight = int(round(weight))
if height is not None:
# store with one decimal place
card.height = Decimal(str(round(height, 1)))
if intelligence is not None:
# Accept either a 1-5 scale or 0-100. Map 1-5 -> 0-100 if needed.
if 0 <= intelligence <= 5:
card.intelligence = int(round((intelligence / 5.0) * 100))
else:
card.intelligence = int(round(max(0, min(100, intelligence))))
# Facts: accept multi-line textarea
card.facts = '\n'.join([l.strip() for l in facts_text.splitlines() if l.strip()])
card.save()
# Return refreshed card HTML to replace the item in the list and clear the form.
background = BackgroundImage.get_active() if BackgroundImage.objects.exists() else None
card_html = render_to_string('cards/_card_item.html', {'card': card, 'background': background}, request=request)
oob = '<div id="htmx-form" hx-swap-oob="true"></div>'
return HttpResponse(card_html + oob)
def cards_overview(request): def cards_overview(request):
"""Overview page showing all cards in a table for quick edits.""" """Overview page showing all cards in a table for quick edits."""
backgrounds = BackgroundImage.objects.all() backgrounds = BackgroundImage.objects.all()
@@ -500,3 +434,4 @@ def apply_bulk_import(request):
applied += 1 applied += 1
return HttpResponse(f'Applied updates to {applied} dinosaurs') return HttpResponse(f'Applied updates to {applied} dinosaurs')
+1 -1
View File
@@ -1,3 +1,3 @@
django django
Pillow Pillow
openai