diff --git a/lunes_cms/cmsv2/admin.py b/lunes_cms/cmsv2/admin.py index 60909df7..6505f7b5 100644 --- a/lunes_cms/cmsv2/admin.py +++ b/lunes_cms/cmsv2/admin.py @@ -5,12 +5,96 @@ from __future__ import absolute_import, unicode_literals -from django.contrib import admin +from datetime import datetime +from typing import Any + +from django.contrib import admin, messages from django.contrib.auth.models import User +from django.http import HttpRequest, HttpResponse +from django.shortcuts import redirect +from django.template.response import TemplateResponse +from django.utils.translation import gettext_lazy as _ + +from lunes_cms.core import settings from .admins import FeedbackAdmin, JobAdmin, LunesUserAdmin, UnitAdmin, WordAdmin -from .models import Feedback, Job, Unit, Word +from .models import Feedback, Job, Review, Unit, Word +from .models.static import ReviewStatus, Roles + +_default_index = admin.AdminSite.index + + +def index( + self: admin.AdminSite, + request: HttpRequest, + extra_context: dict[str, Any] | None = None, +) -> HttpResponse: + """ + Renders an empty dashboard for members of :attr:`Roles.EXPERT_GROUP` + instead of Jazzmin's default app-list dashboard. + + :param self: A handle to the :class:`admin.AdminSite` + :param request: current user request + :param extra_context: additional context forwarded to the default dashboard + + :return: the rendered dashboard response + """ + if request.user.groups.filter(name=Roles.EXPERT_GROUP).exists(): + reviews = Review.objects.filter( + reviewer=request.user, completed_at__isnull=True + ).order_by("assigned_at") + review_id = request.GET.get("review") + current_review = ( + reviews.filter(pk=review_id).first() if review_id else None + ) or reviews.first() + next_review = None + if current_review: + next_review = reviews.filter( + assigned_at__gt=current_review.assigned_at + ).first() + context = { + **self.each_context(request), + "reviews": reviews, + "current_review": current_review, + "next_review": next_review, + "base_url": settings.MEDIA_URL, + **(extra_context or {}), + } + + if current_review: + if request.POST.get("approve"): + current_review.review_status = ReviewStatus.APPROVED + current_review.completed_at = datetime.now() + current_review.save() + messages.success( + request, + (_("The word {} has been approved.").format(current_review.word)), + ) + if next_review is not None: + return redirect(f"{request.path}?review={next_review.id}") + return TemplateResponse(request, "admin/index_empty.html", context) + + if request.POST.get("reject"): + current_review.review_status = ReviewStatus.REJECTED + current_review.completed_at = datetime.now() + current_review.save() + if next_review is not None: + return redirect(f"{request.path}?review={next_review.id}") + return TemplateResponse(request, "admin/index_empty.html", context) + + if request.POST.get("not_assessed"): + current_review.review_status = ReviewStatus.CANNOT_BE_ASSESSED + current_review.completed_at = datetime.now() + current_review.save() + if next_review is not None: + return redirect(f"{request.path}?review={next_review.id}") + return TemplateResponse(request, "admin/index_empty.html", context) + + return TemplateResponse(request, "admin/index_empty.html", context) + return _default_index(self, request, extra_context) + +admin.AdminSite.index = index # type: ignore[method-assign,assignment] admin.site.register(Job, JobAdmin) admin.site.register(Unit, UnitAdmin) admin.site.register(Word, WordAdmin) diff --git a/lunes_cms/cmsv2/models/static.py b/lunes_cms/cmsv2/models/static.py index 7a0c7c87..da258ed9 100644 --- a/lunes_cms/cmsv2/models/static.py +++ b/lunes_cms/cmsv2/models/static.py @@ -82,6 +82,7 @@ class Roles: DEFAULT_GROUP_NAME = None ADMIN_GROUP = "Lunes" REVIEWER_GROUP = _("Reviewer") + EXPERT_GROUP = "Lunes Expert:innen (v2)" class Permissions: diff --git a/lunes_cms/cmsv2/templates/admin/index_empty.html b/lunes_cms/cmsv2/templates/admin/index_empty.html new file mode 100644 index 00000000..c953f61c --- /dev/null +++ b/lunes_cms/cmsv2/templates/admin/index_empty.html @@ -0,0 +1,66 @@ +{% extends "admin/base_site.html" %} +{% load i18n %} +{% block content %} +
{{ reviews|length }} {% translate "open reviews" %}
+ {% if reviews %} +{% translate "Currently there are no words to check" %}
+ {% endif %} +