import uuid from django.conf import settings from django.db import models class FormulaDocument(models.Model): id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="formulas") title = models.CharField(max_length=120) source = models.TextField(blank=True) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) class Meta: ordering = ["-updated_at"] class FormulaRevision(models.Model): document = models.ForeignKey(FormulaDocument, on_delete=models.CASCADE, related_name="revisions") source = models.TextField() created_at = models.DateTimeField(auto_now_add=True) class LatexCourse(models.Model): slug = models.SlugField(unique=True) title = models.CharField(max_length=120) description = models.TextField(blank=True) order = models.PositiveIntegerField(default=0) is_published = models.BooleanField(default=False) def __str__(self): return self.title class LatexLesson(models.Model): course = models.ForeignKey(LatexCourse, on_delete=models.CASCADE, related_name="lessons") slug = models.SlugField() title = models.CharField(max_length=120) content = models.TextField() example_source = models.TextField(blank=True) order = models.PositiveIntegerField(default=0) class Meta: constraints = [ models.UniqueConstraint(fields=("course", "slug"), name="unique_course_lesson") ] ordering = ["order"] class LatexExercise(models.Model): lesson = models.ForeignKey(LatexLesson, on_delete=models.CASCADE, related_name="exercises") prompt = models.TextField() expected_source = models.TextField() explanation = models.TextField(blank=True) order = models.PositiveIntegerField(default=0) class LatexAttempt(models.Model): user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="latex_attempts") exercise = models.ForeignKey(LatexExercise, on_delete=models.PROTECT) submitted_source = models.TextField() is_correct = models.BooleanField() created_at = models.DateTimeField(auto_now_add=True) class HandwritingRecognitionJob(models.Model): class Status(models.TextChoices): PENDING = "pending", "等待" COMPLETE = "complete", "完成" FAILED = "failed", "失败" id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) status = models.CharField(max_length=16, choices=Status.choices, default=Status.PENDING) result = models.JSONField(default=dict, blank=True) created_at = models.DateTimeField(auto_now_add=True)