Skip to content
Snippets Groups Projects
Commit e9a035da authored by Hangzhi Yu's avatar Hangzhi Yu
Browse files

Generalize get_*_by_pk functions

parent c867eec4
No related branches found
No related tags found
1 merge request!243Resolve "Rewrite notification_mark_read with rules and permissions"
Pipeline #1890 passed with warnings
......@@ -4,7 +4,7 @@ from operator import itemgetter
import os
import pkgutil
from importlib import import_module
from typing import Any, Callable, Sequence, Union, List
from typing import Any, Callable, Sequence, Union, List, Optional
from uuid import uuid4
from django.conf import settings
......@@ -192,37 +192,13 @@ def now_tomorrow() -> datetime:
return timezone.now() + timedelta(days=1)
def get_person_by_pk(request: HttpRequest, id_: Optional[int] = None):
""" Get a person by its ID, defaulting to person in request's user """
from ..models import Person # noqa
if id_:
return get_object_or_404(Person, pk=id_)
else:
return request.user.person
def get_group_by_pk(request: HttpRequest, id_: Optional[int] = None) -> Group:
""" Get a group by its ID, defaulting to None """
if id_:
return get_object_or_404(Group, id=id_)
return None
def get_announcement_by_pk(request: HttpRequest, id_: Optional[int] = None):
""" Get an announcement by its ID; defaulting to None """
if id_:
return get_object_or_404(Announcement, pk=pk)
return None
def objectgetter_optional(model: Model, default: Optional[Any] = None, default_eval: bool = False) -> Callable[[HttpRequest, Optional[int]], Model]:
""" Get an object by pk, defaulting to None """
def get_object(request: HttpRequest, id_: Optional[int] = None) -> Model:
if id_ is not None:
return get_object_or_404(model, pk=id_)
else:
return eval(default) if default_eval else default
def get_notification_by_pk(request: HttpRequest, pk: int):
try:
return get_object_or_404(Notification, pk=pk)
except:
return None
return get_object
......@@ -33,7 +33,7 @@ from .registries import site_preferences_registry, group_preferences_registry, p
from .tables import GroupsTable, PersonsTable
from .util import messages
from .util.apps import AppConfig
from .util.core_helpers import get_announcement_by_pk, get_group_by_pk, get_person_by_pk, get_notification_by_pk
from .util.core_helpers import objectgetter_optional
@permission_required("core.view_dashboard")
......@@ -97,13 +97,13 @@ def persons(request: HttpRequest) -> HttpResponse:
return render(request, "core/persons.html", context)
@permission_required("core.view_person", fn=get_person_by_pk)
@permission_required("core.view_person", fn=objectgetter_optional(Person, "request.user.person", True))
def person(request: HttpRequest, id_: Optional[int] = None) -> HttpResponse:
""" Detail view for one person; defaulting to logged-in person """
context = {}
person = get_person_by_pk(request, id_)
person = objectgetter_optional(Person, "request.user.person", True)(request, id_)
context["person"] = person
# Get groups where person is member of
......@@ -117,13 +117,13 @@ def person(request: HttpRequest, id_: Optional[int] = None) -> HttpResponse:
return render(request, "core/person_full.html", context)
@permission_required("core.view_group", fn=get_group_by_pk)
@permission_required("core.view_group", fn=objectgetter_optional(Group, None, False))
def group(request: HttpRequest, id_: int) -> HttpResponse:
""" Detail view for one group """
context = {}
group = get_group_by_pk(request, id_)
group = objectgetter_optional(Group, None, False)(request, id_)
context["group"] = group
# Get group
......@@ -224,13 +224,13 @@ def groups_child_groups(request: HttpRequest) -> HttpResponse:
return render(request, "core/groups_child_groups.html", context)
@permission_required("core.edit_person", fn=get_person_by_pk)
@permission_required("core.edit_person", fn=objectgetter_optional(Person, "request.user.person", True))
def edit_person(request: HttpRequest, id_: Optional[int] = None) -> HttpResponse:
""" Edit view for a single person, defaulting to logged-in person """
context = {}
person = get_person_by_pk(request, id_)
person = objectgetter_optional(Person, "request.user.person", True)(request, id_)
context["person"] = person
edit_person_form = EditPersonForm(request.POST or None, request.FILES or None, instance=person)
......@@ -255,13 +255,13 @@ def get_group_by_id(request: HttpRequest, id_: Optional[int] = None):
return None
@permission_required("core.edit_group", fn=get_group_by_pk)
@permission_required("core.edit_group", fn=objectgetter_optional(Group, None, False))
def edit_group(request: HttpRequest, id_: Optional[int] = None) -> HttpResponse:
""" View to edit or create a group """
context = {}
group = get_group_by_pk(request, id_)
group = objectgetter_optional(Group, None, False)(request, id_)
context["group"] = group
if id_:
......@@ -301,13 +301,13 @@ def system_status(request: HttpRequest) -> HttpResponse:
return render(request, "core/system_status.html", context)
@permission_required("core.mark_notification_as_read", fn=get_notification_by_pk)
@permission_required("core.mark_notification_as_read", fn=objectgetter_optional(Notification, None, False))
def notification_mark_read(request: HttpRequest, id_: int) -> HttpResponse:
""" Mark a notification read """
context = {}
notification = get_notification_by_pk(request, id_)
notification = objectgetter_optional(Notification, None, False)(request, id_)
notification.read = True
notification.save()
......@@ -329,13 +329,13 @@ def announcements(request: HttpRequest) -> HttpResponse:
return render(request, "core/announcement/list.html", context)
@permission_required("core.create_or_edit_announcement", fn=get_announcement_by_pk)
def announcement_form(request: HttpRequest, pk: Optional[int] = None) -> HttpResponse:
@permission_required("core.create_or_edit_announcement", fn=objectgetter_optional(Announcement, None, False))
def announcement_form(request: HttpRequest, id_: Optional[int] = None) -> HttpResponse:
""" View to create or edit an announcement """
context = {}
announcement = get_announcement_by_pk(request, pk)
announcement = objectgetter_optional(Announcement, None, False)(request, id_)
if announcement:
# Edit form for existing announcement
......@@ -361,12 +361,12 @@ def announcement_form(request: HttpRequest, pk: Optional[int] = None) -> HttpRes
return render(request, "core/announcement/form.html", context)
@permission_required("core.delete_announcement", fn=get_announcement_by_pk)
def delete_announcement(request: HttpRequest, pk: int) -> HttpResponse:
@permission_required("core.delete_announcement", fn=objectgetter_optional(Announcement, None, False))
def delete_announcement(request: HttpRequest, id_: int) -> HttpResponse:
""" View to delete an announcement """
if request.method == "POST":
announcement = get_announcement_by_pk(request, pk)
announcement = objectgetter_optional(Announcement, None, False)(request, id_)
announcement.delete()
messages.success(request, _("The announcement has been deleted."))
......
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