UPD: small steps to become python3 compatible.

This commit is contained in:
2019-03-28 18:08:12 +01:00
parent e05bf3e56f
commit 943285f1ed
12 changed files with 164 additions and 147 deletions

View File

@@ -1,7 +1,7 @@
- FIX: validation for first_day - FIX: validation for first_day
- FIX: no timezone on pre_meeting - FIX: no timezone on pre_meeting
- chainedform für update - Test event list export
- bootstrap update - bootstrap update
- python und django update - python und django update

View File

@@ -1,4 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.test import SimpleTestCase, tag from django.test import SimpleTestCase, tag
from django.utils.translation import ugettext from django.utils.translation import ugettext
@@ -11,7 +12,7 @@ from dav_base.tests.generic import SeleniumTestCase
from .generic import SeleniumAuthMixin from .generic import SeleniumAuthMixin
TEST_USERNAME = 'root@localhost' TEST_USERNAME = 'root@localhost'
TEST_PASSWORD = u'me||ön 2' TEST_PASSWORD = 'me||ön 2'
TEST_EMAIL = TEST_USERNAME TEST_EMAIL = TEST_USERNAME
@@ -19,8 +20,8 @@ class TemplatesTestCase(SimpleTestCase):
def test_reset_link_in_login_form(self): def test_reset_link_in_login_form(self):
login_url = reverse('dav_auth:login') login_url = reverse('dav_auth:login')
reset_url = reverse('dav_auth:reset_password') reset_url = reverse('dav_auth:reset_password')
text = ugettext(u'Passwort vergessen?') text = ugettext('Passwort vergessen?')
html = u'<a href="{url}">{text}</a>'.format(url=reset_url, text=text) html = '<a href="{url}">{text}</a>'.format(url=reset_url, text=text)
response = self.client.get(login_url) response = self.client.get(login_url)
self.assertInHTML(html, response.content) self.assertInHTML(html, response.content)
@@ -50,18 +51,18 @@ class TestCase(SeleniumAuthMixin, SeleniumTestCase):
c.get(self.complete_url(location)) c.get(self.complete_url(location))
field = c.find_element_by_id('id_username') field = c.find_element_by_id('id_username')
self.assertEqual(field.get_attribute('required'), u'true') self.assertEqual(field.get_attribute('required'), 'true')
field = c.find_element_by_id('id_password') field = c.find_element_by_id('id_password')
self.assertEqual(field.get_attribute('required'), u'true') self.assertEqual(field.get_attribute('required'), 'true')
def test_required_fields_in_set_password_form(self): def test_required_fields_in_set_password_form(self):
c = self.login(self.selenium, self.test_username, self.test_password) c = self.login(self.selenium, self.test_username, self.test_password)
c.get(self.complete_url(reverse('dav_auth:set_password'))) c.get(self.complete_url(reverse('dav_auth:set_password')))
field = self.wait_on_presence(c, (By.ID, "id_new_password")) field = self.wait_on_presence(c, (By.ID, 'id_new_password'))
self.assertEqual(field.get_attribute('required'), u'true') self.assertEqual(field.get_attribute('required'), 'true')
field = c.find_element_by_id('id_new_password_repeat') field = c.find_element_by_id('id_new_password_repeat')
self.assertEqual(field.get_attribute('required'), u'true') self.assertEqual(field.get_attribute('required'), 'true')
field = c.find_element_by_id('id_send_password_mail') field = c.find_element_by_id('id_send_password_mail')
self.assertEqual(field.get_attribute('required'), None) self.assertEqual(field.get_attribute('required'), None)

View File

@@ -1,6 +1,5 @@
import datetime import datetime
import os import os
import urllib
from django.apps import apps from django.apps import apps
from django.contrib.auth.models import AbstractUser from django.contrib.auth.models import AbstractUser
from django.contrib.staticfiles.testing import StaticLiveServerTestCase from django.contrib.staticfiles.testing import StaticLiveServerTestCase
@@ -9,6 +8,7 @@ from django.urls import reverse
from selenium import webdriver from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support import expected_conditions as EC
from six.moves.urllib.parse import quote
class AppSetting(object): class AppSetting(object):
@@ -252,7 +252,7 @@ class ScreenshotTestCase(SeleniumTestCase):
self.screenshot_sequences = {} self.screenshot_sequences = {}
def sanitize_filename(self, location): def sanitize_filename(self, location):
return urllib.quote(location).replace('/', '--') return quote(location).replace('/', '--')
def save_screenshot(self, title=None, sequence=None, resize=True): def save_screenshot(self, title=None, sequence=None, resize=True):
if sequence is None: if sequence is None:

View File

@@ -1,3 +1,4 @@
from __future__ import unicode_literals
from django.conf import settings from django.conf import settings
from django.test import SimpleTestCase from django.test import SimpleTestCase

View File

@@ -1,4 +1,4 @@
from generic import Url, UrlsTestCase from .generic import Url, UrlsTestCase
from ..views import RootView, generic from ..views import RootView, generic

View File

