Merge branch 'master' into member_lists

v1-0-stable
Schlabonski 9 years ago committed by GitHub
commit 2fdb326c4e

@ -1,16 +1,27 @@
from django.contrib import admin from django.contrib import admin, messages
from django.contrib.admin import helpers from django.contrib.admin import helpers
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.shortcuts import render from django.shortcuts import render
from django.db import models
from django import forms
from .models import Message from .models import Message, Attachment
class AttachmentInline(admin.StackedInline):
model = Attachment
extra = 0
class MessageAdmin(admin.ModelAdmin): class MessageAdmin(admin.ModelAdmin):
"""Message creation view""" """Message creation view"""
list_display = ('subject', 'from_addr', 'get_groups', 'sent') list_display = ('subject', 'from_addr', 'get_groups', 'sent')
change_form_template = "mailer/change_form.html" change_form_template = "mailer/change_form.html"
formfield_overrides = {
models.ManyToManyField: {'widget': forms.CheckboxSelectMultiple}
}
inlines = [AttachmentInline]
actions = ['send_message'] actions = ['send_message']
def send_message(self, request, queryset): def send_message(self, request, queryset):
@ -30,13 +41,19 @@ class MessageAdmin(admin.ModelAdmin):
def response_change(self, request, obj): def response_change(self, request, obj):
if "_send" in request.POST: if "_send" in request.POST:
obj.submit() if not obj.submit():
messages.error(request, _("Failed to send message"))
else:
messages.info(request, _("Successfully sent message"))
return super(MessageAdmin, self).response_change(request, obj) return super(MessageAdmin, self).response_change(request, obj)
def response_add(self, request, obj): def response_add(self, request, obj):
if "_send" in request.POST: if "_send" in request.POST:
obj.submit() if not obj.submit():
return super(MessageAdmin, self).response_change(request, obj) messages.error(request, _("Failed to send message"))
else:
messages.info(request, _("Successfully sent message"))
return super(MessageAdmin, self).response_add(request, obj)
admin.site.register(Message, MessageAdmin) admin.site.register(Message, MessageAdmin)

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-11-19 16:11+0100\n" "POT-Creation-Date: 2017-01-14 15:55+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -18,51 +18,79 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: admin.py:20 #: admin.py:32
msgid "Message sent" msgid "Message sent"
msgstr "Nachricht gesendet" msgstr "Nachricht gesendet"
#: admin.py:28 #: admin.py:40
msgid "Send message" msgid "Send message"
msgstr "Nachricht verschicken" msgstr "Nachricht verschicken"
#: admin.py:45 admin.py:53
msgid "Failed to send message"
msgstr "Fehler beim senden der Email"
#: admin.py:47 admin.py:55
msgid "Successfully sent message"
msgstr "Email wurde erfolgreich verschickt"
#: apps.py:7 #: apps.py:7
msgid "mailer" msgid "mailer"
msgstr "Verteiler" msgstr "Verteiler"
#: models.py:9 #: models.py:34
msgid "from email" msgid "from email"
msgstr "Von Email" msgstr "Von Email"
#: models.py:10 #: models.py:35
msgid "subject" msgid "subject"
msgstr "Betreff" msgstr "Betreff"
#: models.py:11 #: models.py:36
msgid "content" msgid "content"
msgstr "Inhalt" msgstr "Inhalt"
#: models.py:12 #: models.py:38
msgid "to group" msgid "to group"
msgstr "An Gruppe" msgstr "An Gruppe"
#: models.py:13 #: models.py:39
msgid "sent" msgid "sent"
msgstr "Gesendet" msgstr "Gesendet"
#: models.py:29 #: models.py:46
msgid "recipients"
msgstr "Empfänger"
#: models.py:74
msgid "message" msgid "message"
msgstr "Nachricht" msgstr "Nachricht"
#: models.py:30 #: models.py:75
msgid "messages" msgid "messages"
msgstr "Nachrichten" msgstr "Nachrichten"
#: models.py:32 #: models.py:77
msgid "Can submit mails" msgid "Can submit mails"
msgstr "Kann Mails verschicken" msgstr "Kann Mails verschicken"
#: templates/admin/change_form.html:11 #: models.py:86
msgid "file"
msgstr "Datei"
#: models.py:92
msgid "Empty"
msgstr "Leer"
#: models.py:95
msgid "attachment"
msgstr "Anhang"
#: models.py:96
msgid "attachments"
msgstr "Anhänge"
#: templates/mailer/change_form.html:11
msgid "Save and send mail" msgid "Save and send mail"
msgstr "Speichern und Email senden" msgstr "Speichern und Email senden"
@ -89,6 +117,14 @@ msgstr "Senden"
msgid "Cancel" msgid "Cancel"
msgstr "Abbruch" msgstr "Abbruch"
#: templates/mailer/confirmation_sent.html:3
msgid "Sent confirmation mail to"
msgstr "Bestätigungsmail gesendet an"
#: templates/mailer/confirmation_sent.html:3
msgid "Follow the link in your mail to confirm your unsubscription."
msgstr ""
#: templates/mailer/index.html:2 #: templates/mailer/index.html:2
msgid "This is the mailer app!" msgid "This is the mailer app!"
msgstr "Das ist die Mailer App!" msgstr "Das ist die Mailer App!"
@ -113,9 +149,71 @@ msgstr "Erhaltende Gruppe"
msgid "Send mail" msgid "Send mail"
msgstr "Email senden" msgstr "Email senden"
#: views.py:33 #: templates/mailer/subscribe.html:5
msgid "Here you can register yourself to the newsletter"
msgstr "Hier kannst du dich für den Newsletter anmelden."
#: templates/mailer/subscribe.html:16
msgid "Prename"
msgstr "Vorname"
#: templates/mailer/subscribe.html:21
msgid "Lastname"
msgstr "Nachname"
#: templates/mailer/subscribe.html:26 views.py:60
msgid "Birthdate"
msgstr "Geburtsdatum"
#: templates/mailer/subscribe.html:37 templates/mailer/unsubscribe.html:14
msgid "Email address"
msgstr "Email-Adresse"
#: templates/mailer/subscribe.html:42
msgid "Register"
msgstr "Registrieren"
#: templates/mailer/subscribed.html:3
msgid "Subscribed successfully"
msgstr "Erfolgreich angemeldet"
#: templates/mailer/unsubscribe.html:3
msgid "Here you can unsubscribe from the newsletter"
msgstr "Hier kannst du dich vom Newsletter abmelden"
#: templates/mailer/unsubscribe.html:19
msgid "Unsubscribe"
msgstr "Vom Newsletter abmelden"
#: templates/mailer/unsubscribed.html:4
msgid "Successfully unsubscribed from the newsletter for "
msgstr "Newsletter erfolgreich abbestellt für "
#: views.py:35
msgid "Can't verify this link. Try again!"
msgstr "Ungültiger Link. Bitte nochmal versuchen!"
#: views.py:47
msgid "Please fill in every field"
msgstr "Bitte jedes Feld ausfüllen!"
#: views.py:49
msgid "Confirmation of unsubscription"
msgstr "Abmeldebestätigung"
#: views.py:50
msgid ""
"Click the link to unsubscribe to the newsletter of the JDAV\n"
"{}"
msgstr "Klicke auf den Link um dich von Newsletter des JDAV Ludwigsburg abzumelden"
#: views.py:83
msgid "Please fill in every field!" msgid "Please fill in every field!"
msgstr "Bitte jedes Feld ausfüllen!" msgstr "Bitte jedes Feld ausfüllen!"
#: views.py:90
msgid "Member already exists"
msgstr "Mitglied schon vorhanden"
#~ msgid "History" #~ msgid "History"
#~ msgstr "Geschichte" #~ msgstr "Geschichte"

