From 943285f1ed282b417a4d356f716fb487a536d66e Mon Sep 17 00:00:00 2001 From: Jens Kleineheismann Date: Thu, 28 Mar 2019 18:08:12 +0100 Subject: [PATCH] UPD: small steps to become python3 compatible. --- TODO.txt | 2 +- dav_auth/tests/test_templates.py | 17 +-- dav_base/tests/generic.py | 4 +- dav_base/tests/test_templates.py | 1 + dav_base/tests/test_urls.py | 2 +- dav_events/models/event.py | 155 ++++++++++++++-------------- dav_events/models/eventflag.py | 9 +- dav_events/models/eventstatus.py | 15 +-- dav_events/models/oneclickaction.py | 29 +++--- dav_events/tests/test_emails.py | 2 +- dav_registration/models.py | 73 ++++++------- tests/__init__.py | 2 +- 12 files changed, 164 insertions(+), 147 deletions(-) diff --git a/TODO.txt b/TODO.txt index b70fba9..a9a6e3a 100644 --- a/TODO.txt +++ b/TODO.txt @@ -1,7 +1,7 @@ - FIX: validation for first_day - FIX: no timezone on pre_meeting -- chainedform für update +- Test event list export - bootstrap update - python und django update diff --git a/dav_auth/tests/test_templates.py b/dav_auth/tests/test_templates.py index 6b6a589..dd94d62 100644 --- a/dav_auth/tests/test_templates.py +++ b/dav_auth/tests/test_templates.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +from __future__ import unicode_literals from django.contrib.auth import get_user_model from django.test import SimpleTestCase, tag from django.utils.translation import ugettext @@ -11,7 +12,7 @@ from dav_base.tests.generic import SeleniumTestCase from .generic import SeleniumAuthMixin TEST_USERNAME = 'root@localhost' -TEST_PASSWORD = u'me||ön 2' +TEST_PASSWORD = 'me||ön 2' TEST_EMAIL = TEST_USERNAME @@ -19,8 +20,8 @@ class TemplatesTestCase(SimpleTestCase): def test_reset_link_in_login_form(self): login_url = reverse('dav_auth:login') reset_url = reverse('dav_auth:reset_password') - text = ugettext(u'Passwort vergessen?') - html = u'{text}'.format(url=reset_url, text=text) + text = ugettext('Passwort vergessen?') + html = '{text}'.format(url=reset_url, text=text) response = self.client.get(login_url) self.assertInHTML(html, response.content) @@ -50,18 +51,18 @@ class TestCase(SeleniumAuthMixin, SeleniumTestCase): c.get(self.complete_url(location)) 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') - self.assertEqual(field.get_attribute('required'), u'true') + self.assertEqual(field.get_attribute('required'), 'true') def test_required_fields_in_set_password_form(self): c = self.login(self.selenium, self.test_username, self.test_password) c.get(self.complete_url(reverse('dav_auth:set_password'))) - field = self.wait_on_presence(c, (By.ID, "id_new_password")) - self.assertEqual(field.get_attribute('required'), u'true') + field = self.wait_on_presence(c, (By.ID, 'id_new_password')) + self.assertEqual(field.get_attribute('required'), 'true') 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') self.assertEqual(field.get_attribute('required'), None) diff --git a/dav_base/tests/generic.py b/dav_base/tests/generic.py index d7a4de3..bcd2ddf 100644 --- a/dav_base/tests/generic.py +++ b/dav_base/tests/generic.py @@ -1,6 +1,5 @@ import datetime import os -import urllib from django.apps import apps from django.contrib.auth.models import AbstractUser from django.contrib.staticfiles.testing import StaticLiveServerTestCase @@ -9,6 +8,7 @@ from django.urls import reverse from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC +from six.moves.urllib.parse import quote class AppSetting(object): @@ -252,7 +252,7 @@ class ScreenshotTestCase(SeleniumTestCase): self.screenshot_sequences = {} def sanitize_filename(self, location): - return urllib.quote(location).replace('/', '--') + return quote(location).replace('/', '--') def save_screenshot(self, title=None, sequence=None, resize=True): if sequence is None: diff --git a/dav_base/tests/test_templates.py b/dav_base/tests/test_templates.py index 7220d10..09db754 100644 --- a/dav_base/tests/test_templates.py +++ b/dav_base/tests/test_templates.py @@ -1,3 +1,4 @@ +from __future__ import unicode_literals from django.conf import settings from django.test import SimpleTestCase diff --git a/dav_base/tests/test_urls.py b/dav_base/tests/test_urls.py index 752e05d..d7e6795 100644 --- a/dav_base/tests/test_urls.py +++ b/dav_base/tests/test_urls.py @@ -1,4 +1,4 @@ -from generic import Url, UrlsTestCase +from .generic import Url, UrlsTestCase from ..views import RootView, generic diff --git a/dav_events/models/event.py b/dav_events/models/event.py index dc44722..c958885 100644 --- a/dav_events/models/event.py +++ b/dav_events/models/event.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +from __future__ import unicode_literals import datetime import difflib import logging @@ -11,6 +12,7 @@ from django.contrib.auth import get_user_model from django.core.urlresolvers import reverse from django.db import models 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_countries.fields import CountryField @@ -24,206 +26,207 @@ from ..workflow import DefaultWorkflow logger = logging.getLogger(__name__) +@python_2_unicode_compatible class Event(models.Model): # Metadata owner = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, on_delete=models.SET(get_ghost_user), related_name='events', - verbose_name=_(u'Ersteller')) + verbose_name=_('Ersteller')) created_at = models.DateTimeField(auto_now_add=True, - verbose_name=_(u'Erstellt')) + verbose_name=_('Erstellt')) number = models.CharField(unique=True, max_length=config.NUMBER_MAX_LENGTH, blank=True, null=True, default=None, - verbose_name=_(u'Programmnummer')) + verbose_name=_('Programmnummer')) # DescriptionForm - title = models.CharField(max_length=config.TITLE_MAX_LENGTH, verbose_name=_(u'Titel')) - description = models.TextField(verbose_name=_(u'Beschreibung')) + title = models.CharField(max_length=config.TITLE_MAX_LENGTH, verbose_name=_('Titel')) + description = models.TextField(verbose_name=_('Beschreibung')) # ModeForm mode = models.CharField(max_length=choices.CHOICE_FIELD_MAX_LENGTH, choices=choices.MODE_CHOICES, - verbose_name=_(u'Veranstaltungsart')) + verbose_name=_('Veranstaltungsart')) sport = models.CharField(max_length=choices.CHOICE_FIELD_MAX_LENGTH, choices=choices.SPORT_CHOICES, - verbose_name=_(u'Spielart')) + verbose_name=_('Spielart')) ski_lift = models.BooleanField(default=False, - verbose_name=_(u'Skiliftbenutzung')) + verbose_name=_('Skiliftbenutzung')) level = models.CharField(max_length=choices.CHOICE_FIELD_MAX_LENGTH, choices=choices.LEVEL_CHOICES, - verbose_name=_(u'Schwierigkeitsnivau')) - first_day = models.DateField(verbose_name=_(u'Erster Tag')) + verbose_name=_('Schwierigkeitsnivau')) + first_day = models.DateField(verbose_name=_('Erster Tag')) alt_first_day = models.DateField(blank=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, null=True, - verbose_name=_(u'Letzter Tag')) + verbose_name=_('Letzter Tag')) alt_last_day = models.DateField(blank=True, null=True, - verbose_name=u'%s - %s' % (_(u'Ersatztermin'), _(u'Letzter Tag'))) + verbose_name='%s - %s' % (_('Ersatztermin'), _('Letzter Tag'))) # LocationForm country = CountryField(countries=choices.CountryChoiceSet, - verbose_name=_(u'Land')) + verbose_name=_('Land')) terrain = models.CharField(max_length=choices.CHOICE_FIELD_MAX_LENGTH, choices=choices.TERRAIN_CHOICES, default=choices.TERRAIN_CHOICES[0][0], - verbose_name=_(u'Gelände')) + verbose_name=_('Gelände')) location = models.CharField(max_length=config.LOCATION_MAX_LENGTH, blank=True, - verbose_name=_(u'Ort oder Gebiet')) + verbose_name=_('Ort oder Gebiet')) transport = models.CharField(max_length=choices.CHOICE_FIELD_MAX_LENGTH, choices=choices.TRANSPORT_CHOICES, default=choices.TRANSPORT_CHOICES[0][0], - verbose_name=_(u'Verkehrsmittel')) + verbose_name=_('Verkehrsmittel')) transport_other = models.CharField(max_length=config.TRANSPORT_OTHER_MAX_LENGTH, blank=True, - verbose_name=_(u'Anderes Verkehrsmittel')) + verbose_name=_('Anderes Verkehrsmittel')) # JourneyForm meeting_point = models.CharField(max_length=choices.CHOICE_FIELD_MAX_LENGTH, choices=choices.MEETING_POINT_CHOICES, 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, blank=True, - verbose_name=_(u'Anderer Treffpunkt')) + verbose_name=_('Anderer Treffpunkt')) meeting_time = models.TimeField(blank=True, null=True, - verbose_name=_(u'Uhrzeit am Treffpunkt')) + verbose_name=_('Uhrzeit am Treffpunkt')) departure_time = models.TimeField(blank=True, null=True, - verbose_name=_(u'Uhrzeit Abfahrt')) + verbose_name=_('Uhrzeit Abfahrt')) departure_ride = models.CharField(max_length=config.DEPARTURE_RIDE_MAX_LENGTH, blank=True, - verbose_name=_(u'Bahn-/Bus-Linie')) + verbose_name=_('Bahn-/Bus-Linie')) return_departure_time = models.TimeField(blank=True, null=True, - verbose_name=_(u'Uhrzeit Rückfahrt')) + verbose_name=_('Uhrzeit Rückfahrt')) return_arrival_time = models.TimeField(blank=True, null=True, - verbose_name=_(u'Uhrzeit Rückkunft')) + verbose_name=_('Uhrzeit Rückkunft')) arrival_previous_day = models.BooleanField(default=False, - verbose_name=_(u'Anreise des Trainers am Vortag')) + verbose_name=_('Anreise des Trainers am Vortag')) # AccommodationForm basecamp = models.CharField(max_length=config.BASECAMP_MAX_LENGTH, blank=True, - verbose_name=_(u'Stützpunkt')) + verbose_name=_('Stützpunkt')) accommodation = models.CharField(max_length=choices.CHOICE_FIELD_MAX_LENGTH, choices=choices.ACCOMMODATION_CHOICES, default=choices.ACCOMMODATION_CHOICES[0][0], - verbose_name=_(u'Unterkunft')) + verbose_name=_('Unterkunft')) accommodation_other = models.CharField(max_length=config.ACCOMMODATION_OTHER_MAX_LENGTH, blank=True, - verbose_name=_(u'Andere Unterkunft')) + verbose_name=_('Andere Unterkunft')) meals = models.CharField(max_length=choices.CHOICE_FIELD_MAX_LENGTH, choices=choices.MEALS_CHOICES, default=choices.MEALS_CHOICES[0][0], - verbose_name=_(u'Verpflegung')) + verbose_name=_('Verpflegung')) meals_other = models.CharField(max_length=config.MEALS_OTHER_MAX_LENGTH, blank=True, - verbose_name=_(u'Andere Verpflegung')) + verbose_name=_('Andere Verpflegung')) # RequirementsForm requirements = models.TextField(blank=True, - verbose_name=_(u'Anforderungen')) + verbose_name=_('Anforderungen')) equipment = models.TextField(blank=True, - verbose_name=_(u'Ausrüstung')) + verbose_name=_('Ausrüstung')) pre_meeting_1 = models.DateTimeField(blank=True, null=True, - verbose_name=u'1. %s' % _(u'Vortreffen')) + verbose_name='1. %s' % _('Vortreffen')) pre_meeting_2 = models.DateTimeField(blank=True, null=True, - verbose_name=u'2. %s' % _(u'Vortreffen')) + verbose_name='2. %s' % _('Vortreffen')) # TrainerForm trainer_firstname = models.CharField(max_length=config.TRAINER_NAME_MAX_LENGTH, 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, 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, - 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, 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, 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, - 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, 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, 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, - 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, blank=True, - verbose_name=u'3. %s %s' % (_(u'Trainer'), _(u'Telefon'))) + verbose_name='3. %s %s' % (_('Trainer'), _('Telefon'))) # RegistrationForm min_participants = models.IntegerField(default=0, - verbose_name=_(u'Min. Teilnehmer')) + verbose_name=_('Min. Teilnehmer')) max_participants = models.IntegerField(default=0, - verbose_name=_(u'Max. Teilnehmer')) + verbose_name=_('Max. Teilnehmer')) registration_required = models.BooleanField(default=False, - verbose_name=_(u'Anmeldung notwendig')) + verbose_name=_('Anmeldung notwendig')) deadline = models.DateField(blank=True, null=True, - verbose_name=_(u'Anmeldeschluss')) + verbose_name=_('Anmeldeschluss')) registration_howto = models.TextField(blank=True, - verbose_name=_(u'Anmeldungshinweis')) + verbose_name=_('Anmeldungshinweis')) # ChargesForm 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, blank=True, - verbose_name=_(u'Zusätzliche Kosten')) + verbose_name=_('Zusätzliche Kosten')) # TrainingForm 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, - verbose_name=u'%s - %s 2' % (_(u'Kursinhalt'), _(u'Absatz'))) + verbose_name='%s - %s 2' % (_('Kursinhalt'), _('Absatz'))) 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, - verbose_name=u'%s - %s 4' % (_(u'Kursinhalt'), _(u'Absatz'))) + verbose_name='%s - %s 4' % (_('Kursinhalt'), _('Absatz'))) 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, - verbose_name=u'%s - %s 6' % (_(u'Kursinhalt'), _(u'Absatz'))) + verbose_name='%s - %s 6' % (_('Kursinhalt'), _('Absatz'))) 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, - verbose_name=u'%s - %s 2' % (_(u'Kursziele'), _(u'Absatz'))) + verbose_name='%s - %s 2' % (_('Kursziele'), _('Absatz'))) 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, - verbose_name=u'%s - %s 4' % (_(u'Kursziele'), _(u'Absatz'))) + verbose_name='%s - %s 4' % (_('Kursziele'), _('Absatz'))) 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, - verbose_name=u'%s - %s 6' % (_(u'Kursziele'), _(u'Absatz'))) + verbose_name='%s - %s 6' % (_('Kursziele'), _('Absatz'))) # SummaryForm planned_publication_date = models.DateField(blank=True, null=True, - verbose_name=_(u'Veröffentlichung am')) + verbose_name=_('Veröffentlichung am')) internal_note = models.TextField(blank=True, - verbose_name=_(u'Bearbeitungshinweis')) + verbose_name=_('Bearbeitungshinweis')) @property def workflow(self): @@ -240,14 +243,14 @@ class Event(models.Model): self._editor = editor class Meta: - verbose_name = _(u'Veranstaltung') - verbose_name_plural = _(u'Veranstaltungen') + verbose_name = _('Veranstaltung') + verbose_name_plural = _('Veranstaltungen') ordering = ['first_day'] - def __unicode__(self): - return u'{number} - {title} ({date})'.format(number=self.get_number(), - title=self.title, - date=self.get_formated_date()) + def __str__(self): + return '{number} - {title} ({date})'.format(number=self.get_number(), + title=self.title, + date=self.get_formated_date()) def get_absolute_url(self): return reverse('dav_events:detail', kwargs={'pk': self.pk}) @@ -260,11 +263,11 @@ class Event(models.Model): user_model = get_user_model() username = self.trainer_email.lower() 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 = re.sub(r'[^a-z-]', '', s.lower()) 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 = re.sub(r'[^a-z-]', '', s.lower()) username += '.' + s @@ -362,7 +365,7 @@ class Event(models.Model): begin = format_date(begin_date, begin_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 @@ -376,7 +379,7 @@ class Event(models.Model): 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) + return '%s %s' % (self.trainer_firstname, self.trainer_familyname) def get_template_context(self, context=None): if self.alt_last_day: diff --git a/dav_events/models/eventflag.py b/dav_events/models/eventflag.py index 471c69d..a00a115 100644 --- a/dav_events/models/eventflag.py +++ b/dav_events/models/eventflag.py @@ -1,6 +1,8 @@ +from __future__ import unicode_literals from django.conf import settings from django.db import models from django.utils import timezone +from django.utils.encoding import python_2_unicode_compatible from ..utils import get_ghost_user, get_system_user @@ -9,6 +11,7 @@ def get_system_user_id(): return get_system_user().id +@python_2_unicode_compatible class EventFlag(models.Model): event = models.ForeignKey('dav_events.Event', related_name='flags') status = models.ForeignKey('dav_events.EventStatus', @@ -23,9 +26,9 @@ class EventFlag(models.Model): class Meta: ordering = ['event', 'timestamp', 'status'] - def __unicode__(self): - s = u'{status} - {timestamp}' + def __str__(self): + s = '{status} - {timestamp}' 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'), user=self.user) diff --git a/dav_events/models/eventstatus.py b/dav_events/models/eventstatus.py index 9fba8ae..ee2a221 100644 --- a/dav_events/models/eventstatus.py +++ b/dav_events/models/eventstatus.py @@ -1,4 +1,6 @@ +from __future__ import unicode_literals from django.db import models +from django.utils.encoding import python_2_unicode_compatible from django.utils.translation import ugettext_lazy as _ from ..validators import IdStringValidator @@ -13,6 +15,7 @@ BOOTSTRAP_CONTEXT_CHOICES = ( ) +@python_2_unicode_compatible class EventStatus(models.Model): code = models.CharField(primary_key=True, max_length=254, validators=[IdStringValidator]) severity = models.IntegerField(unique=True) @@ -20,14 +23,14 @@ class EventStatus(models.Model): bootstrap_context = models.CharField(max_length=20, blank=True, choices=BOOTSTRAP_CONTEXT_CHOICES) class Meta: - verbose_name = _(u'Veranstaltungsstatus') - verbose_name_plural = _(u'Veranstaltungsstati') + verbose_name = _('Veranstaltungsstatus') + verbose_name_plural = _('Veranstaltungsstati') ordering = ['severity'] - def __unicode__(self): - return u'{severity} - {code} ({label})'.format(code=self.code, - severity=self.severity, - label=self.label) + def __str__(self): + return '{severity} - {code} ({label})'.format(code=self.code, + severity=self.severity, + label=self.label) def get_or_create_event_status(code): diff --git a/dav_events/models/oneclickaction.py b/dav_events/models/oneclickaction.py index 1ee9ce1..f7b883a 100644 --- a/dav_events/models/oneclickaction.py +++ b/dav_events/models/oneclickaction.py @@ -1,10 +1,12 @@ # -*- coding: utf-8 -*- +from __future__ import unicode_literals import logging import uuid from django.contrib.auth import get_user_model from django.core.urlresolvers import reverse from django.db import models from django.utils import timezone +from django.utils.encoding import python_2_unicode_compatible from django.utils.translation import ugettext, ugettext_lazy as _ from .event import Event @@ -12,6 +14,7 @@ from .event import Event logger = logging.getLogger(__name__) +@python_2_unicode_compatible class OneClickAction(models.Model): COMMANDS = ( ('EVENT_LIST', 'login and go to event list (user id)'), @@ -32,14 +35,14 @@ class OneClickAction(models.Model): parameters = models.TextField(blank=True) class Meta: - verbose_name = _(u'One-Click-Action') + verbose_name = _('One-Click-Action') - def __unicode__(self): - s = u'{command}({parameters}) - {description}'.format(description=self.get_command_display(), - command=self.command, - parameters=self.parameters) + def __str__(self): + s = '{command}({parameters}) - {description}'.format(description=self.get_command_display(), + command=self.command, + parameters=self.parameters) if self.done and not self.allow_repeat: - s += u' - done' + s += ' - done' return s def get_absolute_url(self): @@ -50,7 +53,7 @@ class OneClickAction(models.Model): if self.done and not self.allow_repeat: result['context'] = { 'status': 'warning', - 'message': ugettext(u'Diese Aktion hast du bereits ausgeführt.'), + 'message': ugettext('Diese Aktion hast du bereits ausgeführt.'), } return result @@ -77,17 +80,17 @@ class OneClickAction(models.Model): flag = event.flags.filter(status__code=status_code).first() if flag: - message = (ugettext(u'Der Status wurde bereits' - u' am %(date)s' - u' von %(user)s' - u' auf \'%(status)s\' gesetzt.') % { + message = (ugettext('Der Status wurde bereits' + ' am %(date)s' + ' von %(user)s' + ' auf \'%(status)s\' gesetzt.') % { 'status': flag.status.label, 'date': flag.timestamp.strftime('%d.%m.%Y %H:%M:%S'), 'user': flag.user.get_full_name(), }) else: 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}) result['context'] = { @@ -108,7 +111,7 @@ class OneClickAction(models.Model): else: result['context'] = { 'status': 'danger', - 'message': ugettext(u'Invalid Command. Code on fire!'), + 'message': ugettext('Invalid Command. Code on fire!'), } return result diff --git a/dav_events/tests/test_emails.py b/dav_events/tests/test_emails.py index 9f6c182..d161ef5 100644 --- a/dav_events/tests/test_emails.py +++ b/dav_events/tests/test_emails.py @@ -215,7 +215,7 @@ class EmailTestCase(EmailTestMixin, RoleMixin, TestCase): expected_body = EVENT_UPDATED_EMAIL_TEMPLATE.format( recipient_first_name=expected_recipient.first_name, editor_full_name=editor.get_full_name(), - event=unicode(self.event), + event=self.event, base_url=self.email_base_url, event_url=self.event.get_absolute_url(), ) diff --git a/dav_registration/models.py b/dav_registration/models.py index 510385c..3ba98bf 100644 --- a/dav_registration/models.py +++ b/dav_registration/models.py @@ -1,9 +1,11 @@ # -*- coding: utf-8 -*- +from __future__ import unicode_literals import datetime import logging from django.db import models from django.urls import reverse from django.utils import timezone +from django.utils.encoding import python_2_unicode_compatible from django.utils.translation import ugettext_lazy as _ from dav_events.models.event import Event @@ -17,72 +19,73 @@ midnight = datetime.time(00, 00, 00) one_day = datetime.timedelta(1) +@python_2_unicode_compatible class Registration(models.Model): event = models.ForeignKey(Event, related_name='registrations') created_at = models.DateTimeField(auto_now_add=True) personal_names = models.CharField(max_length=1024, - verbose_name=_(u'Vorname(n)')) + verbose_name=_('Vorname(n)')) family_names = models.CharField(max_length=1024, - verbose_name=_(u'Familienname')) + verbose_name=_('Familienname')) address = models.CharField(max_length=1024, - verbose_name=_(u'Anschrift'), - help_text=_(u'Straße, Hausnummer')) + verbose_name=_('Anschrift'), + help_text=_('Straße, Hausnummer')) postal_code = models.CharField(max_length=254, - verbose_name=_(u'Postleitzahl')) + verbose_name=_('Postleitzahl')) city = models.CharField(max_length=1024, - verbose_name=_(u'Ort')) - email_address = models.EmailField(verbose_name=_(u'E-Mail-Adresse')) + verbose_name=_('Ort')) + email_address = models.EmailField(verbose_name=_('E-Mail-Adresse')) phone_number = models.CharField(max_length=254, - verbose_name=_(u'Telefonnummer'), - help_text=_(u'Idealerweise eine Mobilfunk-Nummer')) + verbose_name=_('Telefonnummer'), + help_text=_('Idealerweise eine Mobilfunk-Nummer')) dav_number = models.CharField(max_length=62, validators=[DAVNumberValidator], - verbose_name=_(u'DAV Mitgliednummer'), - help_text=u'%s
%s %s' % ( - _(u'Deine Mitgliedsnummer findest du unter dem Strichcode' - u' auf deinem DAV Ausweis.'), - _(u'Beispiel: 131/00/012345'), - _(u'(der Teil bis zum ersten * genügt)'), + verbose_name=_('DAV Mitgliednummer'), + help_text='%s
%s %s' % ( + _('Deine Mitgliedsnummer findest du unter dem Strichcode' + ' auf deinem DAV Ausweis.'), + _('Beispiel: 131/00/012345'), + _('(der Teil bis zum ersten * genügt)'), )) emergency_contact = models.TextField(blank=True, - verbose_name=_(u'Notfall-Kontakt'), - help_text=_(u'Name und Telefonnummer bzw. Anschrift,' - u' die in Notfällen informiert werden soll.')) + verbose_name=_('Notfall-Kontakt'), + help_text=_('Name und Telefonnummer bzw. Anschrift,' + ' die in Notfällen informiert werden soll.')) experience = models.TextField(blank=True, - verbose_name=_(u'Erfahrung'), - help_text=_(u'Welche Touren oder Kurse hast du bereits gemacht?')) + verbose_name=_('Erfahrung'), + help_text=_('Welche Touren oder Kurse hast du bereits gemacht?')) note = models.TextField(blank=True, - verbose_name=_(u'Anmerkung'), - help_text=u'%s
%s' % ( - _(u'Wissenswertes für den Tourenleiter, z.B. Allergien,' - u' gesundheitliche Einschränkungen, ...'), - _(u'Kann frei gelassen werden.')) + verbose_name=_('Anmerkung'), + help_text='%s
%s' % ( + _('Wissenswertes für den Tourenleiter, z.B. Allergien,' + ' gesundheitliche Einschränkungen, ...'), + _('Kann frei gelassen werden.')) ) 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, - verbose_name=_(u'Einwilligung zur Datenspeicherung')) + verbose_name=_('Einwilligung zur Datenspeicherung')) purge_at = models.DateTimeField() class Meta: - verbose_name = _(u'Anmeldung') - verbose_name_plural = _(u'Anmeldungen') + verbose_name = _('Anmeldung') + verbose_name_plural = _('Anmeldungen') ordering = ['created_at'] - def __unicode__(self): - return u'{number} - {name} ({created} - {purge})'.format(number=self.event.get_number(), - name=self.get_full_name(), - created=self.created_at.strftime('%d.%m.%Y %H:%M'), - purge=self.purge_at.strftime('%d.%m.%Y %H:%M')) + def __str__(self): + return '{number} - {name} ({created} - {purge})'.format(number=self.event.get_number(), + name=self.get_full_name(), + created=self.created_at.strftime('%d.%m.%Y %H:%M'), + purge=self.purge_at.strftime('%d.%m.%Y %H:%M')) def get_absolute_url(self): return reverse('dav_registration:registered') 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): creating = False diff --git a/tests/__init__.py b/tests/__init__.py index ccf560b..014b65d 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -1,2 +1,2 @@ -from test_suite import TestSuite +from .test_suite import TestSuite test_suite = TestSuite()