diff --git a/aleksis/apps/untis/forms.py b/aleksis/apps/untis/forms.py index fee160cf7165d1d8102c77cf11af3090757d37e5..81fc0a57ac0329a84b5bd8967fe5864b0ac16637 100644 --- a/aleksis/apps/untis/forms.py +++ b/aleksis/apps/untis/forms.py @@ -5,11 +5,36 @@ from constance import config from material import Fieldset from aleksis.core.forms import EditGroupForm +from aleksis.core.models import Group class UntisUploadForm(forms.Form): untis_xml = forms.FileField(label=_("Untis XML export")) +class GroupSubjectForm(forms.ModelForm): + child_groups = forms.ModelMultipleChoiceField(queryset=Group.objects.all()) + + class Meta: + model = Group + fields = [ + "name", + "short_name", + "untis_subject", + ] + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.fields["name"].widget = forms.HiddenInput() + self.fields["short_name"].widget = forms.HiddenInput() + + +GroupSubjectFormset = forms.modelformset_factory( + Group, form=GroupSubjectForm, max_num=0, extra=0 +) + + + + if config.UNTIS_IMPORT_MYSQL_USE_COURSE_GROUPS: EditGroupForm.add_node_to_layout(Fieldset(_("UNTIS import"), "untis_subject")) diff --git a/aleksis/apps/untis/menus.py b/aleksis/apps/untis/menus.py index 7e4cbd69476ea51e978df1f488957871b383dd95..e4a817190119561c9c47508261ac2acf53f53ccd 100644 --- a/aleksis/apps/untis/menus.py +++ b/aleksis/apps/untis/menus.py @@ -10,6 +10,15 @@ MENUS = { "menu_generator.validators.is_superuser", "aleksis.core.util.core_helpers.has_person", ], - } + }, + { + "name": _("Link subjects to groups (for UNTIS MySQL import)"), + "url": "untis_groups_subjects", + "validators": [ + "menu_generator.validators.is_authenticated", + "menu_generator.validators.is_superuser", + "aleksis.core.util.core_helpers.has_person", + ], + }, ] } diff --git a/aleksis/apps/untis/templates/untis/groups_subjects.html b/aleksis/apps/untis/templates/untis/groups_subjects.html new file mode 100644 index 0000000000000000000000000000000000000000..7f58b1ac4ae69050e8bf9c89283404aff0946293 --- /dev/null +++ b/aleksis/apps/untis/templates/untis/groups_subjects.html @@ -0,0 +1,69 @@ +{# -*- engine:django -*- #} + +{% extends "core/base.html" %} + +{% load i18n %} + +{% block browser_title %}{% blocktrans %}Assign subjects to groups{% endblocktrans %}{% endblock %} +{% block page_title %} + {% blocktrans %}Assign subjects to groups{% endblocktrans %} +{% endblock %} + + +{% block content %} + <div class="alert info"> + <p> + <i class="material-icons left">info</i> + {% blocktrans %} + You can use this form to assign subjects to groups. Please enter the exact names of the subjects as they are + saved in UNTIS (case-insensitive). These values are only used to match course groups while importing from MySQL. + {% endblocktrans %} + </p> + </div> + + <div class="alert warning"> + <p> + <i class="material-icons left">warning</i> + {% blocktrans %} + If there are more than 100 groups, this table will have multiple pages. That means that you must save your + changes on every page. <strong>Please don't change the page before you saved your changes!</strong> + {% endblocktrans %} + </p> + </div> + + <form method="post"> + {% csrf_token %} + {{ formset.management_form }} + + {% include "core/save_button.html" %} + + {% include "components/pagination.html" %} + + <table> + <tr> + <th>{% blocktrans %}Group{% endblocktrans %}</th> + <th>{% blocktrans %}Subject{% endblocktrans %}</th> + </tr> + {% for form in formset %} + {{ form.id }} + <tr> + <td> + {{ form.name }} {{ form.short_name }} + {{ form.name.value }} {% if form.short_name.value %}({{ form.short_name.value }}){% endif %} + </td> + <td>{{ form.untis_subject }}</td> + </tr> + {% endfor %} + </table> + + {% include "components/pagination.html" %} + + {% include "core/save_button.html" %} + + <div class="fixed-action-btn"> + <button class="btn-floating btn-large green" type="submit"> + <i class="large material-icons">save</i> + </button> + </div> + </form> +{% endblock %} diff --git a/aleksis/apps/untis/urls.py b/aleksis/apps/untis/urls.py index 1a5119ea3c6195ab915588b2e3fd684891294b0b..db389b6ac1056d854064d4d517c5668b8dd8417f 100644 --- a/aleksis/apps/untis/urls.py +++ b/aleksis/apps/untis/urls.py @@ -4,4 +4,5 @@ from . import views urlpatterns = [ path("import/xml/", views.xml_import, name="untis_xml_import"), + path("groups_subjects", views.groups_subjects, name="untis_groups_subjects"), ] diff --git a/aleksis/apps/untis/views.py b/aleksis/apps/untis/views.py index 2221a3b02156b5bf6dddee0c58a246d82ea6aff5..d1d86e4e45bedeb7bda92bc078f3a5ed8bc7cc62 100644 --- a/aleksis/apps/untis/views.py +++ b/aleksis/apps/untis/views.py @@ -1,10 +1,14 @@ +from django.contrib import messages from django.contrib.auth.decorators import login_required +from django.core.paginator import Paginator from django.http import HttpRequest, HttpResponse from django.shortcuts import render +from django.utils.translation import gettext as _ from aleksis.core.decorators import admin_required +from aleksis.core.models import Group -from .forms import UntisUploadForm +from .forms import UntisUploadForm, GroupSubjectFormset from .util.xml.xml import untis_import_xml @@ -24,3 +28,37 @@ def xml_import(request: HttpRequest) -> HttpResponse: context["upload_form"] = upload_form return render(request, "untis/xml_import.html", context) + + +# FIXME: Rule must check if setting is enabled +@admin_required +def groups_subjects(request: HttpRequest) -> HttpResponse: + """ Assign subjects to groups (for matching by MySQL importer) """ + context = {} + + groups_qs = Group.objects.all() + + # Paginate + paginator = Paginator(groups_qs, 100) + page_number = request.GET.get("page") + page = paginator.get_page(page_number) + groups_paged = groups_qs.filter(id__in=[g.id for g in page]) + + # Create filtered queryset + group_subject_formset = GroupSubjectFormset( + request.POST or None, queryset=groups_paged + ) + + # Check if form is submitted and valid, then save + if request.method == "POST": + if group_subject_formset.is_valid(): + group_subject_formset.save() + messages.success(request, _("Your changes were successfully saved.")) + + context["formset"] = group_subject_formset + context["page"] = page + context["paginator"] = paginator + + return render(request, "untis/groups_subjects.html", context) + +