119 lines
3.9 KiB
Python
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
|