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

Drop old views and templates for groups and persons

parent d79b11f9
No related branches found
No related tags found
1 merge request!1628Resolve "TemplateDoesNotExist: core/person/list.html"
Pipeline #193655 failed
......@@ -6,12 +6,12 @@ from django.contrib.contenttypes.models import ContentType
from django.db.models import Q
from django.utils.translation import gettext as _
from django_filters import CharFilter, FilterSet, ModelChoiceFilter, ModelMultipleChoiceFilter
from django_filters import CharFilter, FilterSet, ModelChoiceFilter
from django_select2.forms import ModelSelect2Widget
from guardian.models import GroupObjectPermission, UserObjectPermission
from material import Layout, Row
from aleksis.core.models import Group, GroupType, Person, SchoolTerm
from aleksis.core.models import Person
class MultipleCharFilter(CharFilter):
......@@ -31,19 +31,6 @@ class MultipleCharFilter(CharFilter):
super().__init__(self, *args, **kwargs)
class GroupFilter(FilterSet):
school_term = ModelChoiceFilter(queryset=SchoolTerm.objects.all())
group_type = ModelChoiceFilter(queryset=GroupType.objects.all())
parent_groups = ModelMultipleChoiceFilter(queryset=Group.objects.all())
search = MultipleCharFilter(["name__icontains", "short_name__icontains"], label=_("Search"))
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.form.layout = Layout(Row("search"), Row("school_term", "group_type", "parent_groups"))
self.form.initial = {"school_term": SchoolTerm.current}
class PersonFilter(FilterSet):
name = MultipleCharFilter(
[
......
from textwrap import wrap
from django.template.loader import render_to_string
from django.utils.translation import gettext_lazy as _
import django_tables2 as tables
from django_tables2.utils import A
from .models import Person
from .util.core_helpers import get_site_preferences
class PersonsTable(tables.Table):
"""Table to list persons."""
class Meta:
model = Person
attrs = {"class": "highlight"}
fields = []
first_name = tables.LinkColumn("person_by_id", args=[A("id")])
last_name = tables.LinkColumn("person_by_id", args=[A("id")])
class FullPersonsTable(PersonsTable):
"""Table to list persons."""
photo = tables.Column(verbose_name=_("Photo"), accessor="pk", orderable=False)
address = tables.Column(verbose_name=_("Address"), accessor="pk", orderable=False)
class Meta(PersonsTable.Meta):
fields = (
"photo",
"short_name",
"date_of_birth",
"sex",
"email",
"user__username",
)
sequence = ("photo", "first_name", "last_name", "short_name", "...")
def render_photo(self, value, record):
return render_to_string(
"core/partials/avatar_content.html",
{
"person_or_user": record,
"class": "materialize-circle table-circle",
"img_class": "materialize-circle",
},
self.request,
)
def render_address(self, value, record):
return render_to_string(
"core/partials/address.html",
{
"person": record,
},
self.request,
)
def before_render(self, request):
"""Hide columns if user has no permission to view them."""
if not self.request.user.has_perm("core.view_person_rule"):
self.columns.hide("date_of_birth")
self.columns.hide("sex")
if not self.request.user.has_perm("core.view_contact_details_rule"):
self.columns.hide("email")
if not self.request.user.has_perm("core.view_address_rule"):
self.columns.hide("address")
class GroupsTable(tables.Table):
"""Table to list groups."""
class Meta:
attrs = {"class": "highlight"}
name = tables.LinkColumn("group_by_id", args=[A("id")])
short_name = tables.LinkColumn("group_by_id", args=[A("id")])
school_term = tables.Column()
class DashboardWidgetTable(tables.Table):
"""Table to list dashboard widgets."""
......
{# -*- engine:django -*- #}
{% extends "core/base.html" %}
{% load i18n material_form %}
{% load render_table from django_tables2 %}
{% block browser_title %}{% blocktrans %}Groups{% endblocktrans %}{% endblock %}
{% block page_title %}{% blocktrans %}Groups{% endblocktrans %}{% endblock %}
{% block content %}
<a class="btn green waves-effect waves-light" href="{% url 'create_group' %}">
<i class="material-icons iconify left" data-icon="mdi:add"></i>
{% trans "Create group" %}
</a>
<h2>{% trans "Filter groups" %}</h2>
<form method="get">
{% form form=groups_filter.form %}{% endform %}
{% trans "Search" as caption %}
{% include "core/partials/save_button.html" with caption=caption icon="search" %}
<button type="reset" class="btn red waves-effect waves-light">
<i class="material-icons iconify left" data-icon="mdi:close"></i>
{% trans "Clear" %}
</button>
</form>
<h2>{% trans "Selected groups" %}</h2>
{% render_table groups_table %}
{% endblock %}
......@@ -130,7 +130,11 @@ urlpatterns = [
views.TwoFactorSetupView.as_view(),
name="setup_two_factor_auth",
),
path("persons/", views.persons, name="persons"),
path(
"persons/",
TemplateView.as_view(template_name="core/empty.html"),
name="persons",
),
path(
"person/", TemplateView.as_view(template_name="core/empty.html"), name="person"
),
......@@ -150,7 +154,9 @@ urlpatterns = [
views.InvitePersonByID.as_view(),
name="invite_person_by_id",
),
path("groups/", views.groups, name="groups"),
path(
"groups/", TemplateView.as_view(template_name="core/empty.html"), name="groups"
),
path("groups/create/", views.edit_group, name="create_group"),
path(
"groups/<int:id_>/",
......
......@@ -8,7 +8,7 @@ from django.contrib.auth.models import Group as DjangoGroup
from django.contrib.auth.models import Permission, User
from django.contrib.auth.views import LogoutView
from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import BadRequest, PermissionDenied, ValidationError
from django.core.exceptions import BadRequest, ObjectDoesNotExist, PermissionDenied, ValidationError
from django.db.models import QuerySet
from django.forms.models import BaseModelForm, modelform_factory
from django.http import (
......@@ -43,11 +43,11 @@ from allauth.socialaccount.adapter import get_adapter
from allauth.socialaccount.models import SocialAccount
from django_celery_results.models import TaskResult
from django_filters.views import FilterView
from django_tables2 import RequestConfig, SingleTableMixin, SingleTableView
from django_tables2 import SingleTableMixin, SingleTableView
from dynamic_preferences.forms import preference_form_builder
from graphene_django.views import GraphQLView
from graphql import GraphQLError
from guardian.shortcuts import GroupObjectPermission, UserObjectPermission, get_objects_for_user
from guardian.shortcuts import GroupObjectPermission, UserObjectPermission
from haystack.generic_views import SearchView
from haystack.inputs import AutoQuery
from haystack.query import SearchQuerySet
......@@ -70,10 +70,8 @@ from aleksis.core.data_checks import DataCheck, check_data
from .celery import app
from .decorators import pwa_cache
from .filters import (
GroupFilter,
GroupGlobalPermissionFilter,
GroupObjectPermissionFilter,
PersonFilter,
UserGlobalPermissionFilter,
UserObjectPermissionFilter,
)
......@@ -119,9 +117,7 @@ from .tables import (
DashboardWidgetTable,
GroupGlobalPermissionTable,
GroupObjectPermissionTable,
GroupsTable,
InvitationsTable,
PersonsTable,
UserGlobalPermissionTable,
UserObjectPermissionTable,
)
......@@ -245,55 +241,6 @@ def index(request: HttpRequest) -> HttpResponse:
return render(request, "core/index.html", context)
@pwa_cache
@permission_required("core.view_persons_rule")
def persons(request: HttpRequest) -> HttpResponse:
"""List view listing all persons."""
context = {}
# Get all persons
persons = get_objects_for_user(request.user, "core.view_person", Person.objects.all())
# Get filter
persons_filter = PersonFilter(request.GET, queryset=persons)
context["persons_filter"] = persons_filter
# Build table
persons_table = PersonsTable(persons_filter.qs)
RequestConfig(request).configure(persons_table)
context["persons_table"] = persons_table
return render(request, "core/person/list.html", context)
@pwa_cache
@permission_required("core.view_groups_rule")
def groups(request: HttpRequest) -> HttpResponse:
"""List view for listing all groups."""
context = {}
# Get all groups
groups = get_objects_for_user(request.user, "core.view_group", Group)
groups = (
groups
| Group.objects.filter(
owners=request.user.person,
group_type__owners_can_see_groups=True,
)
).distinct()
# Get filter
groups_filter = GroupFilter(request.GET, queryset=groups)
context["groups_filter"] = groups_filter
# Build table
groups_table = GroupsTable(groups_filter.qs)
RequestConfig(request).configure(groups_table)
context["groups_table"] = groups_table
return render(request, "core/group/list.html", context)
@method_decorator(never_cache, name="dispatch")
class CreatePersonView(PermissionRequiredMixin, AdvancedCreateView):
form_class = PersonForm
......@@ -1322,7 +1269,12 @@ class LoggingGraphQLView(GraphQLView):
result = super().execute_graphql_request(*args, **kwargs)
errors = result.errors or []
for error in errors:
if not isinstance(error.original_error, (GraphQLError, ValidationError)):
if not isinstance(
error.original_error,
(GraphQLError, ValidationError, PermissionDenied, ObjectDoesNotExist),
):
if isinstance(error.original_error, ObjectDoesNotExist):
raise GraphQLError from PermissionDenied
raise error
# Pass validation errors to frontend
......
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