Add module category to cms
This commit is contained in:
parent
38c9b7623d
commit
f88a85a54f
|
|
@ -1,7 +1,6 @@
|
||||||
from books.models import Module
|
from .models.module import Module, ModuleCategory, ModuleType
|
||||||
import json
|
|
||||||
|
|
||||||
def categorize_modules():
|
def analyze_module_meta_titles():
|
||||||
all_nodes = []
|
all_nodes = []
|
||||||
|
|
||||||
for module in Module.objects.all():
|
for module in Module.objects.all():
|
||||||
|
|
@ -18,3 +17,36 @@ def categorize_modules():
|
||||||
print(f"{i}.: {set(leafs)}")
|
print(f"{i}.: {set(leafs)}")
|
||||||
|
|
||||||
|
|
||||||
|
def create_default_categories():
|
||||||
|
for lehrjahr in range(1,4):
|
||||||
|
module_category, created = ModuleCategory.objects.get_or_create(name=f"{lehrjahr}. Lehrjahr")
|
||||||
|
|
||||||
|
for type in range(1, 10):
|
||||||
|
ModuleType.objects.get_or_create(name=f"Lernfeld {type}", category=module_category)
|
||||||
|
|
||||||
|
|
||||||
|
def categorize_modules():
|
||||||
|
for category in ModuleCategory.objects.all():
|
||||||
|
modules = Module.objects.filter(category__isnull=True, category_type__isnull=True, meta_title__icontains=category.name)
|
||||||
|
print(f"{category.name}: {modules.count()}")
|
||||||
|
modules.update(category=category)
|
||||||
|
|
||||||
|
for type in ModuleType.objects.all():
|
||||||
|
modules = Module.objects.filter(category=type.category, category_type__isnull=True, meta_title__contains=type.name)
|
||||||
|
print(f"{type.category} {type.name}: {modules.count()}")
|
||||||
|
modules.update(category_type=type)
|
||||||
|
|
||||||
|
|
||||||
|
def uncategorize_modules():
|
||||||
|
ModuleCategory.objects.all().delete()
|
||||||
|
ModuleType.objects.all().delete()
|
||||||
|
|
||||||
|
def delete_unused_categories():
|
||||||
|
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()
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,17 @@
|
||||||
from django.core.management import BaseCommand
|
from django.core.management import BaseCommand
|
||||||
from books.categorize_modules import categorize_modules
|
from books.categorize_modules import categorize_modules, delete_unused_categories, delete_unused_types
|
||||||
|
|
||||||
|
from books.categorize_modules import create_default_categories
|
||||||
|
|
||||||
|
|
||||||
class Command(BaseCommand):
|
class Command(BaseCommand):
|
||||||
def handle(self, *args, **options):
|
def handle(self, *args, **options):
|
||||||
self.stdout.write("Migrating Wagtail documents to Custommyskillbox documents")
|
self.stdout.write("Categorizing modules")
|
||||||
|
create_default_categories()
|
||||||
categorize_modules()
|
categorize_modules()
|
||||||
self.stdout.write("Finish migration")
|
delete_unused_types()
|
||||||
|
delete_unused_categories()
|
||||||
|
|
||||||
|
self.stdout.write("Finish categorizing modules")
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
from django.core.management import BaseCommand
|
||||||
|
from books.categorize_modules import categorize_modules, create_default_categories
|
||||||
|
|
||||||
|
|
||||||
|
class Command(BaseCommand):
|
||||||
|
def handle(self, *args, **options):
|
||||||
|
self.stdout.write("Create defaut categories")
|
||||||
|
create_default_categories()
|
||||||
|
self.stdout.write("Finish")
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,12 +1,46 @@
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from wagtail.admin.panels import FieldPanel, InlinePanel, TabbedInterface, ObjectList
|
from wagtail.admin.panels import FieldPanel, InlinePanel, TabbedInterface, ObjectList, MultiFieldPanel, MultipleChooserPanel
|
||||||
from wagtail.fields import RichTextField
|
from wagtail.fields import RichTextField
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
from core.constants import DEFAULT_RICH_TEXT_FEATURES
|
from core.constants import DEFAULT_RICH_TEXT_FEATURES
|
||||||
from core.wagtail_utils import StrictHierarchyPage, get_default_settings
|
from core.wagtail_utils import StrictHierarchyPage, get_default_settings
|
||||||
from users.models import SchoolClass
|
from users.models import SchoolClass
|
||||||
|
from django.utils.text import slugify
|
||||||
|
|
||||||
|
class ModuleCategory(models.Model):
|
||||||
|
name = models.CharField(max_length=255, unique=True)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
verbose_name_plural = _("module categories")
|
||||||
|
verbose_name = _("module category")
|
||||||
|
|
||||||
|
|
||||||
|
def default_category():
|
||||||
|
return ModuleCategory.objects.first().pk
|
||||||
|
|
||||||
|
|
||||||
|
class ModuleType(models.Model):
|
||||||
|
class Meta:
|
||||||
|
verbose_name = _("module type")
|
||||||
|
verbose_name_plural = _("module types")
|
||||||
|
ordering = ("category", "name")
|
||||||
|
|
||||||
|
name = models.CharField(max_length=255)
|
||||||
|
category = models.ForeignKey(
|
||||||
|
ModuleCategory,
|
||||||
|
on_delete=models.PROTECT,
|
||||||
|
null=False,
|
||||||
|
default=default_category,
|
||||||
|
related_name="module_types",
|
||||||
|
)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return f"{self.category} - {self.name}"
|
||||||
|
|
||||||
|
|
||||||
class Module(StrictHierarchyPage):
|
class Module(StrictHierarchyPage):
|
||||||
|
|
@ -15,6 +49,10 @@ class Module(StrictHierarchyPage):
|
||||||
verbose_name_plural = "Module"
|
verbose_name_plural = "Module"
|
||||||
|
|
||||||
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'")
|
||||||
|
category = models.ForeignKey(ModuleCategory, on_delete=models.SET_NULL, null=True)
|
||||||
|
category_type = models.ForeignKey(ModuleType, on_delete=models.SET_NULL, null=True)
|
||||||
|
|
||||||
|
|
||||||
hero_image = models.ForeignKey(
|
hero_image = models.ForeignKey(
|
||||||
"wagtailimages.Image",
|
"wagtailimages.Image",
|
||||||
null=True,
|
null=True,
|
||||||
|
|
@ -31,13 +69,18 @@ class Module(StrictHierarchyPage):
|
||||||
|
|
||||||
solutions_enabled_for = models.ManyToManyField(SchoolClass)
|
solutions_enabled_for = models.ManyToManyField(SchoolClass)
|
||||||
|
|
||||||
|
# TODO: Filter category_type by category
|
||||||
|
|
||||||
content_panels = [
|
content_panels = [
|
||||||
FieldPanel("title", classname="full title"),
|
FieldPanel("title", classname="full title"),
|
||||||
FieldPanel("meta_title", classname="full title"),
|
FieldPanel("meta_title", classname="full title"),
|
||||||
|
FieldPanel("category"),
|
||||||
|
FieldPanel("category_type"),
|
||||||
FieldPanel("hero_image"),
|
FieldPanel("hero_image"),
|
||||||
FieldPanel("hero_source"),
|
FieldPanel("hero_source"),
|
||||||
FieldPanel("teaser"),
|
FieldPanel("teaser"),
|
||||||
FieldPanel("intro"),
|
FieldPanel("intro"),
|
||||||
|
# TODO: Why is this commented out?
|
||||||
# InlinePanel(
|
# InlinePanel(
|
||||||
# "assignments",
|
# "assignments",
|
||||||
# label=_("Assignment"),
|
# label=_("Assignment"),
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,49 @@
|
||||||
|
from wagtail.contrib.modeladmin.options import (
|
||||||
|
ModelAdmin,
|
||||||
|
ModelAdminGroup,
|
||||||
|
modeladmin_register,
|
||||||
|
)
|
||||||
|
from wagtail import hooks
|
||||||
|
|
||||||
|
from .models.module import ModuleCategory, ModuleType, Module
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
|
class ModuleAdmin(ModelAdmin):
|
||||||
|
model = Module
|
||||||
|
list_display = ("title", "meta_title", "category", "category_type")
|
||||||
|
search_fields = ("title", "meta_title")
|
||||||
|
list_filter = ("category","category_type")
|
||||||
|
|
||||||
|
|
||||||
|
class ModuleCategoryAdmin(ModelAdmin):
|
||||||
|
model = ModuleCategory
|
||||||
|
list_display = ("name",)
|
||||||
|
ordering = ("name",)
|
||||||
|
|
||||||
|
|
||||||
|
class ModuleTypeAdmin(ModelAdmin):
|
||||||
|
model = ModuleType
|
||||||
|
list_display = (
|
||||||
|
"name",
|
||||||
|
"category",
|
||||||
|
)
|
||||||
|
list_filter = ("category",)
|
||||||
|
ordering = ("category", "name")
|
||||||
|
inspect_view_enabled = True
|
||||||
|
inspect_view_fields = (
|
||||||
|
"name",
|
||||||
|
"category",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class InstrumentGroup(ModelAdminGroup):
|
||||||
|
menu_label = _("Modules")
|
||||||
|
items = (
|
||||||
|
ModuleAdmin,
|
||||||
|
ModuleCategoryAdmin,
|
||||||
|
ModuleTypeAdmin,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
modeladmin_register(InstrumentGroup)
|
||||||
|
|
||||||
Loading…
Reference in New Issue