From ef65869c7c8b951419c2b8e6d4c559dd0be14eb9 Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Wed, 12 Jan 2022 12:56:22 +0100 Subject: [PATCH 1/8] # 63 Refactoring * refactors django User model to custom User model to provide further attributes and methods directly on the user model --- compensation/forms/forms.py | 2 +- compensation/models/compensation.py | 2 +- compensation/models/eco_account.py | 2 +- compensation/tables.py | 2 +- compensation/utils/quality.py | 12 -- ema/forms.py | 2 +- intervention/forms/forms.py | 2 +- intervention/forms/modalForms.py | 2 +- intervention/models/intervention.py | 2 +- konova/autocompletes.py | 2 +- konova/forms.py | 2 +- konova/management/commands/setup.py | 3 +- konova/management/commands/setup_data.py | 3 +- konova/models/object.py | 7 +- konova/sso/sso.py | 3 +- konova/sub_settings/django_settings.py | 2 +- konova/tasks.py | 9 +- konova/tests/test_views.py | 3 +- konova/utils/mailer.py | 37 ++++-- konova/utils/messenger.py | 2 +- konova/utils/user_checks.py | 2 +- locale/de/LC_MESSAGES/django.mo | Bin 29827 -> 29910 bytes locale/de/LC_MESSAGES/django.po | 105 ++++++++++-------- .../email/sharing/shared_access_removed.html | 0 user/admin.py | 14 ++- user/enums.py | 5 +- user/forms.py | 12 +- user/models/__init__.py | 2 +- user/models/konova_user.py | 19 ---- user/models/user.py | 28 +++++ user/models/user_action.py | 15 ++- user/views.py | 7 +- 32 files changed, 174 insertions(+), 136 deletions(-) create mode 100644 templates/email/sharing/shared_access_removed.html delete mode 100644 user/models/konova_user.py create mode 100644 user/models/user.py diff --git a/compensation/forms/forms.py b/compensation/forms/forms.py index dbd3c6c8..0970daad 100644 --- a/compensation/forms/forms.py +++ b/compensation/forms/forms.py @@ -6,7 +6,7 @@ Created on: 04.12.20 """ from dal import autocomplete -from django.contrib.auth.models import User +from user.models import User from django.db import transaction from django.urls import reverse_lazy, reverse from django.utils.translation import gettext_lazy as _ diff --git a/compensation/models/compensation.py b/compensation/models/compensation.py index 65a62b6e..b68ad105 100644 --- a/compensation/models/compensation.py +++ b/compensation/models/compensation.py @@ -8,7 +8,7 @@ Created on: 16.11.21 import shutil from django.contrib import messages -from django.contrib.auth.models import User +from user.models import User from django.db import models, transaction from django.db.models import QuerySet, Sum from django.http import HttpRequest diff --git a/compensation/models/eco_account.py b/compensation/models/eco_account.py index dad7bfff..7d339b4d 100644 --- a/compensation/models/eco_account.py +++ b/compensation/models/eco_account.py @@ -7,7 +7,7 @@ Created on: 16.11.21 """ import shutil -from django.contrib.auth.models import User +from user.models import User from django.core.exceptions import ValidationError from django.core.validators import MinValueValidator from django.db import models, transaction diff --git a/compensation/tables.py b/compensation/tables.py index 6e6a190b..9daf2b23 100644 --- a/compensation/tables.py +++ b/compensation/tables.py @@ -5,7 +5,7 @@ Contact: michel.peltriaux@sgdnord.rlp.de Created on: 01.12.20 """ -from django.contrib.auth.models import User +from user.models import User from django.http import HttpRequest from django.template.loader import render_to_string from django.urls import reverse diff --git a/compensation/utils/quality.py b/compensation/utils/quality.py index b7f8daa7..b622fcdd 100644 --- a/compensation/utils/quality.py +++ b/compensation/utils/quality.py @@ -58,20 +58,8 @@ class EcoAccountQualityChecker(CompensationQualityChecker): self._check_deductable_surface() self._check_responsible_data() self._check_legal_data() - self._check_record_state() super().run_check() - def _check_record_state(self): - """ Checks the data quality for recorded state - - Returns: - - """ - if self.obj.recorded is None: - self.messages.append( - _("Not recorded") - ) - def _check_legal_data(self): """ Checks the data quality for Legal diff --git a/ema/forms.py b/ema/forms.py index cb7f0cc8..5dc3bcfb 100644 --- a/ema/forms.py +++ b/ema/forms.py @@ -7,7 +7,7 @@ Created on: 06.10.21 """ from dal import autocomplete from django import forms -from django.contrib.auth.models import User +from user.models import User from django.db import transaction from django.urls import reverse, reverse_lazy from django.utils.translation import gettext_lazy as _ diff --git a/intervention/forms/forms.py b/intervention/forms/forms.py index 5340dd6e..6f098151 100644 --- a/intervention/forms/forms.py +++ b/intervention/forms/forms.py @@ -7,7 +7,7 @@ Created on: 02.12.20 """ from dal import autocomplete from django import forms -from django.contrib.auth.models import User +from user.models import User from django.db import transaction from django.urls import reverse, reverse_lazy from django.utils.translation import gettext_lazy as _ diff --git a/intervention/forms/modalForms.py b/intervention/forms/modalForms.py index aea9f2ce..063a912a 100644 --- a/intervention/forms/modalForms.py +++ b/intervention/forms/modalForms.py @@ -6,7 +6,7 @@ Created on: 27.09.21 """ from dal import autocomplete -from django.contrib.auth.models import User +from user.models import User from django.db import transaction from django import forms from django.urls import reverse diff --git a/intervention/models/intervention.py b/intervention/models/intervention.py index 737dd407..6f721237 100644 --- a/intervention/models/intervention.py +++ b/intervention/models/intervention.py @@ -8,7 +8,7 @@ Created on: 15.11.21 import shutil from django.contrib import messages -from django.contrib.auth.models import User +from user.models import User from django.db import models, transaction from django.db.models import QuerySet from django.http import HttpRequest diff --git a/konova/autocompletes.py b/konova/autocompletes.py index f47117cc..bee8dad8 100644 --- a/konova/autocompletes.py +++ b/konova/autocompletes.py @@ -6,7 +6,7 @@ Created on: 07.12.20 """ from dal_select2.views import Select2QuerySetView, Select2GroupQuerySetView -from django.contrib.auth.models import User +from user.models import User from django.db.models import Q from codelist.models import KonovaCode diff --git a/konova/forms.py b/konova/forms.py index 4ad309ed..aae83e6a 100644 --- a/konova/forms.py +++ b/konova/forms.py @@ -12,7 +12,7 @@ from bootstrap_modal_forms.forms import BSModalForm from bootstrap_modal_forms.utils import is_ajax from django import forms from django.contrib import messages -from django.contrib.auth.models import User +from user.models import User from django.contrib.gis.forms import OSMWidget, MultiPolygonField from django.contrib.gis.geos import MultiPolygon from django.db import transaction diff --git a/konova/management/commands/setup.py b/konova/management/commands/setup.py index f02a8e36..6c52ba9e 100644 --- a/konova/management/commands/setup.py +++ b/konova/management/commands/setup.py @@ -7,7 +7,8 @@ Created on: 15.12.20 """ from getpass import getpass -from django.contrib.auth.models import User, Group +from user.models import User +from django.contrib.auth.models import Group from django.core.management import BaseCommand, call_command from django.db import transaction diff --git a/konova/management/commands/setup_data.py b/konova/management/commands/setup_data.py index 85e64907..159dd3ec 100644 --- a/konova/management/commands/setup_data.py +++ b/konova/management/commands/setup_data.py @@ -23,8 +23,7 @@ GROUPS_DATA = [ # Must match with UserNotificationEnum USER_NOTIFICATIONS_NAMES = { - "NOTIFY_ON_NEW_RELATED_DATA": _("On new related data"), - "NOTIFY_ON_SHARE_LINK_DISABLED": _("On disabled share link"), + "NOTIFY_ON_SHARED_ACCESS_GAINED": _("On shared access gained"), "NOTIFY_ON_SHARED_ACCESS_REMOVED": _("On shared access removed"), "NOTIFY_ON_SHARED_DATA_RECORDED": _("On shared data recorded"), "NOTIFY_ON_SHARED_DATA_DELETED": _("On shared data deleted"), diff --git a/konova/models/object.py b/konova/models/object.py index 49c1f4e0..23a21651 100644 --- a/konova/models/object.py +++ b/konova/models/object.py @@ -10,7 +10,7 @@ import uuid from abc import abstractmethod from django.contrib import messages -from django.contrib.auth.models import User +from user.models import User from django.core.exceptions import ObjectDoesNotExist from django.http import HttpRequest from django.utils.timezone import now @@ -411,6 +411,11 @@ class ShareableObjectMixin(models.Model): users = User.objects.filter( id__in=accessing_users ) + removed_users = self.users.all().exclude( + id__in=accessing_users + ) + for user in removed_users: + user.send_mail_shared_access_removed(self) self.share_with_list(users) diff --git a/konova/sso/sso.py b/konova/sso/sso.py index 69cd2b36..f33376fc 100644 --- a/konova/sso/sso.py +++ b/konova/sso/sso.py @@ -5,9 +5,10 @@ Contact: michel.peltriaux@sgdnord.rlp.de Created on: 17.08.21 """ -from django.contrib.auth.models import User from simple_sso.sso_client.client import Client +from user.models import User + class KonovaSSOClient(Client): """ Konova specialized derivate of general sso.Client. diff --git a/konova/sub_settings/django_settings.py b/konova/sub_settings/django_settings.py index df875a81..199ab17a 100644 --- a/konova/sub_settings/django_settings.py +++ b/konova/sub_settings/django_settings.py @@ -129,7 +129,7 @@ DATABASES = { # Password validation # https://docs.djangoproject.com/en/3.1/ref/settings/#auth-password-validators - +AUTH_USER_MODEL = "user.User" AUTH_PASSWORD_VALIDATORS = [ { 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', diff --git a/konova/tasks.py b/konova/tasks.py index b0108a4b..2db4b19f 100644 --- a/konova/tasks.py +++ b/konova/tasks.py @@ -1,3 +1,5 @@ +from time import sleep + from celery import shared_task from django.core.exceptions import ObjectDoesNotExist @@ -5,10 +7,13 @@ from konova.models import Geometry @shared_task -def celery_update_parcels(geometry_id: str): +def celery_update_parcels(geometry_id: str, recheck: bool = True): try: geom = Geometry.objects.get(id=geometry_id) geom.parcels.clear() geom.update_parcels() except ObjectDoesNotExist: - return + if recheck: + sleep(5) + celery_update_parcels(geometry_id, False) + diff --git a/konova/tests/test_views.py b/konova/tests/test_views.py index dad44297..1e0ae7f8 100644 --- a/konova/tests/test_views.py +++ b/konova/tests/test_views.py @@ -7,7 +7,8 @@ Created on: 26.10.21 """ import datetime -from django.contrib.auth.models import User, Group +from user.models import User +from django.contrib.auth.models import Group from django.contrib.gis.geos import MultiPolygon, Polygon from django.core.exceptions import ObjectDoesNotExist from django.test import TestCase, Client diff --git a/konova/utils/mailer.py b/konova/utils/mailer.py index 0dc32c66..cc25f660 100644 --- a/konova/utils/mailer.py +++ b/konova/utils/mailer.py @@ -8,6 +8,8 @@ Created on: 09.11.20 import logging from django.core.mail import send_mail +from django.template.loader import render_to_string +from django.utils.translation import gettext_lazy as _ from konova.sub_settings.django_settings import DEFAULT_FROM_EMAIL @@ -26,18 +28,13 @@ class Mailer: auth_user = None auth_password = None - def __init__(self, to_mail: list, from_mail: str = DEFAULT_FROM_EMAIL, auth_user: str = None, auth_password: str = None, fail_silently: bool = False): - # Make sure given to_mail parameter is a list - if isinstance(to_mail, str): - to_mail = [to_mail] - + def __init__(self, from_mail: str = DEFAULT_FROM_EMAIL, auth_user: str = None, auth_password: str = None, fail_silently: bool = False): self.from_mail = from_mail - self.to_mail = to_mail self.fail_silently = fail_silently self.auth_user = auth_user self.auth_password = auth_password - def send(self, subject: str, msg: str): + def send(self, recipient_list: list, subject: str, msg: str): """ Sends a mail with subject and message """ @@ -45,8 +42,30 @@ class Mailer: subject=subject, message=msg, from_email=self.from_mail, - recipient_list=self.to_mail, + recipient_list=recipient_list, fail_silently=self.fail_silently, auth_user=self.auth_user, auth_password=self.auth_password - ) \ No newline at end of file + ) + + def send_mail_shared_access_removed(self, obj, user): + """ Send a mail if user has no access to the object anymore + + Args: + obj (): + + Returns: + + """ + context = { + "user": user, + "obj": obj, + } + msg = render_to_string("email/sharing/shared_access_removed.html", context) + user_mail_address = [user.email] + self.send( + user_mail_address, + _("{} - Shared access removed").format(obj.identifier), + msg + ) + diff --git a/konova/utils/messenger.py b/konova/utils/messenger.py index 8169d5e6..5be4dc1e 100644 --- a/konova/utils/messenger.py +++ b/konova/utils/messenger.py @@ -8,7 +8,7 @@ Created on: 17.08.21 from collections import Iterable import requests -from django.contrib.auth.models import User +from user.models import User from django.utils.translation import gettext_lazy as _ from konova.settings import SSO_SERVER_BASE, SSO_PUBLIC_KEY, PROXIES diff --git a/konova/utils/user_checks.py b/konova/utils/user_checks.py index a01dadbe..b4f65271 100644 --- a/konova/utils/user_checks.py +++ b/konova/utils/user_checks.py @@ -5,7 +5,7 @@ Contact: michel.peltriaux@sgdnord.rlp.de Created on: 02.07.21 """ -from django.contrib.auth.models import User +from user.models import User from konova.settings import ETS_GROUP, ZB_GROUP diff --git a/locale/de/LC_MESSAGES/django.mo b/locale/de/LC_MESSAGES/django.mo index 1246234f1e0debae2285b00e000c54893295026c..37299851a48bd993a37c2dea089bb4b52d56c980 100644 GIT binary patch delta 8620 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 diff --git a/locale/de/LC_MESSAGES/django.po b/locale/de/LC_MESSAGES/django.po index cb6b2a81..ba3953af 100644 --- a/locale/de/LC_MESSAGES/django.po +++ b/locale/de/LC_MESSAGES/django.po @@ -3,26 +3,30 @@ # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # -#: compensation/filters.py:91 compensation/forms/modalForms.py:34 +#: compensation/filters.py:122 compensation/forms/modalForms.py:34 #: compensation/forms/modalForms.py:45 compensation/forms/modalForms.py:61 #: compensation/forms/modalForms.py:238 compensation/forms/modalForms.py:316 #: intervention/forms/forms.py:52 intervention/forms/forms.py:154 #: intervention/forms/forms.py:166 intervention/forms/modalForms.py:125 #: intervention/forms/modalForms.py:138 intervention/forms/modalForms.py:151 -#: konova/filters.py:63 konova/filters.py:64 konova/filters.py:91 -#: konova/filters.py:92 konova/filters.py:104 konova/filters.py:105 -#: konova/filters.py:117 konova/filters.py:118 konova/filters.py:130 -#: konova/filters.py:131 konova/filters.py:144 konova/filters.py:145 -#: konova/filters.py:280 konova/filters.py:324 konova/forms.py:140 -#: konova/forms.py:241 konova/forms.py:312 konova/forms.py:339 -#: konova/forms.py:349 konova/forms.py:362 konova/forms.py:374 -#: konova/forms.py:392 user/forms.py:38 +#: konova/filters/mixins.py:53 konova/filters/mixins.py:54 +#: konova/filters/mixins.py:81 konova/filters/mixins.py:82 +#: konova/filters/mixins.py:94 konova/filters/mixins.py:95 +#: konova/filters/mixins.py:107 konova/filters/mixins.py:108 +#: konova/filters/mixins.py:120 konova/filters/mixins.py:121 +#: konova/filters/mixins.py:134 konova/filters/mixins.py:135 +#: konova/filters/mixins.py:270 konova/filters/mixins.py:315 +#: konova/filters/mixins.py:353 konova/filters/mixins.py:354 +#: konova/filters/mixins.py:385 konova/filters/mixins.py:386 +#: konova/forms.py:140 konova/forms.py:241 konova/forms.py:312 +#: konova/forms.py:339 konova/forms.py:349 konova/forms.py:362 +#: konova/forms.py:374 konova/forms.py:392 user/forms.py:38 #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-01-11 17:07+0100\n" +"POT-Creation-Date: 2022-01-12 11:33+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -48,7 +52,7 @@ msgstr "Bis" #: intervention/forms/forms.py:100 #: intervention/templates/intervention/detail/view.html:56 #: intervention/templates/intervention/report/report.html:37 -#: intervention/utils/quality.py:49 +#: intervention/utils/quality.py:49 konova/filters/mixins.py:395 msgid "Conservation office" msgstr "Eintragungsstelle" @@ -301,7 +305,7 @@ msgstr "Altfälle" msgid "Before" msgstr "Vor" -#: compensation/filters.py:90 +#: compensation/filters.py:121 msgid "Show only unrecorded" msgstr "Nur unverzeichnete anzeigen" @@ -1218,7 +1222,7 @@ msgstr "Mehrfachauswahl möglich" #: intervention/forms/forms.py:84 #: intervention/templates/intervention/detail/view.html:48 #: intervention/templates/intervention/report/report.html:29 -#: intervention/utils/quality.py:46 +#: intervention/utils/quality.py:46 konova/filters/mixins.py:363 msgid "Registration office" msgstr "Zulassungsbehörde" @@ -1508,62 +1512,73 @@ msgstr "" "somit nichts eingeben, bearbeiten oder sonstige Aktionen ausführen. " "Kontaktieren Sie bitte einen Administrator. +++" -#: konova/filters.py:67 +#: konova/filters/mixins.py:57 msgid "File number" msgstr "Aktenzeichen" -#: konova/filters.py:68 +#: konova/filters/mixins.py:58 msgid "Search for file number" msgstr "Nach Aktenzeichen suchen" -#: konova/filters.py:95 +#: konova/filters/mixins.py:85 msgid "District" msgstr "Kreis" -#: konova/filters.py:96 +#: konova/filters/mixins.py:86 msgid "Search for district" msgstr "Nach Kreis suchen" -#: konova/filters.py:108 +#: konova/filters/mixins.py:98 msgid "Parcel gmrkng" msgstr "Gemarkung" -#: konova/filters.py:109 +#: konova/filters/mixins.py:99 msgid "Search for parcel gmrkng" msgstr "Nach Gemarkung suchen" -#: konova/filters.py:121 konova/templates/konova/includes/parcels.html:18 +#: konova/filters/mixins.py:111 +#: konova/templates/konova/includes/parcels.html:18 msgid "Parcel" msgstr "Flur" -#: konova/filters.py:122 +#: konova/filters/mixins.py:112 msgid "Search for parcel" msgstr "Nach Flur suchen" -#: konova/filters.py:134 konova/templates/konova/includes/parcels.html:19 +#: konova/filters/mixins.py:124 +#: konova/templates/konova/includes/parcels.html:19 msgid "Parcel counter" msgstr "Flurstückzähler" -#: konova/filters.py:135 +#: konova/filters/mixins.py:125 msgid "Search for parcel counter" msgstr "Nach Flurstückzähler suchen" -#: konova/filters.py:148 konova/templates/konova/includes/parcels.html:20 +#: konova/filters/mixins.py:138 +#: konova/templates/konova/includes/parcels.html:20 msgid "Parcel number" msgstr "Flurstücknenner" -#: konova/filters.py:149 +#: konova/filters/mixins.py:139 msgid "Search for parcel number" msgstr "Nach Flurstücknenner suchen" -#: konova/filters.py:279 +#: konova/filters/mixins.py:269 msgid "Show unshared" msgstr "Nicht freigegebene anzeigen" -#: konova/filters.py:323 +#: konova/filters/mixins.py:314 msgid "Show recorded" msgstr "Verzeichnete anzeigen" +#: konova/filters/mixins.py:364 +msgid "Search for registration office" +msgstr "Nach Zulassungsbehörde suchen" + +#: konova/filters/mixins.py:396 +msgid "Search for conservation office" +msgstr "Nch Eintragungsstelle suchen" + #: konova/forms.py:37 templates/form/collapsable/form.html:62 msgid "Save" msgstr "Speichern" @@ -1644,26 +1659,22 @@ msgstr "" "Ich, {} {}, bestätige, dass diese Daten wieder entzeichnet werden müssen." #: konova/management/commands/setup_data.py:26 -msgid "On new related data" -msgstr "Wenn neue Daten für mich angelegt werden" +msgid "On shared access gained" +msgstr "Wenn mir eine Freigabe zu Daten erteilt wird" #: konova/management/commands/setup_data.py:27 -msgid "On disabled share link" -msgstr "Wenn ein Freigabelink deaktiviert wird" - -#: konova/management/commands/setup_data.py:28 msgid "On shared access removed" msgstr "Wenn mir eine Freigabe zu Daten entzogen wird" -#: konova/management/commands/setup_data.py:29 +#: konova/management/commands/setup_data.py:28 msgid "On shared data recorded" msgstr "Wenn meine freigegebenen Daten verzeichnet wurden" -#: konova/management/commands/setup_data.py:30 +#: konova/management/commands/setup_data.py:29 msgid "On shared data deleted" msgstr "Wenn meine freigegebenen Daten gelöscht wurden" -#: konova/management/commands/setup_data.py:31 +#: konova/management/commands/setup_data.py:30 msgid "On registered data edited" msgstr "Wenn meine freigegebenen Daten bearbeitet wurden" @@ -1906,35 +1917,35 @@ msgstr "Abbrechen" msgid "Fields with * are required." msgstr "* sind Pflichtfelder." -#: templates/generic_index.html:28 +#: templates/generic_index.html:39 msgid "New entry" msgstr "Neuer Eintrag" -#: templates/generic_index.html:30 +#: templates/generic_index.html:41 msgid "New" msgstr "Neu" -#: templates/generic_index.html:45 +#: templates/generic_index.html:56 msgid "Search for keywords" msgstr "Nach Schlagwörtern suchen" -#: templates/generic_index.html:45 +#: templates/generic_index.html:56 msgid "Search" msgstr "Suchen" -#: templates/generic_index.html:46 +#: templates/generic_index.html:57 msgid "Start search" msgstr "Starte Suche" -#: templates/generic_index.html:58 +#: templates/generic_index.html:69 msgid "Results per page" msgstr "Treffer pro Seite" -#: templates/generic_index.html:82 templates/generic_index.html:99 +#: templates/generic_index.html:93 templates/generic_index.html:118 msgid "Filter" msgstr "" -#: templates/generic_index.html:101 +#: templates/generic_index.html:120 msgid "Apply filter" msgstr "Filter anwenden" @@ -3591,6 +3602,12 @@ msgstr "" msgid "Unable to connect to qpid with SASL mechanism %s" msgstr "" +#~ msgid "On new related data" +#~ msgstr "Wenn neue Daten für mich angelegt werden" + +#~ msgid "On disabled share link" +#~ msgstr "Wenn ein Freigabelink deaktiviert wird" + #~ msgid "Deduct" #~ msgstr "Abbuchen" diff --git a/templates/email/sharing/shared_access_removed.html b/templates/email/sharing/shared_access_removed.html new file mode 100644 index 00000000..e69de29b diff --git a/user/admin.py b/user/admin.py index 9a633e77..92266b92 100644 --- a/user/admin.py +++ b/user/admin.py @@ -1,6 +1,6 @@ from django.contrib import admin -from user.models import UserNotification, KonovaUserExtension, UserActionLogEntry +from user.models import UserNotification, UserActionLogEntry, User class UserNotificationAdmin(admin.ModelAdmin): @@ -11,9 +11,13 @@ class UserNotificationAdmin(admin.ModelAdmin): ] -class KonovaUserExtensionAdmin(admin.ModelAdmin): +class UserAdmin(admin.ModelAdmin): list_display = [ - "user", + "id", + "username", + "first_name", + "last_name", + "email", ] @@ -27,5 +31,5 @@ class UserActionLogEntryAdmin(admin.ModelAdmin): admin.site.register(UserNotification, UserNotificationAdmin) -admin.site.register(KonovaUserExtension, KonovaUserExtensionAdmin) -admin.site.register(UserActionLogEntry, UserActionLogEntryAdmin) \ No newline at end of file +admin.site.register(UserActionLogEntry, UserActionLogEntryAdmin) +admin.site.register(User, UserAdmin) \ No newline at end of file diff --git a/user/enums.py b/user/enums.py index 1575a778..9ba6cf95 100644 --- a/user/enums.py +++ b/user/enums.py @@ -9,9 +9,8 @@ from konova.enums import BaseEnum class UserNotificationEnum(BaseEnum): - NOTIFY_ON_NEW_RELATED_DATA = "NOTIFY_ON_NEW_RELATED_DATA" # notifies in case new data has been added which is related to the user's organisation - NOTIFY_ON_SHARE_LINK_DISABLED = "NOTIFY_ON_SHARE_LINK_DISABLED" # notifies in case share link for data has been disabled NOTIFY_ON_SHARED_ACCESS_REMOVED = "NOTIFY_ON_SHARED_ACCESS_REMOVED" # notifies in case shared access to data has been removed NOTIFY_ON_SHARED_DATA_RECORDED = "NOTIFY_ON_SHARED_DATA_RECORDED" # notifies in case data has been "verzeichnet" NOTIFY_ON_SHARED_DATA_DELETED = "NOTIFY_ON_SHARED_DATA_DELETED" # notifies in case data has been deleted - NOTIFY_ON_REGISTERED_DATA_EDITED = "NOTIFY_ON_REGISTERED_DATA_EDITED" # notifies in case registered ("verzeichnet") data has been edited \ No newline at end of file + NOTIFY_ON_REGISTERED_DATA_EDITED = "NOTIFY_ON_REGISTERED_DATA_EDITED" # notifies in case registered ("verzeichnet") data has been edited + NOTIFY_ON_SHARED_ACCESS_GAINED = "NOTIFY_ON_SHARED_ACCESS_GAINED" # notifies in case new access has been gained \ No newline at end of file diff --git a/user/forms.py b/user/forms.py index 6d6accbc..66f9fab7 100644 --- a/user/forms.py +++ b/user/forms.py @@ -8,10 +8,10 @@ Created on: 08.07.21 from django import forms from django.urls import reverse from django.utils.translation import gettext_lazy as _ -from django.contrib.auth.models import User +from user.models import User from konova.forms import BaseForm, BaseModalForm -from user.models import UserNotification, KonovaUserExtension +from user.models import UserNotification class UserNotificationForm(BaseForm): @@ -50,11 +50,7 @@ class UserNotificationForm(BaseForm): ) self.fields["notifications"].choices = choices - # Set currently selected notifications as initial - self.konova_extension = KonovaUserExtension.objects.get_or_create( - user=user - )[0] - users_current_notifications = self.konova_extension.notifications.all() + users_current_notifications = self.user.notifications.all() users_current_notifications = [str(n.id) for n in users_current_notifications] self.fields["notifications"].initial = users_current_notifications @@ -68,7 +64,7 @@ class UserNotificationForm(BaseForm): notifications = UserNotification.objects.filter( id__in=selected_notification_ids, ) - self.konova_extension.notifications.set(notifications) + self.user.notifications.set(notifications) class UserContactForm(BaseModalForm): diff --git a/user/models/__init__.py b/user/models/__init__.py index 85a98b67..7788d8e4 100644 --- a/user/models/__init__.py +++ b/user/models/__init__.py @@ -6,5 +6,5 @@ Created on: 15.11.21 """ from .user_action import * -from .konova_user import * +from .user import * from .notification import * diff --git a/user/models/konova_user.py b/user/models/konova_user.py deleted file mode 100644 index b100e02f..00000000 --- a/user/models/konova_user.py +++ /dev/null @@ -1,19 +0,0 @@ -""" -Author: Michel Peltriaux -Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany -Contact: michel.peltriaux@sgdnord.rlp.de -Created on: 15.11.21 - -""" -from django.contrib.auth.models import User -from django.db import models - - -class KonovaUserExtension(models.Model): - """ Extension model for additional ksp features - - Extends the default user model for some extras - - """ - user = models.OneToOneField(User, on_delete=models.CASCADE) - notifications = models.ManyToManyField("user.UserNotification", related_name="+") diff --git a/user/models/user.py b/user/models/user.py new file mode 100644 index 00000000..63f71e35 --- /dev/null +++ b/user/models/user.py @@ -0,0 +1,28 @@ +""" +Author: Michel Peltriaux +Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany +Contact: michel.peltriaux@sgdnord.rlp.de +Created on: 15.11.21 + +""" +from django.contrib.auth.models import AbstractUser + +from django.db import models + +from konova.utils.mailer import Mailer + + +class User(AbstractUser): + notifications = models.ManyToManyField("user.UserNotification", related_name="+", blank=True) + + def send_mail_shared_access_removed(self, obj): + """ Sends a mail to the user in case of removed shared access + + Args: + obj (): + + Returns: + + """ + mailer = Mailer() + mailer.send_mail_shared_access_removed(obj, self) diff --git a/user/models/user_action.py b/user/models/user_action.py index c1894f7d..72e86151 100644 --- a/user/models/user_action.py +++ b/user/models/user_action.py @@ -7,7 +7,6 @@ Created on: 15.11.21 """ import uuid -from django.contrib.auth.models import User from django.db import models from django.utils.translation import gettext_lazy as _ @@ -34,7 +33,7 @@ class UserActionLogEntry(models.Model): primary_key=True, default=uuid.uuid4, ) - user = models.ForeignKey(User, related_name='+', on_delete=models.CASCADE, help_text="Performing user") + user = models.ForeignKey("user.User", related_name='+', on_delete=models.CASCADE, help_text="Performing user") timestamp = models.DateTimeField(auto_now_add=True, help_text="Timestamp of performed action") action = models.CharField( max_length=255, @@ -69,7 +68,7 @@ class UserActionLogEntry(models.Model): return None @classmethod - def get_created_action(cls, user: User, comment: str = None): + def get_created_action(cls, user, comment: str = None): action = UserActionLogEntry.objects.create( user=user, action=UserAction.CREATED, @@ -78,7 +77,7 @@ class UserActionLogEntry(models.Model): return action @classmethod - def get_edited_action(cls, user: User, comment: str = None): + def get_edited_action(cls, user, comment: str = None): action = UserActionLogEntry.objects.create( user=user, action=UserAction.EDITED, @@ -87,7 +86,7 @@ class UserActionLogEntry(models.Model): return action @classmethod - def get_deleted_action(cls, user: User, comment: str = None): + def get_deleted_action(cls, user, comment: str = None): action = UserActionLogEntry.objects.create( user=user, action=UserAction.DELETED, @@ -96,7 +95,7 @@ class UserActionLogEntry(models.Model): return action @classmethod - def get_checked_action(cls, user: User, comment: str = None): + def get_checked_action(cls, user, comment: str = None): action = UserActionLogEntry.objects.create( user=user, action=UserAction.CHECKED, @@ -105,7 +104,7 @@ class UserActionLogEntry(models.Model): return action @classmethod - def get_recorded_action(cls, user: User, comment: str = None): + def get_recorded_action(cls, user, comment: str = None): action = UserActionLogEntry.objects.create( user=user, action=UserAction.RECORDED, @@ -114,7 +113,7 @@ class UserActionLogEntry(models.Model): return action @classmethod - def get_unrecorded_action(cls, user: User, comment: str = None): + def get_unrecorded_action(cls, user, comment: str = None): action = UserActionLogEntry.objects.create( user=user, action=UserAction.UNRECORDED, diff --git a/user/views.py b/user/views.py index f63b14bd..13fecf5c 100644 --- a/user/views.py +++ b/user/views.py @@ -1,6 +1,6 @@ from django.contrib import messages from django.contrib.auth.decorators import login_required -from django.contrib.auth.models import User +from user.models import User from django.http import HttpRequest from django.shortcuts import render, redirect, get_object_or_404 from django.utils.translation import gettext_lazy as _ @@ -8,7 +8,6 @@ from django.utils.translation import gettext_lazy as _ from konova.contexts import BaseContext from konova.decorators import any_group_check from user.forms import UserNotificationForm, UserContactForm -from user.models import KonovaUserExtension @login_required @@ -43,9 +42,6 @@ def notifications_view(request: HttpRequest): """ template = "user/notifications.html" user = request.user - konova_ext = KonovaUserExtension.objects.get_or_create( - user=user - )[0] form = UserNotificationForm(user=user, data=request.POST or None) if request.method == "POST": @@ -65,7 +61,6 @@ def notifications_view(request: HttpRequest): context = { "user": user, "form": form, - "konova_ext": konova_ext, } context = BaseContext(request, context).context return render(request, template, context) From 35319970804daf8ec5d9b946f868114757ae5c2b Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Wed, 12 Jan 2022 14:17:12 +0100 Subject: [PATCH 2/8] # 63 Mail shared access revoked * adds mail support for revoking shared access * adds/updates translations --- konova/sub_settings/django_settings.py | 10 ++- konova/utils/mailer.py | 6 +- locale/de/LC_MESSAGES/django.mo | Bin 29910 -> 30761 bytes locale/de/LC_MESSAGES/django.po | 83 +++++++++++++----- .../email/sharing/shared_access_removed.html | 27 ++++++ templates/email/signature.html | 10 +++ 6 files changed, 109 insertions(+), 27 deletions(-) create mode 100644 templates/email/signature.html diff --git a/konova/sub_settings/django_settings.py b/konova/sub_settings/django_settings.py index 199ab17a..bc1a7511 100644 --- a/konova/sub_settings/django_settings.py +++ b/konova/sub_settings/django_settings.py @@ -204,9 +204,15 @@ DEBUG_TOOLBAR_CONFIG = { } # EMAIL (see https://docs.djangoproject.com/en/dev/topics/email/) -DEFAULT_FROM_EMAIL = "bot@arneo.de" # The default email address for the 'from' element + +# CHANGE_ME !!! ONLY FOR DEVELOPMENT !!! +EMAIL_BACKEND = 'django.core.mail.backends.filebased.EmailBackend' +EMAIL_FILE_PATH = '/tmp/app-messages' # change this to a proper location + +DEFAULT_FROM_EMAIL = "service@ksp.de" # The default email address for the 'from' element EMAIL_HOST = "localhost" -EMAIL_PORT = "1025" +EMAIL_REPLY_TO = "ksp-servicestelle@sgdnord.rlp.de" +EMAIL_PORT = "25" #EMAIL_HOST_USER = "" #EMAIL_HOST_PASSWORD = "" EMAIL_USE_TLS = False diff --git a/konova/utils/mailer.py b/konova/utils/mailer.py index cc25f660..ab2ddcaf 100644 --- a/konova/utils/mailer.py +++ b/konova/utils/mailer.py @@ -11,7 +11,7 @@ from django.core.mail import send_mail from django.template.loader import render_to_string from django.utils.translation import gettext_lazy as _ -from konova.sub_settings.django_settings import DEFAULT_FROM_EMAIL +from konova.sub_settings.django_settings import DEFAULT_FROM_EMAIL, EMAIL_REPLY_TO logger = logging.getLogger(__name__) @@ -40,7 +40,8 @@ class Mailer: """ return send_mail( subject=subject, - message=msg, + message=None, + html_message=msg, from_email=self.from_mail, recipient_list=recipient_list, fail_silently=self.fail_silently, @@ -60,6 +61,7 @@ class Mailer: context = { "user": user, "obj": obj, + "EMAIL_REPLY_TO": EMAIL_REPLY_TO, } msg = render_to_string("email/sharing/shared_access_removed.html", context) user_mail_address = [user.email] diff --git a/locale/de/LC_MESSAGES/django.mo b/locale/de/LC_MESSAGES/django.mo index 37299851a48bd993a37c2dea089bb4b52d56c980..3143958dea20cdf80285e35243f4906d9e3b0fd0 100644 GIT binary patch delta 10133 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 KSCd|`;eP?5b0SCp delta 9196 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\n" "Language-Team: LANGUAGE \n" @@ -47,7 +47,7 @@ msgstr "Bis" #: analysis/forms.py:47 compensation/forms/forms.py:77 #: compensation/templates/compensation/detail/eco_account/view.html:58 #: compensation/templates/compensation/report/eco_account/report.html:16 -#: compensation/utils/quality.py:112 ema/templates/ema/detail/view.html:49 +#: compensation/utils/quality.py:100 ema/templates/ema/detail/view.html:49 #: ema/templates/ema/report/report.html:16 ema/utils/quality.py:26 #: intervention/forms/forms.py:100 #: intervention/templates/intervention/detail/view.html:56 @@ -140,7 +140,7 @@ msgstr "Zuständigkeitsbereich" #: compensation/templates/compensation/detail/compensation/view.html:63 #: intervention/tables.py:33 #: intervention/templates/intervention/detail/view.html:68 -#: user/models/user_action.py:19 +#: user/models/user_action.py:18 msgid "Checked" msgstr "Geprüft" @@ -159,7 +159,7 @@ msgstr "Geprüft" #: ema/tables.py:38 ema/templates/ema/detail/view.html:35 #: intervention/tables.py:39 #: intervention/templates/intervention/detail/view.html:82 -#: user/models/user_action.py:20 +#: user/models/user_action.py:19 msgid "Recorded" msgstr "Verzeichnet" @@ -374,7 +374,7 @@ msgstr "Zusätzlicher Kommentar" #: compensation/forms/forms.py:93 #: compensation/templates/compensation/detail/eco_account/view.html:62 #: compensation/templates/compensation/report/eco_account/report.html:20 -#: compensation/utils/quality.py:114 ema/templates/ema/detail/view.html:53 +#: compensation/utils/quality.py:102 ema/templates/ema/detail/view.html:53 #: ema/templates/ema/report/report.html:20 ema/utils/quality.py:28 #: intervention/forms/forms.py:128 #: intervention/templates/intervention/detail/view.html:60 @@ -434,7 +434,7 @@ msgstr "Neue Kompensation" msgid "Edit compensation" msgstr "Bearbeite Kompensation" -#: compensation/forms/forms.py:302 compensation/utils/quality.py:96 +#: compensation/forms/forms.py:302 compensation/utils/quality.py:84 msgid "Available Surface" msgstr "Verfügbare Fläche" @@ -444,7 +444,7 @@ msgstr "Die für Abbuchungen zur Verfügung stehende Menge" #: compensation/forms/forms.py:314 #: compensation/templates/compensation/detail/eco_account/view.html:66 -#: compensation/utils/quality.py:84 +#: compensation/utils/quality.py:72 msgid "Agreement date" msgstr "Vereinbarungsdatum" @@ -962,7 +962,7 @@ msgstr "Eingriffskennung" #: compensation/templates/compensation/detail/eco_account/includes/deductions.html:37 #: intervention/templates/intervention/detail/includes/deductions.html:34 -#: user/models/user_action.py:22 +#: user/models/user_action.py:21 msgid "Created" msgstr "Erstellt" @@ -1040,21 +1040,17 @@ msgstr "-" msgid "States unequal" msgstr "Ungleiche Zustandsflächenmengen" -#: compensation/utils/quality.py:72 -msgid "Not recorded" -msgstr "Noch nicht verzeichnet" - -#: compensation/utils/quality.py:86 intervention/utils/quality.py:84 +#: compensation/utils/quality.py:74 intervention/utils/quality.py:84 msgid "Legal data" msgstr "Rechtliche Daten" -#: compensation/utils/quality.py:100 +#: compensation/utils/quality.py:88 msgid "Deductable surface can not be larger than state surface" msgstr "" "Die abbuchbare Fläche darf die Gesamtfläche der Zielzustände nicht " "überschreiten" -#: compensation/utils/quality.py:116 ema/utils/quality.py:30 +#: compensation/utils/quality.py:104 ema/utils/quality.py:30 #: intervention/utils/quality.py:55 msgid "Responsible data" msgstr "Daten zu den verantwortlichen Stellen" @@ -1757,6 +1753,10 @@ msgstr "In Zwischenablage kopiert" msgid "Document '{}' deleted" msgstr "Dokument '{}' gelöscht" +#: konova/utils/mailer.py:70 +msgid "{} - Shared access removed" +msgstr "{} - Zugriff entzogen" + #: konova/utils/message_templates.py:11 msgid "There was an error on this form." msgstr "Es gab einen Fehler im Formular." @@ -1871,6 +1871,40 @@ msgstr "Alle" msgid "News" msgstr "Neuigkeiten" +#: templates/email/sharing/shared_access_removed.html:2 +msgid "Shared access removed" +msgstr "Freigegebener Zugriff entzogen" + +#: templates/email/sharing/shared_access_removed.html:6 +msgid "Hello " +msgstr "Hallo " + +#: templates/email/sharing/shared_access_removed.html:8 +msgid "" +"your shared access, including editing, has been revoked for the dataset " +msgstr "" +"Ihnen wurde soeben der bearbeitende Zugriff auf den folgenden Datensatz entzogen: " + +#: templates/email/sharing/shared_access_removed.html:13 +msgid "However, you are still able to view the dataset content." +msgstr "Sie können den Datensatz aber immer noch im KSP einsehen." + +#: templates/email/sharing/shared_access_removed.html:14 +msgid "Please use the provided search filter on the dataset`s overview pages to find them." +msgstr "Nutzen Sie hierzu einfach die entsprechenden Suchfilter auf den Übersichtsseiten" + +#: templates/email/sharing/shared_access_removed.html:18 +msgid "Best regards" +msgstr "Beste Grüße" + +#: templates/email/signature.html:6 +msgid "Please do not reply on this mail." +msgstr "Bitte antworten Sie nicht auf diese Mail." + +#: templates/email/signature.html:8 +msgid "If needed, please contact " +msgstr "Bei Rückfragen, wenden Sie sich bitte an " + #: templates/footer.html:6 msgid "Help" msgstr "Hilfe" @@ -2026,31 +2060,31 @@ msgstr "Wann wollen Sie per E-Mail benachrichtigt werden?" msgid "Edit notifications" msgstr "Benachrichtigungen bearbeiten" -#: user/forms.py:76 user/templates/user/index.html:9 +#: user/forms.py:72 user/templates/user/index.html:9 msgid "Username" msgstr "Nutzername" -#: user/forms.py:87 +#: user/forms.py:83 msgid "Person name" msgstr "Name" -#: user/forms.py:98 user/templates/user/index.html:17 +#: user/forms.py:94 user/templates/user/index.html:17 msgid "E-Mail" msgstr "" -#: user/forms.py:112 +#: user/forms.py:108 msgid "User contact data" msgstr "Kontaktdaten" -#: user/models/user_action.py:21 +#: user/models/user_action.py:20 msgid "Unrecorded" msgstr "Entzeichnet" -#: user/models/user_action.py:23 +#: user/models/user_action.py:22 msgid "Edited" msgstr "Bearbeitet" -#: user/models/user_action.py:24 +#: user/models/user_action.py:23 msgid "Deleted" msgstr "Gelöscht" @@ -2095,7 +2129,7 @@ msgstr "Benachrichtigungseinstellungen ändern" msgid "Notification settings" msgstr "Benachrichtigungen" -#: user/views.py:56 +#: user/views.py:52 msgid "Notifications edited" msgstr "Benachrichtigungen bearbeitet" @@ -3602,6 +3636,9 @@ msgstr "" msgid "Unable to connect to qpid with SASL mechanism %s" msgstr "" +#~ msgid "Not recorded" +#~ msgstr "Noch nicht verzeichnet" + #~ msgid "On new related data" #~ msgstr "Wenn neue Daten für mich angelegt werden" diff --git a/templates/email/sharing/shared_access_removed.html b/templates/email/sharing/shared_access_removed.html index e69de29b..529252c3 100644 --- a/templates/email/sharing/shared_access_removed.html +++ b/templates/email/sharing/shared_access_removed.html @@ -0,0 +1,27 @@ +{% load i18n %} + +
+