@@ -1,4 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from __future__ import unicode_literals
import datetime import datetime
import difflib import difflib
import logging import logging
@@ -11,6 +12,7 @@ from django.contrib.auth import get_user_model
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.db import models from django.db import models
from django.template.loader import get_template from django.template.loader import get_template
from django.utils.encoding import python_2_unicode_compatible
from django.utils.translation import get_language, ugettext_lazy as _ from django.utils.translation import get_language, ugettext_lazy as _
from django_countries.fields import CountryField from django_countries.fields import CountryField
@@ -24,206 +26,207 @@ from ..workflow import DefaultWorkflow
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@python_2_unicode_compatible
class Event(models.Model): class Event(models.Model):
# Metadata # Metadata
owner = models.ForeignKey(settings.AUTH_USER_MODEL, owner = models.ForeignKey(settings.AUTH_USER_MODEL,
null=True, null=True,
on_delete=models.SET(get_ghost_user), on_delete=models.SET(get_ghost_user),
related_name='events', related_name='events',
verbose_name=_(u'Ersteller')) verbose_name=_('Ersteller'))
created_at = models.DateTimeField(auto_now_add=True, created_at = models.DateTimeField(auto_now_add=True,
verbose_name=_(u'Erstellt')) verbose_name=_('Erstellt'))
number = models.CharField(unique=True, number = models.CharField(unique=True,
max_length=config.NUMBER_MAX_LENGTH, max_length=config.NUMBER_MAX_LENGTH,
blank=True, blank=True,
null=True, null=True,
default=None, default=None,
verbose_name=_(u'Programmnummer')) verbose_name=_('Programmnummer'))
# DescriptionForm # DescriptionForm
title = models.CharField(max_length=config.TITLE_MAX_LENGTH, verbose_name=_(u'Titel')) title = models.CharField(max_length=config.TITLE_MAX_LENGTH, verbose_name=_('Titel'))
description = models.TextField(verbose_name=_(u'Beschreibung')) description = models.TextField(verbose_name=_('Beschreibung'))
# ModeForm # ModeForm
mode = models.CharField(max_length=choices.CHOICE_FIELD_MAX_LENGTH, mode = models.CharField(max_length=choices.CHOICE_FIELD_MAX_LENGTH,
choices=choices.MODE_CHOICES, choices=choices.MODE_CHOICES,
verbose_name=_(u'Veranstaltungsart')) verbose_name=_('Veranstaltungsart'))
sport = models.CharField(max_length=choices.CHOICE_FIELD_MAX_LENGTH, sport = models.CharField(max_length=choices.CHOICE_FIELD_MAX_LENGTH,
choices=choices.SPORT_CHOICES, choices=choices.SPORT_CHOICES,
verbose_name=_(u'Spielart')) verbose_name=_('Spielart'))
ski_lift = models.BooleanField(default=False, ski_lift = models.BooleanField(default=False,
verbose_name=_(u'Skiliftbenutzung')) verbose_name=_('Skiliftbenutzung'))
level = models.CharField(max_length=choices.CHOICE_FIELD_MAX_LENGTH, level = models.CharField(max_length=choices.CHOICE_FIELD_MAX_LENGTH,
choices=choices.LEVEL_CHOICES, choices=choices.LEVEL_CHOICES,
verbose_name=_(u'Schwierigkeitsnivau')) verbose_name=_('Schwierigkeitsnivau'))
first_day = models.DateField(verbose_name=_(u'Erster Tag')) first_day = models.DateField(verbose_name=_('Erster Tag'))
alt_first_day = models.DateField(blank=True, alt_first_day = models.DateField(blank=True,
null=True, null=True,
verbose_name=u'%s - %s' % (_(u'Ersatztermin'), _(u'Erster Tag'))) verbose_name='%s - %s' % (_('Ersatztermin'), _('Erster Tag')))
last_day = models.DateField(blank=True, last_day = models.DateField(blank=True,
null=True, null=True,
verbose_name=_(u'Letzter Tag')) verbose_name=_('Letzter Tag'))
alt_last_day = models.DateField(blank=True, alt_last_day = models.DateField(blank=True,
null=True, null=True,
verbose_name=u'%s - %s' % (_(u'Ersatztermin'), _(u'Letzter Tag'))) verbose_name='%s - %s' % (_('Ersatztermin'), _('Letzter Tag')))
# LocationForm # LocationForm
country = CountryField(countries=choices.CountryChoiceSet, country = CountryField(countries=choices.CountryChoiceSet,
verbose_name=_(u'Land')) verbose_name=_('Land'))
terrain = models.CharField(max_length=choices.CHOICE_FIELD_MAX_LENGTH, terrain = models.CharField(max_length=choices.CHOICE_FIELD_MAX_LENGTH,
choices=choices.TERRAIN_CHOICES, choices=choices.TERRAIN_CHOICES,
default=choices.TERRAIN_CHOICES[0][0], default=choices.TERRAIN_CHOICES[0][0],
verbose_name=_(u'Gelände')) verbose_name=_('Gelände'))
location = models.CharField(max_length=config.LOCATION_MAX_LENGTH, location = models.CharField(max_length=config.LOCATION_MAX_LENGTH,
blank=True, blank=True,
verbose_name=_(u'Ort oder Gebiet')) verbose_name=_('Ort oder Gebiet'))
transport = models.CharField(max_length=choices.CHOICE_FIELD_MAX_LENGTH, transport = models.CharField(max_length=choices.CHOICE_FIELD_MAX_LENGTH,
choices=choices.TRANSPORT_CHOICES, choices=choices.TRANSPORT_CHOICES,
default=choices.TRANSPORT_CHOICES[0][0], default=choices.TRANSPORT_CHOICES[0][0],
verbose_name=_(u'Verkehrsmittel')) verbose_name=_('Verkehrsmittel'))
transport_other = models.CharField(max_length=config.TRANSPORT_OTHER_MAX_LENGTH, transport_other = models.CharField(max_length=config.TRANSPORT_OTHER_MAX_LENGTH,
blank=True, blank=True,
verbose_name=_(u'Anderes Verkehrsmittel')) verbose_name=_('Anderes Verkehrsmittel'))
# JourneyForm # JourneyForm
meeting_point = models.CharField(max_length=choices.CHOICE_FIELD_MAX_LENGTH, meeting_point = models.CharField(max_length=choices.CHOICE_FIELD_MAX_LENGTH,
choices=choices.MEETING_POINT_CHOICES, choices=choices.MEETING_POINT_CHOICES,
default=choices.MEETING_POINT_CHOICES[0][0], default=choices.MEETING_POINT_CHOICES[0][0],
verbose_name=_(u'Treffpunkt')) verbose_name=_('Treffpunkt'))
meeting_point_other = models.CharField(max_length=config.MEETING_POINT_OTHER_MAX_LENGTH, meeting_point_other = models.CharField(max_length=config.MEETING_POINT_OTHER_MAX_LENGTH,
blank=True, blank=True,
verbose_name=_(u'Anderer Treffpunkt')) verbose_name=_('Anderer Treffpunkt'))
meeting_time = models.TimeField(blank=True, meeting_time = models.TimeField(blank=True,
null=True, null=True,
verbose_name=_(u'Uhrzeit am Treffpunkt')) verbose_name=_('Uhrzeit am Treffpunkt'))
departure_time = models.TimeField(blank=True, departure_time = models.TimeField(blank=True,
null=True, null=True,
verbose_name=_(u'Uhrzeit Abfahrt')) verbose_name=_('Uhrzeit Abfahrt'))
departure_ride = models.CharField(max_length=config.DEPARTURE_RIDE_MAX_LENGTH, departure_ride = models.CharField(max_length=config.DEPARTURE_RIDE_MAX_LENGTH,
blank=True, blank=True,
verbose_name=_(u'Bahn-/Bus-Linie')) verbose_name=_('Bahn-/Bus-Linie'))
return_departure_time = models.TimeField(blank=True, return_departure_time = models.TimeField(blank=True,
null=True, null=True,
verbose_name=_(u'Uhrzeit Rückfahrt')) verbose_name=_('Uhrzeit Rückfahrt'))
return_arrival_time = models.TimeField(blank=True, return_arrival_time = models.TimeField(blank=True,
null=True, null=True,
verbose_name=_(u'Uhrzeit Rückkunft')) verbose_name=_('Uhrzeit Rückkunft'))
arrival_previous_day = models.BooleanField(default=False, arrival_previous_day = models.BooleanField(default=False,
verbose_name=_(u'Anreise des Trainers am Vortag')) verbose_name=_('Anreise des Trainers am Vortag'))
# AccommodationForm # AccommodationForm
basecamp = models.CharField(max_length=config.BASECAMP_MAX_LENGTH, basecamp = models.CharField(max_length=config.BASECAMP_MAX_LENGTH,
blank=True, blank=True,
verbose_name=_(u'Stützpunkt')) verbose_name=_('Stützpunkt'))
accommodation = models.CharField(max_length=choices.CHOICE_FIELD_MAX_LENGTH, accommodation = models.CharField(max_length=choices.CHOICE_FIELD_MAX_LENGTH,
choices=choices.ACCOMMODATION_CHOICES, choices=choices.ACCOMMODATION_CHOICES,
default=choices.ACCOMMODATION_CHOICES[0][0], default=choices.ACCOMMODATION_CHOICES[0][0],
verbose_name=_(u'Unterkunft')) verbose_name=_('Unterkunft'))
accommodation_other = models.CharField(max_length=config.ACCOMMODATION_OTHER_MAX_LENGTH, accommodation_other = models.CharField(max_length=config.ACCOMMODATION_OTHER_MAX_LENGTH,
blank=True, blank=True,
verbose_name=_(u'Andere Unterkunft')) verbose_name=_('Andere Unterkunft'))
meals = models.CharField(max_length=choices.CHOICE_FIELD_MAX_LENGTH, meals = models.CharField(max_length=choices.CHOICE_FIELD_MAX_LENGTH,
choices=choices.MEALS_CHOICES, choices=choices.MEALS_CHOICES,
default=choices.MEALS_CHOICES[0][0], default=choices.MEALS_CHOICES[0][0],
verbose_name=_(u'Verpflegung')) verbose_name=_('Verpflegung'))
meals_other = models.CharField(max_length=config.MEALS_OTHER_MAX_LENGTH, meals_other = models.CharField(max_length=config.MEALS_OTHER_MAX_LENGTH,
blank=True, blank=True,
verbose_name=_(u'Andere Verpflegung')) verbose_name=_('Andere Verpflegung'))
# RequirementsForm # RequirementsForm
requirements = models.TextField(blank=True, requirements = models.TextField(blank=True,
verbose_name=_(u'Anforderungen')) verbose_name=_('Anforderungen'))
equipment = models.TextField(blank=True, equipment = models.TextField(blank=True,
verbose_name=_(u'Ausrüstung')) verbose_name=_('Ausrüstung'))
pre_meeting_1 = models.DateTimeField(blank=True, pre_meeting_1 = models.DateTimeField(blank=True,
null=True, null=True,
verbose_name=u'1. %s' % _(u'Vortreffen')) verbose_name='1. %s' % _('Vortreffen'))
pre_meeting_2 = models.DateTimeField(blank=True, pre_meeting_2 = models.DateTimeField(blank=True,
null=True, null=True,
verbose_name=u'2. %s' % _(u'Vortreffen')) verbose_name='2. %s' % _('Vortreffen'))
# TrainerForm # TrainerForm
trainer_firstname = models.CharField(max_length=config.TRAINER_NAME_MAX_LENGTH, trainer_firstname = models.CharField(max_length=config.TRAINER_NAME_MAX_LENGTH,
blank=True, blank=True,
verbose_name=u'1. %s %s' % (_(u'Trainer'), _(u'Vorname'))) verbose_name='1. %s %s' % (_('Trainer'), _('Vorname')))
trainer_familyname = models.CharField(max_length=config.TRAINER_NAME_MAX_LENGTH, trainer_familyname = models.CharField(max_length=config.TRAINER_NAME_MAX_LENGTH,
blank=True, blank=True,
verbose_name=u'1. %s %s' % (_(u'Trainer'), _(u'Familienname'))) verbose_name='1. %s %s' % (_('Trainer'), _('Familienname')))
trainer_email = models.EmailField(blank=True, trainer_email = models.EmailField(blank=True,
verbose_name=u'1. %s %s' % (_(u'Trainer'), _(u'E-Mail'))) verbose_name='1. %s %s' % (_('Trainer'), _('E-Mail')))
trainer_phone = models.CharField(max_length=config.PHONE_NUMBER_MAX_LENGTH, trainer_phone = models.CharField(max_length=config.PHONE_NUMBER_MAX_LENGTH,
blank=True, blank=True,
verbose_name=u'1. %s %s' % (_(u'Trainer'), _(u'Telefon'))) verbose_name='1. %s %s' % (_('Trainer'), _('Telefon')))
trainer_2_fullname = models.CharField(max_length=config.TRAINER_NAME_MAX_LENGTH, trainer_2_fullname = models.CharField(max_length=config.TRAINER_NAME_MAX_LENGTH,
blank=True, blank=True,
verbose_name=u'2. %s %s' % (_(u'Trainer'), _(u'Name'))) verbose_name='2. %s %s' % (_('Trainer'), _('Name')))
trainer_2_email = models.EmailField(blank=True, trainer_2_email = models.EmailField(blank=True,
verbose_name=u'2. %s %s' % (_(u'Trainer'), _(u'E-Mail'))) verbose_name='2. %s %s' % (_('Trainer'), _('E-Mail')))
trainer_2_phone = models.CharField(max_length=config.PHONE_NUMBER_MAX_LENGTH, trainer_2_phone = models.CharField(max_length=config.PHONE_NUMBER_MAX_LENGTH,
blank=True, blank=True,
verbose_name=u'2. %s %s' % (_(u'Trainer'), _(u'Telefon'))) verbose_name='2. %s %s' % (_('Trainer'), _('Telefon')))
trainer_3_fullname = models.CharField(max_length=config.TRAINER_NAME_MAX_LENGTH, trainer_3_fullname = models.CharField(max_length=config.TRAINER_NAME_MAX_LENGTH,
blank=True, blank=True,
verbose_name=u'3. %s %s' % (_(u'Trainer'), _(u'Name'))) verbose_name='3. %s %s' % (_('Trainer'), _('Name')))
trainer_3_email = models.EmailField(blank=True, trainer_3_email = models.EmailField(blank=True,
verbose_name=u'3. %s %s' % (_(u'Trainer'), _(u'E-Mail'))) verbose_name='3. %s %s' % (_('Trainer'), _('E-Mail')))
trainer_3_phone = models.CharField(max_length=config.PHONE_NUMBER_MAX_LENGTH, trainer_3_phone = models.CharField(max_length=config.PHONE_NUMBER_MAX_LENGTH,
blank=True, blank=True,
verbose_name=u'3. %s %s' % (_(u'Trainer'), _(u'Telefon'))) verbose_name='3. %s %s' % (_('Trainer'), _('Telefon')))
# RegistrationForm # RegistrationForm
min_participants = models.IntegerField(default=0, min_participants = models.IntegerField(default=0,
verbose_name=_(u'Min. Teilnehmer')) verbose_name=_('Min. Teilnehmer'))
max_participants = models.IntegerField(default=0, max_participants = models.IntegerField(default=0,
verbose_name=_(u'Max. Teilnehmer')) verbose_name=_('Max. Teilnehmer'))
registration_required = models.BooleanField(default=False, registration_required = models.BooleanField(default=False,
verbose_name=_(u'Anmeldung notwendig')) verbose_name=_('Anmeldung notwendig'))
deadline = models.DateField(blank=True, deadline = models.DateField(blank=True,
null=True, null=True,
verbose_name=_(u'Anmeldeschluss')) verbose_name=_('Anmeldeschluss'))
registration_howto = models.TextField(blank=True, registration_howto = models.TextField(blank=True,
verbose_name=_(u'Anmeldungshinweis')) verbose_name=_('Anmeldungshinweis'))
# ChargesForm # ChargesForm
charge = models.FloatField(default=0, charge = models.FloatField(default=0,
verbose_name=_(u'Teilnahmegebühr')) verbose_name=_('Teilnahmegebühr'))
additional_costs = models.CharField(max_length=config.ADDITIONAL_COSTS_MAX_LENGTH, additional_costs = models.CharField(max_length=config.ADDITIONAL_COSTS_MAX_LENGTH,
blank=True, blank=True,
verbose_name=_(u'Zusätzliche Kosten')) verbose_name=_('Zusätzliche Kosten'))
# TrainingForm # TrainingForm
course_topic_1 = models.TextField(blank=True, course_topic_1 = models.TextField(blank=True,
verbose_name=u'%s - %s 1' % (_(u'Kursinhalt'), _(u'Absatz'))) verbose_name='%s - %s 1' % (_('Kursinhalt'), _('Absatz')))
course_topic_2 = models.TextField(blank=True, course_topic_2 = models.TextField(blank=True,
verbose_name=u'%s - %s 2' % (_(u'Kursinhalt'), _(u'Absatz'))) verbose_name='%s - %s 2' % (_('Kursinhalt'), _('Absatz')))
course_topic_3 = models.TextField(blank=True, course_topic_3 = models.TextField(blank=True,
verbose_name=u'%s - %s 3' % (_(u'Kursinhalt'), _(u'Absatz'))) verbose_name='%s - %s 3' % (_('Kursinhalt'), _('Absatz')))
course_topic_4 = models.TextField(blank=True, course_topic_4 = models.TextField(blank=True,
verbose_name=u'%s - %s 4' % (_(u'Kursinhalt'), _(u'Absatz'))) verbose_name='%s - %s 4' % (_('Kursinhalt'), _('Absatz')))
course_topic_5 = models.TextField(blank=True, course_topic_5 = models.TextField(blank=True,
verbose_name=u'%s - %s 5' % (_(u'Kursinhalt'), _(u'Absatz'))) verbose_name='%s - %s 5' % (_('Kursinhalt'), _('Absatz')))
course_topic_6 = models.TextField(blank=True, course_topic_6 = models.TextField(blank=True,
verbose_name=u'%s - %s 6' % (_(u'Kursinhalt'), _(u'Absatz'))) verbose_name='%s - %s 6' % (_('Kursinhalt'), _('Absatz')))
course_goal_1 = models.TextField(blank=True, course_goal_1 = models.TextField(blank=True,
verbose_name=u'%s - %s 1' % (_(u'Kursziele'), _(u'Absatz'))) verbose_name='%s - %s 1' % (_('Kursziele'), _('Absatz')))
course_goal_2 = models.TextField(blank=True, course_goal_2 = models.TextField(blank=True,
verbose_name=u'%s - %s 2' % (_(u'Kursziele'), _(u'Absatz'))) verbose_name='%s - %s 2' % (_('Kursziele'), _('Absatz')))
course_goal_3 = models.TextField(blank=True, course_goal_3 = models.TextField(blank=True,
verbose_name=u'%s - %s 3' % (_(u'Kursziele'), _(u'Absatz'))) verbose_name='%s - %s 3' % (_('Kursziele'), _('Absatz')))
course_goal_4 = models.TextField(blank=True, course_goal_4 = models.TextField(blank=True,
verbose_name=u'%s - %s 4' % (_(u'Kursziele'), _(u'Absatz'))) verbose_name='%s - %s 4' % (_('Kursziele'), _('Absatz')))
course_goal_5 = models.TextField(blank=True, course_goal_5 = models.TextField(blank=True,
verbose_name=u'%s - %s 5' % (_(u'Kursziele'), _(u'Absatz'))) verbose_name='%s - %s 5' % (_('Kursziele'), _('Absatz')))
course_goal_6 = models.TextField(blank=True, course_goal_6 = models.TextField(blank=True,
verbose_name=u'%s - %s 6' % (_(u'Kursziele'), _(u'Absatz'))) verbose_name='%s - %s 6' % (_('Kursziele'), _('Absatz')))
# SummaryForm # SummaryForm
planned_publication_date = models.DateField(blank=True, planned_publication_date = models.DateField(blank=True,
null=True, null=True,
verbose_name=_(u'Veröffentlichung am')) verbose_name=_('Veröffentlichung am'))
internal_note = models.TextField(blank=True, internal_note = models.TextField(blank=True,
verbose_name=_(u'Bearbeitungshinweis')) verbose_name=_('Bearbeitungshinweis'))
@property @property
def workflow(self): def workflow(self):
@@ -240,12 +243,12 @@ class Event(models.Model):
self._editor = editor self._editor = editor
class Meta: class Meta:
verbose_name = _(u'Veranstaltung') verbose_name = _('Veranstaltung')
verbose_name_plural = _(u'Veranstaltungen') verbose_name_plural = _('Veranstaltungen')
ordering = ['first_day'] ordering = ['first_day']
def __unicode__(self): def __str__(self):
return u'{number} - {title} ({date})'.format(number=self.get_number(), return '{number} - {title} ({date})'.format(number=self.get_number(),
title=self.title, title=self.title,
date=self.get_formated_date()) date=self.get_formated_date())
@@ -260,11 +263,11 @@ class Event(models.Model):
user_model = get_user_model() user_model = get_user_model()
username = self.trainer_email.lower() username = self.trainer_email.lower()
if not username: if not username:
s = self.trainer_firstname.replace(u'ß', u'ss') s = self.trainer_firstname.replace('ß', 'ss')
s = unicodedata.normalize('NFKD', s).encode('ascii', 'ignore') s = unicodedata.normalize('NFKD', s).encode('ascii', 'ignore')
s = re.sub(r'[^a-z-]', '', s.lower()) s = re.sub(r'[^a-z-]', '', s.lower())
username = s username = s
s = self.trainer_familyname.replace(u'ß', u'ss') s = self.trainer_familyname.replace('ß', 'ss')
s = unicodedata.normalize('NFKD', s).encode('ascii', 'ignore') s = unicodedata.normalize('NFKD', s).encode('ascii', 'ignore')
s = re.sub(r'[^a-z-]', '', s.lower()) s = re.sub(r'[^a-z-]', '', s.lower())
username += '.' + s username += '.' + s
@@ -362,7 +365,7 @@ class Event(models.Model):
begin = format_date(begin_date, begin_format, locale=lang) begin = format_date(begin_date, begin_format, locale=lang)
end = format_date(end_date, end_format, locale=lang) end = format_date(end_date, end_format, locale=lang)
r = u'{begin} - {end}'.format(begin=begin, end=end) r = '{begin} - {end}'.format(begin=begin, end=end)
return r return r
@@ -376,7 +379,7 @@ class Event(models.Model):
return self.get_formated_date(begin_date=begin_date, end_date=end_date, format='numeric') return self.get_formated_date(begin_date=begin_date, end_date=end_date, format='numeric')
def get_trainer_full_name(self): def get_trainer_full_name(self):
return u'%s %s' % (self.trainer_firstname, self.trainer_familyname) return '%s %s' % (self.trainer_firstname, self.trainer_familyname)
def get_template_context(self, context=None): def get_template_context(self, context=None):
if self.alt_last_day: if self.alt_last_day:

View File

@@ -1,6 +1,8 @@
from __future__ import unicode_literals
from django.conf import settings from django.conf import settings
from django.db import models from django.db import models
from django.utils import timezone from django.utils import timezone
from django.utils.encoding import python_2_unicode_compatible
from ..utils import get_ghost_user, get_system_user from ..utils import get_ghost_user, get_system_user
@@ -9,6 +11,7 @@ def get_system_user_id():
return get_system_user().id return get_system_user().id
@python_2_unicode_compatible
class EventFlag(models.Model): class EventFlag(models.Model):
event = models.ForeignKey('dav_events.Event', related_name='flags') event = models.ForeignKey('dav_events.Event', related_name='flags')
status = models.ForeignKey('dav_events.EventStatus', status = models.ForeignKey('dav_events.EventStatus',
@@ -23,9 +26,9 @@ class EventFlag(models.Model):
class Meta: class Meta:
ordering = ['event', 'timestamp', 'status'] ordering = ['event', 'timestamp', 'status']
def __unicode__(self): def __str__(self):
s = u'{status} - {timestamp}' s = '{status} - {timestamp}'
if self.user: if self.user:
s += u' by user {user}' s += ' by user {user}'
return s.format(status=self.status, timestamp=self.timestamp.strftime('%d.%m.%Y %H:%M:%S'), return s.format(status=self.status, timestamp=self.timestamp.strftime('%d.%m.%Y %H:%M:%S'),
user=self.user) user=self.user)

View File

@@ -1,4 +1,6 @@
from __future__ import unicode_literals
from django.db import models from django.db import models
from django.utils.encoding import python_2_unicode_compatible
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from ..validators import IdStringValidator from ..validators import IdStringValidator
@@ -13,6 +15,7 @@ BOOTSTRAP_CONTEXT_CHOICES = (
) )
@python_2_unicode_compatible
class EventStatus(models.Model): class EventStatus(models.Model):
code = models.CharField(primary_key=True, max_length=254, validators=[IdStringValidator]) code = models.CharField(primary_key=True, max_length=254, validators=[IdStringValidator])
severity = models.IntegerField(unique=True) severity = models.IntegerField(unique=True)
@@ -20,12 +23,12 @@ class EventStatus(models.Model):
bootstrap_context = models.CharField(max_length=20, blank=True, choices=BOOTSTRAP_CONTEXT_CHOICES) bootstrap_context = models.CharField(max_length=20, blank=True, choices=BOOTSTRAP_CONTEXT_CHOICES)
class Meta: class Meta:
verbose_name = _(u'Veranstaltungsstatus') verbose_name = _('Veranstaltungsstatus')
verbose_name_plural = _(u'Veranstaltungsstati') verbose_name_plural = _('Veranstaltungsstati')
ordering = ['severity'] ordering = ['severity']
def __unicode__(self): def __str__(self):
return u'{severity} - {code} ({label})'.format(code=self.code, return '{severity} - {code} ({label})'.format(code=self.code,
severity=self.severity, severity=self.severity,
label=self.label) label=self.label)

View File

@@ -1,10 +1,12 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from __future__ import unicode_literals
import logging import logging
import uuid import uuid
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.db import models from django.db import models
from django.utils import timezone from django.utils import timezone
from django.utils.encoding import python_2_unicode_compatible
from django.utils.translation import ugettext, ugettext_lazy as _ from django.utils.translation import ugettext, ugettext_lazy as _
from .event import Event from .event import Event
@@ -12,6 +14,7 @@ from .event import Event
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@python_2_unicode_compatible
class OneClickAction(models.Model): class OneClickAction(models.Model):
COMMANDS = ( COMMANDS = (
('EVENT_LIST', 'login and go to event list (user id)'), ('EVENT_LIST', 'login and go to event list (user id)'),
@@ -32,14 +35,14 @@ class OneClickAction(models.Model):
parameters = models.TextField(blank=True) parameters = models.TextField(blank=True)
class Meta: class Meta:
verbose_name = _(u'One-Click-Action') verbose_name = _('One-Click-Action')
def __unicode__(self): def __str__(self):
s = u'{command}({parameters}) - {description}'.format(description=self.get_command_display(), s = '{command}({parameters}) - {description}'.format(description=self.get_command_display(),
command=self.command, command=self.command,
parameters=self.parameters) parameters=self.parameters)
if self.done and not self.allow_repeat: if self.done and not self.allow_repeat:
s += u' - done' s += ' - done'
return s return s
def get_absolute_url(self): def get_absolute_url(self):
@@ -50,7 +53,7 @@ class OneClickAction(models.Model):
if self.done and not self.allow_repeat: if self.done and not self.allow_repeat:
result['context'] = { result['context'] = {
'status': 'warning', 'status': 'warning',
'message': ugettext(u'Diese Aktion hast du bereits ausgeführt.'), 'message': ugettext('Diese Aktion hast du bereits ausgeführt.'),
} }
return result return result
@@ -77,17 +80,17 @@ class OneClickAction(models.Model):
flag = event.flags.filter(status__code=status_code).first() flag = event.flags.filter(status__code=status_code).first()
if flag: if flag:
message = (ugettext(u'Der Status wurde bereits' message = (ugettext('Der Status wurde bereits'
u' am %(date)s' ' am %(date)s'
u' von %(user)s' ' von %(user)s'
u' auf \'%(status)s\' gesetzt.') % { ' auf \'%(status)s\' gesetzt.') % {
'status': flag.status.label, 'status': flag.status.label,
'date': flag.timestamp.strftime('%d.%m.%Y %H:%M:%S'), 'date': flag.timestamp.strftime('%d.%m.%Y %H:%M:%S'),
'user': flag.user.get_full_name(), 'user': flag.user.get_full_name(),
}) })
else: else:
flag = event.workflow.update_status(status_code, user) flag = event.workflow.update_status(status_code, user)
message = (ugettext(u'Der Status wurde auf \'%(status)s\' gesetzt.') % message = (ugettext('Der Status wurde auf \'%(status)s\' gesetzt.') %
{'status': flag.status.label}) {'status': flag.status.label})
result['context'] = { result['context'] = {
@@ -108,7 +111,7 @@ class OneClickAction(models.Model):
else: else:
result['context'] = { result['context'] = {
'status': 'danger', 'status': 'danger',
'message': ugettext(u'Invalid Command. Code on fire!'), 'message': ugettext('Invalid Command. Code on fire!'),
} }
return result return result

View File

@@ -215,7 +215,7 @@ class EmailTestCase(EmailTestMixin, RoleMixin, TestCase):
expected_body = EVENT_UPDATED_EMAIL_TEMPLATE.format( expected_body = EVENT_UPDATED_EMAIL_TEMPLATE.format(
recipient_first_name=expected_recipient.first_name, recipient_first_name=expected_recipient.first_name,
editor_full_name=editor.get_full_name(), editor_full_name=editor.get_full_name(),
event=unicode(self.event), event=self.event,
base_url=self.email_base_url, base_url=self.email_base_url,
event_url=self.event.get_absolute_url(), event_url=self.event.get_absolute_url(),
) )

View File

@@ -1,9 +1,11 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from __future__ import unicode_literals
import datetime import datetime
import logging import logging
from django.db import models from django.db import models
from django.urls import reverse from django.urls import reverse
from django.utils import timezone from django.utils import timezone
from django.utils.encoding import python_2_unicode_compatible
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from dav_events.models.event import Event from dav_events.models.event import Event
@@ -17,63 +19,64 @@ midnight = datetime.time(00, 00, 00)
one_day = datetime.timedelta(1) one_day = datetime.timedelta(1)
@python_2_unicode_compatible
class Registration(models.Model): class Registration(models.Model):
event = models.ForeignKey(Event, related_name='registrations') event = models.ForeignKey(Event, related_name='registrations')
created_at = models.DateTimeField(auto_now_add=True) created_at = models.DateTimeField(auto_now_add=True)
personal_names = models.CharField(max_length=1024, personal_names = models.CharField(max_length=1024,
verbose_name=_(u'Vorname(n)')) verbose_name=_('Vorname(n)'))
family_names = models.CharField(max_length=1024, family_names = models.CharField(max_length=1024,
verbose_name=_(u'Familienname')) verbose_name=_('Familienname'))
address = models.CharField(max_length=1024, address = models.CharField(max_length=1024,
verbose_name=_(u'Anschrift'), verbose_name=_('Anschrift'),
help_text=_(u'Straße, Hausnummer')) help_text=_('Straße, Hausnummer'))
postal_code = models.CharField(max_length=254, postal_code = models.CharField(max_length=254,
verbose_name=_(u'Postleitzahl')) verbose_name=_('Postleitzahl'))
city = models.CharField(max_length=1024, city = models.CharField(max_length=1024,
verbose_name=_(u'Ort')) verbose_name=_('Ort'))
email_address = models.EmailField(verbose_name=_(u'E-Mail-Adresse')) email_address = models.EmailField(verbose_name=_('E-Mail-Adresse'))
phone_number = models.CharField(max_length=254, phone_number = models.CharField(max_length=254,
verbose_name=_(u'Telefonnummer'), verbose_name=_('Telefonnummer'),
help_text=_(u'Idealerweise eine Mobilfunk-Nummer')) help_text=_('Idealerweise eine Mobilfunk-Nummer'))
dav_number = models.CharField(max_length=62, dav_number = models.CharField(max_length=62,
validators=[DAVNumberValidator], validators=[DAVNumberValidator],
verbose_name=_(u'DAV Mitgliednummer'), verbose_name=_('DAV Mitgliednummer'),
help_text=u'%s<br /> %s %s' % ( help_text='%s<br /> %s %s' % (
_(u'Deine Mitgliedsnummer findest du unter dem Strichcode' _('Deine Mitgliedsnummer findest du unter dem Strichcode'
u' auf deinem DAV Ausweis.'), ' auf deinem DAV Ausweis.'),
_(u'Beispiel: <tt>131/00/012345</tt>'), _('Beispiel: <tt>131/00/012345</tt>'),
_(u'(der Teil bis zum ersten * genügt)'), _('(der Teil bis zum ersten * genügt)'),
)) ))
emergency_contact = models.TextField(blank=True, emergency_contact = models.TextField(blank=True,
verbose_name=_(u'Notfall-Kontakt'), verbose_name=_('Notfall-Kontakt'),
help_text=_(u'Name und Telefonnummer bzw. Anschrift,' help_text=_('Name und Telefonnummer bzw. Anschrift,'
u' die in Notfällen informiert werden soll.')) ' die in Notfällen informiert werden soll.'))
experience = models.TextField(blank=True, experience = models.TextField(blank=True,
verbose_name=_(u'Erfahrung'), verbose_name=_('Erfahrung'),
help_text=_(u'Welche Touren oder Kurse hast du bereits gemacht?')) help_text=_('Welche Touren oder Kurse hast du bereits gemacht?'))
note = models.TextField(blank=True, note = models.TextField(blank=True,
verbose_name=_(u'Anmerkung'), verbose_name=_('Anmerkung'),
help_text=u'%s<br /> %s' % ( help_text='%s<br /> %s' % (
_(u'Wissenswertes für den Tourenleiter, z.B. Allergien,' _('Wissenswertes für den Tourenleiter, z.B. Allergien,'
u' gesundheitliche Einschränkungen, ...'), ' gesundheitliche Einschränkungen, ...'),
_(u'Kann frei gelassen werden.')) _('Kann frei gelassen werden.'))
) )
privacy_policy = models.TextField(blank=True, privacy_policy = models.TextField(blank=True,
verbose_name=_(u'Erklärung zur Datenspeicherung')) verbose_name=_('Erklärung zur Datenspeicherung'))
privacy_policy_accepted = models.BooleanField(default=False, privacy_policy_accepted = models.BooleanField(default=False,
verbose_name=_(u'Einwilligung zur Datenspeicherung')) verbose_name=_('Einwilligung zur Datenspeicherung'))
purge_at = models.DateTimeField() purge_at = models.DateTimeField()
class Meta: class Meta:
verbose_name = _(u'Anmeldung') verbose_name = _('Anmeldung')
verbose_name_plural = _(u'Anmeldungen') verbose_name_plural = _('Anmeldungen')
ordering = ['created_at'] ordering = ['created_at']
def __unicode__(self): def __str__(self):
return u'{number} - {name} ({created} - {purge})'.format(number=self.event.get_number(), return '{number} - {name} ({created} - {purge})'.format(number=self.event.get_number(),
name=self.get_full_name(), name=self.get_full_name(),
created=self.created_at.strftime('%d.%m.%Y %H:%M'), created=self.created_at.strftime('%d.%m.%Y %H:%M'),
purge=self.purge_at.strftime('%d.%m.%Y %H:%M')) purge=self.purge_at.strftime('%d.%m.%Y %H:%M'))
@@ -82,7 +85,7 @@ class Registration(models.Model):
return reverse('dav_registration:registered') return reverse('dav_registration:registered')
def get_full_name(self): def get_full_name(self):
return u'{} {}'.format(self.personal_names, self.family_names) return '{} {}'.format(self.personal_names, self.family_names)
def save(self, **kwargs): def save(self, **kwargs):
creating = False creating = False

View File

@@ -1,2 +1,2 @@
from test_suite import TestSuite from .test_suite import TestSuite
test_suite = TestSuite() test_suite = TestSuite()