From e4b58b286d46dda5fe2623b99b3de3674edeb72b Mon Sep 17 00:00:00 2001 From: Ramon Wenger Date: Thu, 23 May 2024 12:20:34 +0200 Subject: [PATCH] Add ordering meta info to some models Otherwise graphene complains when using those in Connections --- server/basicknowledge/models.py | 12 ++--- server/books/models/chapter.py | 15 ++++-- server/books/models/module.py | 1 + server/notes/models.py | 4 ++ server/objectives/models.py | 94 ++++++++++++++++++++------------- server/rooms/models.py | 13 +++-- 6 files changed, 85 insertions(+), 54 deletions(-) diff --git a/server/basicknowledge/models.py b/server/basicknowledge/models.py index 020477f6..b3b52714 100644 --- a/server/basicknowledge/models.py +++ b/server/basicknowledge/models.py @@ -1,9 +1,3 @@ -from django.db import models -from django.utils.text import slugify -from wagtail.admin.panels import FieldPanel, TitleFieldPanel -from wagtail.fields import RichTextField, StreamField -from wagtail.images.blocks import ImageChooserBlock - from books.blocks import ( CMSDocumentBlock, DocumentBlock, @@ -18,7 +12,12 @@ from books.blocks import ( ) from core.constants import DEFAULT_RICH_TEXT_FEATURES from core.wagtail_utils import StrictHierarchyPage +from django.db import models +from django.utils.text import slugify from django.utils.translation import gettext_lazy as _ +from wagtail.admin.panels import FieldPanel, TitleFieldPanel +from wagtail.fields import RichTextField, StreamField +from wagtail.images.blocks import ImageChooserBlock LANGUAGE_COMMUNICATION = "language_communication" SOCIETY = "society" @@ -77,6 +76,7 @@ class BasicKnowledge(StrictHierarchyPage): class Meta: verbose_name = _("instrument") verbose_name_plural = _("instruments") + ordering = ["path"] parent_page_types = ["books.book"] diff --git a/server/books/models/chapter.py b/server/books/models/chapter.py index c13cc4e9..46e7b363 100644 --- a/server/books/models/chapter.py +++ b/server/books/models/chapter.py @@ -1,11 +1,15 @@ import logging -from django.db import models -from wagtail.admin.panels import FieldPanel, TabbedInterface, ObjectList, TitleFieldPanel - -from core.wagtail_utils import StrictHierarchyPage, get_default_settings -from users.models import SchoolClass from core.mixins import GraphqlNodeMixin +from core.wagtail_utils import StrictHierarchyPage, get_default_settings +from django.db import models +from users.models import SchoolClass +from wagtail.admin.panels import ( + FieldPanel, + ObjectList, + TabbedInterface, + TitleFieldPanel, +) logger = logging.getLogger(__name__) @@ -14,6 +18,7 @@ class Chapter(StrictHierarchyPage, GraphqlNodeMixin): class Meta: verbose_name = "Kapitel" verbose_name_plural = "Kapitel" + ordering = ["path"] description = models.TextField(blank=True) diff --git a/server/books/models/module.py b/server/books/models/module.py index 9b43a953..8387a912 100644 --- a/server/books/models/module.py +++ b/server/books/models/module.py @@ -76,6 +76,7 @@ class Module(StrictHierarchyPage): class Meta: verbose_name = "Modul" verbose_name_plural = "Module" + ordering = ["path"] meta_title = models.CharField(max_length=255, help_text="e.g. 'Intro' or 'Modul 1'") level = models.ForeignKey( diff --git a/server/notes/models.py b/server/notes/models.py index 3cdeeb6f..f921f9e8 100644 --- a/server/notes/models.py +++ b/server/notes/models.py @@ -28,6 +28,7 @@ class ContentBlockBookmark(Bookmark): name="unique_content_bookmark_per_user", ) ] + ordering = ["pk"] class ModuleBookmark(Bookmark): @@ -35,6 +36,9 @@ class ModuleBookmark(Bookmark): class ChapterBookmark(Bookmark): + class Meta: + ordering = ["pk"] + chapter = models.ForeignKey("books.Chapter", on_delete=models.CASCADE) diff --git a/server/objectives/models.py b/server/objectives/models.py index 49d4b893..3f936760 100644 --- a/server/objectives/models.py +++ b/server/objectives/models.py @@ -1,35 +1,48 @@ +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 books.models import Module -from core.utils import sync_visible_for, sync_hidden_for from users.models import SchoolClass class ObjectiveGroup(models.Model): class Meta: - verbose_name = 'Lernzielgruppe' - verbose_name_plural = 'Lernzielgruppen' + verbose_name = "Lernzielgruppe" + verbose_name_plural = "Lernzielgruppen" + ordering = ["pk"] - LANGUAGE_COMMUNICATION = 'language_communication' - SOCIETY = 'society' - INTERDISCIPLINARY = 'interdisciplinary' + LANGUAGE_COMMUNICATION = "language_communication" + SOCIETY = "society" + INTERDISCIPLINARY = "interdisciplinary" TITLE_CHOICES = ( - (LANGUAGE_COMMUNICATION, 'Sprache & Kommunikation'), - (SOCIETY, 'Gesellschaft'), - (INTERDISCIPLINARY, 'Überfachliche Lernziele'), + (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') + 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) + hidden_for = models.ManyToManyField( + SchoolClass, related_name="hidden_objective_groups", blank=True + ) def __str__(self): - return '{} - {}'.format(self.module, self.title) + 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(): @@ -45,21 +58,32 @@ class ObjectiveGroup(models.Model): class Objective(models.Model): class Meta: - verbose_name = 'Lernziel' - verbose_name_plural = 'Lernziele' + 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) + 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) + 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) @@ -67,27 +91,25 @@ class Objective(models.Model): 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() - ) + 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', + "books.Snapshot", on_delete=models.SET_NULL, null=True, - related_name='custom_objectives' + 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 + owner=owner, text=self.text, group=self.group, order=self.order ) objective.visible_for.add(school_class) diff --git a/server/rooms/models.py b/server/rooms/models.py index 4f1ab6ad..517c01ac 100644 --- a/server/rooms/models.py +++ b/server/rooms/models.py @@ -1,8 +1,3 @@ -from django.contrib.auth import get_user_model -from django.db import models -from django_extensions.db.models import TitleSlugDescriptionModel -from wagtail.fields import StreamField - from books.blocks import ( DocumentBlock, ImageUrlBlock, @@ -12,7 +7,11 @@ from books.blocks import ( ) from books.models import TextBlock from core.mixins import GraphqlNodeMixin +from django.contrib.auth import get_user_model +from django.db import models +from django_extensions.db.models import TitleSlugDescriptionModel from users.models import SchoolClass +from wagtail.fields import StreamField class Room(TitleSlugDescriptionModel, GraphqlNodeMixin): @@ -39,6 +38,7 @@ class RoomEntry(TitleSlugDescriptionModel): class Meta: verbose_name = "Raumeintrag" verbose_name_plural = "Raumeinträge" + ordering = ["pk"] room = models.ForeignKey( Room, @@ -47,8 +47,7 @@ class RoomEntry(TitleSlugDescriptionModel): on_delete=models.CASCADE, related_name="room_entries", ) - author = models.ForeignKey( - get_user_model(), null=True, on_delete=models.CASCADE) + author = models.ForeignKey(get_user_model(), null=True, on_delete=models.CASCADE) contents = StreamField( [