{% trans 'Shared access removed' %}

+

{{obj.identifier}}

+
+
+ {% trans 'Hello ' %} {{user.username}}, +
+ {% trans 'your shared access, including editing, has been revoked for the dataset ' %} +
+ '{{obj.identifier}}' +
+ {% trans 'However, you are still able to view the dataset content.' %} + {% trans 'Please use the provided search filter on the dataset`s overview pages to find them.' %} +
+
+ {% trans 'Best regards' %} +
+ KSP +
+
+
+ {% include 'email/signature.html' %} +
+
+ diff --git a/templates/email/signature.html b/templates/email/signature.html new file mode 100644 index 00000000..48f09095 --- /dev/null +++ b/templates/email/signature.html @@ -0,0 +1,10 @@ +{% load i18n %} + +
+
+ + {% trans 'Please do not reply on this mail.' %} +
+ {% trans 'If needed, please contact ' %} {{EMAIL_REPLY_TO}}. +
+
\ No newline at end of file From 82778d1fec5d566c325f3d9be8c4615bf70d2814 Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Wed, 12 Jan 2022 14:27:39 +0100 Subject: [PATCH 3/8] # 63 Mail background sending * moves mail sending to background using celery --- konova/models/object.py | 6 ++++-- konova/tasks.py | 8 +++++++- konova/utils/mailer.py | 6 +++--- templates/email/sharing/shared_access_removed.html | 4 ++-- user/models/user.py | 4 ++-- 5 files changed, 18 insertions(+), 10 deletions(-) diff --git a/konova/models/object.py b/konova/models/object.py index 23a21651..6451fb83 100644 --- a/konova/models/object.py +++ b/konova/models/object.py @@ -10,6 +10,8 @@ import uuid from abc import abstractmethod from django.contrib import messages + +from konova.tasks import celery_send_mail_shared_access_removed from user.models import User from django.core.exceptions import ObjectDoesNotExist from django.http import HttpRequest @@ -413,9 +415,9 @@ class ShareableObjectMixin(models.Model): ) removed_users = self.users.all().exclude( id__in=accessing_users - ) + ).values("id") for user in removed_users: - user.send_mail_shared_access_removed(self) + celery_send_mail_shared_access_removed.delay(self.identifier, user["id"]) self.share_with_list(users) diff --git a/konova/tasks.py b/konova/tasks.py index 2db4b19f..eb4e91d5 100644 --- a/konova/tasks.py +++ b/konova/tasks.py @@ -3,11 +3,11 @@ from time import sleep from celery import shared_task from django.core.exceptions import ObjectDoesNotExist -from konova.models import Geometry @shared_task def celery_update_parcels(geometry_id: str, recheck: bool = True): + from konova.models import Geometry try: geom = Geometry.objects.get(id=geometry_id) geom.parcels.clear() @@ -17,3 +17,9 @@ def celery_update_parcels(geometry_id: str, recheck: bool = True): sleep(5) celery_update_parcels(geometry_id, False) + +@shared_task +def celery_send_mail_shared_access_removed(obj_identifier, user_id): + from user.models import User + user = User.objects.get(id=user_id) + user.send_mail_shared_access_removed(obj_identifier) \ No newline at end of file diff --git a/konova/utils/mailer.py b/konova/utils/mailer.py index ab2ddcaf..f3f2efb0 100644 --- a/konova/utils/mailer.py +++ b/konova/utils/mailer.py @@ -49,7 +49,7 @@ class Mailer: auth_password=self.auth_password ) - def send_mail_shared_access_removed(self, obj, user): + def send_mail_shared_access_removed(self, obj_identifier, user): """ Send a mail if user has no access to the object anymore Args: @@ -60,14 +60,14 @@ class Mailer: """ context = { "user": user, - "obj": obj, + "obj_identifier": obj_identifier, "EMAIL_REPLY_TO": EMAIL_REPLY_TO, } msg = render_to_string("email/sharing/shared_access_removed.html", context) user_mail_address = [user.email] self.send( user_mail_address, - _("{} - Shared access removed").format(obj.identifier), + _("{} - Shared access removed").format(obj_identifier), msg ) diff --git a/templates/email/sharing/shared_access_removed.html b/templates/email/sharing/shared_access_removed.html index 529252c3..be6a4d6c 100644 --- a/templates/email/sharing/shared_access_removed.html +++ b/templates/email/sharing/shared_access_removed.html @@ -2,14 +2,14 @@