@ -1,16 +1,25 @@
from django.core.mail import send_mass_mail, send_mail from django.core.mail import EmailMessage
def send(subject, content, sender, recipicient): def send(subject, content, sender, recipients, reply_to=None,
send_mail(subject, content, sender, [recipicient]) attachments=None):
if type(recipients) != list:
recipients = [recipients]
def send_mass(subject, content, sender, recipicients): if reply_to is not None:
data = [ kwargs = {"reply_to": [reply_to]}
(subject, content, sender, [recipicient]) else:
for recipicient in recipicients] kwargs = {}
print("sending data", data) email = EmailMessage(subject, content, sender, recipients, **kwargs)
send_mass_mail(data) if attachments is not None:
for attach in attachments:
email.attach_file(attach)
try:
email.send()
except Exception as e:
print("Error when sending mail:", e)
return False
else:
return True
def get_content(content): def get_content(content):

@ -1,6 +1,31 @@
from django.db import models from django.db import models
from django.forms import forms
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from .mailutils import send_mass, get_content from .mailutils import send, get_content
import os
class RestrictedFileField(models.FileField):
def __init__(self, *args, **kwargs):
if "max_upload_size" in kwargs:
self.max_upload_size = kwargs.pop("max_upload_size")
super(RestrictedFileField, self).__init__(*args, **kwargs)
def clean(self, *args, **kwargs):
data = super(RestrictedFileField, self).clean(*args, **kwargs)
f = data.file
try:
if f._size > self.max_upload_size:
raise forms.ValidationError('Please keep filesize under {}. '
'Current filesize: '
'{}'.format(self.max_upload_size,
f._size))
except AttributeError as e:
print(e)
return data
# Create your models here. # Create your models here.
@ -29,10 +54,21 @@ class Message(models.Model):
if not member.gets_newsletter: if not member.gets_newsletter:
continue continue
members.add(member) members.add(member)
send_mass(self.subject, get_content(self.content), attach = [a.f.path for a in Attachment.objects.filter(msg__id=self.pk)
self.from_addr, [member.email for member in members]) if a.f.name]
self.sent = True success = send(self.subject, get_content(self.content),
self.save() self.from_addr, [member.email for member in members],
attachments=attach)
for a in Attachment.objects.filter(msg__id=self.pk):
if a.f.name:
os.remove(a.f.path)
a.delete()
if success:
self.sent = True
self.save()
return True
else:
return False
class Meta: class Meta:
verbose_name = _('message') verbose_name = _('message')
@ -40,3 +76,21 @@ class Message(models.Model):
permissions = ( permissions = (
("submit_mails", _("Can submit mails")), ("submit_mails", _("Can submit mails")),
) )
class Attachment(models.Model):
"""Represents an attachment to an email"""
msg = models.ForeignKey(Message, on_delete=models.CASCADE)
print("attachment class")
# file (not naming it file because of builtin)
f = RestrictedFileField(_('file'),
upload_to='attachments',
blank=True,
max_upload_size=10485760)
def __str__(self):
return os.path.basename(self.f.name) if self.f.name else _("Empty")
class Meta:
verbose_name = _('attachment')
verbose_name_plural = _('attachments')

