Archived
- Backend: Chapter, ReadingProgress, ReadingSettings models - Backend: Chapter API (TOC + content), progress tracking, settings CRUD - Frontend: ReadingPage with chapter navigation - Frontend: TableOfContents drawer - Frontend: ReadingSettingsPanel (theme, font, size, orientation) - Frontend: Custom hooks for settings, chapters, progress tracking - CSS: Mobile-first reading view with sepia/dark/light/paper themes - Route: /reader/:bookId reading view from book detail page - Docs: 001-customizable-mobile-reading-experience.md
54 lines
1.7 KiB
Python
54 lines
1.7 KiB
Python
from django.conf import settings
|
|
from django.db import models
|
|
|
|
|
|
class ReadingSettings(models.Model):
|
|
"""Per-user reading preferences for the e-book reader view."""
|
|
|
|
THEME_CHOICES = [
|
|
("sepia", "Sepia"),
|
|
("dark", "Dark"),
|
|
("light", "Light"),
|
|
("paper", "Paper"),
|
|
]
|
|
|
|
FONT_CHOICES = [
|
|
("sans-serif", "Sans-serif"),
|
|
("serif", "Serif"),
|
|
("monospace", "Monospace"),
|
|
]
|
|
|
|
ORIENTATION_CHOICES = [
|
|
("auto", "Auto"),
|
|
("portrait", "Portrait"),
|
|
("landscape", "Landscape"),
|
|
]
|
|
|
|
user = models.OneToOneField(
|
|
settings.AUTH_USER_MODEL,
|
|
on_delete=models.CASCADE,
|
|
related_name="reading_settings",
|
|
primary_key=True,
|
|
)
|
|
font_family = models.CharField(max_length=32, choices=FONT_CHOICES, default="serif")
|
|
font_size = models.PositiveSmallIntegerField(default=18)
|
|
line_height = models.FloatField(default=1.6)
|
|
margin_width = models.PositiveSmallIntegerField(default=16)
|
|
background_color = models.CharField(max_length=7, default="#f5f0eb")
|
|
text_color = models.CharField(max_length=7, default="#1a1a1a")
|
|
brightness = models.PositiveSmallIntegerField(default=100)
|
|
orientation_lock = models.CharField(
|
|
max_length=16, choices=ORIENTATION_CHOICES, default="auto"
|
|
)
|
|
theme = models.CharField(max_length=32, choices=THEME_CHOICES, default="sepia")
|
|
created_at = models.DateTimeField(auto_now_add=True)
|
|
updated_at = models.DateTimeField(auto_now=True)
|
|
|
|
class Meta:
|
|
db_table = "reader_reading_settings"
|
|
verbose_name = "Reading Settings"
|
|
verbose_name_plural = "Reading Settings"
|
|
|
|
def __str__(self) -> str:
|
|
return f"{self.user} — {self.theme} ({self.font_size}px)"
|