{% trans 'Shared access removed' %}

-

{{obj.identifier}}

+

{{obj_identifier}}


{% trans 'Hello ' %} {{user.username}},
{% trans 'your shared access, including editing, has been revoked for the dataset ' %}
- '{{obj.identifier}}' + '{{obj_identifier}}'
{% trans 'However, you are still able to view the dataset content.' %} {% trans 'Please use the provided search filter on the dataset`s overview pages to find them.' %} diff --git a/user/models/user.py b/user/models/user.py index 63f71e35..c55896ee 100644 --- a/user/models/user.py +++ b/user/models/user.py @@ -15,7 +15,7 @@ from konova.utils.mailer import Mailer class User(AbstractUser): notifications = models.ManyToManyField("user.UserNotification", related_name="+", blank=True) - def send_mail_shared_access_removed(self, obj): + def send_mail_shared_access_removed(self, obj_identifier): """ Sends a mail to the user in case of removed shared access Args: @@ -25,4 +25,4 @@ class User(AbstractUser): """ mailer = Mailer() - mailer.send_mail_shared_access_removed(obj, self) + mailer.send_mail_shared_access_removed(obj_identifier, self) From eb54443aca1f68a2dcf529f840abdfb0115d7305 Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Wed, 12 Jan 2022 14:51:50 +0100 Subject: [PATCH 4/8] # 63 Mail celery * moves mail sending to celery worker using shared_task in konova/tasks.py * adds mail sending for shared access given * adds UserNotification settings checks for mail sending * adds/updates translations --- konova/models/object.py | 8 ++- konova/tasks.py | 9 ++- konova/utils/mailer.py | 24 ++++++- locale/de/LC_MESSAGES/django.mo | Bin 30761 -> 31667 bytes locale/de/LC_MESSAGES/django.po | 68 ++++++++++++++---- .../email/sharing/shared_access_given.html | 32 +++++++++ user/models/user.py | 26 ++++++- 7 files changed, 147 insertions(+), 20 deletions(-) create mode 100644 templates/email/sharing/shared_access_given.html diff --git a/konova/models/object.py b/konova/models/object.py index 6451fb83..65b0c1a1 100644 --- a/konova/models/object.py +++ b/konova/models/object.py @@ -11,7 +11,7 @@ from abc import abstractmethod from django.contrib import messages -from konova.tasks import celery_send_mail_shared_access_removed +from konova.tasks import celery_send_mail_shared_access_removed, celery_send_mail_shared_access_given from user.models import User from django.core.exceptions import ObjectDoesNotExist from django.http import HttpRequest @@ -416,8 +416,14 @@ class ShareableObjectMixin(models.Model): removed_users = self.users.all().exclude( id__in=accessing_users ).values("id") + + # Send mails for user in removed_users: celery_send_mail_shared_access_removed.delay(self.identifier, user["id"]) + for user in new_accessing_users: + celery_send_mail_shared_access_given.delay(self.identifier, user) + + # Set new shared users self.share_with_list(users) diff --git a/konova/tasks.py b/konova/tasks.py index eb4e91d5..54956835 100644 --- a/konova/tasks.py +++ b/konova/tasks.py @@ -22,4 +22,11 @@ def celery_update_parcels(geometry_id: str, recheck: bool = True): def celery_send_mail_shared_access_removed(obj_identifier, user_id): from user.models import User user = User.objects.get(id=user_id) - user.send_mail_shared_access_removed(obj_identifier) \ No newline at end of file + user.send_mail_shared_access_removed(obj_identifier) + + +@shared_task +def celery_send_mail_shared_access_given(obj_identifier, user_id): + from user.models import User + user = User.objects.get(id=user_id) + user.send_mail_shared_access_given(obj_identifier) \ No newline at end of file diff --git a/konova/utils/mailer.py b/konova/utils/mailer.py index f3f2efb0..87ffe29d 100644 --- a/konova/utils/mailer.py +++ b/konova/utils/mailer.py @@ -53,7 +53,7 @@ class Mailer: """ Send a mail if user has no access to the object anymore Args: - obj (): + obj_identifier (str): The object identifier Returns: @@ -71,3 +71,25 @@ class Mailer: msg ) + def send_mail_shared_access_given(self, obj_identifier, user): + """ Send a mail if user just got access to the object + + Args: + obj_identifier (str): The object identifier + + Returns: + + """ + context = { + "user": user, + "obj_identifier": obj_identifier, + "EMAIL_REPLY_TO": EMAIL_REPLY_TO, + } + msg = render_to_string("email/sharing/shared_access_given.html", context) + user_mail_address = [user.email] + self.send( + user_mail_address, + _("{} - Shared access given").format(obj_identifier), + msg + ) + diff --git a/locale/de/LC_MESSAGES/django.mo b/locale/de/LC_MESSAGES/django.mo index 3143958dea20cdf80285e35243f4906d9e3b0fd0..d9103b58eb531b1082357e9d93bcffe4d12d9c29 100644 GIT binary patch delta 10214 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 diff --git a/locale/de/LC_MESSAGES/django.po b/locale/de/LC_MESSAGES/django.po index 65277896..f1f99f9f 100644 --- a/locale/de/LC_MESSAGES/django.po +++ b/locale/de/LC_MESSAGES/django.po @@ -26,7 +26,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-01-12 14:12+0100\n" +"POT-Creation-Date: 2022-01-12 14:31+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -1757,6 +1757,10 @@ msgstr "Dokument '{}' gelöscht" msgid "{} - Shared access removed" msgstr "{} - Zugriff entzogen" +#: konova/utils/mailer.py:92 +msgid "{} - Shared access given" +msgstr "{} - Zugriff freigegeben" + #: konova/utils/message_templates.py:11 msgid "There was an error on this form." msgstr "Es gab einen Fehler im Formular." @@ -1871,32 +1875,66 @@ msgstr "Alle" msgid "News" msgstr "Neuigkeiten" -#: templates/email/sharing/shared_access_removed.html:2 -msgid "Shared access removed" -msgstr "Freigegebener Zugriff entzogen" +#: templates/email/sharing/shared_access_given.html:4 +msgid "Access shared" +msgstr "Zugriff freigegeben" -#: templates/email/sharing/shared_access_removed.html:6 +#: templates/email/sharing/shared_access_given.html:8 +#: templates/email/sharing/shared_access_removed.html:8 msgid "Hello " msgstr "Hallo " -#: templates/email/sharing/shared_access_removed.html:8 +#: templates/email/sharing/shared_access_given.html:10 +msgid "the following dataset has just been shared with you" +msgstr "der folgende Datensatz wurde soeben für Sie freigegeben " + +#: templates/email/sharing/shared_access_given.html:14 +msgid "This means you can now edit this dataset." +msgstr "Das bedeutet, dass Sie diesen Datensatz nun auch bearbeiten können." + +#: templates/email/sharing/shared_access_given.html:15 msgid "" -"your shared access, including editing, has been revoked for the dataset " +"The shared dataset appears now by default on your overview for this dataset " +"type." msgstr "" -"Ihnen wurde soeben der bearbeitende Zugriff auf den folgenden Datensatz entzogen: " +"Der freigegebene Datensatz ist nun standardmäßig in Ihrer Übersicht für den Datensatztyp im KSP gelistet." -#: templates/email/sharing/shared_access_removed.html:13 -msgid "However, you are still able to view the dataset content." -msgstr "Sie können den Datensatz aber immer noch im KSP einsehen." - -#: templates/email/sharing/shared_access_removed.html:14 -msgid "Please use the provided search filter on the dataset`s overview pages to find them." -msgstr "Nutzen Sie hierzu einfach die entsprechenden Suchfilter auf den Übersichtsseiten" +#: templates/email/sharing/shared_access_given.html:16 +msgid "" +"Please note: Shared access on an intervention means you automatically have " +"editing access to related compensations." +msgstr "" +"Bitte beachten Sie: Freigegebener Zugriff auf einen Eingriff bedeutet, dass Sie automatisch auch " +"Zugriff auf die zugehörigen Kompensationen erhalten haben." +#: templates/email/sharing/shared_access_given.html:19 #: templates/email/sharing/shared_access_removed.html:18 msgid "Best regards" msgstr "Beste Grüße" +#: templates/email/sharing/shared_access_removed.html:4 +msgid "Shared access removed" +msgstr "Freigegebener Zugriff entzogen" + +#: templates/email/sharing/shared_access_removed.html:10 +msgid "" +"your shared access, including editing, has been revoked for the dataset " +msgstr "" +"Ihnen wurde soeben der bearbeitende Zugriff auf den folgenden Datensatz " +"entzogen: " + +#: templates/email/sharing/shared_access_removed.html:14 +msgid "However, you are still able to view the dataset content." +msgstr "Sie können den Datensatz aber immer noch im KSP einsehen." + +#: templates/email/sharing/shared_access_removed.html:15 +msgid "" +"Please use the provided search filter on the dataset`s overview pages to " +"find them." +msgstr "" +"Nutzen Sie hierzu einfach die entsprechenden Suchfilter auf den " +"Übersichtsseiten" + #: templates/email/signature.html:6 msgid "Please do not reply on this mail." msgstr "Bitte antworten Sie nicht auf diese Mail." diff --git a/templates/email/sharing/shared_access_given.html b/templates/email/sharing/shared_access_given.html new file mode 100644 index 00000000..bf93e863 --- /dev/null +++ b/templates/email/sharing/shared_access_given.html @@ -0,0 +1,32 @@ +{% load i18n %} + +
+

