From 13d911291ac51efc5be666454693d6181c37c8e3 Mon Sep 17 00:00:00 2001 From: Jonathan Weth <git@jonathanweth.de> Date: Mon, 25 Jan 2021 21:24:55 +0100 Subject: [PATCH] Rename class role to group role --- aleksis/apps/alsijil/forms.py | 13 +++- aleksis/apps/alsijil/menus.py | 6 +- ...009_class_roles.py => 0009_group_roles.py} | 53 +++++++++++--- aleksis/apps/alsijil/models.py | 27 ++++--- aleksis/apps/alsijil/preferences.py | 6 +- aleksis/apps/alsijil/rules.py | 30 ++++---- aleksis/apps/alsijil/tables.py | 10 +-- .../{class_role => group_role}/create.html | 4 +- .../{class_role => group_role}/edit.html | 4 +- .../{class_role => group_role}/list.html | 12 ++-- .../{class_role => group_role}/warning.html | 0 aleksis/apps/alsijil/urls.py | 12 ++-- aleksis/apps/alsijil/views.py | 72 ++++++++++--------- 13 files changed, 147 insertions(+), 102 deletions(-) rename aleksis/apps/alsijil/migrations/{0009_class_roles.py => 0009_group_roles.py} (94%) rename aleksis/apps/alsijil/templates/alsijil/{class_role => group_role}/create.html (71%) rename aleksis/apps/alsijil/templates/alsijil/{class_role => group_role}/edit.html (71%) rename aleksis/apps/alsijil/templates/alsijil/{class_role => group_role}/list.html (56%) rename aleksis/apps/alsijil/templates/alsijil/{class_role => group_role}/warning.html (100%) diff --git a/aleksis/apps/alsijil/forms.py b/aleksis/apps/alsijil/forms.py index 5d0c16129..348b51bf8 100644 --- a/aleksis/apps/alsijil/forms.py +++ b/aleksis/apps/alsijil/forms.py @@ -15,7 +15,14 @@ from aleksis.apps.chronos.models import TimePeriod from aleksis.core.models import Group, Person from aleksis.core.util.predicates import check_global_permission -from .models import ClassRole, ExcuseType, ExtraMark, LessonDocumentation, PersonalNote +from .models import ( + GroupRole, + GroupRoleAssignment, + ExcuseType, + ExtraMark, + LessonDocumentation, + PersonalNote, +) class LessonDocumentationForm(forms.ModelForm): @@ -164,9 +171,9 @@ class ExcuseTypeForm(forms.ModelForm): fields = ["short_name", "name"] -class ClassRoleForm(forms.ModelForm): +class GroupRoleForm(forms.ModelForm): layout = Layout("name", "icon", "colour") class Meta: - model = ClassRole + model = GroupRole fields = ["name", "icon", "colour"] diff --git a/aleksis/apps/alsijil/menus.py b/aleksis/apps/alsijil/menus.py index 6267dc8bc..a5b5b687a 100644 --- a/aleksis/apps/alsijil/menus.py +++ b/aleksis/apps/alsijil/menus.py @@ -90,13 +90,13 @@ MENUS = { ], }, { - "name": _("Manage class roles"), - "url": "class_roles", + "name": _("Manage group roles"), + "url": "group_roles", "icon": "assignment_ind", "validators": [ ( "aleksis.core.util.predicates.permission_validator", - "alsijil.view_classroles", + "alsijil.view_grouproles", ), ], }, diff --git a/aleksis/apps/alsijil/migrations/0009_class_roles.py b/aleksis/apps/alsijil/migrations/0009_group_roles.py similarity index 94% rename from aleksis/apps/alsijil/migrations/0009_class_roles.py rename to aleksis/apps/alsijil/migrations/0009_group_roles.py index 8e2e11326..ee48b033e 100644 --- a/aleksis/apps/alsijil/migrations/0009_class_roles.py +++ b/aleksis/apps/alsijil/migrations/0009_group_roles.py @@ -1,4 +1,4 @@ -# Generated by Django 3.1.5 on 2021-01-21 20:25 +# Generated by Django 3.1.5 on 2021-01-25 20:18 import django.contrib.sites.managers from django.db import migrations, models @@ -15,7 +15,7 @@ class Migration(migrations.Migration): operations = [ migrations.CreateModel( - name='ClassRole', + name='GroupRole', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('extended_data', models.JSONField(default=dict, editable=False)), @@ -25,28 +25,61 @@ class Migration(migrations.Migration): ('site', models.ForeignKey(default=1, editable=False, on_delete=django.db.models.deletion.CASCADE, to='sites.site')), ], options={ - 'verbose_name': 'Class role', - 'verbose_name_plural': 'Class roles', + 'verbose_name': 'Group role', + 'verbose_name_plural': 'Group roles', }, managers=[ ('objects', django.contrib.sites.managers.CurrentSiteManager()), ], ), + migrations.AlterModelOptions( + name='lessondocumentation', + options={'ordering': ['year', 'week', 'lesson_period__period__weekday', 'lesson_period__period__period'], 'verbose_name': 'Lesson documentation', 'verbose_name_plural': 'Lesson documentations'}, + ), + migrations.AlterModelOptions( + name='personalnote', + options={'ordering': ['year', 'week', 'lesson_period__period__weekday', 'lesson_period__period__period', 'person__last_name', 'person__first_name'], 'verbose_name': 'Personal note', 'verbose_name_plural': 'Personal notes'}, + ), + migrations.AlterModelManagers( + name='personalnote', + managers=[ + ], + ), + migrations.AlterField( + model_name='excusetype', + name='extended_data', + field=models.JSONField(default=dict, editable=False), + ), + migrations.AlterField( + model_name='extramark', + name='extended_data', + field=models.JSONField(default=dict, editable=False), + ), + migrations.AlterField( + model_name='lessondocumentation', + name='extended_data', + field=models.JSONField(default=dict, editable=False), + ), + migrations.AlterField( + model_name='personalnote', + name='extended_data', + field=models.JSONField(default=dict, editable=False), + ), migrations.CreateModel( - name='ClassRoleAssignment', + name='GroupRoleAssignment', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('extended_data', models.JSONField(default=dict, editable=False)), ('date_start', models.DateField(verbose_name='Start date')), ('date_end', models.DateField(blank=True, help_text='Can be left empty if end date is not clear yet', null=True, verbose_name='End date')), - ('person', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='class_roles', to='core.person', verbose_name='Assigned person')), - ('role', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='assignments', to='alsijil.classrole', verbose_name='Class role')), - ('group', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='class_roles', to='core.group', verbose_name='Group')), + ('groups', models.ManyToManyField(related_name='group_roles', to='core.Group', verbose_name='Groups')), + ('person', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='group_roles', to='core.person', verbose_name='Assigned person')), + ('role', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='assignments', to='alsijil.grouprole', verbose_name='Group role')), ('site', models.ForeignKey(default=1, editable=False, on_delete=django.db.models.deletion.CASCADE, to='sites.site')), ], options={ - 'verbose_name': 'Class role assignment', - 'verbose_name_plural': 'Class role assignments', + 'verbose_name': 'Group role assignment', + 'verbose_name_plural': 'Group role assignments', }, managers=[ ('objects', django.contrib.sites.managers.CurrentSiteManager()), diff --git a/aleksis/apps/alsijil/models.py b/aleksis/apps/alsijil/models.py index ada2135be..440e12c57 100644 --- a/aleksis/apps/alsijil/models.py +++ b/aleksis/apps/alsijil/models.py @@ -233,7 +233,7 @@ class ExtraMark(ExtensibleModel): verbose_name_plural = _("Extra marks") -class ClassRole(ExtensibleModel): +class GroupRole(ExtensibleModel): name = models.CharField(max_length=255, verbose_name=_("Name")) icon = models.CharField(max_length=50, blank=True, choices=ICONS, verbose_name=_("Icon")) colour = models.CharField(max_length=50, blank=True, choices=COLOURS, verbose_name=_("Colour")) @@ -242,30 +242,27 @@ class ClassRole(ExtensibleModel): return self.name class Meta: - verbose_name = _("Class role") - verbose_name_plural = _("Class roles") + verbose_name = _("Group role") + verbose_name_plural = _("Group roles") -class ClassRoleAssignment(ExtensibleModel): +class GroupRoleAssignment(ExtensibleModel): role = models.ForeignKey( - ClassRole, + GroupRole, on_delete=models.CASCADE, related_name="assignments", - verbose_name=_("Class role"), + verbose_name=_("Group role"), ) person = models.ForeignKey( "core.Person", on_delete=models.CASCADE, - related_name="class_roles", + related_name="group_roles", verbose_name=_("Assigned person"), ) - group = models.ForeignKey( + groups = models.ManyToManyField( "core.Group", - on_delete=models.CASCADE, - related_name="class_roles", - verbose_name=_("Group"), - blank=True, - null=True, + related_name="group_roles", + verbose_name=_("Groups"), ) date_start = models.DateField(verbose_name=_("Start date")) date_end = models.DateField( @@ -280,8 +277,8 @@ class ClassRoleAssignment(ExtensibleModel): return f"{self.role}: {self.person}, {date_format(self.date_start)}–{date_end}" class Meta: - verbose_name = _("Class role assignment") - verbose_name_plural = _("Class role assignments") + verbose_name = _("Group role assignment") + verbose_name_plural = _("Group role assignments") class AlsijilGlobalPermissions(ExtensibleModel): diff --git a/aleksis/apps/alsijil/preferences.py b/aleksis/apps/alsijil/preferences.py index 055d5c997..0e9706da1 100644 --- a/aleksis/apps/alsijil/preferences.py +++ b/aleksis/apps/alsijil/preferences.py @@ -69,8 +69,8 @@ class AllowEntriesInHolidays(BooleanPreference): @site_preferences_registry.register -class ActivateClassRoles(BooleanPreference): +class ActivateGroupRoles(BooleanPreference): section = alsijil - name = "activate_class_roles" + name = "activate_group_roles" default = True - verbose_name = _("Activate support for creating and assigning class roles") + verbose_name = _("Activate support for creating and assigning group roles") diff --git a/aleksis/apps/alsijil/rules.py b/aleksis/apps/alsijil/rules.py index 0d74385a3..0273c2c74 100644 --- a/aleksis/apps/alsijil/rules.py +++ b/aleksis/apps/alsijil/rules.py @@ -220,24 +220,24 @@ delete_extramark_predicate = view_extramarks_predicate & has_global_perm("alsiji add_perm("alsijil.delete_extramark", delete_extramark_predicate) -# View class role list -view_class_roles_predicate = ( +# View group role list +view_group_roles_predicate = ( has_person - & is_site_preference_set("alsijil", "activate_class_roles") - & has_global_perm("alsijil.view_classrole") + & is_site_preference_set("alsijil", "activate_group_roles") + & has_global_perm("alsijil.view_grouprole") ) -add_perm("alsijil.view_classroles", view_class_roles_predicate) +add_perm("alsijil.view_grouproles", view_group_roles_predicate) -# Add class role -add_class_role_predicate = view_class_roles_predicate & has_global_perm("alsijil.add_classrole") -add_perm("alsijil.add_classrole", add_class_role_predicate) +# Add group role +add_group_role_predicate = view_group_roles_predicate & has_global_perm("alsijil.add_grouprole") +add_perm("alsijil.add_grouprole", add_group_role_predicate) -# Edit class role -edit_class_role_predicate = view_class_roles_predicate & has_global_perm("alsijil.change_classrole") -add_perm("alsijil.edit_classrole", edit_class_role_predicate) +# Edit group role +edit_group_role_predicate = view_group_roles_predicate & has_global_perm("alsijil.change_grouprole") +add_perm("alsijil.edit_grouprole", edit_group_role_predicate) -# Delete class role -delete_class_role_predicate = view_class_roles_predicate & has_global_perm( - "alsijil.delete_classrole" +# Delete group role +delete_group_role_predicate = view_group_roles_predicate & has_global_perm( + "alsijil.delete_grouprole" ) -add_perm("alsijil.delete_classrole", delete_class_role_predicate) +add_perm("alsijil.delete_grouprole", delete_group_role_predicate) diff --git a/aleksis/apps/alsijil/tables.py b/aleksis/apps/alsijil/tables.py index 93d17ee0f..85c819119 100644 --- a/aleksis/apps/alsijil/tables.py +++ b/aleksis/apps/alsijil/tables.py @@ -51,19 +51,19 @@ class ExcuseTypeTable(tables.Table): self.columns.hide("delete") -class ClassRoleTable(tables.Table): +class GroupRoleTable(tables.Table): class Meta: attrs = {"class": "highlight"} name = tables.LinkColumn("edit_excuse_type", args=[A("id")]) edit = tables.LinkColumn( - "edit_class_role", + "edit_group_role", args=[A("id")], text=_("Edit"), attrs={"a": {"class": "btn-flat waves-effect waves-orange orange-text"}}, ) delete = tables.LinkColumn( - "delete_class_role", + "delete_group_role", args=[A("id")], text=_("Delete"), attrs={"a": {"class": "btn-flat waves-effect waves-red red-text"}}, @@ -76,7 +76,7 @@ class ClassRoleTable(tables.Table): return render_to_string("components/materialize-chips.html", context) def before_render(self, request): - if not request.user.has_perm("alsijil.edit_classrole"): + if not request.user.has_perm("alsijil.edit_grouprole"): self.columns.hide("edit") - if not request.user.has_perm("alsijil.delete_classrole"): + if not request.user.has_perm("alsijil.delete_grouprole"): self.columns.hide("delete") diff --git a/aleksis/apps/alsijil/templates/alsijil/class_role/create.html b/aleksis/apps/alsijil/templates/alsijil/group_role/create.html similarity index 71% rename from aleksis/apps/alsijil/templates/alsijil/class_role/create.html rename to aleksis/apps/alsijil/templates/alsijil/group_role/create.html index 096d34ed9..5f83f575f 100644 --- a/aleksis/apps/alsijil/templates/alsijil/class_role/create.html +++ b/aleksis/apps/alsijil/templates/alsijil/group_role/create.html @@ -3,8 +3,8 @@ {% extends "core/base.html" %} {% load material_form i18n %} -{% block browser_title %}{% blocktrans %}Create class role{% endblocktrans %}{% endblock %} -{% block page_title %}{% blocktrans %}Create class role{% endblocktrans %}{% endblock %} +{% block browser_title %}{% blocktrans %}Create group role{% endblocktrans %}{% endblock %} +{% block page_title %}{% blocktrans %}Create group role{% endblocktrans %}{% endblock %} {% block content %} <form method="post"> diff --git a/aleksis/apps/alsijil/templates/alsijil/class_role/edit.html b/aleksis/apps/alsijil/templates/alsijil/group_role/edit.html similarity index 71% rename from aleksis/apps/alsijil/templates/alsijil/class_role/edit.html rename to aleksis/apps/alsijil/templates/alsijil/group_role/edit.html index b01aa3dc9..6e2a12fb3 100644 --- a/aleksis/apps/alsijil/templates/alsijil/class_role/edit.html +++ b/aleksis/apps/alsijil/templates/alsijil/group_role/edit.html @@ -3,8 +3,8 @@ {% extends "core/base.html" %} {% load material_form i18n %} -{% block browser_title %}{% blocktrans %}Edit class role{% endblocktrans %}{% endblock %} -{% block page_title %}{% blocktrans %}Edit class role{% endblocktrans %}{% endblock %} +{% block browser_title %}{% blocktrans %}Edit group role{% endblocktrans %}{% endblock %} +{% block page_title %}{% blocktrans %}Edit group role{% endblocktrans %}{% endblock %} {% block content %} diff --git a/aleksis/apps/alsijil/templates/alsijil/class_role/list.html b/aleksis/apps/alsijil/templates/alsijil/group_role/list.html similarity index 56% rename from aleksis/apps/alsijil/templates/alsijil/class_role/list.html rename to aleksis/apps/alsijil/templates/alsijil/group_role/list.html index 146b65013..f3e4a487e 100644 --- a/aleksis/apps/alsijil/templates/alsijil/class_role/list.html +++ b/aleksis/apps/alsijil/templates/alsijil/group_role/list.html @@ -5,15 +5,15 @@ {% load i18n rules %} {% load render_table from django_tables2 %} -{% block browser_title %}{% blocktrans %}Class roles{% endblocktrans %}{% endblock %} -{% block page_title %}{% blocktrans %}Class roles{% endblocktrans %}{% endblock %} +{% block browser_title %}{% blocktrans %}Group roles{% endblocktrans %}{% endblock %} +{% block page_title %}{% blocktrans %}Group roles{% endblocktrans %}{% endblock %} {% block content %} - {% has_perm "alsijil.add_classrole" user as add_class_role %} - {% if add_class_role %} - <a class="btn green waves-effect waves-light" href="{% url 'create_class_role' %}"> + {% has_perm "alsijil.add_grouprole" user as add_group_role %} + {% if add_group_role %} + <a class="btn green waves-effect waves-light" href="{% url 'create_group_role' %}"> <i class="material-icons left">add</i> - {% trans "Create class role" %} + {% trans "Create group role" %} </a> {% endif %} diff --git a/aleksis/apps/alsijil/templates/alsijil/class_role/warning.html b/aleksis/apps/alsijil/templates/alsijil/group_role/warning.html similarity index 100% rename from aleksis/apps/alsijil/templates/alsijil/class_role/warning.html rename to aleksis/apps/alsijil/templates/alsijil/group_role/warning.html diff --git a/aleksis/apps/alsijil/urls.py b/aleksis/apps/alsijil/urls.py index 752f5b8e9..cb9b45dac 100644 --- a/aleksis/apps/alsijil/urls.py +++ b/aleksis/apps/alsijil/urls.py @@ -49,12 +49,12 @@ urlpatterns = [ views.ExcuseTypeDeleteView.as_view(), name="delete_excuse_type", ), - path("class_roles/", views.ClassRoleListView.as_view(), name="class_roles"), - path("class_roles/create/", views.ClassRoleCreateView.as_view(), name="create_class_role"), - path("class_roles/<int:pk>/edit/", views.ClassRoleEditView.as_view(), name="edit_class_role",), + path("group_roles/", views.GroupRoleListView.as_view(), name="group_roles"), + path("group_roles/create/", views.GroupRoleCreateView.as_view(), name="create_group_role"), + path("group_roles/<int:pk>/edit/", views.GroupRoleEditView.as_view(), name="edit_group_role",), path( - "class_roles/<int:pk>/delete/", - views.ClassRoleDeleteView.as_view(), - name="delete_class_role", + "group_roles/<int:pk>/delete/", + views.GroupRoleDeleteView.as_view(), + name="delete_group_role", ), ] diff --git a/aleksis/apps/alsijil/views.py b/aleksis/apps/alsijil/views.py index 8803a8851..dac92a9f9 100644 --- a/aleksis/apps/alsijil/views.py +++ b/aleksis/apps/alsijil/views.py @@ -1,5 +1,5 @@ from datetime import date, datetime, timedelta -from typing import Optional +from typing import Any, Dict, Optional from django.core.exceptions import PermissionDenied from django.db.models import Count, Exists, OuterRef, Prefetch, Q, Subquery, Sum @@ -27,7 +27,8 @@ from aleksis.core.util import messages from aleksis.core.util.core_helpers import get_site_preferences, objectgetter_optional from .forms import ( - ClassRoleForm, + AssignGroupRoleForm, + GroupRoleForm, ExcuseTypeForm, ExtraMarkForm, LessonDocumentationForm, @@ -35,8 +36,15 @@ from .forms import ( RegisterAbsenceForm, SelectForm, ) -from .models import ClassRole, ExcuseType, ExtraMark, LessonDocumentation, PersonalNote -from .tables import ClassRoleTable, ExcuseTypeTable, ExtraMarkTable +from .models import ( + GroupRole, + GroupRoleAssignment, + ExcuseType, + ExtraMark, + LessonDocumentation, + PersonalNote, +) +from .tables import GroupRoleTable, ExcuseTypeTable, ExtraMarkTable from .util.alsijil_helpers import get_lesson_period_by_pk, get_timetable_instance_by_pk @@ -852,45 +860,45 @@ class ExcuseTypeDeleteView(PermissionRequiredMixin, RevisionMixin, AdvancedDelet success_message = _("The excuse type has been deleted.") -class ClassRoleListView(PermissionRequiredMixin, SingleTableView): - """Table of all class roles.""" +class GroupRoleListView(PermissionRequiredMixin, SingleTableView): + """Table of all group roles.""" - model = ClassRole - table_class = ClassRoleTable - permission_required = "alsijil.view_classroles" - template_name = "alsijil/class_role/list.html" + model = GroupRole + table_class = GroupRoleTable + permission_required = "alsijil.view_grouproles" + template_name = "alsijil/group_role/list.html" @method_decorator(never_cache, name="dispatch") -class ClassRoleCreateView(PermissionRequiredMixin, AdvancedCreateView): - """Create view for class roles.""" +class GroupRoleCreateView(PermissionRequiredMixin, AdvancedCreateView): + """Create view for group roles.""" - model = ClassRole - form_class = ClassRoleForm - permission_required = "alsijil.add_classrole" - template_name = "alsijil/class_role/create.html" - success_url = reverse_lazy("class_roles") - success_message = _("The class role has been created.") + model = GroupRole + form_class = GroupRoleForm + permission_required = "alsijil.add_grouprole" + template_name = "alsijil/group_role/create.html" + success_url = reverse_lazy("group_roles") + success_message = _("The group role has been created.") @method_decorator(never_cache, name="dispatch") -class ClassRoleEditView(PermissionRequiredMixin, AdvancedEditView): - """Edit view for class roles.""" +class GroupRoleEditView(PermissionRequiredMixin, AdvancedEditView): + """Edit view for group roles.""" - model = ClassRole - form_class = ClassRoleForm - permission_required = "alsijil.edit_classrole" - template_name = "alsijil/class_role/edit.html" - success_url = reverse_lazy("class_roles") - success_message = _("The class role has been saved.") + model = GroupRole + form_class = GroupRoleForm + permission_required = "alsijil.edit_grouprole" + template_name = "alsijil/group_role/edit.html" + success_url = reverse_lazy("group_roles") + success_message = _("The group role has been saved.") @method_decorator(never_cache, "dispatch") -class ClassRoleDeleteView(PermissionRequiredMixin, RevisionMixin, AdvancedDeleteView): - """Delete view for class roles.""" +class GroupRoleDeleteView(PermissionRequiredMixin, RevisionMixin, AdvancedDeleteView): + """Delete view for group roles.""" - model = ClassRole - permission_required = "alsijil.delete_classrole" + model = GroupRole + permission_required = "alsijil.delete_grouprole" template_name = "core/pages/delete.html" - success_url = reverse_lazy("class_roles") - success_message = _("The class role has been deleted.") + success_url = reverse_lazy("group_roles") + success_message = _("The group role has been deleted.") -- GitLab