Source code for education.models

"""The models defined by the education package"""
from django.db import models
from django.urls import reverse
from django.utils import timezone
from django.utils.translation import gettext_lazy as _

from members.models import Member
from thaliawebsite.settings import settings
from utils.snippets import datetime_to_lectureyear
from utils.translation import ModelTranslateMeta, MultilingualField


[docs]class Category(models.Model, metaclass=ModelTranslateMeta): """Describes a course category""" name = MultilingualField(models.CharField, max_length=64,) def __str__(self): return self.name
[docs] def get_absolute_url(self): return reverse("education:category", args=[str(self.pk)])
class Meta: verbose_name = _("category") verbose_name_plural = _("categories")
[docs]class Course(models.Model, metaclass=ModelTranslateMeta): """Describes a course""" name = MultilingualField(models.CharField, max_length=255) categories = models.ManyToManyField( Category, verbose_name=_("categories"), blank=True ) old_courses = models.ManyToManyField( "self", symmetrical=False, verbose_name=_("old courses"), blank=True ) course_code = models.CharField(max_length=16) ec = models.IntegerField(verbose_name=_("EC")) since = models.IntegerField() until = models.IntegerField(blank=True, null=True) def __str__(self): return "{} ({})".format(self.name, self.course_code)
[docs] def get_absolute_url(self): return reverse("education:course", args=[str(self.pk)])
class Meta: ordering = ["-pk"] verbose_name = _("course") verbose_name_plural = _("courses")
[docs]class Exam(models.Model, metaclass=ModelTranslateMeta): """Describes an exam""" EXAM_TYPES = ( ("document", _("Document")), ("exam", _("Exam")), ("partial", _("Partial Exam")), ("resit", _("Resit")), ("practice", _("Practice Exam")), ("exam_answers", _("Exam Answers")), ("partial_answers", _("Partial Exam Answers")), ("resit_answers", _("Resit Answers")), ("practice_answers", _("Practice Exam Answers")), ) type = models.CharField( max_length=40, choices=EXAM_TYPES, verbose_name=_("exam type"), ) name = models.CharField(max_length=255, verbose_name=_("exam name"), blank=True) uploader = models.ForeignKey( Member, verbose_name=_("uploader"), on_delete=models.SET_NULL, null=True, ) uploader_date = models.DateField(default=timezone.now,) accepted = models.BooleanField(verbose_name=_("accepted"), default=False,) exam_date = models.DateField(verbose_name=_("exam date"),) file = models.FileField( upload_to="education/files/exams/", help_text=_( "Use the 'View on site' button to download the file for inspection." ), ) course = models.ForeignKey( Course, verbose_name=_("course"), on_delete=models.CASCADE, ) language = models.CharField( max_length=2, choices=settings.LANGUAGES, blank=False, null=True ) download_count = models.IntegerField( verbose_name=_("amount of downloads"), default=0, blank=False, ) def __str__(self): return "{} {} ({}, {}, {})".format( self.name.capitalize(), self.type.capitalize(), self.course.name, self.course.course_code, self.exam_date, )
[docs] def get_absolute_url(self): return reverse("education:exam", args=[str(self.pk)])
@property def year(self): return datetime_to_lectureyear(self.exam_date) class Meta: verbose_name = _("exam") verbose_name_plural = _("exams")
[docs]class Summary(models.Model, metaclass=ModelTranslateMeta): """Describes a summary""" name = models.CharField(max_length=255, verbose_name=_("summary name"),) uploader = models.ForeignKey( Member, verbose_name=_("uploader"), on_delete=models.SET_NULL, null=True, ) uploader_date = models.DateField(default=timezone.now,) year = models.IntegerField() author = models.CharField(max_length=64, verbose_name=_("author"),) course = models.ForeignKey( Course, verbose_name=_("course"), on_delete=models.CASCADE, ) accepted = models.BooleanField(verbose_name=_("accepted"), default=False,) file = models.FileField( upload_to="education/files/summary/", help_text=_( "Use the 'View on site' button to download the file for inspection." ), ) language = models.CharField( max_length=2, choices=settings.LANGUAGES, blank=False, null=True ) download_count = models.IntegerField( verbose_name=_("amount of downloads"), default=0, blank=False, ) def __str__(self): return "{} ({}, {}, {})".format( self.name, self.course.name, self.course.course_code, self.year )
[docs] def get_absolute_url(self): return reverse("education:summary", args=[str(self.pk)])
class Meta: verbose_name = _("summary") verbose_name_plural = _("summaries")