@ -1,3 +1,7 @@
{% load i18n %} {% load i18n %}
<head>
<title>{% trans "Unsubscribe" %}</title>
</head>
<p>{% trans "Sent confirmation mail to" %} <b>{{ email }}</b>. {% trans "Follow the link in your mail to confirm your unsubscription." %}</p> <p>{% trans "Sent confirmation mail to" %} <b>{{ email }}</b>. {% trans "Follow the link in your mail to confirm your unsubscription." %}</p>

@ -1,5 +1,11 @@
{% load i18n %} {% load i18n %}
<head>
<title>
{% trans "Unsubscribe" %}
</title>
</head>
<p><b>{% trans "Here you can unsubscribe from the newsletter" %}</b></p> <p><b>{% trans "Here you can unsubscribe from the newsletter" %}</b></p>
{% if error_message %} {% if error_message %}

@ -1,5 +1,9 @@
{% load i18n %} {% load i18n %}
<head>
<title>{% trans Unsubscribe %}</title>
</head>
<p> <p>
{% trans "Successfully unsubscribed from the newsletter for " %}<b>{{ email }}</b> {% trans "Successfully unsubscribed from the newsletter for " %}<b>{{ email }}</b>
</p> </p>

@ -46,9 +46,10 @@ def unsubscribe(request):
except (KeyError, Member.DoesNotExist): except (KeyError, Member.DoesNotExist):
return render_unsubscribe(request, _("Please fill in every field")) return render_unsubscribe(request, _("Please fill in every field"))
else: else:
send_mail(_("Confirmation of unsubscription"), send_mail("Abmeldebestätigung",
_("Click the link to unsubscribe to the newsletter of" "Klicke auf den Link, um dich vom Newsletter des JDAV "
" the JDAV\n{}".format(get_unsubscribe_link(member))), "Ludwigsburg "
"abzumelden\n{}".format(get_unsubscribe_link(member)),
mail_root, email) mail_root, email)
return render_confirmation_sent(request, email) return render_confirmation_sent(request, email)

