bloombase/plants/views/species.py
Stephan Kerkman 40e3419160 fix: surface Perenual API errors instead of silently returning no results
Timeout and rate-limit failures now show a warning message to the user.
Timeout increased to 10s.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-28 10:37:30 +02:00

46 lines
1.6 KiB
Python

from django.shortcuts import render, redirect
from django.urls import reverse
from plants.models import Species
from plants.services.perenual import search_species, PerenualError
_MONTH_MAP = {
'January': 1, 'February': 2, 'March': 3, 'April': 4,
'May': 5, 'June': 6, 'July': 7, 'August': 8,
'September': 9, 'October': 10, 'November': 11, 'December': 12,
}
def species_search(request):
q = request.GET.get('q', '').strip()
results = []
error = None
if len(q) >= 2:
try:
results = search_species(q)
except PerenualError as e:
error = str(e)
return render(request, 'plants/partials/species_results.html', {
'results': results, 'q': q, 'error': error,
})
def species_select(request):
perenual_id = int(request.POST['perenual_id'])
if not Species.objects.filter(perenual_id=perenual_id).exists():
pruning_str = request.POST.get('pruning_months', '')
pruning_months = [
_MONTH_MAP[m.strip()]
for m in pruning_str.split(',')
if m.strip() in _MONTH_MAP
]
Species.objects.create(
perenual_id=perenual_id,
common_name=request.POST.get('common_name', ''),
scientific_name=request.POST.get('scientific_name', ''),
watering=request.POST.get('watering', ''),
sunlight=request.POST.get('sunlight', ''),
pruning_months=pruning_months,
api_image_url=request.POST.get('api_image_url', ''),
)
species = Species.objects.get(perenual_id=perenual_id)
return redirect(f"{reverse('plant_add')}?species_id={species.pk}")