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

Merge branch '239-frontend-for-additional-fields-for-group' into 'master'

Resolve "Frontend for additional fields for group"

Closes #239

See merge request AlekSIS/official/AlekSIS!271
parents 468cac28 03c1320e
No related branches found
No related tags found
No related merge requests found
...@@ -10,7 +10,7 @@ from dynamic_preferences.forms import PreferenceForm ...@@ -10,7 +10,7 @@ from dynamic_preferences.forms import PreferenceForm
from material import Fieldset, Layout, Row from material import Fieldset, Layout, Row
from .mixins import ExtensibleForm from .mixins import ExtensibleForm
from .models import Announcement, Group, GroupType, Person from .models import AdditionalField, Announcement, Group, GroupType, Person
from .registries import ( from .registries import (
group_preferences_registry, group_preferences_registry,
person_preferences_registry, person_preferences_registry,
...@@ -127,6 +127,7 @@ class EditGroupForm(ExtensibleForm): ...@@ -127,6 +127,7 @@ class EditGroupForm(ExtensibleForm):
layout = Layout( layout = Layout(
Fieldset(_("Common data"), "name", "short_name", "group_type"), Fieldset(_("Common data"), "name", "short_name", "group_type"),
Fieldset(_("Persons"), "members", "owners", "parent_groups"), Fieldset(_("Persons"), "members", "owners", "parent_groups"),
Fieldset(_("Additional data"), "additional_fields"),
) )
class Meta: class Meta:
...@@ -150,6 +151,7 @@ class EditGroupForm(ExtensibleForm): ...@@ -150,6 +151,7 @@ class EditGroupForm(ExtensibleForm):
"parent_groups": ModelSelect2MultipleWidget( "parent_groups": ModelSelect2MultipleWidget(
search_fields=["name__icontains", "short_name__icontains"] search_fields=["name__icontains", "short_name__icontains"]
), ),
"additional_fields": ModelSelect2MultipleWidget(search_fields=["title__icontains",]),
} }
...@@ -282,6 +284,14 @@ class GroupPreferenceForm(PreferenceForm): ...@@ -282,6 +284,14 @@ class GroupPreferenceForm(PreferenceForm):
registry = group_preferences_registry registry = group_preferences_registry
class EditAdditionalFieldForm(forms.ModelForm):
"""Form to manage additional fields."""
class Meta:
model = AdditionalField
exclude = []
class EditGroupTypeForm(forms.ModelForm): class EditGroupTypeForm(forms.ModelForm):
"""Form to manage group types.""" """Form to manage group types."""
......
...@@ -186,6 +186,17 @@ MENUS = { ...@@ -186,6 +186,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 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 ( from .util.predicates import (
has_any_object, has_any_object,
has_global_perm, has_global_perm,
...@@ -195,6 +195,33 @@ change_group_preferences = has_person & ( ...@@ -195,6 +195,33 @@ change_group_preferences = has_person & (
) )
add_perm("core.change_group_preferences", change_group_preferences) 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 # Edit group type
change_group_type_predicate = has_person & ( change_group_type_predicate = has_person & (
has_global_perm("core.change_grouptype") | has_object_perm("core.change_grouptype") has_global_perm("core.change_grouptype") | has_object_perm("core.change_grouptype")
......
...@@ -24,6 +24,18 @@ class GroupsTable(tables.Table): ...@@ -24,6 +24,18 @@ class GroupsTable(tables.Table):
short_name = tables.LinkColumn("group_by_id", args=[A("id")]) short_name = tables.LinkColumn("group_by_id", args=[A("id")])
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")
)
class GroupTypesTable(tables.Table): class GroupTypesTable(tables.Table):
"""Table to list group types.""" """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 %}
...@@ -27,7 +27,23 @@ urlpatterns = [ ...@@ -27,7 +27,23 @@ urlpatterns = [
path("person/<int:id_>", views.person, name="person_by_id"), path("person/<int:id_>", views.person, name="person_by_id"),
path("person/<int:id_>/edit", views.edit_person, name="edit_person_by_id"), path("person/<int:id_>/edit", views.edit_person, name="edit_person_by_id"),
path("groups", views.groups, name="groups"), 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/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/create", views.edit_group, name="create_group"),
path("group/<int:id_>", views.group, name="group_by_id"), path("group/<int:id_>", views.group, name="group_by_id"),
path("group/<int:id_>/edit", views.edit_group, name="edit_group_by_id"), path("group/<int:id_>/edit", views.edit_group, name="edit_group_by_id"),
......
...@@ -20,6 +20,7 @@ from .filters import GroupFilter ...@@ -20,6 +20,7 @@ from .filters import GroupFilter
from .forms import ( from .forms import (
AnnouncementForm, AnnouncementForm,
ChildGroupsForm, ChildGroupsForm,
EditAdditionalFieldForm,
EditGroupForm, EditGroupForm,
EditGroupTypeForm, EditGroupTypeForm,
EditPersonForm, EditPersonForm,
...@@ -28,13 +29,21 @@ from .forms import ( ...@@ -28,13 +29,21 @@ from .forms import (
PersonsAccountsFormSet, PersonsAccountsFormSet,
SitePreferenceForm, SitePreferenceForm,
) )
from .models import Announcement, DashboardWidget, Group, GroupType, Notification, Person from .models import (
AdditionalField,
Announcement,
DashboardWidget,
Group,
GroupType,
Notification,
Person,
)
from .registries import ( from .registries import (
group_preferences_registry, group_preferences_registry,
person_preferences_registry, person_preferences_registry,
site_preferences_registry, site_preferences_registry,
) )
from .tables import GroupsTable, GroupTypesTable, PersonsTable from .tables import AdditionalFieldsTable, GroupsTable, GroupTypesTable, PersonsTable
from .util import messages from .util import messages
from .util.apps import AppConfig from .util.apps import AppConfig
from .util.core_helpers import objectgetter_optional from .util.core_helpers import objectgetter_optional
...@@ -447,6 +456,71 @@ def preferences( ...@@ -447,6 +456,71 @@ def preferences(
return render(request, "dynamic_preferences/form.html", context) 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)) @permission_required("core.change_grouptype", fn=objectgetter_optional(GroupType, None, False))
def edit_group_type(request: HttpRequest, id_: Optional[int] = None) -> HttpResponse: def edit_group_type(request: HttpRequest, id_: Optional[int] = None) -> HttpResponse:
"""View to edit or create a group_type.""" """View to edit or create a group_type."""
......
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