@ -1,5 +1,5 @@
from django.contrib import admin from django.contrib import admin
from django.utils. translation import ugettext_lazy as translate from django.utils.translation import ugettext_lazy as _
from django.contrib.admin import SimpleListFilter from django.contrib.admin import SimpleListFilter
from .models import MaterialPart, Ownership from .models import MaterialPart, Ownership
@ -16,13 +16,13 @@ class OwnershipInline(admin.StackedInline):
class NotTooOldFilter(SimpleListFilter): class NotTooOldFilter(SimpleListFilter):
title = translate('Age') title = _('Age')
parameter_name = 'age' parameter_name = 'age'
def lookups(self, request, model_admin): def lookups(self, request, model_admin):
return ( return (
('too_old', translate('Not Too Old')), ('too_old', _('Not too old')),
('not_too_old', translate('Too old')), ('not_too_old', _('Too old')),
) )
def queryset(self, request, queryset): def queryset(self, request, queryset):
@ -31,7 +31,7 @@ class NotTooOldFilter(SimpleListFilter):
if self.value() == 'not_too_old': if self.value() == 'not_too_old':
return queryset.filter(pk__in=[x.pk for x in queryset.all() if not x.not_too_old()]) return queryset.filter(pk__in=[x.pk for x in queryset.all() if not x.not_too_old()])
class MaterialAdmin(admin.ModelAdmin): class MaterialAdmin(admin.ModelAdmin):
"""Edit view of a MaterialPart""" """Edit view of a MaterialPart"""
@ -41,4 +41,4 @@ class MaterialAdmin(admin.ModelAdmin):
list_filter = (NotTooOldFilter,) list_filter = (NotTooOldFilter,)
admin.site.register(MaterialPart, MaterialAdmin) admin.site.register(MaterialPart, MaterialAdmin)

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-10-21 23:38+0200\n" "POT-Creation-Date: 2017-01-14 16:49+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -18,6 +18,18 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: admin.py:19
msgid "Age"
msgstr "Alter"
#: admin.py:24
msgid "Not too old"
msgstr "Nicht zu alt"
#: admin.py:25
msgid "Too old"
msgstr "Zu alt"
#: apps.py:7 #: apps.py:7
msgid "material" msgid "material"
msgstr "Material" msgstr "Material"
@ -27,10 +39,14 @@ msgid "name"
msgstr "Name" msgstr "Name"
#: models.py:18 #: models.py:18
msgid "quantity"
msgstr "Anzahl"
#: models.py:19
msgid "purchase date" msgid "purchase date"
msgstr "Kaufdatum" msgstr "Kaufdatum"
#: models.py:19 #: models.py:20
msgid "lifetime (years)" msgid "lifetime (years)"
msgstr "Lebenszeit (Jahre)" msgstr "Lebenszeit (Jahre)"
@ -38,30 +54,34 @@ msgstr "Lebenszeit (Jahre)"
msgid "photo" msgid "photo"
msgstr "Bild" msgstr "Bild"
#: models.py:35 #: models.py:32
msgid "Quantity"
msgstr "Anzahl"
#: models.py:42
msgid "Not too old?" msgid "Not too old?"
msgstr "Nicht zu alt?" msgstr "Nicht zu alt?"
#: models.py:38 #: models.py:45
msgid "material part" msgid "material part"
msgstr "Materialteil" msgstr "Materialteil"
#: models.py:39 #: models.py:46
msgid "material parts" msgid "material parts"
msgstr "Materialteile" msgstr "Materialteile"
#: models.py:45 #: models.py:52
msgid "owner" msgid "owner"
msgstr "Besitzer" msgstr "Besitzer"
#: models.py:46 #: models.py:53
msgid "count" msgid "count"
msgstr "Anzahl" msgstr "Anzahl"
#: models.py:53 #: models.py:60
msgid "ownership" msgid "ownership"
msgstr "Besitztum" msgstr "Besitztum"
#: models.py:54 #: models.py:61
msgid "ownerships" msgid "ownerships"
msgstr "Besitztümer" msgstr "Besitztümer"

