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

Merge branch '240-frontend-for-group-types' into 'master'

Resolve "Frontend for group types"

Closes #240

See merge request AlekSIS!270
parents b472b4ec f91e88ec
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, Person from .models import Announcement, Group, GroupType, Person
from .registries import ( from .registries import (
group_preferences_registry, group_preferences_registry,
person_preferences_registry, person_preferences_registry,
...@@ -125,7 +125,7 @@ class EditGroupForm(ExtensibleForm): ...@@ -125,7 +125,7 @@ class EditGroupForm(ExtensibleForm):
"""Form to edit an existing group in the frontend.""" """Form to edit an existing group in the frontend."""
layout = Layout( layout = Layout(
Fieldset(_("Common data"), "name", "short_name"), Fieldset(_("Common data"), "name", "short_name", "group_type"),
Fieldset(_("Persons"), "members", "owners", "parent_groups"), Fieldset(_("Persons"), "members", "owners", "parent_groups"),
) )
...@@ -280,3 +280,11 @@ class GroupPreferenceForm(PreferenceForm): ...@@ -280,3 +280,11 @@ class GroupPreferenceForm(PreferenceForm):
"""Form to edit preferences valid for members of a group.""" """Form to edit preferences valid for members of a group."""
registry = group_preferences_registry registry = group_preferences_registry
class EditGroupTypeForm(forms.ModelForm):
"""Form to manage group types."""
class Meta:
model = GroupType
exclude = []
...@@ -153,6 +153,17 @@ MENUS = { ...@@ -153,6 +153,17 @@ MENUS = {
("aleksis.core.util.predicates.permission_validator", "core.view_groups") ("aleksis.core.util.predicates.permission_validator", "core.view_groups")
], ],
}, },
{
"name": _("Group types"),
"url": "group_types",
"icon": "category",
"validators": [
(
"aleksis.core.util.predicates.permission_validator",
"core.view_group_type",
)
],
},
{ {
"name": _("Persons and accounts"), "name": _("Persons and accounts"),
"url": "persons_accounts", "url": "persons_accounts",
......
from rules import add_perm, always_allow from rules import add_perm, always_allow
from .models import Announcement, Group, Person from .models import Announcement, Group, GroupType, Person
from .util.predicates import ( from .util.predicates import (
has_any_object, has_any_object,
has_global_perm, has_global_perm,
...@@ -194,3 +194,28 @@ change_group_preferences = has_person & ( ...@@ -194,3 +194,28 @@ change_group_preferences = has_person & (
| is_group_owner | is_group_owner
) )
add_perm("core.change_group_preferences", change_group_preferences) add_perm("core.change_group_preferences", change_group_preferences)
# Edit group type
change_group_type_predicate = has_person & (
has_global_perm("core.change_grouptype") | has_object_perm("core.change_grouptype")
)
add_perm("core.edit_grouptype", change_group_type_predicate)
# Create group type
create_group_type_predicate = has_person & (
has_global_perm("core.create_grouptype") | has_object_perm("core.change_grouptype")
)
add_perm("core.create_grouptype", create_group_type_predicate)
# Delete group type
delete_group_type_predicate = has_person & (
has_global_perm("core.delete_grouptype") | has_object_perm("core.delete_grouptype")
)
add_perm("core.delete_grouptype", delete_group_type_predicate)
# View group types
view_group_type_predicate = has_person & (
has_global_perm("core.view_grouptype") | has_any_object("core.view_grouptype", GroupType)
)
add_perm("core.view_grouptype", view_group_type_predicate)
from django.utils.translation import gettext_lazy as _
import django_tables2 as tables import django_tables2 as tables
from django_tables2.utils import A from django_tables2.utils import A
...@@ -20,3 +22,16 @@ class GroupsTable(tables.Table): ...@@ -20,3 +22,16 @@ class GroupsTable(tables.Table):
name = tables.LinkColumn("group_by_id", args=[A("id")]) name = tables.LinkColumn("group_by_id", args=[A("id")])
short_name = tables.LinkColumn("group_by_id", args=[A("id")]) short_name = tables.LinkColumn("group_by_id", args=[A("id")])
class GroupTypesTable(tables.Table):
"""Table to list group types."""
class Meta:
attrs = {"class": "responsive-table highlight"}
name = tables.LinkColumn("edit_group_type_by_id", args=[A("id")])
description = tables.LinkColumn("edit_group_type_by_id", args=[A("id")])
delete = tables.LinkColumn(
"delete_group_type_by_id", args=[A("id")], verbose_name=_("Delete"), text=_("Delete")
)
{# -*- engine:django -*- #}
{% extends "core/base.html" %}
{% load material_form i18n %}
{% block browser_title %}{% blocktrans %}Edit group type{% endblocktrans %}{% endblock %}
{% block page_title %}{% blocktrans %}Edit group type{% endblocktrans %}{% endblock %}
{% block content %}
<form method="post">
{% csrf_token %}
{% form form=edit_group_type_form %}{% endform %}
{% include "core/save_button.html" %}
</form>
{% endblock %}
{# -*- engine:django -*- #}
{% extends "core/base.html" %}
{% load i18n %}
{% load render_table from django_tables2 %}
{% block browser_title %}{% blocktrans %}Group types{% endblocktrans %}{% endblock %}
{% block page_title %}{% blocktrans %}Group types{% endblocktrans %}{% endblock %}
{% block content %}
<a class="btn green waves-effect waves-light" href="{% url 'create_group_type' %}">
<i class="material-icons left">add</i>
{% trans "Create group type" %}
</a>
{% render_table group_types_table %}
{% endblock %}
...@@ -37,6 +37,14 @@ urlpatterns = [ ...@@ -37,6 +37,14 @@ urlpatterns = [
views.notification_mark_read, views.notification_mark_read,
name="notification_mark_read", name="notification_mark_read",
), ),
path("groups/group_type/create", views.edit_group_type, name="create_group_type"),
path(
"groups/group_type/<int:id_>/delete",
views.delete_group_type,
name="delete_group_type_by_id",
),
path("groups/group_type/<int:id_>/edit", views.edit_group_type, name="edit_group_type_by_id"),
path("groups/group_types", views.group_types, name="group_types"),
path("announcements/", views.announcements, name="announcements"), path("announcements/", views.announcements, name="announcements"),
path("announcement/create/", views.announcement_form, name="add_announcement"), path("announcement/create/", views.announcement_form, name="add_announcement"),
path("announcement/edit/<int:id_>/", views.announcement_form, name="edit_announcement"), path("announcement/edit/<int:id_>/", views.announcement_form, name="edit_announcement"),
......
...@@ -21,19 +21,20 @@ from .forms import ( ...@@ -21,19 +21,20 @@ from .forms import (
AnnouncementForm, AnnouncementForm,
ChildGroupsForm, ChildGroupsForm,
EditGroupForm, EditGroupForm,
EditGroupTypeForm,
EditPersonForm, EditPersonForm,
GroupPreferenceForm, GroupPreferenceForm,
PersonPreferenceForm, PersonPreferenceForm,
PersonsAccountsFormSet, PersonsAccountsFormSet,
SitePreferenceForm, SitePreferenceForm,
) )
from .models import Announcement, DashboardWidget, Group, Notification, Person from .models import 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, PersonsTable from .tables import 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
...@@ -444,3 +445,57 @@ def preferences( ...@@ -444,3 +445,57 @@ def preferences(
context["instance"] = instance context["instance"] = instance
return render(request, "dynamic_preferences/form.html", context) return render(request, "dynamic_preferences/form.html", context)
@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."""
context = {}
group_type = objectgetter_optional(GroupType, None, False)(request, id_)
context["group_type"] = group_type
if id_:
# Edit form for existing group_type
edit_group_type_form = EditGroupTypeForm(request.POST or None, instance=group_type)
else:
# Empty form to create a new group_type
edit_group_type_form = EditGroupTypeForm(request.POST or None)
if request.method == "POST":
if edit_group_type_form.is_valid():
edit_group_type_form.save(commit=True)
messages.success(request, _("The group type has been saved."))
return redirect("group_types")
context["edit_group_type_form"] = edit_group_type_form
return render(request, "core/edit_group_type.html", context)
@permission_required("core.view_grouptype")
def group_types(request: HttpRequest) -> HttpResponse:
"""List view for listing all group types."""
context = {}
# Get all group types
group_types = get_objects_for_user(request.user, "core.view_grouptype", GroupType)
# Build table
group_types_table = GroupTypesTable(group_types)
RequestConfig(request).configure(group_types_table)
context["group_types_table"] = group_types_table
return render(request, "core/group_types.html", context)
@permission_required("core.delete_grouptype", fn=objectgetter_optional(GroupType, None, False))
def delete_group_type(request: HttpRequest, id_: int) -> HttpResponse:
"""View to delete an group_type."""
group_type = objectgetter_optional(GroupType, None, False)(request, id_)
group_type.delete()
messages.success(request, _("The group type has been deleted."))
return redirect("group_types")
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