bloombase/plants/services/perenual.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

35 lines
1.1 KiB
Python

import requests
from django.conf import settings
_BASE = 'https://perenual.com/api'
class PerenualError(Exception):
pass
def search_species(query):
"""Query Perenual species-list endpoint.
Returns list of result dicts on success.
Raises PerenualError if the API is unreachable or rate-limited.
Returns [] if no API key is configured.
"""
if not settings.PERENUAL_API_KEY:
return []
try:
resp = requests.get(
f'{_BASE}/species-list',
params={'q': query, 'key': settings.PERENUAL_API_KEY},
timeout=10,
)
resp.raise_for_status()
return resp.json().get('data', [])
except requests.Timeout:
raise PerenualError('Perenual API timed out — try again in a moment.')
except requests.HTTPError as e:
if e.response is not None and e.response.status_code == 429:
raise PerenualError('Perenual API rate limit reached — try again later.')
raise PerenualError(f'Perenual API error ({e.response.status_code if e.response else "?"}).')
except Exception:
raise PerenualError('Could not reach Perenual API.')