{% trans 'Access shared' %}

+

{{obj_identifier}}

+
+
+ {% trans 'Hello ' %} {{user.username}}, +
+ {% trans 'the following dataset has just been shared with you' %} +
+ '{{obj_identifier}}' +
+ {% trans 'This means you can now edit this dataset.' %} + {% trans 'The shared dataset appears now by default on your overview for this dataset type.' %} +
+
+ {% trans 'Best regards' %} +
+ KSP +
+
+
+ + {% trans 'Please note: Shared access on an intervention means you automatically have editing access to related compensations.' %} + +
+
+ {% include 'email/signature.html' %} +
+
+ diff --git a/user/models/user.py b/user/models/user.py index c55896ee..e8e6ae79 100644 --- a/user/models/user.py +++ b/user/models/user.py @@ -10,11 +10,17 @@ from django.contrib.auth.models import AbstractUser from django.db import models from konova.utils.mailer import Mailer +from user.enums import UserNotificationEnum class User(AbstractUser): notifications = models.ManyToManyField("user.UserNotification", related_name="+", blank=True) + def is_notification_setting_set(self, notification_enum: UserNotificationEnum): + return self.notifications.filter( + id=notification_enum.value + ).exists() + def send_mail_shared_access_removed(self, obj_identifier): """ Sends a mail to the user in case of removed shared access @@ -24,5 +30,21 @@ class User(AbstractUser): Returns: """ - mailer = Mailer() - mailer.send_mail_shared_access_removed(obj_identifier, self) + notification_set = self.is_notification_setting_set(UserNotificationEnum.NOTIFY_ON_SHARED_ACCESS_REMOVED) + if notification_set: + mailer = Mailer() + mailer.send_mail_shared_access_removed(obj_identifier, self) + + def send_mail_shared_access_given(self, obj_identifier): + """ Sends a mail to the user in case of removed shared access + + Args: + obj (): + + Returns: + + """ + notification_set = self.is_notification_setting_set(UserNotificationEnum.NOTIFY_ON_SHARED_ACCESS_GAINED) + if notification_set: + mailer = Mailer() + mailer.send_mail_shared_access_given(obj_identifier, self) From d7a9f72c3ea81a0faaedc672e76eb3100e37b0b0 Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Wed, 12 Jan 2022 15:09:52 +0100 Subject: [PATCH 5/8] # 63 Mail recording/unrecording * adds mail sending in case of unrecording and recording of data * adds/updates translations --- konova/models/object.py | 13 ++- konova/tasks.py | 16 +++- konova/utils/mailer.py | 44 ++++++++++ locale/de/LC_MESSAGES/django.mo | Bin 31667 -> 33012 bytes locale/de/LC_MESSAGES/django.po | 76 +++++++++++++++--- .../email/sharing/shared_data_recorded.html | 31 +++++++ .../email/sharing/shared_data_unrecorded.html | 31 +++++++ user/models/user.py | 34 +++++++- 8 files changed, 230 insertions(+), 15 deletions(-) create mode 100644 templates/email/sharing/shared_data_recorded.html create mode 100644 templates/email/sharing/shared_data_unrecorded.html diff --git a/konova/models/object.py b/konova/models/object.py index 65b0c1a1..175cf3a8 100644 --- a/konova/models/object.py +++ b/konova/models/object.py @@ -11,7 +11,8 @@ from abc import abstractmethod from django.contrib import messages -from konova.tasks import celery_send_mail_shared_access_removed, celery_send_mail_shared_access_given +from konova.tasks import celery_send_mail_shared_access_removed, celery_send_mail_shared_access_given, \ + celery_send_mail_shared_data_recorded, celery_send_mail_shared_data_unrecorded from user.models import User from django.core.exceptions import ObjectDoesNotExist from django.http import HttpRequest @@ -218,6 +219,11 @@ class RecordableObjectMixin(models.Model): self.recorded = None self.save() self.log.add(action) + + shared_users = self.users.all().values_list("id", flat=True) + for user_id in shared_users: + celery_send_mail_shared_data_unrecorded(self.identifier, user_id) + return action def set_recorded(self, user: User): @@ -235,6 +241,11 @@ class RecordableObjectMixin(models.Model): self.recorded = action self.save() self.log.add(action) + + shared_users = self.users.all().values_list("id", flat=True) + for user_id in shared_users: + celery_send_mail_shared_data_recorded(self.identifier, user_id) + return action def mark_as_edited(self, performing_user: User, request: HttpRequest = None, edit_comment: str = None): diff --git a/konova/tasks.py b/konova/tasks.py index 54956835..ee7aabd7 100644 --- a/konova/tasks.py +++ b/konova/tasks.py @@ -29,4 +29,18 @@ def celery_send_mail_shared_access_removed(obj_identifier, user_id): def celery_send_mail_shared_access_given(obj_identifier, user_id): from user.models import User user = User.objects.get(id=user_id) - user.send_mail_shared_access_given(obj_identifier) \ No newline at end of file + user.send_mail_shared_access_given(obj_identifier) + + +@shared_task +def celery_send_mail_shared_data_recorded(obj_identifier, user_id): + from user.models import User + user = User.objects.get(id=user_id) + user.send_mail_shared_data_recorded(obj_identifier) + + +@shared_task +def celery_send_mail_shared_data_unrecorded(obj_identifier, user_id): + from user.models import User + user = User.objects.get(id=user_id) + user.send_mail_shared_data_unrecorded(obj_identifier) diff --git a/konova/utils/mailer.py b/konova/utils/mailer.py index 87ffe29d..107ac8ce 100644 --- a/konova/utils/mailer.py +++ b/konova/utils/mailer.py @@ -93,3 +93,47 @@ class Mailer: msg ) + def send_mail_shared_data_recorded(self, obj_identifier, user): + """ Send a mail if user just got access to the object + + Args: + obj_identifier (str): The object identifier + + Returns: + + """ + context = { + "user": user, + "obj_identifier": obj_identifier, + "EMAIL_REPLY_TO": EMAIL_REPLY_TO, + } + msg = render_to_string("email/sharing/shared_data_recorded.html", context) + user_mail_address = [user.email] + self.send( + user_mail_address, + _("{} - Shared data recorded").format(obj_identifier), + msg + ) + + def send_mail_shared_data_unrecorded(self, obj_identifier, user): + """ Send a mail if user just got access to the object + + Args: + obj_identifier (str): The object identifier + + Returns: + + """ + context = { + "user": user, + "obj_identifier": obj_identifier, + "EMAIL_REPLY_TO": EMAIL_REPLY_TO, + } + msg = render_to_string("email/sharing/shared_data_unrecorded.html", context) + user_mail_address = [user.email] + self.send( + user_mail_address, + _("{} - Shared data unrecorded").format(obj_identifier), + msg + ) + diff --git a/locale/de/LC_MESSAGES/django.mo b/locale/de/LC_MESSAGES/django.mo index d9103b58eb531b1082357e9d93bcffe4d12d9c29..77a572718db6aca9e38e8c7c235c74f00174dd7b 100644 GIT binary patch delta 10585 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 diff --git a/locale/de/LC_MESSAGES/django.po b/locale/de/LC_MESSAGES/django.po index f1f99f9f..012d25d7 100644 --- a/locale/de/LC_MESSAGES/django.po +++ b/locale/de/LC_MESSAGES/django.po @@ -26,7 +26,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-01-12 14:31+0100\n" +"POT-Creation-Date: 2022-01-12 15:06+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -1761,6 +1761,14 @@ msgstr "{} - Zugriff entzogen" msgid "{} - Shared access given" msgstr "{} - Zugriff freigegeben" +#: konova/utils/mailer.py:114 +msgid "{} - Shared data recorded" +msgstr "{} - Freigegebene Daten verzeichnet" + +#: konova/utils/mailer.py:136 +msgid "{} - Shared data unrecorded" +msgstr "{} - Freigegebene Daten entzeichnet" + #: konova/utils/message_templates.py:11 msgid "There was an error on this form." msgstr "Es gab einen Fehler im Formular." @@ -1881,6 +1889,8 @@ msgstr "Zugriff freigegeben" #: templates/email/sharing/shared_access_given.html:8 #: templates/email/sharing/shared_access_removed.html:8 +#: templates/email/sharing/shared_data_recorded.html:8 +#: templates/email/sharing/shared_data_unrecorded.html:8 msgid "Hello " msgstr "Hallo " @@ -1897,20 +1907,24 @@ msgid "" "The shared dataset appears now by default on your overview for this dataset " "type." msgstr "" -"Der freigegebene Datensatz ist nun standardmäßig in Ihrer Übersicht für den Datensatztyp im KSP gelistet." +"Der freigegebene Datensatz ist nun standardmäßig in Ihrer Übersicht für den " +"Datensatztyp im KSP gelistet." -#: templates/email/sharing/shared_access_given.html:16 +#: templates/email/sharing/shared_access_given.html:18 +#: templates/email/sharing/shared_access_removed.html:18 +#: templates/email/sharing/shared_data_recorded.html:17 +#: templates/email/sharing/shared_data_unrecorded.html:17 +msgid "Best regards" +msgstr "Beste Grüße" + +#: templates/email/sharing/shared_access_given.html:25 msgid "" "Please note: Shared access on an intervention means you automatically have " "editing access to related compensations." msgstr "" -"Bitte beachten Sie: Freigegebener Zugriff auf einen Eingriff bedeutet, dass Sie automatisch auch " -"Zugriff auf die zugehörigen Kompensationen erhalten haben." - -#: templates/email/sharing/shared_access_given.html:19 -#: templates/email/sharing/shared_access_removed.html:18 -msgid "Best regards" -msgstr "Beste Grüße" +"Bitte beachten Sie: Freigegebener Zugriff auf einen Eingriff bedeutet, dass " +"Sie automatisch auch Zugriff auf die zugehörigen Kompensationen erhalten " +"haben." #: templates/email/sharing/shared_access_removed.html:4 msgid "Shared access removed" @@ -1935,6 +1949,48 @@ msgstr "" "Nutzen Sie hierzu einfach die entsprechenden Suchfilter auf den " "Übersichtsseiten" +#: templates/email/sharing/shared_data_recorded.html:4 +msgid "Shared data recorded" +msgstr "Freigegebene Daten verzeichnet" + +#: templates/email/sharing/shared_data_recorded.html:10 +msgid "the following dataset has just been recorded" +msgstr "der folgende Datensatz wurde soeben verzeichnet " + +#: templates/email/sharing/shared_data_recorded.html:14 +msgid "This means the data is now publicly available, e.g. in LANIS" +msgstr "" +"Das bedeutet, dass die Daten nun öffentlich verfügbar sind, z.B. im LANIS." + +#: templates/email/sharing/shared_data_recorded.html:24 +msgid "" +"Please note: Recorded intervention means the compensations are recorded as " +"well." +msgstr "" +"Bitte beachten Sie: Verzeichnete Eingriffe bedeuten, dass auch die " +"zugehörigen Kompensationen automatisch verzeichnet sind." + +#: templates/email/sharing/shared_data_unrecorded.html:4 +msgid "Shared data unrecorded" +msgstr "Freigegebene Daten entzeichnet" + +#: templates/email/sharing/shared_data_unrecorded.html:10 +msgid "the following dataset has just been unrecorded" +msgstr "der folgende Datensatz wurde soeben entzeichnet " + +#: templates/email/sharing/shared_data_unrecorded.html:14 +msgid "This means the data is no longer publicly available." +msgstr "" +"Das bedeutet, dass die Daten nicht länger öffentlich verfügbar sind." + +#: templates/email/sharing/shared_data_unrecorded.html:24 +msgid "" +"Please note: Unrecorded intervention means the compensations are unrecorded " +"as well." +msgstr "" +"Bitte beachten Sie: Entzeichnete Eingriffe bedeuten, dass auch die " +"zugehörigen Kompensationen automatisch entzeichnet worden sind." + #: templates/email/signature.html:6 msgid "Please do not reply on this mail." msgstr "Bitte antworten Sie nicht auf diese Mail." diff --git a/templates/email/sharing/shared_data_recorded.html b/templates/email/sharing/shared_data_recorded.html new file mode 100644 index 00000000..82d236d8 --- /dev/null +++ b/templates/email/sharing/shared_data_recorded.html @@ -0,0 +1,31 @@ +{% load i18n %} + +
+

