diff --git a/dav_events/forms/events.py b/dav_events/forms/events.py index 4908e92..4b163a7 100644 --- a/dav_events/forms/events.py +++ b/dav_events/forms/events.py @@ -2,6 +2,7 @@ import calendar import datetime import logging +import re from babel.dates import format_date from django import forms from django.apps import apps @@ -517,7 +518,9 @@ class TrainerForm(EventCreateForm): max_length=config.TRAINER_NAME_MAX_LENGTH) trainer_familyname = forms.CharField(label=_(u'Familienname'), max_length=config.TRAINER_NAME_MAX_LENGTH) - trainer_email = forms.EmailField(label=_(u'E-Mail-Adresse')) + trainer_email = forms.EmailField(required=False, + label=_(u'E-Mail-Adresse'), + ) trainer_phone = forms.CharField(required=False, max_length=config.PHONE_NUMBER_MAX_LENGTH, label=_(u'Telefonnummer'), @@ -577,6 +580,20 @@ class TrainerForm(EventCreateForm): self.fields['trainer_familyname'].initial = _(u'Kleineheismann') self.fields['trainer_email'].initial = _(u'heinzel@alpenverein-karlsruhe.de') + def clean_trainer_phone(self): + return re.sub(r'[-.]', ' ', self.cleaned_data['trainer_phone']) + + def clean(self): + super(TrainerForm, self).clean() + trainer_email = self.cleaned_data.get('trainer_email', None) + trainer_phone = self.cleaned_data.get('trainer_phone', None) + if not trainer_email and not trainer_phone: + error_msg = _(u'Bitte E-Mail-Adresse und/oder Telefonnummer angeben.') + self.add_error('trainer_email', error_msg) + self.add_error('trainer_phone', error_msg) + raise forms.ValidationError(error_msg) + return self.cleaned_data + class RegistrationForm(EventCreateForm): _form_title = _(u'Teilnehmer / Anmeldung') @@ -625,9 +642,17 @@ class RegistrationForm(EventCreateForm): def get_initial_for_field(self, field, field_name): value = super(RegistrationForm, self).get_initial_for_field(field, field_name) if field_name == 'registration_howto' and value is not None: - trainer_fullname = u'%s %s' % (self._session_data.get('trainer_firstname'), - self._session_data.get('trainer_familyname')) - value = value % {'name': trainer_fullname, 'emailaddr': self._session_data.get('trainer_email')} + trainer_firstname = self._session_data.get('trainer_firstname') + trainer_familyname = self._session_data.get('trainer_familyname') + trainer_email = self._session_data.get('trainer_email', None) + trainer_phone = self._session_data.get('trainer_phone', None) + if trainer_email: + trainer_contact = u'%s %s (%s)' % (trainer_firstname, trainer_familyname, trainer_email) + elif trainer_phone: + trainer_contact = u'%s %s (%s)' % (trainer_firstname, trainer_familyname, trainer_phone) + else: + trainer_contact = u'%s %s' % (trainer_firstname, trainer_familyname) + value %= {'trainer_contact': trainer_contact} elif field_name in ('min_participants', 'max_participants') and value is None: trainer_2 = bool(self._session_data.get('trainer_2_fullname', False)) trainer_3 = bool(self._session_data.get('trainer_3_fullname', False)) diff --git a/dav_events/models.py b/dav_events/models.py index 0d7c2b0..aaa3dbf 100644 --- a/dav_events/models.py +++ b/dav_events/models.py @@ -3,6 +3,7 @@ import datetime import logging import os import re +import unicodedata import uuid from babel.dates import format_date from django.conf import settings @@ -263,10 +264,23 @@ class Event(models.Model): if not self.id: user_model = get_user_model() + username = self.trainer_email.lower() + if not username: + s = self.trainer_firstname.replace(u'ß', u'ss') + s = unicodedata.normalize('NFKD', s).encode('ascii', 'ignore') + s = re.sub(r'[^a-z-]', '', s.lower()) + username = s + s = self.trainer_familyname.replace(u'ß', u'ss') + s = unicodedata.normalize('NFKD', s).encode('ascii', 'ignore') + s = re.sub(r'[^a-z-]', '', s.lower()) + username += '.' + s + s = re.sub(r'[^0-9]', '', str(self.trainer_phone)) + username += '@' + s + try: - owner = user_model.objects.get(username=self.trainer_email.lower()) + owner = user_model.objects.get(username=username) except user_model.DoesNotExist: - owner = user_model(username=self.trainer_email.lower(), + owner = user_model(username=username, first_name=self.trainer_firstname, last_name=self.trainer_familyname, email=self.trainer_email, @@ -285,14 +299,16 @@ class Event(models.Model): managers = get_users_by_role('manage_all') managers += get_users_by_role('manage_{}'.format(self.sport.lower())) for user in managers: - action = OneClickAction(command='EA') - action.parameters = '{event},{user}'.format(event=self.id, user=user.id) - action.save() - email = emails.EventToAcceptMail(recipient=user, event=self, accept_action=action) - email.send() + if user.email: + action = OneClickAction(command='EA') + action.parameters = '{event},{user}'.format(event=self.id, user=user.id) + action.save() + email = emails.EventToAcceptMail(recipient=user, event=self, accept_action=action) + email.send() - email = emails.NewEventMail(recipient=self.owner, event=self) - email.send() + if self.owner.email: + email = emails.NewEventMail(recipient=self.owner, event=self) + email.send() def accept(self, user=None): if not self.accepted: @@ -309,14 +325,16 @@ class Event(models.Model): publishers = get_users_by_role('publish_incremental') for user in publishers: - action = OneClickAction(command='EP') - action.parameters = '{event},{user}'.format(event=self.id, user=user.id) - action.save() - email = emails.EventToPublishMail(recipient=user, event=self, confirm_publication_action=action) - email.send() + if user.email: + action = OneClickAction(command='EP') + action.parameters = '{event},{user}'.format(event=self.id, user=user.id) + action.save() + email = emails.EventToPublishMail(recipient=user, event=self, confirm_publication_action=action) + email.send() - email = emails.EventAcceptedMail(recipient=self.owner, event=self) - email.send() + if self.owner.email: + email = emails.EventAcceptedMail(recipient=self.owner, event=self) + email.send() return self.number else: @@ -453,6 +471,9 @@ class Event(models.Model): def get_numeric_date(self, begin_date=None, end_date=None): return self.get_formated_date(begin_date=begin_date, end_date=end_date, format='numeric') + def get_trainer_full_name(self): + return u'%s %s' % (self.trainer_firstname, self.trainer_familyname) + def get_template_context(self, context=None): r = { 'event': self, @@ -494,6 +515,7 @@ class Event(models.Model): 'pre_meeting_2': self.pre_meeting_2, 'trainer_firstname': self.trainer_firstname, 'trainer_familyname': self.trainer_familyname, + 'trainer_fullname': self.get_trainer_full_name(), 'trainer_email': self.trainer_email, 'trainer_phone': self.trainer_phone, 'trainer_2_fullname': self.trainer_2_fullname, diff --git a/dav_events/templates/dav_events/event_list.html b/dav_events/templates/dav_events/event_list.html index 28d0d4c..02582b5 100644 --- a/dav_events/templates/dav_events/event_list.html +++ b/dav_events/templates/dav_events/event_list.html @@ -51,10 +51,13 @@ {{ event.title }}