Rename ModuleCategoryType to ModuleCategory

This commit is contained in:
Lorenz Padberg 2023-08-21 15:17:52 +02:00
parent 0b1954c570
commit 807c038a34
13 changed files with 80 additions and 81 deletions

View File

@ -9,9 +9,9 @@
<Dropdown <Dropdown
class="module-filter__dropdown" class="module-filter__dropdown"
:selected-item="selectedLernfeld" :selected-item="selectedCategory"
:items="lernfeldOptions" :items="categoryOptions"
@update:selectedItem="newItem => selectedLernfeld = newItem" @update:selectedItem="newItem => selectedCategory = newItem"
></Dropdown> ></Dropdown>
<pill-radio-buttons :selectableItems="languageOptions" <pill-radio-buttons :selectableItems="languageOptions"
:defaultSelectedItem="initialLanguage" :defaultSelectedItem="initialLanguage"
@ -67,7 +67,7 @@
} }
`); `);
const nullCategory = { const nullLevel = {
name: '---', name: '---',
id: null, id: null,
}; };
@ -76,27 +76,27 @@
let selectedLevel = ref(defaultLevel); let selectedLevel = ref(defaultLevel);
const levelOptions = computed(() => { const levelOptions = computed(() => {
return [nullCategory, ...moduleLevelsResult.value?.moduleLevels || []]; return [nullLevel, ...moduleLevelsResult.value?.moduleLevels || []];
}); });
const nullLernfeld = { const nullCategory = {
name: '---', name: '---',
id: null, id: null,
}; };
const selectedLernfeld = ref(nullLernfeld); const selectedCategory = ref(nullCategory);
const {result: moduleCategoryTypesResult} = useQuery(gql` const {result: moduleCategoryResult} = useQuery(gql`
query ModuleCategoryTypesQuery { query ModuleCategoriesQuery {
moduleCategoryTypes { moduleCategories {
name name
id id
} }
} }
`); `);
const lernfeldOptions = computed(() => { const categoryOptions = computed(() => {
return [nullLernfeld, ...moduleCategoryTypesResult.value?.moduleCategoryTypes || []]; return [nullCategory, ...moduleCategoryResult.value?.moduleCategoryTypes || []];
}); });
@ -117,17 +117,17 @@
return props.modules; return props.modules;
} }
// filter by Lehrjahr // filter by Lehrjahr (moduleLevel)
if (selectedLevel.value.name !== '---') { if (selectedLevel.value.name !== '---') {
filteredModules = filteredModules.filter((module) => { filteredModules = filteredModules.filter((module) => {
return module.level?.id == selectedLevel.value.id; return module.level?.id == selectedLevel.value.id;
}); });
} }
//filter by Lernfeld //filter by Lernfeld (Category)
if (selectedLernfeld.value.name !== '---') { if (selectedCategory.value.name !== '---') {
filteredModules = filteredModules.filter((module) => { filteredModules = filteredModules.filter((module) => {
return module.categoryType?.id == selectedLernfeld.value.id; return module.category?.id == selectedCategory.value.id;
}); });
} }
updateLastModuleLevel(selectedLevel.value); updateLastModuleLevel(selectedLevel.value);

View File

