diff --git a/ephios/core/forms/users.py b/ephios/core/forms/users.py index 6ef4cddb5..ebef19105 100644 --- a/ephios/core/forms/users.py +++ b/ephios/core/forms/users.py @@ -464,3 +464,9 @@ def __init__(self, *args, **kwargs): def update_preferences(self): self.user.preferences["notifications__notifications"] = self.cleaned_data + + +class UserOwnDataForm(ModelForm): + class Meta: + model = UserProfile + fields = ["preferred_language"] diff --git a/ephios/core/migrations/0021_userprofile_preferred_language_and_more.py b/ephios/core/migrations/0021_userprofile_preferred_language_and_more.py new file mode 100644 index 000000000..94ae2979d --- /dev/null +++ b/ephios/core/migrations/0021_userprofile_preferred_language_and_more.py @@ -0,0 +1,30 @@ +# Generated by Django 4.2.4 on 2023-09-30 13:03 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("core", "0020_qualificationcategory_show_with_user_and_more"), + ] + + operations = [ + migrations.AddField( + model_name="userprofile", + name="preferred_language", + field=models.CharField( + choices=[("de", "German"), ("en", "English")], + default="de", + max_length=10, + verbose_name="preferred language", + ), + ), + migrations.AlterField( + model_name="qualificationcategory", + name="show_with_user", + field=models.BooleanField( + default=True, + verbose_name="Show qualifications of this category everywhere a user is presented", + ), + ), + ] diff --git a/ephios/core/models/users.py b/ephios/core/models/users.py index 156d4e203..61ba3f8bf 100644 --- a/ephios/core/models/users.py +++ b/ephios/core/models/users.py @@ -7,6 +7,7 @@ from typing import Optional import guardian.mixins +from django.conf import settings from django.contrib.auth import get_user_model from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager from django.contrib.auth.models import Group, PermissionsMixin @@ -110,6 +111,12 @@ class UserProfile(guardian.mixins.GuardianUserMixin, PermissionsMixin, AbstractB date_of_birth = DateField(_("date of birth"), null=True, blank=False) phone = CharField(_("phone number"), max_length=254, blank=True, null=True) calendar_token = CharField(_("calendar token"), max_length=254, default=secrets.token_urlsafe) + preferred_language = CharField( + _("preferred language"), + max_length=10, + default=settings.LANGUAGE_CODE, + choices=settings.LANGUAGES, + ) USERNAME_FIELD = "email" REQUIRED_FIELDS = [ diff --git a/ephios/core/services/notifications/backends.py b/ephios/core/services/notifications/backends.py index 21a69be46..114eeeec3 100644 --- a/ephios/core/services/notifications/backends.py +++ b/ephios/core/services/notifications/backends.py @@ -9,6 +9,7 @@ from ephios.core.models.users import Notification from ephios.core.services.mail.send import send_mail +from ephios.extra.i18n import language logger = logging.getLogger(__name__) @@ -31,23 +32,24 @@ def send_all_notifications(): for backend in installed_notification_backends(): for notification in Notification.objects.filter(failed=False): if backend.can_send(notification) and backend.user_prefers_sending(notification): - try: - backend.send(notification) - except Exception as e: # pylint: disable=broad-except - if settings.DEBUG: - raise e - notification.failed = True - notification.save() + with language((notification.user and notification.user.preferred_language) or None): try: - mail_admins( - "Notification sending failed", - f"Notification: {notification}\nException: {e}\n{traceback.format_exc()}", + backend.send(notification) + except Exception as e: # pylint: disable=broad-except + if settings.DEBUG: + raise e + notification.failed = True + notification.save() + try: + mail_admins( + "Notification sending failed", + f"Notification: {notification}\nException: {e}\n{traceback.format_exc()}", + ) + except smtplib.SMTPConnectError: + pass # if the mail backend threw this, mail admin will probably throw this as well + logger.warning( + f"Notification sending failed for notification object #{notification.pk} ({notification}) for backend {backend} with {e}" ) - except smtplib.SMTPConnectError: - pass # if the mail backend threw this, mail admin will probably throw this as well - logger.warning( - f"Notification sending failed for notification object #{notification.pk} ({notification}) for backend {backend} with {e}" - ) Notification.objects.filter(failed=False).delete() diff --git a/ephios/core/templates/core/settings/settings_personal_data.html b/ephios/core/templates/core/settings/settings_personal_data.html index 45e1b4c5d..cee7c78f5 100644 --- a/ephios/core/templates/core/settings/settings_personal_data.html +++ b/ephios/core/templates/core/settings/settings_personal_data.html @@ -29,4 +29,10 @@