diff --git a/ephios_submit_qualifications/forms.py b/ephios_submit_qualifications/forms.py index cdb9286..30469d1 100644 --- a/ephios_submit_qualifications/forms.py +++ b/ephios_submit_qualifications/forms.py @@ -1,7 +1,10 @@ from django.utils.translation import gettext_lazy as _ from django import forms from ephios.core.models import Qualification -from .models import QualificationRequest, QualificationDefaultExpirationTime +from .models import ( + QualificationRequest, + QualificationDefaultExpirationTime, +) class QualificationSubmitForm(forms.ModelForm): qualification = forms.ModelChoiceField( diff --git a/ephios_submit_qualifications/models.py b/ephios_submit_qualifications/models.py index 6040c78..76bf0aa 100644 --- a/ephios_submit_qualifications/models.py +++ b/ephios_submit_qualifications/models.py @@ -1,8 +1,6 @@ from django.db import models from django.conf import settings from ephios.core.models import Qualification -from logging import getLogger -import os class QualificationRequest(models.Model): user = models.ForeignKey( @@ -30,6 +28,7 @@ class Meta: ("add_qualification_request", "Can add qualification requests"), ("manage_qualification_requests", "Can manage qualification requests"), ("manage_own_qualification_requests", "Can manage own qualification requests"), + ("get_notifications_for_new_qualification_requests", "Can get Notifications for new Qualification Request if Subscribed"), ] def __str__(self): diff --git a/ephios_submit_qualifications/notifications.py b/ephios_submit_qualifications/notifications.py index 335a9e5..b9e5e62 100644 --- a/ephios_submit_qualifications/notifications.py +++ b/ephios_submit_qualifications/notifications.py @@ -7,6 +7,7 @@ def register_notifications(sender, **kwargs): return [ QualificationRequestAcceptedNotification, QualificationRequestRejectedNotification, + QualificationRequestCreateNotification, ] class QualificationRequestAcceptedNotification(AbstractNotificationHandler): @@ -100,4 +101,45 @@ def as_html(cls, notification): @classmethod def get_url(cls, notification): - return reverse("core:settings_personal_data") \ No newline at end of file + return reverse("core:settings_personal_data") + +class QualificationRequestCreateNotification(AbstractNotificationHandler): + slug = "qualification_request_created" + title = _("Qualification Request Created") + + @classmethod + def send(cls, user, qualification_request): + Notification.objects.create( + slug=cls.slug, + user=user, + data={ + "username": qualification_request.user.get_full_name() or _('Unknown Username'), + }, + ) + + @classmethod + def get_subject(cls, notification): + return _("Qualification Request Created") + + @classmethod + def get_body(cls, notification): + base_text = _( + "{username} created a new qualification request." + ).format( + username=notification.data.get('username', _('Unknown Username')), + ) + return base_text + + @classmethod + def as_html(cls, notification): + return """ +
{subject}
+{body}
+ """.format( + subject=cls.get_subject(notification), + body=cls.get_body(notification), + ) + + @classmethod + def get_url(cls, notification): + return reverse("ephios_submit_qualifications:qualification_requests") \ No newline at end of file diff --git a/ephios_submit_qualifications/signals.py b/ephios_submit_qualifications/signals.py index 2cedc79..0d6a5f3 100644 --- a/ephios_submit_qualifications/signals.py +++ b/ephios_submit_qualifications/signals.py @@ -50,7 +50,7 @@ def add_navigation_item(sender, request, **kwargs): def register_permission_fields(sender, **kwargs): return [ ( - "submit_qualification_requests", + "add_qualification_requests", PermissionField( label=_("Submit Qualification Requests"), help_text=_("Allows to submit qualification requests."), @@ -69,6 +69,7 @@ def register_permission_fields(sender, **kwargs): "ephios_submit_qualifications.view_qualification_requests", "ephios_submit_qualifications.view_qualification_request_details", "ephios_submit_qualifications.manage_qualification_requests", + "ephios_submit_qualifications.get_notifications_for_new_qualification_requests", ], ), ), diff --git a/ephios_submit_qualifications/urls.py b/ephios_submit_qualifications/urls.py index fbbedaa..15c83b9 100644 --- a/ephios_submit_qualifications/urls.py +++ b/ephios_submit_qualifications/urls.py @@ -2,7 +2,7 @@ from django.urls import path from .views import ( OwnQualificationRequestView, - QualificationSubmitView, + QualificationRequestAddView, QualificationRequestsView, QualificationRequestDetailView, qualification_request_image, @@ -21,7 +21,7 @@ ), path( "settings/qualifications/own/submit/", - QualificationSubmitView.as_view(), + QualificationRequestAddView.as_view(), name="qualification_submit_form", ), path( diff --git a/ephios_submit_qualifications/views.py b/ephios_submit_qualifications/views.py index e901e97..5f5d63b 100644 --- a/ephios_submit_qualifications/views.py +++ b/ephios_submit_qualifications/views.py @@ -10,20 +10,21 @@ from django.shortcuts import get_object_or_404 from django.views.generic import FormView, TemplateView from django.urls import reverse_lazy -from ephios.core.models import QualificationGrant +from ephios.core.models import UserProfile, QualificationGrant from .forms import ( QualificationSubmitForm, QualificationDetailForm, QualificationDefaultExpirationTimeAddForm, - QualificationDefaultExpirationTimeDetailForm + QualificationDefaultExpirationTimeDetailForm, ) from .models import ( QualificationRequest, - QualificationDefaultExpirationTime + QualificationDefaultExpirationTime, ) from .notifications import ( QualificationRequestAcceptedNotification, QualificationRequestRejectedNotification, + QualificationRequestCreateNotification, ) class OwnQualificationRequestView(LoginRequiredMixin, TemplateView): @@ -48,7 +49,7 @@ def get_context_data(self, **kwargs): context['can_submit'] = self.request.user.has_perm('ephios_submit_qualifications.add_qualification_request') return context -class QualificationSubmitView(LoginRequiredMixin, FormView): +class QualificationRequestAddView(LoginRequiredMixin, FormView): template_name = "ephios_submit_qualifications/qualification_requests/add_form.html" form_class = QualificationSubmitForm success_url = reverse_lazy("ephios_submit_qualifications:own_qualification_requests") @@ -75,7 +76,7 @@ def form_valid(self, form): image_data = None image_content_type = None - QualificationRequest.objects.create( + qualification_request = QualificationRequest.objects.create( user=self.request.user, qualification=form.cleaned_data['qualification'], qualification_date=form.cleaned_data['qualification_date'], @@ -83,6 +84,10 @@ def form_valid(self, form): image_content_type=image_content_type ) + for user in UserProfile.objects.all(): + if user.has_perm('ephios_submit_qualifications.get_notifications_for_new_qualification_requests'): + QualificationRequestCreateNotification.send(user, qualification_request) + return super().form_valid(form) class QualificationRequestsView(LoginRequiredMixin, TemplateView): @@ -104,6 +109,7 @@ def get_initial(self): def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context['qualification_requests'] = QualificationRequest.objects.all() + context['can_subscribe'] = self.request.user.has_perm('ephios_submit_qualifications.get_notifications_for_new_qualification_requests') return context class QualificationRequestDetailView(LoginRequiredMixin, FormView): @@ -199,6 +205,7 @@ def qualification_request_image(request, pk): content_type=qr.image_content_type or 'application/octet-stream' ) + class QualificationDefaultExpirationTimeListView(LoginRequiredMixin, TemplateView): template_name = "ephios_submit_qualifications/qualification_default_expiration_time/list.html"