{% trans 'Shared data recorded' %}

+

{{obj_identifier}}

+
+
+ {% trans 'Hello ' %} {{user.username}}, +
+ {% trans 'the following dataset has just been recorded' %} +
+ '{{obj_identifier}}' +
+ {% trans 'This means the data is now publicly available, e.g. in LANIS' %} +
+
+ {% trans 'Best regards' %} +
+ KSP +
+
+
+ + {% trans 'Please note: Recorded intervention means the compensations are recorded as well.' %} + +
+
+ {% include 'email/signature.html' %} +
+
+ diff --git a/templates/email/sharing/shared_data_unrecorded.html b/templates/email/sharing/shared_data_unrecorded.html new file mode 100644 index 00000000..a40e7ce8 --- /dev/null +++ b/templates/email/sharing/shared_data_unrecorded.html @@ -0,0 +1,31 @@ +{% load i18n %} + +
+

{% trans 'Shared data unrecorded' %}

+

{{obj_identifier}}

+
+
+ {% trans 'Hello ' %} {{user.username}}, +
+ {% trans 'the following dataset has just been unrecorded' %} +
+ '{{obj_identifier}}' +
+ {% trans 'This means the data is no longer publicly available.' %} +
+
+ {% trans 'Best regards' %} +
+ KSP +
+
+
+ + {% trans 'Please note: Unrecorded intervention means the compensations are unrecorded as well.' %} + +
+
+ {% include 'email/signature.html' %} +
+
+ diff --git a/user/models/user.py b/user/models/user.py index e8e6ae79..51c8bcf8 100644 --- a/user/models/user.py +++ b/user/models/user.py @@ -25,7 +25,7 @@ class User(AbstractUser): """ Sends a mail to the user in case of removed shared access Args: - obj (): + obj_identifier (): Returns: @@ -36,10 +36,10 @@ class User(AbstractUser): mailer.send_mail_shared_access_removed(obj_identifier, self) def send_mail_shared_access_given(self, obj_identifier): - """ Sends a mail to the user in case of removed shared access + """ Sends a mail to the user in case of given shared access Args: - obj (): + obj_identifier (): Returns: @@ -48,3 +48,31 @@ class User(AbstractUser): if notification_set: mailer = Mailer() mailer.send_mail_shared_access_given(obj_identifier, self) + + def send_mail_shared_data_recorded(self, obj_identifier): + """ Sends a mail to the user in case of shared data has been recorded + + Args: + obj_identifier (): + + Returns: + + """ + notification_set = self.is_notification_setting_set(UserNotificationEnum.NOTIFY_ON_SHARED_DATA_RECORDED) + if notification_set: + mailer = Mailer() + mailer.send_mail_shared_data_recorded(obj_identifier, self) + + def send_mail_shared_data_unrecorded(self, obj_identifier): + """ Sends a mail to the user in case of shared data has been unrecorded + + Args: + obj_identifier (): + + Returns: + + """ + notification_set = self.is_notification_setting_set(UserNotificationEnum.NOTIFY_ON_SHARED_DATA_RECORDED) + if notification_set: + mailer = Mailer() + mailer.send_mail_shared_data_unrecorded(obj_identifier, self) From 5295c08d99c2fb361ec3a8d6fba1f0c868204016 Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Wed, 12 Jan 2022 15:31:25 +0100 Subject: [PATCH 6/8] # 63 Mail data deleted * adds mail sending if shared data is deleted * adds/updates translations * refactors recording mails into separate email template folder email/recording --- konova/models/object.py | 8 +- konova/tasks.py | 7 + konova/utils/mailer.py | 30 +++- locale/de/LC_MESSAGES/django.mo | Bin 33012 -> 33399 bytes locale/de/LC_MESSAGES/django.po | 140 ++++++++++-------- .../email/deleting/shared_data_deleted.html | 26 ++++ .../shared_data_recorded.html | 0 .../shared_data_unrecorded.html | 0 user/models/user.py | 14 ++ user/models/user_action.py | 3 - 10 files changed, 160 insertions(+), 68 deletions(-) create mode 100644 templates/email/deleting/shared_data_deleted.html rename templates/email/{sharing => recording}/shared_data_recorded.html (100%) rename templates/email/{sharing => recording}/shared_data_unrecorded.html (100%) diff --git a/konova/models/object.py b/konova/models/object.py index 175cf3a8..8353a04d 100644 --- a/konova/models/object.py +++ b/konova/models/object.py @@ -12,7 +12,7 @@ from abc import abstractmethod from django.contrib import messages from konova.tasks import celery_send_mail_shared_access_removed, celery_send_mail_shared_access_given, \ - celery_send_mail_shared_data_recorded, celery_send_mail_shared_data_unrecorded + celery_send_mail_shared_data_recorded, celery_send_mail_shared_data_unrecorded, celery_send_mail_shared_data_deleted from user.models import User from django.core.exceptions import ObjectDoesNotExist from django.http import HttpRequest @@ -121,6 +121,12 @@ class BaseObject(BaseResource): action = UserActionLogEntry.get_deleted_action(user) self.deleted = action self.log.add(action) + + # Send mail + shared_users = self.users.all().values_list("id", flat=True) + for user_id in shared_users: + celery_send_mail_shared_data_deleted.delay(self.identifier, user_id) + self.save() def add_log_entry(self, action: UserAction, user: User, comment: str): diff --git a/konova/tasks.py b/konova/tasks.py index ee7aabd7..16925e57 100644 --- a/konova/tasks.py +++ b/konova/tasks.py @@ -44,3 +44,10 @@ def celery_send_mail_shared_data_unrecorded(obj_identifier, user_id): from user.models import User user = User.objects.get(id=user_id) user.send_mail_shared_data_unrecorded(obj_identifier) + + +@shared_task +def celery_send_mail_shared_data_deleted(obj_identifier, user_id): + from user.models import User + user = User.objects.get(id=user_id) + user.send_mail_shared_data_deleted(obj_identifier) diff --git a/konova/utils/mailer.py b/konova/utils/mailer.py index 107ac8ce..b919164d 100644 --- a/konova/utils/mailer.py +++ b/konova/utils/mailer.py @@ -94,7 +94,7 @@ class Mailer: ) def send_mail_shared_data_recorded(self, obj_identifier, user): - """ Send a mail if user just got access to the object + """ Send a mail if the user's shared data has just been unrecorded Args: obj_identifier (str): The object identifier @@ -107,7 +107,7 @@ class Mailer: "obj_identifier": obj_identifier, "EMAIL_REPLY_TO": EMAIL_REPLY_TO, } - msg = render_to_string("email/sharing/shared_data_recorded.html", context) + msg = render_to_string("email/recording/shared_data_recorded.html", context) user_mail_address = [user.email] self.send( user_mail_address, @@ -116,6 +116,28 @@ class Mailer: ) def send_mail_shared_data_unrecorded(self, obj_identifier, user): + """ Send a mail if the user's shared data has just been unrecorded + + Args: + obj_identifier (str): The object identifier + + Returns: + + """ + context = { + "user": user, + "obj_identifier": obj_identifier, + "EMAIL_REPLY_TO": EMAIL_REPLY_TO, + } + msg = render_to_string("email/recording/shared_data_unrecorded.html", context) + user_mail_address = [user.email] + self.send( + user_mail_address, + _("{} - Shared data unrecorded").format(obj_identifier), + msg + ) + + def send_mail_shared_data_deleted(self, obj_identifier, user): """ Send a mail if user just got access to the object Args: @@ -129,11 +151,11 @@ class Mailer: "obj_identifier": obj_identifier, "EMAIL_REPLY_TO": EMAIL_REPLY_TO, } - msg = render_to_string("email/sharing/shared_data_unrecorded.html", context) + msg = render_to_string("email/deleting/shared_data_deleted.html", context) user_mail_address = [user.email] self.send( user_mail_address, - _("{} - Shared data unrecorded").format(obj_identifier), + _("{} - Shared data deleted").format(obj_identifier), msg ) diff --git a/locale/de/LC_MESSAGES/django.mo b/locale/de/LC_MESSAGES/django.mo index 77a572718db6aca9e38e8c7c235c74f00174dd7b..f2b82d6ed969feb2fb95db306a58839fb995fc65 100644 GIT binary patch delta 10084 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 delta 9751 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 diff --git a/locale/de/LC_MESSAGES/django.po b/locale/de/LC_MESSAGES/django.po index 012d25d7..6f82e795 100644 --- a/locale/de/LC_MESSAGES/django.po +++ b/locale/de/LC_MESSAGES/django.po @@ -26,7 +26,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-01-12 15:06+0100\n" +"POT-Creation-Date: 2022-01-12 15:22+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -1762,10 +1762,10 @@ msgid "{} - Shared access given" msgstr "{} - Zugriff freigegeben" #: konova/utils/mailer.py:114 -msgid "{} - Shared data recorded" -msgstr "{} - Freigegebene Daten verzeichnet" +msgid "{} - Shared data deleted" +msgstr "{} - Freigegebene Daten gelöscht" -#: konova/utils/mailer.py:136 +#: konova/utils/mailer.py:136 konova/utils/mailer.py:158 msgid "{} - Shared data unrecorded" msgstr "{} - Freigegebene Daten entzeichnet" @@ -1883,17 +1883,83 @@ msgstr "Alle" msgid "News" msgstr "Neuigkeiten" +#: templates/email/deleting/shared_data_deleted.html:4 +msgid "Shared data deleted" +msgstr "Freigegebene Daten gelöscht" + +#: templates/email/deleting/shared_data_deleted.html:8 +#: templates/email/recording/shared_data_recorded.html:8 +#: templates/email/recording/shared_data_unrecorded.html:8 +#: templates/email/sharing/shared_access_given.html:8 +#: templates/email/sharing/shared_access_removed.html:8 +msgid "Hello " +msgstr "Hallo " + +#: templates/email/deleting/shared_data_deleted.html:10 +msgid "the following dataset has just been deleted" +msgstr "der folgende Datensatz wurde soeben gelöscht " + +#: templates/email/deleting/shared_data_deleted.html:14 +msgid "" +"If this should not have been happened, please contact us. See the signature " +"for details." +msgstr "" +"Falls das nicht hätte passieren dürfen, kontaktieren Sie uns bitte. In der E-mail Signatur finden Sie " +"weitere Kontaktinformationen." + +#: templates/email/deleting/shared_data_deleted.html:17 +#: templates/email/recording/shared_data_recorded.html:17 +#: templates/email/recording/shared_data_unrecorded.html:17 +#: templates/email/sharing/shared_access_given.html:18 +#: templates/email/sharing/shared_access_removed.html:18 +msgid "Best regards" +msgstr "Beste Grüße" + +#: templates/email/recording/shared_data_recorded.html:4 +msgid "Shared data recorded" +msgstr "Freigegebene Daten verzeichnet" + +#: templates/email/recording/shared_data_recorded.html:10 +msgid "the following dataset has just been recorded" +msgstr "der folgende Datensatz wurde soeben verzeichnet " + +#: templates/email/recording/shared_data_recorded.html:14 +msgid "This means the data is now publicly available, e.g. in LANIS" +msgstr "" +"Das bedeutet, dass die Daten nun öffentlich verfügbar sind, z.B. im LANIS." + +#: templates/email/recording/shared_data_recorded.html:24 +msgid "" +"Please note: Recorded intervention means the compensations are recorded as " +"well." +msgstr "" +"Bitte beachten Sie: Verzeichnete Eingriffe bedeuten, dass auch die " +"zugehörigen Kompensationen automatisch verzeichnet sind." + +#: templates/email/recording/shared_data_unrecorded.html:4 +msgid "Shared data unrecorded" +msgstr "Freigegebene Daten entzeichnet" + +#: templates/email/recording/shared_data_unrecorded.html:10 +msgid "the following dataset has just been unrecorded" +msgstr "der folgende Datensatz wurde soeben entzeichnet " + +#: templates/email/recording/shared_data_unrecorded.html:14 +msgid "This means the data is no longer publicly available." +msgstr "Das bedeutet, dass die Daten nicht länger öffentlich verfügbar sind." + +#: templates/email/recording/shared_data_unrecorded.html:24 +msgid "" +"Please note: Unrecorded intervention means the compensations are unrecorded " +"as well." +msgstr "" +"Bitte beachten Sie: Entzeichnete Eingriffe bedeuten, dass auch die " +"zugehörigen Kompensationen automatisch entzeichnet worden sind." + #: templates/email/sharing/shared_access_given.html:4 msgid "Access shared" msgstr "Zugriff freigegeben" -#: templates/email/sharing/shared_access_given.html:8 -#: templates/email/sharing/shared_access_removed.html:8 -#: templates/email/sharing/shared_data_recorded.html:8 -#: templates/email/sharing/shared_data_unrecorded.html:8 -msgid "Hello " -msgstr "Hallo " - #: templates/email/sharing/shared_access_given.html:10 msgid "the following dataset has just been shared with you" msgstr "der folgende Datensatz wurde soeben für Sie freigegeben " @@ -1910,13 +1976,6 @@ msgstr "" "Der freigegebene Datensatz ist nun standardmäßig in Ihrer Übersicht für den " "Datensatztyp im KSP gelistet." -#: templates/email/sharing/shared_access_given.html:18 -#: templates/email/sharing/shared_access_removed.html:18 -#: templates/email/sharing/shared_data_recorded.html:17 -#: templates/email/sharing/shared_data_unrecorded.html:17 -msgid "Best regards" -msgstr "Beste Grüße" - #: templates/email/sharing/shared_access_given.html:25 msgid "" "Please note: Shared access on an intervention means you automatically have " @@ -1949,48 +2008,6 @@ msgstr "" "Nutzen Sie hierzu einfach die entsprechenden Suchfilter auf den " "Übersichtsseiten" -#: templates/email/sharing/shared_data_recorded.html:4 -msgid "Shared data recorded" -msgstr "Freigegebene Daten verzeichnet" - -#: templates/email/sharing/shared_data_recorded.html:10 -msgid "the following dataset has just been recorded" -msgstr "der folgende Datensatz wurde soeben verzeichnet " - -#: templates/email/sharing/shared_data_recorded.html:14 -msgid "This means the data is now publicly available, e.g. in LANIS" -msgstr "" -"Das bedeutet, dass die Daten nun öffentlich verfügbar sind, z.B. im LANIS." - -#: templates/email/sharing/shared_data_recorded.html:24 -msgid "" -"Please note: Recorded intervention means the compensations are recorded as " -"well." -msgstr "" -"Bitte beachten Sie: Verzeichnete Eingriffe bedeuten, dass auch die " -"zugehörigen Kompensationen automatisch verzeichnet sind." - -#: templates/email/sharing/shared_data_unrecorded.html:4 -msgid "Shared data unrecorded" -msgstr "Freigegebene Daten entzeichnet" - -#: templates/email/sharing/shared_data_unrecorded.html:10 -msgid "the following dataset has just been unrecorded" -msgstr "der folgende Datensatz wurde soeben entzeichnet " - -#: templates/email/sharing/shared_data_unrecorded.html:14 -msgid "This means the data is no longer publicly available." -msgstr "" -"Das bedeutet, dass die Daten nicht länger öffentlich verfügbar sind." - -#: templates/email/sharing/shared_data_unrecorded.html:24 -msgid "" -"Please note: Unrecorded intervention means the compensations are unrecorded " -"as well." -msgstr "" -"Bitte beachten Sie: Entzeichnete Eingriffe bedeuten, dass auch die " -"zugehörigen Kompensationen automatisch entzeichnet worden sind." - #: templates/email/signature.html:6 msgid "Please do not reply on this mail." msgstr "Bitte antworten Sie nicht auf diese Mail." @@ -3730,6 +3747,9 @@ msgstr "" msgid "Unable to connect to qpid with SASL mechanism %s" msgstr "" +#~ msgid "{} - Shared data recorded" +#~ msgstr "{} - Freigegebene Daten verzeichnet" + #~ msgid "Not recorded" #~ msgstr "Noch nicht verzeichnet" diff --git a/templates/email/deleting/shared_data_deleted.html b/templates/email/deleting/shared_data_deleted.html new file mode 100644 index 00000000..36c80b09 --- /dev/null +++ b/templates/email/deleting/shared_data_deleted.html @@ -0,0 +1,26 @@ +{% load i18n %} + +
+

