skillbox/server/objectives/models.py

119 lines
3.9 KiB
Python

from books.models import Module
from core.utils import sync_hidden_for, sync_visible_for
from django.contrib.auth import get_user_model
from django.db import models
from users.models import SchoolClass
class ObjectiveGroup(models.Model):
class Meta:
verbose_name = "Lernzielgruppe"
verbose_name_plural = "Lernzielgruppen"
ordering = ["pk"]
LANGUAGE_COMMUNICATION = "language_communication"
SOCIETY = "society"
INTERDISCIPLINARY = "interdisciplinary"
TITLE_CHOICES = (
(LANGUAGE_COMMUNICATION, "Sprache & Kommunikation"),
(SOCIETY, "Gesellschaft"),
(INTERDISCIPLINARY, "Überfachliche Lernziele"),
)
title = models.CharField(
"title",
blank=True,
null=False,
max_length=255,
choices=TITLE_CHOICES,
default=LANGUAGE_COMMUNICATION,
)
module = models.ForeignKey(
Module,
blank=False,
null=False,
on_delete=models.CASCADE,
related_name="objective_groups",
)
hidden_for = models.ManyToManyField(
SchoolClass, related_name="hidden_objective_groups", blank=True
)
def __str__(self):
return "{} - {}".format(self.module, self.title)
def sync_visibility(self, school_class_template, school_class_to_sync):
# if self.hidden_for.filter(id=school_class_template.id).exists() and not self.hidden_for.filter(id=school_class_to_sync.id).exists():
# self.hidden_for.add(school_class_to_sync)
#
# if self.hidden_for.filter(id=school_class_to_sync.id).exists() and not self.hidden_for.filter(id=school_class_template.id).exists():
# self.hidden_for.remove(school_class_to_sync)
sync_hidden_for(self, school_class_template, school_class_to_sync)
for objective in self.objectives.all():
objective.sync_visibility(school_class_template, school_class_to_sync)
class Objective(models.Model):
class Meta:
verbose_name = "Lernziel"
verbose_name_plural = "Lernziele"
# todo: reinstate ordering in resolver
# ordering = [F('owner').asc(nulls_first=True), F('order').asc(nulls_last=True)]
text = models.CharField("text", blank=True, null=False, max_length=255)
group = models.ForeignKey(
ObjectiveGroup,
blank=False,
null=False,
on_delete=models.CASCADE,
related_name="objectives",
)
owner = models.ForeignKey(
get_user_model(), blank=True, null=True, on_delete=models.PROTECT
)
hidden_for = models.ManyToManyField(
SchoolClass, related_name="hidden_objectives", blank=True
)
visible_for = models.ManyToManyField(
SchoolClass, related_name="visible_objectives", blank=True
)
order = models.IntegerField(null=True, blank=True)
def __str__(self):
return "Objective {}-{}".format(self.id, self.text)
def sync_visibility(self, school_class_template, school_class_to_sync):
sync_hidden_for(self, school_class_template, school_class_to_sync)
sync_visible_for(self, school_class_template, school_class_to_sync)
def is_hidden_for_class(self, school_class):
return (
self.owner is None and self.hidden_for.filter(id=school_class.id).exists()
) or (
self.owner is not None
and not self.visible_for.filter(id=school_class.id).exists()
)
class ObjectiveSnapshot(Objective):
hidden = models.BooleanField(default=False)
snapshot = models.ForeignKey(
"books.Snapshot",
on_delete=models.SET_NULL,
null=True,
related_name="custom_objectives",
)
def to_regular_objective(self, owner, school_class):
objective = Objective.objects.create(
owner=owner, text=self.text, group=self.group, order=self.order
)
objective.visible_for.add(school_class)
objective.save()
return objective