from django.db import models from django.db.models import UniqueConstraint from django.utils.text import slugify from django.utils.translation import gettext_lazy as _ from wagtail.models import Page from vbv_lernwelt.core.model_utils import find_available_slug from vbv_lernwelt.core.models import User class Course(models.Model): title = models.CharField(_("Titel"), max_length=255) category_name = models.CharField( _("Kategorie-Name"), max_length=255, default="Kategorie" ) class Meta: verbose_name = _("Lehrgang") def __str__(self): return f"{self.title}" class CourseCategory(models.Model): # Die Handlungsfelder im "Versicherungsvermittler/in" title = models.CharField(_("Titel"), max_length=255, blank=True) course = models.ForeignKey("course.Course", on_delete=models.CASCADE) general = models.BooleanField(_("Allgemein"), default=False) def __str__(self): return f"{self.course} / {self.title}" class CoursePage(Page): content_panels = Page.content_panels subpage_types = ["learnpath.LearningPath", "media_library.MediaLibraryPage"] course = models.ForeignKey("course.Course", on_delete=models.PROTECT) class Meta: verbose_name = _("Lehrgang-Seite") def full_clean(self, *args, **kwargs): self.slug = find_available_slug(slugify(self.title, allow_unicode=True)) super(CoursePage, self).full_clean(*args, **kwargs) def __str__(self): return f"{self.title}" class CourseCompletion(models.Model): created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) user = models.ForeignKey(User, on_delete=models.CASCADE) # page can logically be a LearningContent or a PerformanceCriteria for now page_key = models.UUIDField() page_type = models.CharField(max_length=255, default="", blank=True) page_slug = models.CharField(max_length=255, default="", blank=True) course = models.ForeignKey("course.Course", on_delete=models.CASCADE) completion_status = models.CharField( max_length=255, choices=[ ("unknown", "unknown"), ("success", "success"), ("fail", "fail"), ], default="unknown", ) additional_json_data = models.JSONField(default=dict) class Meta: constraints = [ UniqueConstraint( fields=[ "user", "page_key", ], name="course_completion_unique_user_page_key", ) ] class CourseSession(models.Model): """ Die Durchführung eines Kurses Benutzer die an eine CourseSession gehängt sind können diesen Lehrgang sehen Das anhängen kann via CourseSessionUser oder "Schulklasse (TODO)" geschehen """ created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) course = models.ForeignKey("course.Course", on_delete=models.CASCADE) title = models.TextField() start_date = models.DateField(null=True, blank=True) end_date = models.DateField(null=True, blank=True) additional_json_data = models.JSONField(default=dict) class CourseSessionUser(models.Model): """ Ein Benutzer der an einer CourseSession teilnimmt """ created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) course_session = models.ForeignKey("course.CourseSession", on_delete=models.CASCADE) user = models.ForeignKey(User, on_delete=models.CASCADE) class Meta: constraints = [ UniqueConstraint( fields=[ "course_session", "user", ], name="course_session_user_unique_course_session_user", ) ]