Archived
- Backend: Django REST Framework API with Bookmark and Note models - ViewSets with user-scoped querysets and select_related for N+1 prevention - Create/List/Detail/Update/Delete endpoints - Batch delete operations - Unique constraint on user+book+page for bookmarks - IsOwner permission class for object-level access control - Full serializer validation (page > 0, non-empty content, duplicate check) - 30+ pytest-django tests covering CRUD, auth, filtering, edge cases - Frontend: React TypeScript components - AnnotationsContext with useReducer for state management - BookmarkList, NoteList, AddAnnotationForm, AnnotationsDashboard - Inline note editing with immediate save - Batch delete support - API client with JWT auto-refresh interceptors - Paginated query hook for infinite scroll support - Responsive CSS with loading/empty states - Infrastructure: Django project with custom User model, JWT auth, CORS - PostgreSQL database models with proper FK and indexes - Django admin configuration for all models
21 lines
651 B
Python
21 lines
651 B
Python
from django.db import models
|
|
|
|
|
|
class Book(models.Model):
|
|
"""Represents a book in the user's library."""
|
|
|
|
title = models.CharField(max_length=512)
|
|
author = models.CharField(max_length=256, blank=True, default="")
|
|
total_pages = models.PositiveIntegerField(default=0)
|
|
cover_image = models.URLField(blank=True, default="")
|
|
created_at = models.DateTimeField(auto_now_add=True)
|
|
updated_at = models.DateTimeField(auto_now=True)
|
|
|
|
class Meta:
|
|
db_table = "books_book"
|
|
verbose_name = "Book"
|
|
verbose_name_plural = "Books"
|
|
ordering = ["title"]
|
|
|
|
def __str__(self) -> str:
|
|
return self.title |