feat: implement group EPUB upload and section splitting (US #29)

Backend:
- Create hermes Django app with models: ReadingGroup, GroupBook, Section, ReadingSchedule, MemberProgress
- EPUB section splitting service with automatic detection and reading time estimation
- Section recommendation engine for 4-week meeting schedule
- REST API endpoints for groups, books, sections, schedule, and member progress
- Manual section adjustment (merge/split) support

Frontend:
- GroupsPage: list/create reading groups
- GroupDetailPage: manage members, upload EPUB to group, view group books
- GroupBookPage: section breakdown with merge/split controls, reading schedule, member progress
- API client and TypeScript types for all group operations
- i18n keys for English and Spanish

Shared:
- Group-related types and API endpoint constants in packages/shared
This commit is contained in:
Marko
2026-06-20 19:30:11 +00:00
parent 26c5f6f06b
commit 1b3b709ba5
23 changed files with 2492 additions and 0 deletions
+46
View File
@@ -0,0 +1,46 @@
from django.contrib import admin
from apps.groups.models import (
GroupBook,
MemberProgress,
ReadingGroup,
ReadingGroupMembership,
ReadingSchedule,
Section,
)
@admin.register(ReadingGroup)
class ReadingGroupAdmin(admin.ModelAdmin):
list_display = ["name", "admin", "created_at"]
search_fields = ["name", "admin__email"]
@admin.register(ReadingGroupMembership)
class ReadingGroupMembershipAdmin(admin.ModelAdmin):
list_display = ["user", "group", "role", "joined_at"]
list_filter = ["role", "group"]
@admin.register(GroupBook)
class GroupBookAdmin(admin.ModelAdmin):
list_display = ["title", "group", "status", "uploaded_by", "created_at"]
list_filter = ["status"]
search_fields = ["title", "group__name"]
@admin.register(Section)
class SectionAdmin(admin.ModelAdmin):
list_display = ["title", "group_book", "order", "estimated_reading_minutes"]
ordering = ["group_book", "order"]
@admin.register(ReadingSchedule)
class ReadingScheduleAdmin(admin.ModelAdmin):
list_display = ["group_book", "meeting_number", "week_date"]
ordering = ["group_book", "meeting_number"]
@admin.register(MemberProgress)
class MemberProgressAdmin(admin.ModelAdmin):
list_display = ["user", "group_book", "current_section", "updated_at"]