Skip to content
Snippets Groups Projects
Verified Commit bf877b2d authored by Jonathan Weth's avatar Jonathan Weth :keyboard:
Browse files

Merge branch 'master' into 40-link-data-to-school-term

parents 819d1e4c 32460cd7
No related branches found
No related tags found
1 merge request!299Resolve "Link data to school term"
Pipeline #2583 failed
......@@ -10,7 +10,7 @@ from dynamic_preferences.forms import PreferenceForm
from material import Fieldset, Layout, Row
from .mixins import ExtensibleForm, SchoolYearRelatedExtensibleForm
from .models import Announcement, Group, GroupType, Person, SchoolYear
from .models import AdditionalField, Announcement, Group, GroupType, Person, SchoolYear
from .registries import (
group_preferences_registry,
person_preferences_registry,
......@@ -128,7 +128,7 @@ class EditGroupForm(SchoolYearRelatedExtensibleForm):
Fieldset(_("School year"), "school_year"),
Fieldset(_("Common data"), "name", "short_name", "group_type"),
Fieldset(_("Persons"), "members", "owners", "parent_groups"),
Fieldset(_("Additional fields"), "additional_fields"),
Fieldset(_("Additional data"), "additional_fields"),
)
class Meta:
......@@ -152,6 +152,7 @@ class EditGroupForm(SchoolYearRelatedExtensibleForm):
"parent_groups": ModelSelect2MultipleWidget(
search_fields=["name__icontains", "short_name__icontains"]
),
"additional_fields": ModelSelect2MultipleWidget(search_fields=["title__icontains",]),
}
......@@ -288,6 +289,14 @@ class GroupPreferenceForm(PreferenceForm):
registry = group_preferences_registry
class EditAdditionalFieldForm(forms.ModelForm):
"""Form to manage additional fields."""
class Meta:
model = AdditionalField
exclude = []
class EditGroupTypeForm(forms.ModelForm):
"""Form to manage group types."""
......
......@@ -197,6 +197,17 @@ MENUS = {
)
],
},
{
"name": _("Additional fields"),
"url": "additional_fields",
"icon": "style",
"validators": [
(
"aleksis.core.util.predicates.permission_validator",
"core.view_additionalfield",
)
],
},
],
},
],
......
from rules import add_perm, always_allow
from .models import Announcement, Group, GroupType, Person
from .models import AdditionalField, Announcement, Group, GroupType, Person
from .util.predicates import (
has_any_object,
has_global_perm,
......@@ -195,6 +195,33 @@ change_group_preferences = has_person & (
)
add_perm("core.change_group_preferences", change_group_preferences)
# Edit additional field
change_additional_field_predicate = has_person & (
has_global_perm("core.change_additionalfield") | has_object_perm("core.change_additionalfield")
)
add_perm("core.change_additionalfield", change_additional_field_predicate)
# Edit additional field
create_additional_field_predicate = has_person & (
has_global_perm("core.create_additionalfield") | has_object_perm("core.create_additionalfield")
)
add_perm("core.create_additionalfield", create_additional_field_predicate)
# Delete additional field
delete_additional_field_predicate = has_person & (
has_global_perm("core.delete_additionalfield") | has_object_perm("core.delete_additionalfield")
)
add_perm("core.delete_additionalfield", delete_additional_field_predicate)
# View additional fields
view_additional_field_predicate = has_person & (
has_global_perm("core.view_additionalfield")
| has_any_object("core.view_additionalfield", AdditionalField)
)
add_perm("core.view_additionalfield", view_additional_field_predicate)
# Edit group type
change_group_type_predicate = has_person & (
has_global_perm("core.change_grouptype") | has_object_perm("core.change_grouptype")
......
......@@ -43,6 +43,22 @@ class GroupsTable(tables.Table):
school_year = tables.Column()
class AdditionalFieldsTable(tables.Table):
"""Table to list group types."""
class Meta:
attrs = {"class": "responsive-table hightlight"}
title = tables.LinkColumn("edit_additional_field_by_id", args=[A("id")])
delete = tables.LinkColumn(
"delete_additional_field_by_id",
args=[A("id")],
verbose_name=_("Delete"),
text=_("Delete"),
attrs={"a": {"class": "btn-flat waves-effect waves-red"}},
)
class GroupTypesTable(tables.Table):
"""Table to list group types."""
......
{# -*- engine:django -*- #}
{% extends "core/base.html" %}
{% load i18n %}
{% load render_table from django_tables2 %}
{% block browser_title %}{% blocktrans %}Additional fields{% endblocktrans %}{% endblock %}
{% block page_title %}{% blocktrans %}Additional fields{% endblocktrans %}{% endblock %}
{% block content %}
<a class="btn green waves-effect waves-light" href="{% url 'create_additional_field' %}">
<i class="material-icons left">add</i>
{% trans "Create additional field" %}
</a>
{% render_table additional_fields_table %}
{% endblock %}
{# -*- engine:django -*- #}
{% extends "core/base.html" %}
{% load material_form i18n %}
{% block browser_title %}{% blocktrans %}Edit additional field{% endblocktrans %}{% endblock %}
{% block page_title %}{% blocktrans %}Edit additional field{% endblocktrans %}{% endblock %}
{% block content %}
<form method="post">
{% csrf_token %}
{% form form=edit_additional_field_form %}{% endform %}
{% include "core/save_button.html" %}
</form>
{% endblock %}
......@@ -30,7 +30,23 @@ urlpatterns = [
path("person/<int:id_>", views.person, name="person_by_id"),
path("person/<int:id_>/edit", views.edit_person, name="edit_person_by_id"),
path("groups", views.groups, name="groups"),
path("groups/additional_fields", views.additional_fields, name="additional_fields"),
path("groups/child_groups/", views.groups_child_groups, name="groups_child_groups"),
path(
"groups/additional_field/<int:id_>/edit",
views.edit_additional_field,
name="edit_additional_field_by_id",
),
path(
"groups/additional_field/create",
views.edit_additional_field,
name="create_additional_field",
),
path(
"groups/additional_field/<int:id_>/delete",
views.delete_additional_field,
name="delete_additional_field_by_id",
),
path("group/create", views.edit_group, name="create_group"),
path("group/<int:id_>", views.group, name="group_by_id"),
path("group/<int:id_>/edit", views.edit_group, name="edit_group_by_id"),
......
......@@ -21,6 +21,7 @@ from .filters import GroupFilter
from .forms import (
AnnouncementForm,
ChildGroupsForm,
EditAdditionalFieldForm,
EditGroupForm,
EditGroupTypeForm,
EditPersonForm,
......@@ -32,6 +33,7 @@ from .forms import (
)
from .mixins import AdvancedCreateView, AdvancedEditView
from .models import (
AdditionalField,
Announcement,
DashboardWidget,
Group,
......@@ -45,7 +47,7 @@ from .registries import (
person_preferences_registry,
site_preferences_registry,
)
from .tables import GroupsTable, GroupTypesTable, PersonsTable, SchoolYearTable
from .tables import AdditionalFieldsTable, GroupsTable, GroupTypesTable, PersonsTable, SchoolYearTable
from .util import messages
from .util.apps import AppConfig
from .util.core_helpers import objectgetter_optional
......@@ -499,6 +501,71 @@ def preferences(
return render(request, "dynamic_preferences/form.html", context)
@permission_required(
"core.change_additionalfield", fn=objectgetter_optional(AdditionalField, None, False)
)
def edit_additional_field(request: HttpRequest, id_: Optional[int] = None) -> HttpResponse:
"""View to edit or create a additional_field."""
context = {}
additional_field = objectgetter_optional(AdditionalField, None, False)(request, id_)
context["additional_field"] = additional_field
if id_:
# Edit form for existing additional_field
edit_additional_field_form = EditAdditionalFieldForm(
request.POST or None, instance=additional_field
)
else:
if request.user.has_perm("core.create_additionalfield"):
# Empty form to create a new additional_field
edit_additional_field_form = EditAdditionalFieldForm(request.POST or None)
else:
raise PermissionDenied()
if request.method == "POST":
if edit_additional_field_form.is_valid():
edit_additional_field_form.save(commit=True)
messages.success(request, _("The additional_field has been saved."))
return redirect("additional_fields")
context["edit_additional_field_form"] = edit_additional_field_form
return render(request, "core/edit_additional_field.html", context)
@permission_required("core.view_additionalfield")
def additional_fields(request: HttpRequest) -> HttpResponse:
"""List view for listing all additional fields."""
context = {}
# Get all additional fields
additional_fields = get_objects_for_user(
request.user, "core.view_additionalfield", AdditionalField
)
# Build table
additional_fields_table = AdditionalFieldsTable(additional_fields)
RequestConfig(request).configure(additional_fields_table)
context["additional_fields_table"] = additional_fields_table
return render(request, "core/additional_fields.html", context)
@permission_required(
"core.delete_additionalfield", fn=objectgetter_optional(AdditionalField, None, False)
)
def delete_additional_field(request: HttpRequest, id_: int) -> HttpResponse:
"""View to delete an additional field."""
additional_field = objectgetter_optional(AdditionalField, None, False)(request, id_)
additional_field.delete()
messages.success(request, _("The additional field has been deleted."))
return redirect("additional_fields")
@permission_required("core.change_grouptype", fn=objectgetter_optional(GroupType, None, False))
def edit_group_type(request: HttpRequest, id_: Optional[int] = None) -> HttpResponse:
"""View to edit or create a group_type."""
......
......@@ -28,7 +28,7 @@ Install native dependencies
Some system libraries are required to install AlekSIS::
sudo apt install build-essential libpq-dev libpq5 libssl-dev python3-dev python3-pip python3-venv yarnpkg
sudo apt install build-essential libpq-dev libpq5 libssl-dev python3-dev python3-pip python3-venv yarnpkg gettext
Get Poetry
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment