diff --git a/client/src/components/modules/ModuleFilter.vue b/client/src/components/modules/ModuleFilter.vue index 731b143a..e1ff9bae 100644 --- a/client/src/components/modules/ModuleFilter.vue +++ b/client/src/components/modules/ModuleFilter.vue @@ -9,9 +9,9 @@ { - return [nullCategory, ...moduleLevelsResult.value?.moduleLevels || []]; + return [nullLevel, ...moduleLevelsResult.value?.moduleLevels || []]; }); - const nullLernfeld = { + const nullCategory = { name: '---', id: null, }; - const selectedLernfeld = ref(nullLernfeld); + const selectedCategory = ref(nullCategory); - const {result: moduleCategoryTypesResult} = useQuery(gql` - query ModuleCategoryTypesQuery { - moduleCategoryTypes { + const {result: moduleCategoryResult} = useQuery(gql` + query ModuleCategoriesQuery { + moduleCategories { name id } } `); - const lernfeldOptions = computed(() => { - return [nullLernfeld, ...moduleCategoryTypesResult.value?.moduleCategoryTypes || []]; + const categoryOptions = computed(() => { + return [nullCategory, ...moduleCategoryResult.value?.moduleCategoryTypes || []]; }); @@ -117,17 +117,17 @@ return props.modules; } - // filter by Lehrjahr + // filter by Lehrjahr (moduleLevel) if (selectedLevel.value.name !== '---') { filteredModules = filteredModules.filter((module) => { return module.level?.id == selectedLevel.value.id; }); } - //filter by Lernfeld - if (selectedLernfeld.value.name !== '---') { + //filter by Lernfeld (Category) + if (selectedCategory.value.name !== '---') { filteredModules = filteredModules.filter((module) => { - return module.categoryType?.id == selectedLernfeld.value.id; + return module.category?.id == selectedCategory.value.id; }); } updateLastModuleLevel(selectedLevel.value); diff --git a/client/src/components/modules/ModuleTeaser.vue b/client/src/components/modules/ModuleTeaser.vue index 57a459a2..0ab7ff56 100644 --- a/client/src/components/modules/ModuleTeaser.vue +++ b/client/src/components/modules/ModuleTeaser.vue @@ -19,7 +19,7 @@

- +
@@ -30,7 +30,7 @@ export default { components: {Pill}, - props: ['metaTitle', 'title', 'teaser', 'id', 'slug', 'heroImage', 'level', 'categoryType'], + props: ['metaTitle', 'title', 'teaser', 'id', 'slug', 'heroImage', 'level', 'category'], computed: { diff --git a/client/src/graphql/gql/fragments/moduleParts.gql b/client/src/graphql/gql/fragments/moduleParts.gql index 9a03d012..9b42877f 100644 --- a/client/src/graphql/gql/fragments/moduleParts.gql +++ b/client/src/graphql/gql/fragments/moduleParts.gql @@ -13,7 +13,7 @@ fragment ModuleParts on ModuleNode { id name } - categoryType { + category { id name } diff --git a/server/books/categorize_modules.py b/server/books/categorize_modules.py index 4cd8f329..527b20a5 100644 --- a/server/books/categorize_modules.py +++ b/server/books/categorize_modules.py @@ -1,4 +1,4 @@ -from .models.module import Module, ModuleLevel, ModuleType +from .models.module import Module, ModuleLevel, ModuleCategory def analyze_module_meta_titles(): all_nodes = [] @@ -17,36 +17,36 @@ def analyze_module_meta_titles(): print(f"{i}.: {set(leafs)}") -def create_default_categories(): +def create_default_levcels_and_categories(): for lehrjahr in range(1,4): module_category, created = ModuleLevel.objects.get_or_create(name=f"{lehrjahr}. Lehrjahr") - for type in range(1, 10): - ModuleType.objects.get_or_create(name=f"Lernfeld {type}") + for category in range(1, 10): + ModuleCategory.objects.get_or_create(name=f"Lernfeld {category}") def categorize_modules(): - for category in ModuleLevel.objects.all(): - modules = Module.objects.filter(category__isnull=True, meta_title__icontains=category.name) + for level in ModuleLevel.objects.all(): + modules = Module.objects.filter(level__isnull=True, meta_title__icontains=level.name) + print(f"{level.name}: {modules.count()}") + modules.update(level=level) + + for category in ModuleCategory.objects.all(): + modules = Module.objects.filter(category__isnull=True, meta_title__contains=type.name) print(f"{category.name}: {modules.count()}") modules.update(category=category) - for type in ModuleType.objects.all(): - modules = Module.objects.filter(category_type__isnull=True, meta_title__contains=type.name) - print(f"{type.name}: {modules.count()}") - modules.update(category_type=type) - def uncategorize_modules(): - ModuleType.objects.all().delete() + ModuleCategory.objects.all().delete() ModuleLevel.objects.all().delete() +def delete_unused_levels(): + for level in ModuleLevel.objects.all(): + if not level.module_set.exists(): + level.delete() + def delete_unused_categories(): - for category in ModuleLevel.objects.all(): + for category in ModuleCategory.objects.all(): if not category.module_set.exists(): category.delete() - -def delete_unused_types(): - for type in ModuleType.objects.all(): - if not type.module_set.exists(): - type.delete() diff --git a/server/books/factories.py b/server/books/factories.py index 5b89ffe7..a1d1cf84 100644 --- a/server/books/factories.py +++ b/server/books/factories.py @@ -28,7 +28,7 @@ from books.blocks import ( SurveyBlock, VideoBlock, ) -from books.models import Book, Chapter, ContentBlock, Module, TextBlock, Topic, ModuleLevel, ModuleType +from books.models import Book, Chapter, ContentBlock, Module, TextBlock, Topic, ModuleLevel, ModuleCategory from core.factories import ( BasePageFactory, DummyImageFactory, @@ -209,7 +209,7 @@ class ModuleLevelFactory(factory.DjangoModelFactory): class ModuleTypeFactory(factory.DjangoModelFactory): class Meta: - model = ModuleType + model = ModuleCategory name = 'Lernfeld 1' diff --git a/server/books/management/commands/categorize_modules.py b/server/books/management/commands/categorize_modules.py index 96a4711e..0e7d7ef0 100644 --- a/server/books/management/commands/categorize_modules.py +++ b/server/books/management/commands/categorize_modules.py @@ -1,16 +1,16 @@ from django.core.management import BaseCommand -from books.categorize_modules import categorize_modules, delete_unused_categories, delete_unused_types, uncategorize_modules - -from books.categorize_modules import create_default_categories +from books.categorize_modules import categorize_modules, delete_unused_levels, uncategorize_modules, \ + delete_unused_categories +from books.categorize_modules import create_default_levcels_and_categories class Command(BaseCommand): def handle(self, *args, **options): self.stdout.write("Categorizing modules") uncategorize_modules() - create_default_categories() + create_default_levcels_and_categories() categorize_modules() - delete_unused_types() + delete_unused_levels() delete_unused_categories() self.stdout.write("Finish categorizing modules") diff --git a/server/books/management/commands/create_default_model_categories.py b/server/books/management/commands/create_default_model_categories.py index 1b378ce3..7c053814 100644 --- a/server/books/management/commands/create_default_model_categories.py +++ b/server/books/management/commands/create_default_model_categories.py @@ -1,11 +1,11 @@ from django.core.management import BaseCommand -from books.categorize_modules import categorize_modules, create_default_categories +from books.categorize_modules import categorize_modules, create_default_levcels_and_categories class Command(BaseCommand): def handle(self, *args, **options): self.stdout.write("Create defaut categories") - create_default_categories() + create_default_levcels_and_categories() self.stdout.write("Finish") diff --git a/server/books/models/module.py b/server/books/models/module.py index e236bfee..d732df28 100644 --- a/server/books/models/module.py +++ b/server/books/models/module.py @@ -24,7 +24,7 @@ def default_category(): return ModuleLevel.objects.first().pk -class ModuleType(models.Model): +class ModuleCategory(models.Model): class Meta: verbose_name = _("module type") verbose_name_plural = _("module types") @@ -43,7 +43,7 @@ class Module(StrictHierarchyPage): meta_title = models.CharField(max_length=255, help_text="e.g. 'Intro' or 'Modul 1'") level = models.ForeignKey(ModuleLevel, on_delete=models.SET_NULL, blank=True, null=True) - category_type = models.ForeignKey(ModuleType, on_delete=models.SET_NULL, blank=True, null=True) + category = models.ForeignKey(ModuleCategory, on_delete=models.SET_NULL, blank=True, null=True) hero_image = models.ForeignKey( @@ -66,7 +66,7 @@ class Module(StrictHierarchyPage): FieldPanel("title", classname="full title"), FieldPanel("meta_title", classname="full title"), FieldPanel("level"), - FieldPanel("category_type"), + FieldPanel("category"), FieldPanel("hero_image"), FieldPanel("hero_source"), FieldPanel("teaser"), diff --git a/server/books/schema/nodes/module.py b/server/books/schema/nodes/module.py index dbbd2fbd..b38b4480 100644 --- a/server/books/schema/nodes/module.py +++ b/server/books/schema/nodes/module.py @@ -6,11 +6,11 @@ from graphene_django.filter import DjangoFilterConnectionField from assignments.models import StudentSubmission from assignments.schema.types import AssignmentNode, StudentSubmissionNode -from books.models import Module, Chapter, ContentBlock, RecentModule, ModuleLevel, ModuleType +from books.models import Module, Chapter, ContentBlock, RecentModule, ModuleLevel, ModuleCategory from books.schema.interfaces.module import ModuleInterface from books.schema.nodes.chapter import ChapterNode -from books.schema.nodes.module_category import ModuleLevelNode -from books.schema.nodes.module_category_type import ModuleCategoryTypeNode +from books.schema.nodes.module_level import ModuleLevelNode +from books.schema.nodes.module_category import ModuleCategoryNode from notes.models import ModuleBookmark, ContentBlockBookmark, ChapterBookmark from notes.schema import ( ModuleBookmarkNode, @@ -37,7 +37,7 @@ class ModuleNode(DjangoObjectType): "hero_source", "topic", "level", - "category_type", + "category", ] filter_fields = { "slug": ["exact", "icontains", "in"], @@ -56,8 +56,8 @@ class ModuleNode(DjangoObjectType): snapshots = graphene.List("books.schema.nodes.SnapshotNode") objective_groups = graphene.List(ObjectiveGroupNode) assignments = graphene.List(AssignmentNode) - category = graphene.Field(ModuleLevelNode) - category_type = graphene.Field(ModuleCategoryTypeNode) + level = graphene.Field(ModuleLevelNode) + category = graphene.Field(ModuleCategoryNode) def resolve_chapters(self, info, **kwargs): return Chapter.get_by_parent(self) @@ -110,11 +110,11 @@ class ModuleNode(DjangoObjectType): def resolve_objective_groups(parent, info, **kwargs): return parent.objective_groups.all().prefetch_related("hidden_for") - def resolve_category(self, info, **kwargs): - return ModuleLevel.objects.get(pk=self.category_id) if self.category_id else None + def resolve_level(self, info, **kwargs): + return ModuleLevel.objects.get(pk=self.level_id) if self.level_id else None - def resolve_category_type(self, info, **kwargs): - return ModuleType.objects.get(pk=self.category_type_id) if self.category_type_id else None + def resolve_category(self, info, **kwargs): + return ModuleCategory.objects.get(pk=self.category_id) if self.category_id else None @staticmethod def resolve_snapshots(parent, info, **kwargs): diff --git a/server/books/schema/nodes/module_category.py b/server/books/schema/nodes/module_category.py index 165d8e83..add10b08 100644 --- a/server/books/schema/nodes/module_category.py +++ b/server/books/schema/nodes/module_category.py @@ -2,12 +2,12 @@ from graphene import relay from graphene import relay from graphene_django import DjangoObjectType -from books.models import ModuleLevel +from books.models import ModuleCategory -class ModuleLevelNode(DjangoObjectType): +class ModuleCategoryNode(DjangoObjectType): class Meta: - model = ModuleLevel + model = ModuleCategory interfaces = (relay.Node,) only_fields = [ "id", diff --git a/server/books/schema/nodes/module_category_type.py b/server/books/schema/nodes/module_level.py similarity index 66% rename from server/books/schema/nodes/module_category_type.py rename to server/books/schema/nodes/module_level.py index 59159a0e..165d8e83 100644 --- a/server/books/schema/nodes/module_category_type.py +++ b/server/books/schema/nodes/module_level.py @@ -2,12 +2,12 @@ from graphene import relay from graphene import relay from graphene_django import DjangoObjectType -from books.models import ModuleType +from books.models import ModuleLevel -class ModuleCategoryTypeNode(DjangoObjectType): +class ModuleLevelNode(DjangoObjectType): class Meta: - model = ModuleType + model = ModuleLevel interfaces = (relay.Node,) only_fields = [ "id", diff --git a/server/books/schema/queries.py b/server/books/schema/queries.py index 7793140b..1de8e190 100644 --- a/server/books/schema/queries.py +++ b/server/books/schema/queries.py @@ -7,9 +7,9 @@ from core.logger import get_logger from .connections import TopicConnection, ModuleConnection from .nodes import ContentBlockNode, ChapterNode, ModuleNode, NotFoundFailure, SnapshotNode, \ TopicOr404Node -from .nodes.module_category import ModuleLevelNode -from .nodes.module_category_type import ModuleCategoryTypeNode -from ..models import Book, Topic, Module, Chapter, Snapshot, ModuleLevel, ModuleType +from .nodes.module_level import ModuleLevelNode +from .nodes.module_category import ModuleCategoryNode +from ..models import Book, Topic, Module, Chapter, Snapshot, ModuleLevel, ModuleCategory logger = get_logger(__name__) @@ -30,8 +30,8 @@ class BookQuery(object): module_level = graphene.Field(ModuleLevelNode, id=graphene.ID(required=True)) module_levels = graphene.List(ModuleLevelNode) - module_category_type= graphene.Field(ModuleCategoryTypeNode, id=graphene.ID(required=True)) - module_category_types = graphene.List(ModuleCategoryTypeNode) + module_category = graphene.Field(ModuleCategoryNode, id=graphene.ID(required=True)) + module_categories = graphene.List(ModuleCategoryNode) def resolve_books(self, *args, **kwargs): return Book.objects.filter(**kwargs).live() @@ -92,18 +92,17 @@ class BookQuery(object): def resolve_module_levels(self, *args, **kwargs): return ModuleLevel.objects.filter(**kwargs) - def resolve_module_category_type(self, info, **kwargs): + def resolve_module_category(self, info, **kwargs): id = kwargs.get('id') try: if id is not None: - module_category_type = get_object(Module, id) - return module_category_type + return get_object(Module, id) except Module.DoesNotExist: return None - def resolve_module_category_types(self, *args, **kwargs): - return ModuleType.objects.filter(**kwargs) + def resolve_module_categories(self, *args, **kwargs): + return ModuleCategory.objects.filter(**kwargs) diff --git a/server/books/wagtail_hooks.py b/server/books/wagtail_hooks.py index 570e006c..00630ef5 100644 --- a/server/books/wagtail_hooks.py +++ b/server/books/wagtail_hooks.py @@ -5,15 +5,15 @@ from wagtail.contrib.modeladmin.options import ( ) from wagtail import hooks -from .models.module import ModuleLevel, ModuleType, Module +from .models.module import ModuleLevel, ModuleCategory, Module from django.utils.translation import gettext_lazy as _ class ModuleAdmin(ModelAdmin): model = Module - list_display = ("title", "meta_title", "level", "category_type") + list_display = ("title", "meta_title", "level", "category") search_fields = ("title", "meta_title") - list_filter = ("level", "category_type") + list_filter = ("level", "category") class ModuleLevelAdmin(ModelAdmin): @@ -22,8 +22,8 @@ class ModuleLevelAdmin(ModelAdmin): ordering = ("name",) -class ModuleTypeAdmin(ModelAdmin): - model = ModuleType +class ModuleCategoryAdmin(ModelAdmin): + model = ModuleCategory list_display = ("name",) ordering = ("name",) inspect_view_fields = ("name",) @@ -34,7 +34,7 @@ class InstrumentGroup(ModelAdminGroup): items = ( ModuleAdmin, ModuleLevelAdmin, - ModuleTypeAdmin, + ModuleCategoryAdmin, )