feat: implement reading pace notifications (US #33)

Backend:
- New hermes app with ReadingGroup, GroupMeeting, GroupMembership models
- NotificationPreference (per-user: enable/disable, frequency daily/weekly)
- PaceNotification model for tracking sent/dismissed notifications
- Pace calculation service comparing current progress vs meeting targets
- API endpoints: pace status, notification preferences CRUD, reminders, dismiss
- Ahead/behind/on_track/completed status determination

Frontend:
- PaceNotification component for in-app alerts (behind/ahead/on_track statuses)
- ReadingPaceBanner — persistent banner in reader view
- Notification settings in Settings page (enable/disable, frequency, reminders)
- API client module (groupsApi) for all notification endpoints
This commit is contained in:
Marko
2026-06-20 19:33:41 +00:00
parent 26c5f6f06b
commit e80c2673ef
21 changed files with 1320 additions and 3 deletions
+23
View File
@@ -0,0 +1,23 @@
from django.urls import include, path
from rest_framework.routers import DefaultRouter
from apps.groups.views import (
GroupMeetingViewSet,
ReadingGroupViewSet,
dismiss_pace_notification_view,
notification_preferences_view,
pace_status_view,
reminder_view,
)
router = DefaultRouter()
router.register(r"groups", ReadingGroupViewSet, basename="reading-group")
router.register(r"meetings", GroupMeetingViewSet, basename="group-meeting")
urlpatterns = [
path("", include(router.urls)),
path("notifications/preferences/", notification_preferences_view, name="notification-preferences"),
path("notifications/pace/", pace_status_view, name="pace-status"),
path("notifications/dismiss/", dismiss_pace_notification_view, name="dismiss-pace"),
path("notifications/reminders/", reminder_view, name="meeting-reminders"),
]