diff --git a/jdav_web/locale/de/LC_MESSAGES/django.po b/jdav_web/locale/de/LC_MESSAGES/django.po index 0155ef5..b29effc 100644 --- a/jdav_web/locale/de/LC_MESSAGES/django.po +++ b/jdav_web/locale/de/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-11-11 16:16+0100\n" +"POT-Creation-Date: 2020-01-24 23:21+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,7 +18,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: jdav_web/urls.py:25 +#: jdav_web/urls.py:26 msgid "Startpage" msgstr "Startseite" @@ -26,29 +26,22 @@ msgstr "Startseite" msgid "Welcome," msgstr "Willkommen" -#: templates/admin/base.html:37 -msgid "View site" -msgstr "Seite anzeigen" - -#: templates/admin/base.html:42 +#: templates/admin/base.html:40 msgid "Documentation" msgstr "Dokumentation" -#: templates/admin/base.html:46 +#: templates/admin/base.html:44 msgid "Change password" msgstr "Passwort ändern" -#: templates/admin/base.html:48 +#: templates/admin/base.html:46 msgid "Log out" msgstr "Abmelden" -#: templates/admin/base.html:58 +#: templates/admin/base.html:56 msgid "Home" msgstr "Start" -#~ msgid "JDAV LB Administration" -#~ msgstr "JDAV LB Verwaltung" - #: utils.py:26 msgid "Filetype not supported." msgstr "Dateityp nicht unterstützt." @@ -56,3 +49,9 @@ msgstr "Dateityp nicht unterstützt." #: utils.py:28 msgid "Please keep filesize under {}. Current filesize: {}" msgstr "Maximale Dateigröße {}. Aktuelle Dateigröße: {}." + +#~ msgid "View site" +#~ msgstr "Seite anzeigen" + +#~ msgid "JDAV LB Administration" +#~ msgstr "JDAV LB Verwaltung" diff --git a/jdav_web/mailer/admin.py b/jdav_web/mailer/admin.py index 312c9f2..702e482 100644 --- a/jdav_web/mailer/admin.py +++ b/jdav_web/mailer/admin.py @@ -7,7 +7,7 @@ from django import forms from easy_select2 import apply_select2 import json -from .models import Message, Attachment, MessageForm +from .models import Message, Attachment, MessageForm, EmailAddress from .mailutils import NOT_SENT, PARTLY_SENT from members.models import Member @@ -17,6 +17,15 @@ class AttachmentInline(admin.TabularInline): extra = 0 +class EmailAddressAdmin(admin.ModelAdmin): + list_display = ('email', ) + formfield_overrides = { + models.ManyToManyField: {'widget': forms.CheckboxSelectMultiple}, + models.ForeignKey: {'widget': apply_select2(forms.Select)} + } + filter_horizontal = ('to_members',) + + class MessageAdmin(admin.ModelAdmin): """Message creation view""" list_display = ('subject', 'get_recipients', 'sent') @@ -81,3 +90,4 @@ def submit_message(msg, request): admin.site.register(Message, MessageAdmin) +admin.site.register(EmailAddress, EmailAddressAdmin) diff --git a/jdav_web/mailer/locale/de/LC_MESSAGES/django.po b/jdav_web/mailer/locale/de/LC_MESSAGES/django.po index 41c88d9..f786ed7 100644 --- a/jdav_web/mailer/locale/de/LC_MESSAGES/django.po +++ b/jdav_web/mailer/locale/de/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-07-05 10:46+0000\n" +"POT-Creation-Date: 2020-01-24 23:21+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,19 +18,19 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: mailer/admin.py:43 +#: mailer/admin.py:55 msgid "Send message" msgstr "Nachricht verschicken" -#: mailer/admin.py:59 +#: mailer/admin.py:85 msgid "Failed to send message" msgstr "Fehler beim Senden der Email" -#: mailer/admin.py:61 +#: mailer/admin.py:87 msgid "Failed to send some messages" msgstr "Fehler beim Senden der Emails" -#: mailer/admin.py:63 +#: mailer/admin.py:89 msgid "Successfully sent message" msgstr "Email wurde erfolgreich verschickt" @@ -38,77 +38,97 @@ msgstr "Email wurde erfolgreich verschickt" msgid "mailer" msgstr "Verteiler" -#: mailer/models.py:39 +#: mailer/models.py:21 msgid "subject" msgstr "Betreff" -#: mailer/models.py:40 +#: mailer/models.py:22 msgid "content" msgstr "Inhalt" -#: mailer/models.py:42 +#: mailer/models.py:24 msgid "to group" msgstr "An Gruppe" -#: mailer/models.py:45 +#: mailer/models.py:27 msgid "to member list" msgstr "An Teilnehmerliste" -#: mailer/models.py:49 +#: mailer/models.py:31 msgid "to member" msgstr "An Teilnehmer" -#: mailer/models.py:52 +#: mailer/models.py:34 msgid "reply to" msgstr "Antwort an" -#: mailer/models.py:56 +#: mailer/models.py:37 msgid "sent" msgstr "Gesendet" -#: mailer/models.py:68 +#: mailer/models.py:49 msgid "Some other members" msgstr "Andere Teilnehmer" -#: mailer/models.py:70 +#: mailer/models.py:51 msgid "recipients" msgstr "Empfänger" -#: mailer/models.py:105 +#: mailer/models.py:102 msgid "message" msgstr "Nachricht" -#: mailer/models.py:106 +#: mailer/models.py:103 msgid "messages" msgstr "Nachrichten" -#: mailer/models.py:108 +#: mailer/models.py:105 msgid "Can submit mails" msgstr "Kann Mails verschicken" -#: mailer/models.py:123 +#: mailer/models.py:120 msgid "" "Either a group, a memberlist or at least one member is required as recipient" msgstr "" "Es muss entweder eine Gruppe, eine Teilnehmerliste oder mindestens ein " "Teilnehmer als Empfänger ausgewählt werden." -#: mailer/models.py:131 +#: mailer/models.py:127 msgid "file" msgstr "Datei" -#: mailer/models.py:137 +#: mailer/models.py:133 msgid "Empty" msgstr "Leer" -#: mailer/models.py:140 +#: mailer/models.py:136 msgid "attachment" msgstr "Anhang" -#: mailer/models.py:141 +#: mailer/models.py:137 msgid "attachments" msgstr "Anhänge" +#: mailer/models.py:140 +msgid "Only alphanumeric characters are allowed" +msgstr "Nur Buchstaben und Zahlen erlaubt" + +#: mailer/models.py:145 +msgid "name" +msgstr "Name" + +#: mailer/models.py:147 +msgid "Forward to" +msgstr "Weiterleitung" + +#: mailer/models.py:157 +msgid "email address" +msgstr "Email-Adresse" + +#: mailer/models.py:158 +msgid "email addresses" +msgstr "Email-Adressen" + #: mailer/templates/mailer/change_form.html:11 msgid "Save and send mail" msgstr "Speichern und Email senden" diff --git a/jdav_web/mailer/models.py b/jdav_web/mailer/models.py index dc49fb3..2a8b7ee 100644 --- a/jdav_web/mailer/models.py +++ b/jdav_web/mailer/models.py @@ -6,11 +6,13 @@ from django.utils.translation import ugettext from .mailutils import send, get_content, NOT_SENT, SENT, PARTLY_SENT, mail_root from utils import RestrictedFileField from jdav_web.celery import app +from django.core.validators import RegexValidator import os # this is the mail address that is used to send mails SENDING_ADDRESS = mail_root +HOST = os.environ.get('DJANGO_ALLOWED_HOST', 'localhost:8000').split(",")[0] # Create your models here. @@ -118,7 +120,6 @@ class MessageForm(forms.ModelForm): raise ValidationError(_('Either a group, a memberlist or at least' ' one member is required as recipient')) - class Attachment(models.Model): """Represents an attachment to an email""" msg = models.ForeignKey(Message, on_delete=models.CASCADE) @@ -134,3 +135,24 @@ class Attachment(models.Model): class Meta: verbose_name = _('attachment') verbose_name_plural = _('attachments') + + +alphanumeric = RegexValidator(r'^[0-9a-zA-Z]*$', _('Only alphanumeric characters are allowed')) + + +class EmailAddress(models.Model): + """Represents an email address, that is forwarded to specific members""" + name = models.CharField(_('name'), max_length=50, validators=[alphanumeric]) + to_members = models.ManyToManyField('members.Member', + verbose_name=_('Forward to')) + + @property + def email(self): + return "{0}@{1}".format(self.name, HOST) + + def __str__(self): + return self.email + + class Meta: + verbose_name = _('email address') + verbose_name_plural = _('email addresses') diff --git a/jdav_web/material/locale/de/LC_MESSAGES/django.po b/jdav_web/material/locale/de/LC_MESSAGES/django.po index 8adf029..f1af77f 100644 --- a/jdav_web/material/locale/de/LC_MESSAGES/django.po +++ b/jdav_web/material/locale/de/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-10-11 13:02+0200\n" +"POT-Creation-Date: 2020-01-24 23:21+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,98 +18,97 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: admin.py:29 +#: material/admin.py:29 msgid "Age" msgstr "Alter" -#: admin.py:34 +#: material/admin.py:34 msgid "Not too old" msgstr "Nicht zu alt" -#: admin.py:35 +#: material/admin.py:35 msgid "Too old" msgstr "Zu alt" -#: apps.py:7 +#: material/apps.py:7 msgid "material" msgstr "Material" -#: models.py:15 +#: material/models.py:15 msgid "Name" msgstr "Name" -#: models.py:16 -msgid "Description" -msgstr "Beschreibung" - -#: models.py:22 models.py:39 +#: material/models.py:21 material/models.py:38 msgid "Material category" msgstr "Materialtyp" -#: models.py:23 +#: material/models.py:22 msgid "Material categories" msgstr "Materialtypen" -#: models.py:32 +#: material/models.py:31 msgid "name" msgstr "Name" -#: models.py:33 +#: material/models.py:32 msgid "description" msgstr "Beschreibung" -#: models.py:34 +#: material/models.py:33 msgid "quantity" msgstr "Anzahl" -#: models.py:35 +#: material/models.py:34 msgid "purchase date" msgstr "Kaufdatum" -#: models.py:36 +#: material/models.py:35 msgid "lifetime (years)" msgstr "Lebenszeit (Jahre)" -#: models.py:37 +#: material/models.py:36 msgid "photo" msgstr "Bild" -#: models.py:50 +#: material/models.py:49 msgid "Quantity" msgstr "Anzahl" -#: models.py:57 +#: material/models.py:56 msgid "Thumbnail" msgstr "Bild" -#: models.py:66 +#: material/models.py:65 msgid "Owners" msgstr "Verantwortliche" -#: models.py:76 +#: material/models.py:75 msgid "Not too old?" msgstr "Nicht zu alt?" -#: models.py:79 +#: material/models.py:78 msgid "material part" msgstr "Materialteil" -#: models.py:80 +#: material/models.py:79 msgid "material parts" msgstr "Materialteile" -#: models.py:86 +#: material/models.py:85 msgid "owner" msgstr "Besitzer" -#: models.py:87 +#: material/models.py:86 msgid "count" msgstr "Anzahl" -#: models.py:94 +#: material/models.py:93 msgid "ownership" msgstr "Besitzer" -#: models.py:95 +#: material/models.py:94 msgid "ownerships" msgstr "Verantwortliche" + +#~ msgid "Description" +#~ msgstr "Beschreibung" diff --git a/jdav_web/members/locale/de/LC_MESSAGES/django.po b/jdav_web/members/locale/de/LC_MESSAGES/django.po index d15d4b5..a0de68e 100644 --- a/jdav_web/members/locale/de/LC_MESSAGES/django.po +++ b/jdav_web/members/locale/de/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-14 23:12+0200\n" +"POT-Creation-Date: 2020-01-24 23:21+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,7 +18,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: members/admin.py:26 members/models.py:72 +#: members/admin.py:26 members/models.py:73 msgid "Registration complete" msgstr "Anmeldung vollständig" @@ -54,177 +54,177 @@ msgstr "Kriseninterventionsliste erstellen" msgid "Generate overview" msgstr "Hinweise für Jugendleiter erstellen" -#: members/apps.py:7 members/models.py:128 +#: members/apps.py:7 members/models.py:129 msgid "members" msgstr "Teilnehmer" -#: members/models.py:19 +#: members/models.py:20 msgid "Name" msgstr "Name" -#: members/models.py:20 +#: members/models.py:21 msgid "Description" msgstr "Beschreibung" -#: members/models.py:26 members/models.py:151 +#: members/models.py:27 members/models.py:150 #: members/templates/members/change_member.html:17 msgid "Activity" msgstr "Aktivität" -#: members/models.py:27 +#: members/models.py:28 msgid "Activities" msgstr "Aktivitäten" -#: members/models.py:35 +#: members/models.py:36 msgid "name" msgstr "Name" -#: members/models.py:37 +#: members/models.py:38 msgid "minimum age (years)" msgstr "Mindestalter (Jahre)" -#: members/models.py:44 members/models.py:65 +#: members/models.py:45 members/models.py:66 msgid "group" msgstr "Gruppe" -#: members/models.py:45 +#: members/models.py:46 msgid "groups" msgstr "Gruppen" -#: members/models.py:53 +#: members/models.py:54 msgid "prename" msgstr "Vorname" -#: members/models.py:54 +#: members/models.py:55 msgid "last name" msgstr "Nachname" -#: members/models.py:55 +#: members/models.py:56 msgid "street" msgstr "Straße" -#: members/models.py:56 +#: members/models.py:57 msgid "Postcode" msgstr "PLZ" -#: members/models.py:58 +#: members/models.py:59 msgid "town" msgstr "Stadt" -#: members/models.py:59 +#: members/models.py:60 msgid "phone number" msgstr "Telefonnummer" -#: members/models.py:60 +#: members/models.py:61 msgid "parents phone number" msgstr "Telefonnummer der Eltern" -#: members/models.py:63 +#: members/models.py:64 msgid "Parents' Email" msgstr "Email der Eltern" -#: members/models.py:64 +#: members/models.py:65 msgid "birth date" msgstr "Geburtsdatum" -#: members/models.py:66 +#: members/models.py:67 msgid "receives newsletter" msgstr "Erhält den Newsletter" -#: members/models.py:70 +#: members/models.py:71 msgid "comments" msgstr "Kommentare" -#: members/models.py:71 +#: members/models.py:72 msgid "created" msgstr "erstellt" -#: members/models.py:73 +#: members/models.py:74 msgid "registration form" msgstr "Anmeldeformular" -#: members/models.py:124 members/models.py:215 +#: members/models.py:125 members/models.py:217 msgid "Group" msgstr "Gruppe" -#: members/models.py:127 +#: members/models.py:128 msgid "member" msgstr "Teilnehmer" -#: members/models.py:153 +#: members/models.py:152 msgid "Place" msgstr "Ort" -#: members/models.py:154 +#: members/models.py:153 msgid "Destination (optional)" msgstr "Ziel (optional)" -#: members/models.py:156 members/models.py:211 +#: members/models.py:155 members/models.py:213 msgid "Date" msgstr "Datum" -#: members/models.py:157 +#: members/models.py:156 msgid "End (optional)" msgstr "Ende" -#: members/models.py:159 +#: members/models.py:158 msgid "Groups" msgstr "Gruppen" -#: members/models.py:167 +#: members/models.py:166 msgid "Categories" msgstr "Kategorien" -#: members/models.py:168 +#: members/models.py:167 msgid "easy" msgstr "leicht" -#: members/models.py:168 +#: members/models.py:167 msgid "medium" msgstr "mittel" -#: members/models.py:168 +#: members/models.py:167 msgid "hard" msgstr "schwer" -#: members/models.py:177 +#: members/models.py:176 msgid "Memberlist" msgstr "Teilnehmerliste" -#: members/models.py:178 +#: members/models.py:177 msgid "Memberlists" msgstr "Teilnehmerlisten" -#: members/models.py:193 members/models.py:201 members/models.py:246 -#: members/models.py:253 +#: members/models.py:195 members/models.py:203 members/models.py:248 +#: members/models.py:255 msgid "Member" msgstr "Teilnehmer" -#: members/models.py:195 +#: members/models.py:197 msgid "Comment" msgstr "Kommentar" -#: members/models.py:202 members/models.py:254 +#: members/models.py:204 members/models.py:256 msgid "Members" msgstr "Teilnehmer" -#: members/models.py:212 +#: members/models.py:214 msgid "Location" msgstr "Ort" -#: members/models.py:213 +#: members/models.py:215 msgid "Topic" msgstr "Thema" -#: members/models.py:237 +#: members/models.py:239 msgid "Jugendleiter" msgstr "Jugendleiter" -#: members/models.py:240 +#: members/models.py:242 msgid "Klettertreff" msgstr "Klettertreff" -#: members/models.py:241 +#: members/models.py:243 msgid "Klettertreffs" msgstr "Klettertreffs" diff --git a/jdav_web/members/management/commands/get_forward_addrs.py b/jdav_web/members/management/commands/get_forward_addrs.py index ff2646d..a8170d1 100644 --- a/jdav_web/members/management/commands/get_forward_addrs.py +++ b/jdav_web/members/management/commands/get_forward_addrs.py @@ -1,5 +1,6 @@ from django.core.management.base import BaseCommand from members.models import Member +from mailer.models import EmailAddress import re @@ -16,6 +17,10 @@ class Command(BaseCommand): if not match: return prename, lastname = match.groups() + addresses = [addr.email for addr in EmailAddress.objects.filter(name=prename)] + if addresses: + self.stdout.write(" ".join(addresses)) + return try: jugendleiter = Member.objects.filter(group__name='Jugendleiter') matching = [jl.email for jl in jugendleiter if matches(simplify(jl.prename), diff --git a/jdav_web/startpage/locale/de/LC_MESSAGES/django.po b/jdav_web/startpage/locale/de/LC_MESSAGES/django.po index d002a7d..7875fb3 100644 --- a/jdav_web/startpage/locale/de/LC_MESSAGES/django.po +++ b/jdav_web/startpage/locale/de/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-11-11 16:16+0100\n" +"POT-Creation-Date: 2020-01-24 23:21+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n"