@ -19,7 +19,7 @@
</p> </p>
<div class="module-teaser__pills"> <div class="module-teaser__pills">
<pill :text="level?.name"></pill> <pill :text="level?.name"></pill>
<pill :text="categoryType?.name"></pill> <pill :text="category?.name"></pill>
</div> </div>
</div> </div>
</router-link> </router-link>
@ -30,7 +30,7 @@
export default { export default {
components: {Pill}, components: {Pill},
props: ['metaTitle', 'title', 'teaser', 'id', 'slug', 'heroImage', 'level', 'categoryType'], props: ['metaTitle', 'title', 'teaser', 'id', 'slug', 'heroImage', 'level', 'category'],
computed: { computed: {

View File

@ -13,7 +13,7 @@ fragment ModuleParts on ModuleNode {
id id
name name
} }
categoryType { category {
id id
name name
} }

View File

@ -1,4 +1,4 @@
from .models.module import Module, ModuleLevel, ModuleType from .models.module import Module, ModuleLevel, ModuleCategory
def analyze_module_meta_titles(): def analyze_module_meta_titles():
all_nodes = [] all_nodes = []
@ -17,36 +17,36 @@ def analyze_module_meta_titles():
print(f"{i}.: {set(leafs)}") print(f"{i}.: {set(leafs)}")
def create_default_categories(): def create_default_levcels_and_categories():
for lehrjahr in range(1,4): for lehrjahr in range(1,4):
module_category, created = ModuleLevel.objects.get_or_create(name=f"{lehrjahr}. Lehrjahr") module_category, created = ModuleLevel.objects.get_or_create(name=f"{lehrjahr}. Lehrjahr")
for type in range(1, 10): for category in range(1, 10):
ModuleType.objects.get_or_create(name=f"Lernfeld {type}") ModuleCategory.objects.get_or_create(name=f"Lernfeld {category}")
def categorize_modules(): def categorize_modules():
for category in ModuleLevel.objects.all(): for level in ModuleLevel.objects.all():
modules = Module.objects.filter(category__isnull=True, meta_title__icontains=category.name) 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()}") print(f"{category.name}: {modules.count()}")
modules.update(category=category) 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(): def uncategorize_modules():
ModuleType.objects.all().delete() ModuleCategory.objects.all().delete()
ModuleLevel.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(): def delete_unused_categories():
for category in ModuleLevel.objects.all(): for category in ModuleCategory.objects.all():
if not category.module_set.exists(): if not category.module_set.exists():
category.delete() category.delete()
def delete_unused_types():
for type in ModuleType.objects.all():
if not type.module_set.exists():
type.delete()

View File

@ -28,7 +28,7 @@ from books.blocks import (
SurveyBlock, SurveyBlock,
VideoBlock, 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 ( from core.factories import (
BasePageFactory, BasePageFactory,
DummyImageFactory, DummyImageFactory,
@ -209,7 +209,7 @@ class ModuleLevelFactory(factory.DjangoModelFactory):
class ModuleTypeFactory(factory.DjangoModelFactory): class ModuleTypeFactory(factory.DjangoModelFactory):
class Meta: class Meta:
model = ModuleType model = ModuleCategory
name = 'Lernfeld 1' name = 'Lernfeld 1'

View File

@ -1,16 +1,16 @@
from django.core.management import BaseCommand 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 categorize_modules, delete_unused_levels, uncategorize_modules, \
delete_unused_categories
from books.categorize_modules import create_default_categories from books.categorize_modules import create_default_levcels_and_categories
class Command(BaseCommand): class Command(BaseCommand):
def handle(self, *args, **options): def handle(self, *args, **options):
self.stdout.write("Categorizing modules") self.stdout.write("Categorizing modules")
uncategorize_modules() uncategorize_modules()
create_default_categories() create_default_levcels_and_categories()
categorize_modules() categorize_modules()
delete_unused_types() delete_unused_levels()
delete_unused_categories() delete_unused_categories()
self.stdout.write("Finish categorizing modules") self.stdout.write("Finish categorizing modules")

View File

@ -1,11 +1,11 @@
from django.core.management import BaseCommand 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): class Command(BaseCommand):
def handle(self, *args, **options): def handle(self, *args, **options):
self.stdout.write("Create defaut categories") self.stdout.write("Create defaut categories")
create_default_categories() create_default_levcels_and_categories()
self.stdout.write("Finish") self.stdout.write("Finish")

View File

@ -24,7 +24,7 @@ def default_category():
return ModuleLevel.objects.first().pk return ModuleLevel.objects.first().pk
class ModuleType(models.Model): class ModuleCategory(models.Model):
class Meta: class Meta:
verbose_name = _("module type") verbose_name = _("module type")
verbose_name_plural = _("module types") 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'") 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) 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( hero_image = models.ForeignKey(
@ -66,7 +66,7 @@ class Module(StrictHierarchyPage):
FieldPanel("title", classname="full title"), FieldPanel("title", classname="full title"),
FieldPanel("meta_title", classname="full title"), FieldPanel("meta_title", classname="full title"),
FieldPanel("level"), FieldPanel("level"),
FieldPanel("category_type"), FieldPanel("category"),
FieldPanel("hero_image"), FieldPanel("hero_image"),
FieldPanel("hero_source"), FieldPanel("hero_source"),
FieldPanel("teaser"), FieldPanel("teaser"),

View File

@ -6,11 +6,11 @@ from graphene_django.filter import DjangoFilterConnectionField
from assignments.models import StudentSubmission from assignments.models import StudentSubmission
from assignments.schema.types import AssignmentNode, StudentSubmissionNode 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.interfaces.module import ModuleInterface
from books.schema.nodes.chapter import ChapterNode from books.schema.nodes.chapter import ChapterNode
from books.schema.nodes.module_category import ModuleLevelNode from books.schema.nodes.module_level import ModuleLevelNode
from books.schema.nodes.module_category_type import ModuleCategoryTypeNode from books.schema.nodes.module_category import ModuleCategoryNode
from notes.models import ModuleBookmark, ContentBlockBookmark, ChapterBookmark from notes.models import ModuleBookmark, ContentBlockBookmark, ChapterBookmark
from notes.schema import ( from notes.schema import (
ModuleBookmarkNode, ModuleBookmarkNode,
@ -37,7 +37,7 @@ class ModuleNode(DjangoObjectType):
"hero_source", "hero_source",
"topic", "topic",
"level", "level",
"category_type", "category",
] ]
filter_fields = { filter_fields = {
"slug": ["exact", "icontains", "in"], "slug": ["exact", "icontains", "in"],
@ -56,8 +56,8 @@ class ModuleNode(DjangoObjectType):
snapshots = graphene.List("books.schema.nodes.SnapshotNode") snapshots = graphene.List("books.schema.nodes.SnapshotNode")
objective_groups = graphene.List(ObjectiveGroupNode) objective_groups = graphene.List(ObjectiveGroupNode)
assignments = graphene.List(AssignmentNode) assignments = graphene.List(AssignmentNode)
category = graphene.Field(ModuleLevelNode) level = graphene.Field(ModuleLevelNode)
category_type = graphene.Field(ModuleCategoryTypeNode) category = graphene.Field(ModuleCategoryNode)
def resolve_chapters(self, info, **kwargs): def resolve_chapters(self, info, **kwargs):
return Chapter.get_by_parent(self) return Chapter.get_by_parent(self)
@ -110,11 +110,11 @@ class ModuleNode(DjangoObjectType):
def resolve_objective_groups(parent, info, **kwargs): def resolve_objective_groups(parent, info, **kwargs):
return parent.objective_groups.all().prefetch_related("hidden_for") return parent.objective_groups.all().prefetch_related("hidden_for")
def resolve_category(self, info, **kwargs): def resolve_level(self, info, **kwargs):
return ModuleLevel.objects.get(pk=self.category_id) if self.category_id else None return ModuleLevel.objects.get(pk=self.level_id) if self.level_id else None
def resolve_category_type(self, info, **kwargs): def resolve_category(self, info, **kwargs):
return ModuleType.objects.get(pk=self.category_type_id) if self.category_type_id else None return ModuleCategory.objects.get(pk=self.category_id) if self.category_id else None
@staticmethod @staticmethod
def resolve_snapshots(parent, info, **kwargs): def resolve_snapshots(parent, info, **kwargs):

View File

@ -2,12 +2,12 @@ from graphene import relay
from graphene import relay from graphene import relay
from graphene_django import DjangoObjectType from graphene_django import DjangoObjectType
from books.models import ModuleLevel from books.models import ModuleCategory
class ModuleLevelNode(DjangoObjectType): class ModuleCategoryNode(DjangoObjectType):
class Meta: class Meta:
model = ModuleLevel model = ModuleCategory
interfaces = (relay.Node,) interfaces = (relay.Node,)
only_fields = [ only_fields = [
"id", "id",

View File

@ -2,12 +2,12 @@ from graphene import relay
from graphene import relay from graphene import relay
from graphene_django import DjangoObjectType from graphene_django import DjangoObjectType
from books.models import ModuleType from books.models import ModuleLevel
class ModuleCategoryTypeNode(DjangoObjectType): class ModuleLevelNode(DjangoObjectType):
class Meta: class Meta:
model = ModuleType model = ModuleLevel
interfaces = (relay.Node,) interfaces = (relay.Node,)
only_fields = [ only_fields = [
"id", "id",

View File

@ -7,9 +7,9 @@ from core.logger import get_logger
from .connections import TopicConnection, ModuleConnection from .connections import TopicConnection, ModuleConnection
from .nodes import ContentBlockNode, ChapterNode, ModuleNode, NotFoundFailure, SnapshotNode, \ from .nodes import ContentBlockNode, ChapterNode, ModuleNode, NotFoundFailure, SnapshotNode, \
TopicOr404Node TopicOr404Node
from .nodes.module_category import ModuleLevelNode from .nodes.module_level import ModuleLevelNode
from .nodes.module_category_type import ModuleCategoryTypeNode from .nodes.module_category import ModuleCategoryNode
from ..models import Book, Topic, Module, Chapter, Snapshot, ModuleLevel, ModuleType from ..models import Book, Topic, Module, Chapter, Snapshot, ModuleLevel, ModuleCategory
logger = get_logger(__name__) logger = get_logger(__name__)
@ -30,8 +30,8 @@ class BookQuery(object):
module_level = graphene.Field(ModuleLevelNode, id=graphene.ID(required=True)) module_level = graphene.Field(ModuleLevelNode, id=graphene.ID(required=True))
module_levels = graphene.List(ModuleLevelNode) module_levels = graphene.List(ModuleLevelNode)
module_category_type= graphene.Field(ModuleCategoryTypeNode, id=graphene.ID(required=True)) module_category = graphene.Field(ModuleCategoryNode, id=graphene.ID(required=True))
module_category_types = graphene.List(ModuleCategoryTypeNode) module_categories = graphene.List(ModuleCategoryNode)
def resolve_books(self, *args, **kwargs): def resolve_books(self, *args, **kwargs):
return Book.objects.filter(**kwargs).live() return Book.objects.filter(**kwargs).live()
@ -92,18 +92,17 @@ class BookQuery(object):
def resolve_module_levels(self, *args, **kwargs): def resolve_module_levels(self, *args, **kwargs):
return ModuleLevel.objects.filter(**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') id = kwargs.get('id')
try: try:
if id is not None: if id is not None:
module_category_type = get_object(Module, id) return get_object(Module, id)
return module_category_type
except Module.DoesNotExist: except Module.DoesNotExist:
return None return None
def resolve_module_category_types(self, *args, **kwargs): def resolve_module_categories(self, *args, **kwargs):
return ModuleType.objects.filter(**kwargs) return ModuleCategory.objects.filter(**kwargs)

View File

@ -5,15 +5,15 @@ from wagtail.contrib.modeladmin.options import (
) )
from wagtail import hooks 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 _ from django.utils.translation import gettext_lazy as _
class ModuleAdmin(ModelAdmin): class ModuleAdmin(ModelAdmin):
model = Module model = Module
list_display = ("title", "meta_title", "level", "category_type") list_display = ("title", "meta_title", "level", "category")
search_fields = ("title", "meta_title") search_fields = ("title", "meta_title")
list_filter = ("level", "category_type") list_filter = ("level", "category")
class ModuleLevelAdmin(ModelAdmin): class ModuleLevelAdmin(ModelAdmin):
@ -22,8 +22,8 @@ class ModuleLevelAdmin(ModelAdmin):
ordering = ("name",) ordering = ("name",)
class ModuleTypeAdmin(ModelAdmin): class ModuleCategoryAdmin(ModelAdmin):
model = ModuleType model = ModuleCategory
list_display = ("name",) list_display = ("name",)
ordering = ("name",) ordering = ("name",)
inspect_view_fields = ("name",) inspect_view_fields = ("name",)
@ -34,7 +34,7 @@ class InstrumentGroup(ModelAdminGroup):
items = ( items = (
ModuleAdmin, ModuleAdmin,
ModuleLevelAdmin, ModuleLevelAdmin,
ModuleTypeAdmin, ModuleCategoryAdmin,
) )