Commit Graph

1865 Commits

Author SHA1 Message Date
408475f159 Add videogame API and register ViewSets for scrobble relationships
VideoGame was missing from the API router, causing
HyperlinkedModelSerializer to fail when generating URLs for scrobble
relationships.

Changes:
- Create videogames/api/ with serializers and views
- Register VideoGameViewSet at /api/v1/videogames/
- Register VideoGameCollectionViewSet at /api/v1/videogame-collections/
- Register VideoGamePlatformViewSet at /api/v1/videogame-platforms/
2026-07-23 21:42:39 -04:00
caff69c714 Register missing trail and food-category ViewSets in API router
TrailViewSet and FoodCategoryViewSet were imported but never registered
in the DRF router, causing HyperlinkedModelSerializer to fail when
trying to generate URLs for scrobble relationships.

Changes:
- Add router.register(r'trails', TrailViewSet)
- Add router.register(r'food-categories', FoodCategoryViewSet)
2026-07-23 21:40:45 -04:00
b0d3029541 Switch scrobble API from UUID to pk lookup
The ScrobbleViewSet was using lookup_field="uuid" which caused
API detail views to fail for scrobbles with NULL UUIDs. Rather
than backfilling all NULL UUIDs, switch to pk lookup which is
always populated.

Changes:
- Remove lookup_field="uuid" from ScrobbleViewSet (defaults to pk)
- Remove extra_kwargs from ScrobbleSerializer (URL now uses pk)
- Update regenerate_share_token action signature to use **kwargs
2026-07-23 21:35:30 -04:00
7e222c9a8a Fix ImproperlyConfigured for scrobble-detail by backfilling NULL UUIDs
The ScrobbleSerializer uses HyperlinkedModelSerializer with
lookup_field='uuid', but 3,273 of 6,155 Scrobbles had NULL UUIDs,
causing URL resolution to fail.

Fix:
- Add migration 0104 to backfill NULL UUIDs with uuid4()
- All Scrobbles now have valid UUIDs for URL resolution
2026-07-23 20:37:52 -04:00
dcbb4034d0 Fix ImproperlyConfigured for paper-detail in scrobbles API
Same issue as drink-detail: Paper model had a template URL but no API
ViewSet, causing HyperlinkedModelSerializer to fail.

Fix:
- Add PaperSerializer and PaperViewSet to books/api/
- Register PaperViewSet as 'papers' in the DRF router
2026-07-23 20:28:35 -04:00
428d84d3bf Fix ImproperlyConfigured for drink-detail in scrobbles API
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.
2026-07-23 20:26:39 -04:00
d004336dd3 Add backlog task for drink-detail ImproperlyConfigured bug
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.
2026-07-23 20:22:59 -04:00
261bb618f5 Mark Android scaffold task as DONE in PROJECT.org
Scaffold completed in ../vrobbler-android with Compose, Hilt,
Navigation, OkHttp, Moshi, and EncryptedSharedPreferences.
2026-07-23 20:16:21 -04:00
cd9961662e Add drf-spectacular for OpenAPI schema generation
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).
2026-07-23 20:01:04 -04:00
050fce7ffc [release] Bump to version 62.1
All checks were successful
ci / test (push) Successful in 2m41s
ci / build-and-deploy (push) Successful in 1m40s
- Add open food stats as requirement
62.1
2026-07-22 01:17:09 -04:00
3bfb01b3f7 poetry lock 2026-07-22 01:16:52 -04:00
c6d94d8584 feat: add Open Food Facts search selector for food and drinks 2026-07-21 17:14:45 -04:00
dbb6225315 [release] Bump to version 62.0
Some checks failed
ci / test (push) Failing after 48s
ci / build-and-deploy (push) Has been skipped
- Add open food facts source for Food and Drink
62.0
2026-07-21 17:10:56 -04:00
155ed2a4f8 feat: add Open Food Facts search selector for food and drinks
- 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
2026-07-21 17:09:13 -04:00
f58f5406bb [release] Bump to version 61.5
All checks were successful
ci / test (push) Successful in 2m29s
ci / build-and-deploy (push) Successful in 2m10s
- Fix referer bug in OSM tiles
- Fix bugs in lifeevent urls
61.5
2026-07-20 23:55:37 -04:00
0e3b3cc68d fix(locations): add referrerPolicy to OSM tile layers
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.
2026-07-20 23:53:12 -04:00
d53a9a9d33 Fix a bug in lifeevent urls 2026-07-20 23:48:17 -04:00
b4d858571e [release] Bump to version 61.4
All checks were successful
ci / test (push) Successful in 2m25s
ci / build-and-deploy (push) Successful in 1m2s
- Add 7-day period for trends
61.4
2026-07-19 15:44:13 -04:00
a598562e24 feat(trends): add 7-day period option
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
2026-07-19 15:43:08 -04:00
bb63e529e7 [release] Bump to version 61.3
All checks were successful
ci / test (push) Successful in 2m41s
ci / build-and-deploy (push) Successful in 1m8s
- Add trends tests and fix fasting
61.3
2026-07-19 13:52:46 -04:00
c21d6f5668 fix(tests): fix fasting custom threshold tests using Django ORM cache
The user_with_custom_thresholds fixture used UserProfile.objects.get_or_create()
which returns a separate Python instance from the one cached in
user._state.fields_cache['profile']. When the fixture modified and saved
the get_or_create instance, the cached instance on the user object still
held default values (periodic=16, full=24). compute_fasting() accessed
u.profile which returned the stale cached object.

