From 013487d4d890e15dd7350656e7d38ebaf05c3543 Mon Sep 17 00:00:00 2001 From: samuelson-ben Date: Thu, 24 Jul 2025 18:50:20 +0200 Subject: [PATCH 01/13] added permission for new notification --- ephios_submit_qualifications/models.py | 1 + ephios_submit_qualifications/signals.py | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/ephios_submit_qualifications/models.py b/ephios_submit_qualifications/models.py index 6040c78..6087387 100644 --- a/ephios_submit_qualifications/models.py +++ b/ephios_submit_qualifications/models.py @@ -30,6 +30,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"), + ("ephios_submit_qualifications.get_notifications_for_new_qualification_requests", "Can get Notifications for new Qualification Request if Subscribed"), ] def __str__(self): 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", ], ), ), From da4aa4e3c3aefe73787610f76a71827e185504e2 Mon Sep 17 00:00:00 2001 From: samuelson-ben Date: Thu, 24 Jul 2025 19:18:33 +0200 Subject: [PATCH 02/13] added import --- ephios_submit_qualifications/views.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ephios_submit_qualifications/views.py b/ephios_submit_qualifications/views.py index e901e97..4871211 100644 --- a/ephios_submit_qualifications/views.py +++ b/ephios_submit_qualifications/views.py @@ -14,12 +14,13 @@ from .forms import ( QualificationSubmitForm, QualificationDetailForm, + QualificationCreateSubscriptionForm, QualificationDefaultExpirationTimeAddForm, - QualificationDefaultExpirationTimeDetailForm + QualificationDefaultExpirationTimeDetailForm, ) from .models import ( QualificationRequest, - QualificationDefaultExpirationTime + QualificationDefaultExpirationTime, ) from .notifications import ( QualificationRequestAcceptedNotification, From 2324086d3b17e3a8405b669829f6753181dba075 Mon Sep 17 00:00:00 2001 From: samuelson-ben Date: Thu, 24 Jul 2025 19:18:48 +0200 Subject: [PATCH 03/13] added model for subscription --- ephios_submit_qualifications/models.py | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/ephios_submit_qualifications/models.py b/ephios_submit_qualifications/models.py index 6087387..3ae1ead 100644 --- a/ephios_submit_qualifications/models.py +++ b/ephios_submit_qualifications/models.py @@ -30,12 +30,32 @@ 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"), - ("ephios_submit_qualifications.get_notifications_for_new_qualification_requests", "Can get Notifications for new Qualification Request if Subscribed"), ] def __str__(self): return f"{self.user} requested {self.qualification} on {self.requested_at}" +class QualificationCreateSubscription(models.Model): + user = models.ForeignKey( + settings.AUTH_USER_MODEL, + on_delete=models.CASCADE, + related_name='qualification_create_subscription', + ) + subscriped = models.BooleanField( + default=False, + ) + + class Meta: + verbose_name = "Qualification Create Subscription" + verbose_name_plural = "Qualification Create Subscriptions" + ordering = ['user'] + permissions = [ + ("ephios_submit_qualifications.get_notifications_for_new_qualification_requests", "Can get Notifications for new Qualification Request if Subscribed"), + ] + + def __str__(self): + return f"{self.user} subscribed: {self.subscriped}" + class QualificationDefaultExpirationTime(models.Model): qualification = models.ForeignKey( Qualification, From 423cc1861481489e79087af2f086eb371716b36a Mon Sep 17 00:00:00 2001 From: samuelson-ben Date: Thu, 24 Jul 2025 19:18:58 +0200 Subject: [PATCH 04/13] added subscription form --- ephios_submit_qualifications/forms.py | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/ephios_submit_qualifications/forms.py b/ephios_submit_qualifications/forms.py index cdb9286..b9ecfa9 100644 --- a/ephios_submit_qualifications/forms.py +++ b/ephios_submit_qualifications/forms.py @@ -1,7 +1,11 @@ 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, + QualificationCreateSubscription, + QualificationDefaultExpirationTime, +) class QualificationSubmitForm(forms.ModelForm): qualification = forms.ModelChoiceField( @@ -62,6 +66,20 @@ class QualificationDetailForm(forms.Form): widget=forms.HiddenInput(), ) +class QualificationCreateSubscriptionForm(forms.ModelForm): + user = forms.CharField( + required=True, + widget=forms.HiddenInput() + ) + subscriped = forms.BooleanField( + required=True, + widget=forms.HiddenInput() + ) + + class Meta: + model = QualificationCreateSubscription + fields = ['user', 'subscriped'] + class QualificationDefaultExpirationTimeAddForm(forms.ModelForm): qualification = forms.ModelChoiceField( queryset=Qualification.objects.all(), From 769ff994becb1fb3e384ec4329a6f4df1532cc19 Mon Sep 17 00:00:00 2001 From: samuelson-ben Date: Thu, 24 Jul 2025 20:08:32 +0200 Subject: [PATCH 05/13] chnaged permissions and removed table --- ephios_submit_qualifications/models.py | 24 +----------------------- 1 file changed, 1 insertion(+), 23 deletions(-) diff --git a/ephios_submit_qualifications/models.py b/ephios_submit_qualifications/models.py index 3ae1ead..2536709 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,32 +28,12 @@ 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"), + ("ephios_submit_qualifications.get_notifications_for_new_qualification_requests", "Can get Notifications for new Qualification Request if Subscribed"), ] def __str__(self): return f"{self.user} requested {self.qualification} on {self.requested_at}" -class QualificationCreateSubscription(models.Model): - user = models.ForeignKey( - settings.AUTH_USER_MODEL, - on_delete=models.CASCADE, - related_name='qualification_create_subscription', - ) - subscriped = models.BooleanField( - default=False, - ) - - class Meta: - verbose_name = "Qualification Create Subscription" - verbose_name_plural = "Qualification Create Subscriptions" - ordering = ['user'] - permissions = [ - ("ephios_submit_qualifications.get_notifications_for_new_qualification_requests", "Can get Notifications for new Qualification Request if Subscribed"), - ] - - def __str__(self): - return f"{self.user} subscribed: {self.subscriped}" - class QualificationDefaultExpirationTime(models.Model): qualification = models.ForeignKey( Qualification, From f6cfae2385fe468c9659ff610488d47f4acc4b9a Mon Sep 17 00:00:00 2001 From: samuelson-ben Date: Thu, 24 Jul 2025 20:09:22 +0200 Subject: [PATCH 06/13] removed for for subscription --- ephios_submit_qualifications/forms.py | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/ephios_submit_qualifications/forms.py b/ephios_submit_qualifications/forms.py index b9ecfa9..30469d1 100644 --- a/ephios_submit_qualifications/forms.py +++ b/ephios_submit_qualifications/forms.py @@ -3,7 +3,6 @@ from ephios.core.models import Qualification from .models import ( QualificationRequest, - QualificationCreateSubscription, QualificationDefaultExpirationTime, ) @@ -66,20 +65,6 @@ class QualificationDetailForm(forms.Form): widget=forms.HiddenInput(), ) -class QualificationCreateSubscriptionForm(forms.ModelForm): - user = forms.CharField( - required=True, - widget=forms.HiddenInput() - ) - subscriped = forms.BooleanField( - required=True, - widget=forms.HiddenInput() - ) - - class Meta: - model = QualificationCreateSubscription - fields = ['user', 'subscriped'] - class QualificationDefaultExpirationTimeAddForm(forms.ModelForm): qualification = forms.ModelChoiceField( queryset=Qualification.objects.all(), From 98563922300f96e71c3e73261a2c441c12a9116f Mon Sep 17 00:00:00 2001 From: samuelson-ben Date: Thu, 24 Jul 2025 20:10:49 +0200 Subject: [PATCH 07/13] revert changes --- ephios_submit_qualifications/views.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ephios_submit_qualifications/views.py b/ephios_submit_qualifications/views.py index 4871211..b6adc7a 100644 --- a/ephios_submit_qualifications/views.py +++ b/ephios_submit_qualifications/views.py @@ -14,7 +14,6 @@ from .forms import ( QualificationSubmitForm, QualificationDetailForm, - QualificationCreateSubscriptionForm, QualificationDefaultExpirationTimeAddForm, QualificationDefaultExpirationTimeDetailForm, ) @@ -105,6 +104,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): @@ -200,6 +200,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" From 5ac1757a1b9d7c77458de82389167c9666a2742b Mon Sep 17 00:00:00 2001 From: samuelson-ben Date: Thu, 24 Jul 2025 20:11:59 +0200 Subject: [PATCH 08/13] changed url --- ephios_submit_qualifications/notifications.py | 45 ++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/ephios_submit_qualifications/notifications.py b/ephios_submit_qualifications/notifications.py index 335a9e5..b0c37cb 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,46 @@ 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, consequence: Consequence, reason=None): + qualification_request = consequence.qualification_request + Notification.objects.create( + slug=cls.slug, + user=qualification_request.user, + data={ + "username": getattr(qualification_request, 'user', _('Unknown Username')), + }, + ) + + @classmethod + def get_subject(cls, notification): + return _("Qualification Request Created") + + @classmethod + def get_body(cls, notification): + base_text = _( + "{username} created a qualification request." + ).format( + qualification=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 From b2047900969e14d02c88785ea32623f48c46d5ff Mon Sep 17 00:00:00 2001 From: samuelson-ben Date: Thu, 24 Jul 2025 20:17:56 +0200 Subject: [PATCH 09/13] namechange --- ephios_submit_qualifications/urls.py | 4 ++-- ephios_submit_qualifications/views.py | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) 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 b6adc7a..5bad6aa 100644 --- a/ephios_submit_qualifications/views.py +++ b/ephios_submit_qualifications/views.py @@ -48,7 +48,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") @@ -83,6 +83,8 @@ def form_valid(self, form): image_content_type=image_content_type ) + + return super().form_valid(form) class QualificationRequestsView(LoginRequiredMixin, TemplateView): From e646ee5b695afce627153e8e4c3dc38fd0a808e4 Mon Sep 17 00:00:00 2001 From: samuelson-ben Date: Thu, 24 Jul 2025 20:19:19 +0200 Subject: [PATCH 10/13] add notification --- ephios_submit_qualifications/views.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ephios_submit_qualifications/views.py b/ephios_submit_qualifications/views.py index 5bad6aa..3dcaf9d 100644 --- a/ephios_submit_qualifications/views.py +++ b/ephios_submit_qualifications/views.py @@ -24,6 +24,7 @@ from .notifications import ( QualificationRequestAcceptedNotification, QualificationRequestRejectedNotification, + QualificationRequestCreateNotification, ) class OwnQualificationRequestView(LoginRequiredMixin, TemplateView): @@ -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,7 +84,7 @@ def form_valid(self, form): image_content_type=image_content_type ) - + QualificationRequestCreateNotification.send(qualification_request) return super().form_valid(form) From f20a18eec917e4a100705f2f978ab9300cad4460 Mon Sep 17 00:00:00 2001 From: samuelson-ben Date: Thu, 24 Jul 2025 21:06:45 +0200 Subject: [PATCH 11/13] corrected qualification name --- ephios_submit_qualifications/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ephios_submit_qualifications/models.py b/ephios_submit_qualifications/models.py index 2536709..76bf0aa 100644 --- a/ephios_submit_qualifications/models.py +++ b/ephios_submit_qualifications/models.py @@ -28,7 +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"), - ("ephios_submit_qualifications.get_notifications_for_new_qualification_requests", "Can get Notifications for new Qualification Request if Subscribed"), + ("get_notifications_for_new_qualification_requests", "Can get Notifications for new Qualification Request if Subscribed"), ] def __str__(self): From c315663a1421d4ac65df25969c18ccda2f44a825 Mon Sep 17 00:00:00 2001 From: samuelson-ben Date: Thu, 24 Jul 2025 21:06:57 +0200 Subject: [PATCH 12/13] corrected notification username --- ephios_submit_qualifications/notifications.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/ephios_submit_qualifications/notifications.py b/ephios_submit_qualifications/notifications.py index b0c37cb..b9e5e62 100644 --- a/ephios_submit_qualifications/notifications.py +++ b/ephios_submit_qualifications/notifications.py @@ -108,13 +108,12 @@ class QualificationRequestCreateNotification(AbstractNotificationHandler): title = _("Qualification Request Created") @classmethod - def send(cls, consequence: Consequence, reason=None): - qualification_request = consequence.qualification_request + def send(cls, user, qualification_request): Notification.objects.create( slug=cls.slug, - user=qualification_request.user, + user=user, data={ - "username": getattr(qualification_request, 'user', _('Unknown Username')), + "username": qualification_request.user.get_full_name() or _('Unknown Username'), }, ) @@ -125,9 +124,9 @@ def get_subject(cls, notification): @classmethod def get_body(cls, notification): base_text = _( - "{username} created a qualification request." + "{username} created a new qualification request." ).format( - qualification=notification.data.get('username', _('Unknown Username')), + username=notification.data.get('username', _('Unknown Username')), ) return base_text From 3c623cc7cf381a65354ec0b53b82fc59274ced78 Mon Sep 17 00:00:00 2001 From: samuelson-ben Date: Thu, 24 Jul 2025 21:07:38 +0200 Subject: [PATCH 13/13] managed import --- ephios_submit_qualifications/views.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ephios_submit_qualifications/views.py b/ephios_submit_qualifications/views.py index 3dcaf9d..5f5d63b 100644 --- a/ephios_submit_qualifications/views.py +++ b/ephios_submit_qualifications/views.py @@ -10,7 +10,7 @@ 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, @@ -84,7 +84,9 @@ def form_valid(self, form): image_content_type=image_content_type ) - QualificationRequestCreateNotification.send(qualification_request) + 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)