@ -25,13 +25,12 @@ class MaterialPart(models.Model):
return self.name return self.name
def quantity_real(self): def quantity_real(self):
real = sum([o.count for o in Ownership.objects.filter(material__id = self.pk)]) real = sum([o.count for o in Ownership.objects.filter(material__id=self.pk)])
return str(real) + '/' + str(self.quantity) return str(real) + '/' + str(self.quantity)
quantity_real.admin_order_field = 'quantity' quantity_real.admin_order_field = 'quantity'
quantity_real.short_description = _('Quantity') quantity_real.short_description = _('Quantity')
def not_too_old(self): def not_too_old(self):
"""Returns wether the part should be replaced cause of age""" """Returns wether the part should be replaced cause of age"""
buy_time = timezone.make_aware(datetime.combine(self.buy_date, buy_time = timezone.make_aware(datetime.combine(self.buy_date,

@ -11,7 +11,7 @@ from django import forms
from django.contrib import admin from django.contrib import admin
from django.contrib.admin import DateFieldListFilter from django.contrib.admin import DateFieldListFilter
from django.utils.translation import ugettext_lazy as translate from django.utils.translation import ugettext_lazy as translate
from django.db.models import TextField from django.db.models import TextField, ManyToManyField
from django.forms import Textarea from django.forms import Textarea
from .models import (Member, Group, MemberList, MemberOnList, Klettertreff, from .models import (Member, Group, MemberList, MemberOnList, Klettertreff,
@ -22,9 +22,11 @@ from .models import (Member, Group, MemberList, MemberOnList, Klettertreff,
class MemberAdmin(admin.ModelAdmin): class MemberAdmin(admin.ModelAdmin):
fields = ['prename', 'lastname', 'email', 'street', 'town', 'phone_number', 'phone_number_parents', 'birth_date', 'group', fields = ['prename', 'lastname', 'email', 'street', 'town', 'phone_number', 'phone_number_parents', 'birth_date', 'group',
'gets_newsletter', 'comments'] 'gets_newsletter', 'comments']
list_display = ('name', 'street', 'town', 'phone_number', list_display = ('name', 'birth_date', 'gets_newsletter', 'get_group', 'comments')
'phone_number_parents', 'birth_date', 'gets_newsletter', 'get_group', 'comments')
list_filter = ('group', 'gets_newsletter') list_filter = ('group', 'gets_newsletter')
formfield_overrides = {
ManyToManyField: {'widget': forms.CheckboxSelectMultiple}
}
class GroupAdmin(admin.ModelAdmin): class GroupAdmin(admin.ModelAdmin):
@ -149,6 +151,7 @@ class MemberListAdmin(admin.ModelAdmin):
return response return response
class KlettertreffAdminForm(forms.ModelForm): class KlettertreffAdminForm(forms.ModelForm):
class Meta: class Meta:
model = Klettertreff model = Klettertreff
@ -169,6 +172,10 @@ class KlettertreffAdmin(admin.ModelAdmin):
inlines = [KlettertreffAttendeeInline] inlines = [KlettertreffAttendeeInline]
list_display = ['__str__', 'date', 'get_jugendleiter'] list_display = ['__str__', 'date', 'get_jugendleiter']
list_filter = [('date', DateFieldListFilter)] list_filter = [('date', DateFieldListFilter)]
formfield_overrides = {
ManyToManyField: {'widget': forms.CheckboxSelectMultiple}
}
admin.site.register(Member, MemberAdmin) admin.site.register(Member, MemberAdmin)
admin.site.register(Group, GroupAdmin) admin.site.register(Group, GroupAdmin)

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-10-21 23:37+0200\n" "POT-Creation-Date: 2017-01-14 16:40+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -18,38 +18,118 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: apps.py:7 models.py:45 #: apps.py:7 models.py:81
msgid "members" msgid "members"
msgstr "Teilnehmer" msgstr "Teilnehmer"
#: models.py:10 #: models.py:13
msgid "name" msgid "name"
msgstr "Name" msgstr "Name"
#: models.py:12 #: models.py:15
msgid "minimum age (years)" msgid "minimum age (years)"
msgstr "Mindestalter (Jahre)" msgstr "Mindestalter (Jahre)"
#: models.py:19 #: models.py:22 models.py:39
msgid "group" msgid "group"
msgstr "Gruppe" msgstr "Gruppe"
#: models.py:20 #: models.py:23
msgid "groups" msgid "groups"
msgstr "Gruppen" msgstr "Gruppen"
#: models.py:28 #: models.py:31
msgid "prename" msgid "prename"
msgstr "Vorname" msgstr "Vorname"
#: models.py:29 #: models.py:32
msgid "last name" msgid "last name"
msgstr "Nachname" msgstr "Nachname"
#: models.py:31 #: models.py:33
msgid "street"
msgstr "Straße"
#: models.py:34
msgid "town"
msgstr "Stadt"
#: models.py:35
msgid "phone number"
msgstr "Telefonnummer"
#: models.py:36
msgid "parents phone number"
msgstr "Telefonnummer der Eltern"
#: models.py:38
msgid "birth date" msgid "birth date"
msgstr "Geburtsdatum" msgstr "Geburtsdatum"
#: models.py:40
msgid "receives newsletter"
msgstr "Erhält den Newsletter"
#: models.py:44 #: models.py:44
msgid "comments"
msgstr "Kommentare"
#: models.py:77
msgid "Group"
msgstr "Gruppe"
#: models.py:80
msgid "member" msgid "member"
msgstr "Teilnehmer" msgstr "Teilnehmer"
#: models.py:86
msgid "Listname"
msgstr "Name der Liste"
#: models.py:88
msgid "date"
msgstr "Datum"
#: models.py:89
msgid "Comments"
msgstr "Kommentare"
#: models.py:96
msgid "Memberlist"
msgstr "Teilnehmerliste"
#: models.py:97
msgid "Memberlists"
msgstr "Teilnehmerlisten"
#: models.py:104 models.py:109 models.py:139 models.py:143
msgid "Member"
msgstr "Teilnehmer"
#: models.py:106
msgid "Comment"
msgstr "Kommentar"
#: models.py:110 models.py:144
msgid "Members"
msgstr "Teilnehmer"
#: models.py:119
msgid "Date"
msgstr "Datum"
#: models.py:120
msgid "Location"
msgstr "Ort"
#: models.py:130
msgid "Jugendleiter"
msgstr "Jugendleiter"
#: models.py:133
msgid "Klettertreff"
msgstr "Klettertreff"
#: models.py:134
msgid "Klettertreffs"
msgstr "Klettertreffs"

@ -38,7 +38,7 @@ class Member(models.Model):
phone_number_parents = models.CharField(max_length=12, verbose_name=_('parents phone number'), default='', blank=True) phone_number_parents = models.CharField(max_length=12, verbose_name=_('parents phone number'), default='', blank=True)
email = models.EmailField(max_length=100, default="") email = models.EmailField(max_length=100, default="")
birth_date = models.DateField(_('birth date')) # to determine the age birth_date = models.DateField(_('birth date')) # to determine the age
group = models.ManyToManyField(Group) group = models.ManyToManyField(Group, verbose_name=_('group'))
gets_newsletter = models.BooleanField(_('receives newsletter'), gets_newsletter = models.BooleanField(_('receives newsletter'),
default=True) default=True)
unsubscribe_key = models.CharField(max_length=32, default="") unsubscribe_key = models.CharField(max_length=32, default="")
@ -70,7 +70,7 @@ class Member(models.Model):
def name(self): def name(self):
"""Returning whole name (prename + lastname)""" """Returning whole name (prename + lastname)"""
return "{0} {1}".format(self.prename, self.lastname) return "{0} {1}".format(self.prename, self.lastname)
def get_group(self): def get_group(self):
"""Returns a string of groups in which the member is.""" """Returns a string of groups in which the member is."""
groupstring = ''.join(g.name + ',\n' for g in self.group.all()) groupstring = ''.join(g.name + ',\n' for g in self.group.all())
@ -85,6 +85,7 @@ class Member(models.Model):
class MemberList(models.Model): class MemberList(models.Model):
"""Lets the user create a list of members in pdf format. """ """Lets the user create a list of members in pdf format. """
name = models.CharField(verbose_name='Activity', default='', name = models.CharField(verbose_name='Activity', default='',
max_length=50) max_length=50)
place = models.CharField(verbose_name=_('Place'), default='', max_length=50) place = models.CharField(verbose_name=_('Place'), default='', max_length=50)
@ -98,30 +99,39 @@ class MemberList(models.Model):
('Ausbildung', 'Ausbildung')) ('Ausbildung', 'Ausbildung'))
tour_type = MultiSelectField(choices=tour_type_choices, default='', max_choices=1) tour_type = MultiSelectField(choices=tour_type_choices, default='', max_choices=1)
def __str__(self): def __str__(self):
"""String represenation""" """String represenation"""
return self.name return self.name
class Meta:
verbose_name = _('Memberlist')
verbose_name_plural = _('Memberlists')
class MemberOnList(models.Model): class MemberOnList(models.Model):
""" """
Connects members to a list of members. Connects members to a list of members.
""" """
member = models.ForeignKey(Member) member = models.ForeignKey(Member, verbose_name=_('Member'))
memberlist = models.ForeignKey(MemberList) memberlist = models.ForeignKey(MemberList)
comments = models.TextField(_('Comment'), default='', blank=True) comments = models.TextField(_('Comment'), default='', blank=True)
class Meta:
verbose_name = _('Member')
verbose_name_plural = _('Members')
class Klettertreff(models.Model): class Klettertreff(models.Model):
""" This model represents a Klettertreff event. """ This model represents a Klettertreff event.
A Klettertreff can take a date, location, Jugendleiter, attending members as A Klettertreff can take a date, location, Jugendleiter, attending members
input. as input.
""" """
date = models.DateField(_('Date'), default=datetime.today) date = models.DateField(_('Date'), default=datetime.today)
location = models.CharField(_('Location'), default='', max_length=60) location = models.CharField(_('Location'), default='', max_length=60)
jugendleiter = models.ManyToManyField(Member) jugendleiter = models.ManyToManyField(Member)
def __str__(self): def __str__(self):
return self.location + ' ' + self.date.strftime('%d.%m.%Y') return self.location + ' ' + self.date.strftime('%d.%m.%Y')
@ -131,8 +141,16 @@ class Klettertreff(models.Model):
get_jugendleiter.short_description = _('Jugendleiter') get_jugendleiter.short_description = _('Jugendleiter')
class Meta:
verbose_name = _('Klettertreff')
verbose_name_plural = _('Klettertreffs')
class KlettertreffAttendee(models.Model): class KlettertreffAttendee(models.Model):
"""Connects members to Klettertreffs.""" """Connects members to Klettertreffs."""
member = models.ForeignKey(Member) member = models.ForeignKey(Member, verbose_name=_('Member'))
klettertreff = models.ForeignKey(Klettertreff) klettertreff = models.ForeignKey(Klettertreff)
class Meta:
verbose_name = _('Member')
verbose_name_plural = _('Members')

Loading…
Cancel
Save