- Dedup track scrobbles from lastfm import
- Write a script to check for raw mopidy vs found track discrepancies
- Push database backups to WebDAV from the backup management command
- Add an exception list of artists as a constant that are exempted from splitting
- Fix celery task prioritization especially for agent sessions
- Before enriching anything, trust the POST data
- Fix lastfm rate limiting dropping scrobbles
- Investigate how historice lastfm imports work
- Fix LookupError on scrobble start/long-plays views
- Add Flexify workout importer
- Add workouts app with exercise catalog and workout routines
- When sharing a scrobble, share the log data too
HyperlinkedModelSerializer could not resolve drink-detail because no
API ViewSet existed for the Drink model, even though the template URL
existed in drinks/urls.py.
Fix:
- Add DrinkSerializer and DrinkViewSet to drinks/api/
- Register DrinkViewSet as 'drinks' in the DRF router (vrobbler/urls.py)
- Mark task 8f2a3b4c as DONE in PROJECT.org
GET /api/v1/scrobbles/ now resolves without error.
GET /api/v1/scrobbles/ fails because HyperlinkedModelSerializer
can't resolve drink-detail — no API ViewSet exists for it, only a
template view in drinks/urls.py.
Closes #2fddd5d0-1138-4a6e-96b7-5879035f033f
drf-spectacular provides OpenAPI 3.0 schema generation for all 52
registered ViewSet endpoints under api/v1/. This is a prerequisite for
auto-generating the Kotlin networking layer.
Changes:
- Add drf-spectacular dependency (0.27.x)
- Register in INSTALLED_APPS and configure DEFAULT_SCHEMA_CLASS
- Add /api/schema/ (OpenAPI YAML) and /api/docs/ (Swagger UI) routes
- Add SPECTACULAR_SETTINGS with enum name overrides to suppress warnings
Schema generates cleanly with 4 non-blocking warnings (1 unique:
TagListSerializerField defaulting to string) and 14 unique skipped
errors (all non-ViewSet APIViews like webhooks that lack serializers).
- Add openfoodfacts Python SDK dependency
- Create foods/sources/openfoodfacts.py API wrapper with text_search
- Add off_code field + find_or_create_from_search() to Food model
- Add nutrition fields (protein, fat, carbs, fiber, sugar, sodium),
ingredients, image, off_code to Drink model
- Create FoodSearchView and FoodScrobbleFromSearchView at /foods/search/
- Route beverages to Drink model based on OFF category keywords
- Update ManualScrobbleView to redirect '-f Food Name' to food search
- Add Drinks section to home page and scrobble detail templates
- Update drink_detail.html with nutrition grid and image display
Add referrerPolicy: 'origin' to the Leaflet tile layer in
geolocation_list.html and geolocation_detail.html to match the
other four templates that already had it.
Without this, those templates send the full page URL as Referer,
which can trigger OSM rate limiting (osm.wiki/blocked error).
Also marks the task as DONE in PROJECT.org.
Add 'last_7' (Last 7 days) as a selectable period for all trends.
Changes are minimal since the period system is driven by PERIOD_CHOICES
and PERIOD_DAYS dicts — the rest of the infrastructure (views, templates,
Celery tasks, management commands) picks it up automatically.
- Add ('last_7', 'Last 7 days') to PERIOD_CHOICES in models.py
- Add 'last_7': 7 to PERIOD_DAYS in utils.py
- Migration 0004_alter_trendresult_period_add_last_7