{% trans 'Shared data deleted' %}

+

{{obj_identifier}}

+
+
+ {% trans 'Hello ' %} {{user.username}}, +
+ {% trans 'the following dataset has just been deleted' %} +
+ '{{obj_identifier}}' +
+ {% trans 'If this should not have been happened, please contact us. See the signature for details.' %} +
+
+ {% trans 'Best regards' %} +
+ KSP +
+
+
+ {% include 'email/signature.html' %} +
+
+ diff --git a/templates/email/sharing/shared_data_recorded.html b/templates/email/recording/shared_data_recorded.html similarity index 100% rename from templates/email/sharing/shared_data_recorded.html rename to templates/email/recording/shared_data_recorded.html diff --git a/templates/email/sharing/shared_data_unrecorded.html b/templates/email/recording/shared_data_unrecorded.html similarity index 100% rename from templates/email/sharing/shared_data_unrecorded.html rename to templates/email/recording/shared_data_unrecorded.html diff --git a/user/models/user.py b/user/models/user.py index 51c8bcf8..12f138e7 100644 --- a/user/models/user.py +++ b/user/models/user.py @@ -76,3 +76,17 @@ class User(AbstractUser): if notification_set: mailer = Mailer() mailer.send_mail_shared_data_unrecorded(obj_identifier, self) + + def send_mail_shared_data_deleted(self, obj_identifier): + """ Sends a mail to the user in case of shared data has been deleted + + Args: + obj_identifier (): + + Returns: + + """ + notification_set = self.is_notification_setting_set(UserNotificationEnum.NOTIFY_ON_SHARED_DATA_DELETED) + if notification_set: + mailer = Mailer() + mailer.send_mail_shared_data_deleted(obj_identifier, self) diff --git a/user/models/user_action.py b/user/models/user_action.py index 72e86151..d902c5d7 100644 --- a/user/models/user_action.py +++ b/user/models/user_action.py @@ -49,9 +49,6 @@ class UserActionLogEntry(models.Model): "-timestamp", ) - def __str__(self): - return "{} | {} | {}".format(self.user.username, self.timestamp, self.action) - @property def action_humanize(self): """ Returns humanized version of enum From dcc4e2fdc8d4899668035297ffdeefc3d2127987 Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Wed, 12 Jan 2022 15:38:57 +0100 Subject: [PATCH 7/8] # 63 UserNotificationEnum changes * drops NOTIFY_ON_REGISTERED_DATA_EDITED in favor of NOTIFY_ON_SHARED_DATA_CHECKED * adds/updates translations --- konova/management/commands/setup_data.py | 2 +- locale/de/LC_MESSAGES/django.mo | Bin 33399 -> 33496 bytes locale/de/LC_MESSAGES/django.po | 24 +++++++++++++---------- user/enums.py | 2 +- 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/konova/management/commands/setup_data.py b/konova/management/commands/setup_data.py index 159dd3ec..4a5683cd 100644 --- a/konova/management/commands/setup_data.py +++ b/konova/management/commands/setup_data.py @@ -27,5 +27,5 @@ USER_NOTIFICATIONS_NAMES = { "NOTIFY_ON_SHARED_ACCESS_REMOVED": _("On shared access removed"), "NOTIFY_ON_SHARED_DATA_RECORDED": _("On shared data recorded"), "NOTIFY_ON_SHARED_DATA_DELETED": _("On shared data deleted"), - "NOTIFY_ON_REGISTERED_DATA_EDITED": _("On registered data edited"), + "NOTIFY_ON_SHARED_DATA_CHECKED": _("On shared data checked"), } \ No newline at end of file diff --git a/locale/de/LC_MESSAGES/django.mo b/locale/de/LC_MESSAGES/django.mo index f2b82d6ed969feb2fb95db306a58839fb995fc65..0549af9432c9a7b11da7a7ef08a875da77274db2 100644 GIT binary patch delta 9849 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 Pt0Fr8RFkrxMOFU=6faHc diff --git a/locale/de/LC_MESSAGES/django.po b/locale/de/LC_MESSAGES/django.po index 6f82e795..e9ecf952 100644 --- a/locale/de/LC_MESSAGES/django.po +++ b/locale/de/LC_MESSAGES/django.po @@ -26,7 +26,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-01-12 15:22+0100\n" +"POT-Creation-Date: 2022-01-12 15:36+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -1671,8 +1671,8 @@ msgid "On shared data deleted" msgstr "Wenn meine freigegebenen Daten gelöscht wurden" #: konova/management/commands/setup_data.py:30 -msgid "On registered data edited" -msgstr "Wenn meine freigegebenen Daten bearbeitet wurden" +msgid "On shared data checked" +msgstr "Wenn meine freigegebenen Daten geprüft wurden" #: konova/models/deadline.py:18 msgid "Finished" @@ -1762,13 +1762,17 @@ msgid "{} - Shared access given" msgstr "{} - Zugriff freigegeben" #: konova/utils/mailer.py:114 -msgid "{} - Shared data deleted" -msgstr "{} - Freigegebene Daten gelöscht" +msgid "{} - Shared data recorded" +msgstr "{} - Freigegebene Daten verzeichnet" -#: konova/utils/mailer.py:136 konova/utils/mailer.py:158 +#: konova/utils/mailer.py:136 msgid "{} - Shared data unrecorded" msgstr "{} - Freigegebene Daten entzeichnet" +#: konova/utils/mailer.py:158 +msgid "{} - Shared data deleted" +msgstr "{} - Freigegebene Daten gelöscht" + #: konova/utils/message_templates.py:11 msgid "There was an error on this form." msgstr "Es gab einen Fehler im Formular." @@ -1904,8 +1908,8 @@ msgid "" "If this should not have been happened, please contact us. See the signature " "for details." msgstr "" -"Falls das nicht hätte passieren dürfen, kontaktieren Sie uns bitte. In der E-mail Signatur finden Sie " -"weitere Kontaktinformationen." +"Falls das nicht hätte passieren dürfen, kontaktieren Sie uns bitte. In der E-" +"mail Signatur finden Sie weitere Kontaktinformationen." #: templates/email/deleting/shared_data_deleted.html:17 #: templates/email/recording/shared_data_recorded.html:17 @@ -3747,8 +3751,8 @@ msgstr "" msgid "Unable to connect to qpid with SASL mechanism %s" msgstr "" -#~ msgid "{} - Shared data recorded" -#~ msgstr "{} - Freigegebene Daten verzeichnet" +#~ msgid "On registered data edited" +#~ msgstr "Wenn meine freigegebenen Daten bearbeitet wurden" #~ msgid "Not recorded" #~ msgstr "Noch nicht verzeichnet" diff --git a/user/enums.py b/user/enums.py index 9ba6cf95..8d0c34de 100644 --- a/user/enums.py +++ b/user/enums.py @@ -12,5 +12,5 @@ class UserNotificationEnum(BaseEnum): NOTIFY_ON_SHARED_ACCESS_REMOVED = "NOTIFY_ON_SHARED_ACCESS_REMOVED" # notifies in case shared access to data has been removed NOTIFY_ON_SHARED_DATA_RECORDED = "NOTIFY_ON_SHARED_DATA_RECORDED" # notifies in case data has been "verzeichnet" NOTIFY_ON_SHARED_DATA_DELETED = "NOTIFY_ON_SHARED_DATA_DELETED" # notifies in case data has been deleted - NOTIFY_ON_REGISTERED_DATA_EDITED = "NOTIFY_ON_REGISTERED_DATA_EDITED" # notifies in case registered ("verzeichnet") data has been edited + NOTIFY_ON_SHARED_DATA_CHECKED = "NOTIFY_ON_SHARED_DATA_CHECKED" # notifies in case shared data has been checked NOTIFY_ON_SHARED_ACCESS_GAINED = "NOTIFY_ON_SHARED_ACCESS_GAINED" # notifies in case new access has been gained \ No newline at end of file From 1de3792d98d98d1938dd788f1d52cc6e0a70dac5 Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Wed, 12 Jan 2022 15:48:47 +0100 Subject: [PATCH 8/8] # 63 Mail data checked * adds mail sending if shared data is checked * adds/updates translations --- konova/models/object.py | 9 +++- konova/tasks.py | 7 +++ konova/utils/mailer.py | 24 ++++++++- locale/de/LC_MESSAGES/django.mo | Bin 33496 -> 33985 bytes locale/de/LC_MESSAGES/django.po | 46 +++++++++++++----- .../email/checking/shared_data_checked.html | 26 ++++++++++ user/models/user.py | 14 ++++++ 7 files changed, 112 insertions(+), 14 deletions(-) create mode 100644 templates/email/checking/shared_data_checked.html diff --git a/konova/models/object.py b/konova/models/object.py index 8353a04d..a27398de 100644 --- a/konova/models/object.py +++ b/konova/models/object.py @@ -12,7 +12,8 @@ from abc import abstractmethod from django.contrib import messages from konova.tasks import celery_send_mail_shared_access_removed, celery_send_mail_shared_access_given, \ - celery_send_mail_shared_data_recorded, celery_send_mail_shared_data_unrecorded, celery_send_mail_shared_data_deleted + celery_send_mail_shared_data_recorded, celery_send_mail_shared_data_unrecorded, \ + celery_send_mail_shared_data_deleted, celery_send_mail_shared_data_checked from user.models import User from django.core.exceptions import ObjectDoesNotExist from django.http import HttpRequest @@ -324,6 +325,12 @@ class CheckableObjectMixin(models.Model): action = UserActionLogEntry.get_checked_action(user) self.checked = action self.save() + + # Send mail + shared_users = self.users.all().values_list("id", flat=True) + for user_id in shared_users: + celery_send_mail_shared_data_checked.delay(self.identifier, user_id) + self.log.add(action) return action diff --git a/konova/tasks.py b/konova/tasks.py index 16925e57..a463374c 100644 --- a/konova/tasks.py +++ b/konova/tasks.py @@ -51,3 +51,10 @@ def celery_send_mail_shared_data_deleted(obj_identifier, user_id): from user.models import User user = User.objects.get(id=user_id) user.send_mail_shared_data_deleted(obj_identifier) + + +@shared_task +def celery_send_mail_shared_data_checked(obj_identifier, user_id): + from user.models import User + user = User.objects.get(id=user_id) + user.send_mail_shared_data_checked(obj_identifier) diff --git a/konova/utils/mailer.py b/konova/utils/mailer.py index b919164d..9c273ff6 100644 --- a/konova/utils/mailer.py +++ b/konova/utils/mailer.py @@ -138,7 +138,7 @@ class Mailer: ) def send_mail_shared_data_deleted(self, obj_identifier, user): - """ Send a mail if user just got access to the object + """ Send a mail if shared data has just been deleted Args: obj_identifier (str): The object identifier @@ -159,3 +159,25 @@ class Mailer: msg ) + def send_mail_shared_data_checked(self, obj_identifier, user): + """ Send a mail if shared data just has been checked + + Args: + obj_identifier (str): The object identifier + + Returns: + + """ + context = { + "user": user, + "obj_identifier": obj_identifier, + "EMAIL_REPLY_TO": EMAIL_REPLY_TO, + } + msg = render_to_string("email/checking/shared_data_checked.html", context) + user_mail_address = [user.email] + self.send( + user_mail_address, + _("{} - Shared data checked").format(obj_identifier), + msg + ) + diff --git a/locale/de/LC_MESSAGES/django.mo b/locale/de/LC_MESSAGES/django.mo index 0549af9432c9a7b11da7a7ef08a875da77274db2..2790b18bdab387bb61f98c9e500c07f48890c5bd 100644 GIT binary patch delta 10093 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 iNgtKt89h8FKYe<=pu%p;p8U)i;{po0IWe(U$Z8 delta 9812 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 aqjKMx_Rv2!(5>Z{n>M$t&&rSIJ^nwJ\n" "Language-Team: LANGUAGE \n" @@ -1773,6 +1773,10 @@ msgstr "{} - Freigegebene Daten entzeichnet" msgid "{} - Shared data deleted" msgstr "{} - Freigegebene Daten gelöscht" +#: konova/utils/mailer.py:180 +msgid "{} - Shared data checked" +msgstr "{} - Freigegebene Daten geprüft" + #: konova/utils/message_templates.py:11 msgid "There was an error on this form." msgstr "Es gab einen Fehler im Formular." @@ -1887,10 +1891,11 @@ msgstr "Alle" msgid "News" msgstr "Neuigkeiten" -#: templates/email/deleting/shared_data_deleted.html:4 -msgid "Shared data deleted" -msgstr "Freigegebene Daten gelöscht" +#: templates/email/checking/shared_data_checked.html:4 +msgid "Shared data checked" +msgstr "Freigegebene Daten geprüft" +#: templates/email/checking/shared_data_checked.html:8 #: templates/email/deleting/shared_data_deleted.html:8 #: templates/email/recording/shared_data_recorded.html:8 #: templates/email/recording/shared_data_unrecorded.html:8 @@ -1899,6 +1904,31 @@ msgstr "Freigegebene Daten gelöscht" msgid "Hello " msgstr "Hallo " +#: templates/email/checking/shared_data_checked.html:10 +msgid "the following dataset has just been checked" +msgstr "der folgende Datensatz wurde soeben geprüft " + +#: templates/email/checking/shared_data_checked.html:14 +msgid "" +"This means, the responsible registration office just confirmed the " +"correctness of this dataset." +msgstr "" +"Das bedeutet, dass die zuständige Zulassungsbehörde die Korrektheit des Datensatzes " +"soeben bestätigt hat." + +#: templates/email/checking/shared_data_checked.html:17 +#: templates/email/deleting/shared_data_deleted.html:17 +#: templates/email/recording/shared_data_recorded.html:17 +#: templates/email/recording/shared_data_unrecorded.html:17 +#: templates/email/sharing/shared_access_given.html:18 +#: templates/email/sharing/shared_access_removed.html:18 +msgid "Best regards" +msgstr "Beste Grüße" + +#: templates/email/deleting/shared_data_deleted.html:4 +msgid "Shared data deleted" +msgstr "Freigegebene Daten gelöscht" + #: templates/email/deleting/shared_data_deleted.html:10 msgid "the following dataset has just been deleted" msgstr "der folgende Datensatz wurde soeben gelöscht " @@ -1911,14 +1941,6 @@ msgstr "" "Falls das nicht hätte passieren dürfen, kontaktieren Sie uns bitte. In der E-" "mail Signatur finden Sie weitere Kontaktinformationen." -#: templates/email/deleting/shared_data_deleted.html:17 -#: templates/email/recording/shared_data_recorded.html:17 -#: templates/email/recording/shared_data_unrecorded.html:17 -#: templates/email/sharing/shared_access_given.html:18 -#: templates/email/sharing/shared_access_removed.html:18 -msgid "Best regards" -msgstr "Beste Grüße" - #: templates/email/recording/shared_data_recorded.html:4 msgid "Shared data recorded" msgstr "Freigegebene Daten verzeichnet" diff --git a/templates/email/checking/shared_data_checked.html b/templates/email/checking/shared_data_checked.html new file mode 100644 index 00000000..ccc0bbf3 --- /dev/null +++ b/templates/email/checking/shared_data_checked.html @@ -0,0 +1,26 @@ +{% load i18n %} + +
+

{% trans 'Shared data checked' %}

+

{{obj_identifier}}

+
+
+ {% trans 'Hello ' %} {{user.username}}, +
+ {% trans 'the following dataset has just been checked' %} +
+ '{{obj_identifier}}' +
+ {% trans 'This means, the responsible registration office just confirmed the correctness of this dataset.' %} +
+
+ {% trans 'Best regards' %} +
+ KSP +
+
+
+ {% include 'email/signature.html' %} +
+
+ diff --git a/user/models/user.py b/user/models/user.py index 12f138e7..837f0c6c 100644 --- a/user/models/user.py +++ b/user/models/user.py @@ -90,3 +90,17 @@ class User(AbstractUser): if notification_set: mailer = Mailer() mailer.send_mail_shared_data_deleted(obj_identifier, self) + + def send_mail_shared_data_checked(self, obj_identifier): + """ Sends a mail to the user in case of shared data has been deleted + + Args: + obj_identifier (): + + Returns: + + """ + notification_set = self.is_notification_setting_set(UserNotificationEnum.NOTIFY_ON_SHARED_DATA_CHECKED) + if notification_set: + mailer = Mailer() + mailer.send_mail_shared_data_checked(obj_identifier, self)