Fixed by modifying through u.profile directly, which operates on the
same cached instance. Also applied black formatting to fasting.py.
2026-07-19 13:50:54 -04:00
29fc493cc2 Rewrite fasting trend algorithm and add comprehensive tests
- Replace day-iteration algorithm with pair-based approach for fasting
  detection. Iterate consecutive food scrobble pairs and mark foodless
  days between them as fasting days.

- Handle consecutive-day periodic fasting: when two food scrobbles are on
  consecutive days with a gap >= periodic_threshold but < full_threshold,
  mark the later day as a periodic fast (user's original bug fix).

- Fix _dt test helper to use replace() instead of subtracting hours,
  producing correct timestamps (e.g., '3 days ago at 18:46' instead of
  '3 days + 18h46m ago').

- Fix total_days off-by-one: removed +1 from inclusive day count so a
  'last_30' period correctly reports 30 days.

- Add _drinks_on_day() for per-day drink detection (replaces whole-
  window _drinks_in_window for more accurate liquid fasting detection).

- Fix Beer test fixture to use styles M2M field instead of non-existent
  beer_style attribute.

- Add 26 test cases covering: classification, short gaps, periodic/
  full/liquid fasting, multi-day gaps, vacation exemptions, custom
  thresholds, streaks, mixed types, edge cases.

Reasoning:
The original day-iteration algorithm had fundamental issues: it marked
days with food as fasting (since it only checked prev/next food times),
it didn't filter out normal (< periodic) gaps, and the _dt helper was
misinterpreting hour parameters. The new pair-based approach is cleaner:
for each consecutive food scrobble pair, we mark the foodless days
between them. This naturally handles multi-day fasts and correctly
avoids marking food-eating days as fasting. The consecutive-day periodic
rule preserves the user's original intent of detecting overnight fasts
between meals.
2026-07-19 13:11:29 -04:00
f0d69cdac0 [release] Bump to version 61.2
All checks were successful
ci / test (push) Successful in 2m18s
ci / build-and-deploy (push) Successful in 40s
- Fix bug in trends and add liquid fasting
61.2
2026-07-17 15:35:57 -04:00
3bbfa6fc37 fix(trends): fix fasting detection for consecutive-day gaps and add liquid fasting 2026-07-17 15:35:42 -04:00
36a1ee8495 [release] Bump to version 61.1
All checks were successful
ci / test (push) Successful in 2m19s
ci / build-and-deploy (push) Successful in 46s
- Add trend for fasting
61.1
2026-07-17 15:03:27 -04:00
9393ae133c feat(trends): add fasting trend 2026-07-17 15:02:15 -04:00
ab2e154ed3 [nature] Fix template and url paths
All checks were successful
ci / test (push) Successful in 2m41s
ci / build-and-deploy (push) Has been skipped
2026-07-17 10:35:20 -04:00
46c5ff6993 [release] Bump to version 61.0
All checks were successful
ci / test (push) Successful in 2m20s
ci / build-and-deploy (push) Successful in 48s
- Try adding a nature app with Observations and Species
- Add ability to push one or sync all board game scrobbles to BGG
- Clean up naming of =bgsplay= parsing
61.0
2026-07-16 23:47:03 -04:00
c3673e2679 [nature] Add iNaturalist observation importer and scrobbles
- New nature app with SpeciesObservation model (scrobblable)
- SpeciesObservationLogData for observation-specific fields
- Atom feed parser + iNat REST API enrichment
- Photo download and local storage
- Celery periodic import (every 4 hours)
- Management command: import_from_inaturalist
- Species fields: title, scientific_name, taxon_id, iconic_taxon_name, rank, wikipedia_url
- Log fields: observation_id, photo_urls, quality_grade, place_guess, lat/lon, uri, identifications_count
- Updates existing scrobbles when observation data changes
- iNaturalist user mapping on UserProfile
- Templates, admin, API, URLs
- Default 5 minute run time for species observations
2026-07-16 23:43:21 -04:00
00249e3d3b [boardgames] Fix and clean up BGG push integration 2026-07-15 16:41:12 -04:00
9523d631b0 [scrobbles] Rename email_scrobble_board_game to scrobble_board_game_from_bgstats 2026-07-15 16:03:00 -04:00
abf0eae493 [release] Bump to version 60.2
All checks were successful
ci / test (push) Successful in 2m31s
ci / build-and-deploy (push) Successful in 2m6s
- Use FastCork to lookup wine data
60.2
2026-07-14 21:05:46 -04:00
740e5268dd [drinks] Add better wine lookups 2026-07-14 21:05:22 -04:00
681252b845 [release] Bump to version 60.1
All checks were successful
ci / test (push) Successful in 2m20s
ci / build-and-deploy (push) Successful in 1m38s
- Migrate coffee scrobbles to new Coffee model
60.1
2026-07-14 12:54:04 -04:00
f6a20b67a6 [drinks] Add coffee migration script 2026-07-14 12:53:27 -04:00
c9298fe387 [release] Bump to version 60.0
All checks were successful
ci / test (push) Successful in 2m19s
ci / build-and-deploy (push) Successful in 41s
- Send water drinking notifications
- Add wine as a ScrobbleItem in a drinks app and move beers into drinks app
60.0
2026-07-14 00:13:17 -04:00
f7d99f8b55 [drinks] Add water drink notifications 2026-07-13 23:17:14 -04:00
6861e28ac6 [drinks] Add Drink as a scrobbleable media
All checks were successful
ci / test (push) Successful in 2m48s
ci / build-and-deploy (push) Has been skipped
2026-07-13 19:12:59 -04:00
fdc18d5a5f [drinks] Rename beers to drinks and add new models 2026-07-13 13:26:28 -04:00
77d92f6c96 [release] Bump to version 59.5
All checks were successful
ci / test (push) Successful in 2m13s
ci / build-and-deploy (push) Successful in 38s
- Fix bug where all variants for board games are in form
59.5
2026-07-05 00:15:58 -04:00
d5d0eb6cd8 [boardgames] Make sure variants are filtered by game 2026-07-05 00:15:26 -04:00
d6f71e0761 [release] Bump to version 59.4
All checks were successful
ci / test (push) Successful in 2m14s
ci / build-and-deploy (push) Successful in 37s
- Fix bug in fetching expansions for board games
- Board games should have genres extracted from family data
59.4
2026-07-04 11:53:28 -04:00
b00ebf49dd [boardgames] Fix getting BGG id 2026-07-04 11:53:05 -04:00
2385e9c7bd [release] Bump to version 59.3
All checks were successful
ci / test (push) Successful in 2m18s
ci / build-and-deploy (push) Successful in 37s
- Exclude some board games from auto-expansion imports
- Should be able to add new variants to board games via the log data form
59.3
2026-07-04 11:41:49 -04:00
d78529efe2 [boardgames] Add genres and categories 2026-07-04 11:41:24 -04:00
f373e98e3d [boardgames] Skip CCG games for auto expansion download 2026-07-04 11:32:17 -04:00
7559ce7824 [boardgames] Add ability to add new variants to form 2026-07-04 11:28:41 -04:00
2c481bd53a [release] Bump to version 59.2
All checks were successful
ci / test (push) Successful in 2m20s
ci / build-and-deploy (push) Successful in 36s
- Fix test failure in discgolf app
59.2
2026-07-04 10:18:42 -04:00
0deb3ee634 [discgolf] Fix breaking tests 2026-07-04 10:18:17 -04:00
28a53d70eb [release] Bump to version 59.1
Some checks failed
ci / test (push) Failing after 1m50s
ci / build-and-deploy (push) Has been skipped
- Fix bug when expansions have no image
59.1
2026-07-04 10:10:22 -04:00