From d7e2acff34f05156872758faa006d57135fa36ee Mon Sep 17 00:00:00 2001 From: Jens Kleineheismann Date: Thu, 10 Apr 2025 11:33:06 +0200 Subject: [PATCH 1/9] Replaced ugettext and ugettext_lazy with gettext and gettext_lazy ugettext and ugettext_lazy were deprecated in Django 3 and will be removed in Django 4. --- dav_auth/admin.py | 2 +- dav_auth/forms.py | 4 +-- dav_auth/tests/test_forms.py | 8 ++--- dav_auth/tests/test_screenshots.py | 10 +++--- dav_auth/tests/test_templates.py | 4 +-- dav_auth/tests/test_views.py | 10 +++--- dav_auth/views.py | 2 +- dav_base/validators.py | 2 +- dav_events/choices.py | 2 +- .../settings-dav_events.py | 2 +- dav_events/forms/events.py | 36 +++++++++---------- dav_events/forms/registration.py | 2 +- dav_events/models/event.py | 2 +- dav_events/models/eventstatus.py | 2 +- dav_events/models/oneclickaction.py | 16 ++++----- dav_events/models/participant.py | 2 +- .../models/trash/trashed_participant.py | 2 +- dav_events/templatetags/dav_events.py | 2 +- dav_events/tests/test_oneclickactions.py | 14 ++++---- dav_events/tests/test_screenshots.py | 14 ++++---- dav_events/views/actions.py | 2 +- dav_events/views/events.py | 2 +- dav_events/workflow.py | 2 +- dav_registration/forms.py | 24 ++++++------- dav_registration/models.py | 2 +- dav_registration/views.py | 2 +- 26 files changed, 86 insertions(+), 86 deletions(-) diff --git a/dav_auth/admin.py b/dav_auth/admin.py index 1e76950..1b2c014 100644 --- a/dav_auth/admin.py +++ b/dav_auth/admin.py @@ -2,7 +2,7 @@ from django.contrib import admin from django.contrib.auth.admin import GroupAdmin as _GroupAdmin from django.contrib.auth.models import Group from django.contrib.auth.models import Permission -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ admin.site.unregister(Group) diff --git a/dav_auth/forms.py b/dav_auth/forms.py index 6e51dfd..5c8e050 100644 --- a/dav_auth/forms.py +++ b/dav_auth/forms.py @@ -2,7 +2,7 @@ import logging from django import forms from django.contrib.auth import forms as auth_forms, password_validation -from django.utils.translation import ugettext, ugettext_lazy as _ +from django.utils.translation import gettext, gettext_lazy as _ logger = logging.getLogger(__name__) @@ -48,7 +48,7 @@ class SetPasswordForm(forms.Form): if password1 and password2: if password1 != password2: raise forms.ValidationError( - ugettext('Passwörter stimmen nicht überein'), + gettext('Passwörter stimmen nicht überein'), code='password_mismatch', ) return password2 diff --git a/dav_auth/tests/test_forms.py b/dav_auth/tests/test_forms.py index e317150..35076d9 100644 --- a/dav_auth/tests/test_forms.py +++ b/dav_auth/tests/test_forms.py @@ -2,7 +2,7 @@ from unittest import skip from django.contrib.auth import get_user_model from django.core import mail as django_mail -from django.utils.translation import ugettext +from django.utils.translation import gettext from dav_base.tests.generic import FormDataSet, FormsTestCase @@ -25,8 +25,8 @@ class LoginFormTestCase(FormsTestCase): def test_labels(self): form = self.form_class() - self.assertEqual(form.fields['username'].label, ugettext('E-Mail-Adresse')) - self.assertEqual(form.fields['password'].label, ugettext('Password')) + self.assertEqual(form.fields['username'].label, gettext('E-Mail-Adresse')) + self.assertEqual(form.fields['password'].label, gettext('Password')) def test_required(self): form = self.form_class() @@ -193,7 +193,7 @@ class CreateAndSendPasswordFormTestCase(FormsTestCase): def test_labels(self): form = self.form_class() - self.assertEqual(form.fields['username'].label, ugettext('E-Mail-Adresse')) + self.assertEqual(form.fields['username'].label, gettext('E-Mail-Adresse')) def test_required(self): form = self.form_class() diff --git a/dav_auth/tests/test_screenshots.py b/dav_auth/tests/test_screenshots.py index 9d30265..1970895 100644 --- a/dav_auth/tests/test_screenshots.py +++ b/dav_auth/tests/test_screenshots.py @@ -2,7 +2,7 @@ from django.contrib.auth import get_user_model from django.test import tag from django.urls import reverse -from django.utils.translation import ugettext +from django.utils.translation import gettext from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys @@ -105,7 +105,7 @@ class TestCase(ScreenshotTestCase): # Click on 'set password' -> save set password page user_menu = c.find_element(By.CSS_SELECTOR, '#login-widget ul') - link = user_menu.find_element(By.PARTIAL_LINK_TEXT, ugettext('Passwort ändern')) + link = user_menu.find_element(By.PARTIAL_LINK_TEXT, gettext('Passwort ändern')) link.click() password_field = self.wait_on_presence(c, (By.ID, 'id_new_password')) self.save_screenshot('empty_set_password_form', sequence=sequence_name) @@ -189,7 +189,7 @@ class TestCase(ScreenshotTestCase): dropdown_button = self.wait_on_presence(c, (By.ID, 'user_dropdown_button')) dropdown_button.click() user_menu = c.find_element(By.CSS_SELECTOR, '#login-widget ul') - link = user_menu.find_element(By.PARTIAL_LINK_TEXT, ugettext('Logout')) + link = user_menu.find_element(By.PARTIAL_LINK_TEXT, gettext('Logout')) link.click() self.wait_until_stale(c, user_menu) self.save_screenshot('logout_succeed', sequence=sequence_name) @@ -200,7 +200,7 @@ class TestCase(ScreenshotTestCase): self.wait_on_presence(c, (By.ID, 'id_username')) # Locate password recreate link, click it -> save password recreate form - link = c.find_element(By.PARTIAL_LINK_TEXT, ugettext('Passwort vergessen')) + link = c.find_element(By.PARTIAL_LINK_TEXT, gettext('Passwort vergessen')) link.click() username_field = self.wait_on_presence(c, (By.ID, 'id_username')) self.save_screenshot('empty_recreate_password_form', sequence=sequence_name) @@ -212,7 +212,7 @@ class TestCase(ScreenshotTestCase): self.save_screenshot('recreate_password_invalid_user', sequence=sequence_name) # Locate password recreate link, click it - link = c.find_element(By.PARTIAL_LINK_TEXT, ugettext('Passwort vergessen')) + link = c.find_element(By.PARTIAL_LINK_TEXT, gettext('Passwort vergessen')) link.click() username_field = self.wait_on_presence(c, (By.ID, 'id_username')) diff --git a/dav_auth/tests/test_templates.py b/dav_auth/tests/test_templates.py index b33ca12..73486c8 100644 --- a/dav_auth/tests/test_templates.py +++ b/dav_auth/tests/test_templates.py @@ -2,7 +2,7 @@ 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 +from django.utils.translation import gettext from django.urls import reverse from selenium.common.exceptions import NoSuchElementException from selenium.webdriver.common.by import By @@ -20,7 +20,7 @@ class TemplatesTestCase(SimpleTestCase): def test_recreate_link_in_login_form(self): login_url = reverse('dav_auth:login') recreate_url = reverse('dav_auth:recreate_password') - text = ugettext('Passwort vergessen?') + text = gettext('Passwort vergessen?') html = '{text}'.format(url=recreate_url, text=text) response = self.client.get(login_url) self.assertInHTML(html, response.content.decode('utf-8')) diff --git a/dav_auth/tests/test_views.py b/dav_auth/tests/test_views.py index 2e3a601..e9d269a 100644 --- a/dav_auth/tests/test_views.py +++ b/dav_auth/tests/test_views.py @@ -4,7 +4,7 @@ from django.contrib.auth import get_user_model from django.core import mail as django_mail from django.shortcuts import resolve_url from django.test import TestCase -from django.utils.translation import ugettext +from django.utils.translation import gettext from django.urls import reverse from ..forms import LoginForm, SetPasswordForm, CreateAndSendPasswordForm @@ -30,9 +30,9 @@ class ViewsTestCase(TestCase): cls.recreate_password_url = reverse('dav_auth:recreate_password') # Some messages - cls.wrong_credentials_message = ugettext('Benutzername oder Passwort falsch.') - cls.logout_message = ugettext('Benutzer abgemeldet.') - cls.set_password_message = ugettext('Passwort gespeichert.') + cls.wrong_credentials_message = gettext('Benutzername oder Passwort falsch.') + cls.logout_message = gettext('Benutzer abgemeldet.') + cls.set_password_message = gettext('Passwort gespeichert.') def setUp(self): super().setUp() @@ -74,7 +74,7 @@ class ViewsTestCase(TestCase): def test_integrated_login_succeed(self): username = self.user.username - message = ugettext('Benutzer angemeldet: %(username)s') % {'username': username} + message = gettext('Benutzer angemeldet: %(username)s') % {'username': username} response = self.client.post(self.login_url, {'username': username, 'password': self.test_password}) self.assertEqual(response.status_code, 302) diff --git a/dav_auth/views.py b/dav_auth/views.py index cf22504..946faa7 100644 --- a/dav_auth/views.py +++ b/dav_auth/views.py @@ -9,7 +9,7 @@ from django.http import HttpResponseRedirect from django.shortcuts import resolve_url from django.urls import reverse_lazy, reverse from django.utils.safestring import mark_safe -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from django.views import generic from . import emails diff --git a/dav_base/validators.py b/dav_base/validators.py index c7966ed..3b93187 100644 --- a/dav_base/validators.py +++ b/dav_base/validators.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- from django.core.validators import RegexValidator -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ DAVNumberValidator = RegexValidator(r'^' diff --git a/dav_events/choices.py b/dav_events/choices.py index 32b23de..6635a86 100644 --- a/dav_events/choices.py +++ b/dav_events/choices.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from django_countries import Countries CHOICE_FIELD_MAX_LENGTH = 25 diff --git a/dav_events/django_project_config/settings-dav_events.py b/dav_events/django_project_config/settings-dav_events.py index f8620cf..2ea4684 100644 --- a/dav_events/django_project_config/settings-dav_events.py +++ b/dav_events/django_project_config/settings-dav_events.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from dav_events.config import FieldInitial # E-Mails diff --git a/dav_events/forms/events.py b/dav_events/forms/events.py index 487fb5c..64fa029 100644 --- a/dav_events/forms/events.py +++ b/dav_events/forms/events.py @@ -6,7 +6,7 @@ import re from babel.dates import format_date from django import forms from django.apps import apps -from django.utils.translation import get_language, ugettext, ugettext_lazy as _ +from django.utils.translation import get_language, gettext, gettext_lazy as _ from django_countries.fields import Country, LazyTypedChoiceField from datetimewidget.widgets import DateWidget, TimeWidget, DateTimeWidget from six import string_types @@ -840,7 +840,7 @@ class ChargesForm(EventCreateForm): additional_costs_text = u'' if transport != 'coach': - additional_costs_text += ugettext(u'Fahrtkosten') + additional_costs_text += gettext(u'Fahrtkosten') if transport == 'public': pubtrans_planned = True else: @@ -852,7 +852,7 @@ class ChargesForm(EventCreateForm): if accommodation != 'NONE': if additional_costs_text: additional_costs_text += u', ' - additional_costs_text += ugettext(u'Unterkunft und Verpflegung') + additional_costs_text += gettext(u'Unterkunft und Verpflegung') else: ndays = 1 @@ -901,10 +901,10 @@ class ChargesForm(EventCreateForm): self.fields['trainer1_reward'].initial = trainer1_reward self.fields['trainer23_reward'].initial = trainer23_reward - self.fields['pubtrans_bonus'].widget.attrs['title'] = ugettext(u'Der Bonus wird nachträglich' - u' auf Meldung der Tourenleitung' - u' verrechnet und ist noch nicht' - u' in den hier dargestellten Zahlen enthalten.') + self.fields['pubtrans_bonus'].widget.attrs['title'] = gettext(u'Der Bonus wird nachträglich' + u' auf Meldung der Tourenleitung' + u' verrechnet und ist noch nicht' + u' in den hier dargestellten Zahlen enthalten.') self.fields['charge'].widget.attrs['title'] = (u'%d € Beitrag \n' u'+ %d Tage * %d € täglicher Beitrag \n' u'+ %d halben Anreisetag * %d € halbtäglicher Beitrag' @@ -941,7 +941,7 @@ class ChargesForm(EventCreateForm): ) ) - self.fields['additional_costs'].widget.attrs['placeholder'] = ugettext(u'Kann freigelassen werden') + self.fields['additional_costs'].widget.attrs['placeholder'] = gettext(u'Kann freigelassen werden') self.fields['additional_costs'].initial = additional_costs_text @@ -1011,32 +1011,32 @@ class DescriptionForm(EventCreateForm): if mode == 'training': # Titelprefix für Kurse if level == 'family': - value += u'%s' % ugettext(u'Familienkurs') + value += u'%s' % gettext(u'Familienkurs') elif level == 'beginner': - value += u'%s' % ugettext(u'Grundkurs') + value += u'%s' % gettext(u'Grundkurs') else: - value += u'%s' % ugettext(u'Aufbaukurs') + value += u'%s' % gettext(u'Aufbaukurs') if sport == 'B': - value += u' %s' % ugettext(u'Alpin') + value += u' %s' % gettext(u'Alpin') elif sport == 'K': if terrain == 'gym': - value += u' %s' % ugettext(u'Indoorklettern') + value += u' %s' % gettext(u'Indoorklettern') elif terrain == 'crag': - value += u' %s' % ugettext(u'Fels') + value += u' %s' % gettext(u'Fels') elif terrain == 'alpine': - value += u' %s' % ugettext(u'Alpinklettern') + value += u' %s' % gettext(u'Alpinklettern') value += u': ...' elif sport == 'W': # Titelprefix für Wanderungen if level == 'family': - value += u'%s ...' % ugettext(u'Familienwanderung') + value += u'%s ...' % gettext(u'Familienwanderung') elif not last_day: - value += u'%s ...' % ugettext(u'Tageswanderung') + value += u'%s ...' % gettext(u'Tageswanderung') elif level == 'family': # Titelprefix für sonstige Familientouren - value += u'%s: ...' % ugettext(u'Familientour') + value += u'%s: ...' % gettext(u'Familientour') if app_config.settings.forms_development_init: if not value: diff --git a/dav_events/forms/registration.py b/dav_events/forms/registration.py index f4561b4..3d1d90c 100644 --- a/dav_events/forms/registration.py +++ b/dav_events/forms/registration.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- from django import forms -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ class RegistrationResponseForm(forms.Form): diff --git a/dav_events/models/event.py b/dav_events/models/event.py index d5a8f6b..7b0db34 100644 --- a/dav_events/models/event.py +++ b/dav_events/models/event.py @@ -13,7 +13,7 @@ from django.contrib.auth import get_user_model from django.urls import reverse from django.db import models from django.template.loader import get_template -from django.utils.translation import get_language, ugettext_lazy as _ +from django.utils.translation import get_language, gettext_lazy as _ from django_countries.fields import Country, CountryField from .. import choices diff --git a/dav_events/models/eventstatus.py b/dav_events/models/eventstatus.py index fd62e61..58e8e8c 100644 --- a/dav_events/models/eventstatus.py +++ b/dav_events/models/eventstatus.py @@ -1,6 +1,6 @@ from __future__ import unicode_literals from django.db import models -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from ..validators import IdStringValidator diff --git a/dav_events/models/oneclickaction.py b/dav_events/models/oneclickaction.py index 63d48bd..544009c 100644 --- a/dav_events/models/oneclickaction.py +++ b/dav_events/models/oneclickaction.py @@ -6,7 +6,7 @@ from django.contrib.auth import get_user_model from django.urls import reverse from django.db import models from django.utils import timezone -from django.utils.translation import ugettext, ugettext_lazy as _ +from django.utils.translation import gettext, gettext_lazy as _ from .event import Event @@ -51,7 +51,7 @@ class OneClickAction(models.Model): if self.done and not self.allow_repeat: result['context'] = { 'status': 'warning', - 'message': ugettext('Diese Aktion hast du bereits ausgeführt.'), + 'message': gettext('Diese Aktion hast du bereits ausgeführt.'), } return result @@ -78,17 +78,17 @@ class OneClickAction(models.Model): flag = event.flags.filter(status__code=status_code).first() if flag: - message = (ugettext('Der Status wurde bereits' - ' am %(date)s' - ' von %(user)s' - ' auf \'%(status)s\' gesetzt.') % { + message = (gettext('Der Status wurde bereits' + ' am %(date)s' + ' von %(user)s' + ' auf \'%(status)s\' gesetzt.') % { 'status': flag.status.label, 'date': timezone.localtime(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('Der Status wurde auf \'%(status)s\' gesetzt.') % + message = (gettext('Der Status wurde auf \'%(status)s\' gesetzt.') % {'status': flag.status.label}) result['context'] = { @@ -109,7 +109,7 @@ class OneClickAction(models.Model): else: result['context'] = { 'status': 'danger', - 'message': ugettext('Invalid Command. Code on fire!'), + 'message': gettext('Invalid Command. Code on fire!'), } return result diff --git a/dav_events/models/participant.py b/dav_events/models/participant.py index d664c35..d931e7a 100644 --- a/dav_events/models/participant.py +++ b/dav_events/models/participant.py @@ -4,7 +4,7 @@ import datetime from django.core.exceptions import ValidationError from django.db import models from django.utils import timezone -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from dav_base.validators import DAVNumberValidator diff --git a/dav_events/models/trash/trashed_participant.py b/dav_events/models/trash/trashed_participant.py index 916ca08..aca3125 100644 --- a/dav_events/models/trash/trashed_participant.py +++ b/dav_events/models/trash/trashed_participant.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals from django.db import models -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from ..participant import AbstractParticipant diff --git a/dav_events/templatetags/dav_events.py b/dav_events/templatetags/dav_events.py index 367679c..622f2a2 100644 --- a/dav_events/templatetags/dav_events.py +++ b/dav_events/templatetags/dav_events.py @@ -4,7 +4,7 @@ from django import template from django.utils.html import format_html from django.utils.safestring import mark_safe from django.utils import timezone -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from ..models.eventchange import EventChange from ..models.eventstatus import EventStatus, get_or_create_event_status diff --git a/dav_events/tests/test_oneclickactions.py b/dav_events/tests/test_oneclickactions.py index 10ddbdb..86f4f41 100644 --- a/dav_events/tests/test_oneclickactions.py +++ b/dav_events/tests/test_oneclickactions.py @@ -5,7 +5,7 @@ import re from django.apps import apps from django.test import TestCase from django.urls import reverse -from django.utils.translation import ugettext +from django.utils.translation import gettext from dav_base.tests.generic import EmailTestMixin @@ -80,7 +80,7 @@ class ActionTestCase(EmailTestMixin, RoleMixin, EventMixin, TestCase): content = response.content.decode('utf-8') status_label = self.get_status_label(status_code) - message = ugettext('Der Status wurde auf \'%(status)s\' gesetzt.') % {'status': status_label} + message = gettext('Der Status wurde auf \'%(status)s\' gesetzt.') % {'status': status_label} html = message.replace('\'', ''') self.assertInHTML(html, content) self.assertRegex(content, r'alert-success') @@ -103,7 +103,7 @@ class ActionTestCase(EmailTestMixin, RoleMixin, EventMixin, TestCase): self.assertEqual(response.status_code, 200) content = response.content.decode('utf-8') - html = ugettext('Diese Aktion hast du bereits ausgeführt.') + html = gettext('Diese Aktion hast du bereits ausgeführt.') self.assertInHTML(html, content) self.assertRegex(content, r'alert-warning') @@ -112,10 +112,10 @@ class ActionTestCase(EmailTestMixin, RoleMixin, EventMixin, TestCase): content = response.content.decode('utf-8') status_label = self.get_status_label(status_code) - message = (ugettext('Der Status wurde bereits' - ' am %(date)s' - ' von %(user)s' - ' auf \'%(status)s\' gesetzt.') % { + message = (gettext('Der Status wurde bereits' + ' am %(date)s' + ' von %(user)s' + ' auf \'%(status)s\' gesetzt.') % { 'status': status_label, # 'date': datetime.datetime.now().strftime('%d.%m.%Y %H:%M:%S'), 'date': '\d{2}\.\d{2}\.\d{4} \d{2}:\d{2}:\d{2}', diff --git a/dav_events/tests/test_screenshots.py b/dav_events/tests/test_screenshots.py index 40d7668..acf2fd6 100644 --- a/dav_events/tests/test_screenshots.py +++ b/dav_events/tests/test_screenshots.py @@ -2,7 +2,7 @@ import time from django.test import tag from django.urls import reverse -from django.utils.translation import ugettext +from django.utils.translation import gettext from selenium.common.exceptions import NoSuchElementException from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys @@ -528,7 +528,7 @@ class TestCase(SeleniumAuthMixin, RoleMixin, ScreenshotTestCase): self.wait_until_stale(c, link) action_tabs = c.find_element(By.CSS_SELECTOR, '.action-tabs > ul.nav-tabs') - tab = action_tabs.find_element(By.LINK_TEXT, ugettext(u'Ändern')) + tab = action_tabs.find_element(By.LINK_TEXT, gettext(u'Ändern')) tab.click() self.wait_until_stale(c, tab) @@ -537,7 +537,7 @@ class TestCase(SeleniumAuthMixin, RoleMixin, ScreenshotTestCase): if screenshots: self.save_screenshot('edit-form', sequence=sequence_name) - button = panel.find_element(By.PARTIAL_LINK_TEXT, ugettext(u'Nächster Abschnitt')) + button = panel.find_element(By.PARTIAL_LINK_TEXT, gettext(u'Nächster Abschnitt')) button.click() time.sleep(.5) @@ -580,7 +580,7 @@ class TestCase(SeleniumAuthMixin, RoleMixin, ScreenshotTestCase): if screenshots: self.save_screenshot('accepted', sequence=sequence_name) - link = c.find_element(By.LINK_TEXT, ugettext('Veranstaltungsliste')) + link = c.find_element(By.LINK_TEXT, gettext('Veranstaltungsliste')) link.click() self.wait_until_stale(c, link) if screenshots: @@ -618,7 +618,7 @@ class TestCase(SeleniumAuthMixin, RoleMixin, ScreenshotTestCase): if screenshots: self.save_screenshot('confirmed_{}'.format(channel), sequence=sequence_name) - link = c.find_element(By.LINK_TEXT, ugettext('Veranstaltungsliste')) + link = c.find_element(By.LINK_TEXT, gettext('Veranstaltungsliste')) link.click() self.wait_until_stale(c, link) if screenshots: @@ -650,7 +650,7 @@ class TestCase(SeleniumAuthMixin, RoleMixin, ScreenshotTestCase): if screenshots: self.save_screenshot('confirmed_clearance', sequence=sequence_name) - link = c.find_element(By.LINK_TEXT, ugettext('Veranstaltungsliste')) + link = c.find_element(By.LINK_TEXT, gettext('Veranstaltungsliste')) link.click() self.wait_until_stale(c, link) if screenshots: @@ -730,7 +730,7 @@ class TestCase(SeleniumAuthMixin, RoleMixin, ScreenshotTestCase): button.click() self.wait_until_stale(c, button) - link = c.find_element(By.PARTIAL_LINK_TEXT, ugettext(u'Veranstaltungsliste herunterladen')) + link = c.find_element(By.PARTIAL_LINK_TEXT, gettext(u'Veranstaltungsliste herunterladen')) link.click() self.wait_until_stale(c, link) self.save_screenshot('event_export_form') diff --git a/dav_events/views/actions.py b/dav_events/views/actions.py index 413d2c0..a4eefdd 100644 --- a/dav_events/views/actions.py +++ b/dav_events/views/actions.py @@ -2,7 +2,7 @@ import logging from django.contrib import messages from django.contrib.auth import login from django.http import HttpResponseRedirect -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from django.views import generic from .. import models diff --git a/dav_events/views/events.py b/dav_events/views/events.py index eb7a2f3..5159569 100644 --- a/dav_events/views/events.py +++ b/dav_events/views/events.py @@ -14,7 +14,7 @@ from django.shortcuts import get_object_or_404 from django.urls import reverse, reverse_lazy from django.utils.decorators import method_decorator from django.utils.text import normalize_newlines -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from django.views import generic from .. import choices diff --git a/dav_events/workflow.py b/dav_events/workflow.py index 81e7cf8..8ead414 100644 --- a/dav_events/workflow.py +++ b/dav_events/workflow.py @@ -5,7 +5,7 @@ import re from django.apps import apps from django.db.models.functions import Length from django.utils import timezone -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from . import emails from . import signals diff --git a/dav_registration/forms.py b/dav_registration/forms.py index 5b907b9..b261f29 100644 --- a/dav_registration/forms.py +++ b/dav_registration/forms.py @@ -2,7 +2,7 @@ import datetime import logging from django import forms -from django.utils.translation import ugettext, ugettext_lazy as _ +from django.utils.translation import gettext, gettext_lazy as _ from .models import Registration @@ -40,16 +40,16 @@ class RegistrationForm(forms.ModelForm): val = self.cleaned_data.get('year_of_birth') if val > year_now: raise forms.ValidationError( - ugettext('Dein Geburtsjahr liegt in der Zukunft?' - ' Das finden wir gut,' - ' aber bitte melde dich besser mal per E-Mail bei uns.'), + gettext('Dein Geburtsjahr liegt in der Zukunft?' + ' Das finden wir gut,' + ' aber bitte melde dich besser mal per E-Mail bei uns.'), code='to_young', ) elif val < (year_now - max_age): raise forms.ValidationError( - ugettext('Du bist schon über %(max_age)d Jahre alt?' - ' Das finden wir gut,' - ' aber bitte melde dich besser mal per E-Mail bei uns.'), + gettext('Du bist schon über %(max_age)d Jahre alt?' + ' Das finden wir gut,' + ' aber bitte melde dich besser mal per E-Mail bei uns.'), params={'max_age': max_age}, code='to_old', ) @@ -63,8 +63,8 @@ class RegistrationForm(forms.ModelForm): need_experience = False if need_experience: raise forms.ValidationError( - ugettext('Die Tourenleiter*innen brauchen ein paar Angaben,' - ' was du bereits kannst oder wie fit du bist.'), + gettext('Die Tourenleiter*innen brauchen ein paar Angaben,' + ' was du bereits kannst oder wie fit du bist.'), code='need_experience', ) return val @@ -73,8 +73,8 @@ class RegistrationForm(forms.ModelForm): val = self.cleaned_data.get('privacy_policy_accepted') if not val and self.instance.privacy_policy: raise forms.ValidationError( - ugettext('Wir müssen deine Daten leider speichern können,' - ' damit wir wissen, dass du teilnehmen möchtest.'), + gettext('Wir müssen deine Daten leider speichern können,' + ' damit wir wissen, dass du teilnehmen möchtest.'), code='privacy_policy_not_accepted', ) return val @@ -84,7 +84,7 @@ class RegistrationForm(forms.ModelForm): dav_member = self.cleaned_data.get('dav_member') dav_number = self.cleaned_data.get('dav_number') if dav_member and not dav_number: - error_msg = ugettext('Wenn du DAV Mitglied bist, brauchen wir deine Mitgliedsnummer.') + error_msg = gettext('Wenn du DAV Mitglied bist, brauchen wir deine Mitgliedsnummer.') self.add_error('not_dav_member', error_msg) raise forms.ValidationError(error_msg, code='dav_number_missing') return self.cleaned_data diff --git a/dav_registration/models.py b/dav_registration/models.py index dd6d111..f64359b 100644 --- a/dav_registration/models.py +++ b/dav_registration/models.py @@ -6,7 +6,7 @@ from django.core.exceptions import ValidationError from django.db import models from django.urls import reverse from django.utils import timezone -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from dav_base.validators import DAVNumberValidator from dav_events.models.event import Event diff --git a/dav_registration/views.py b/dav_registration/views.py index 494f7fd..c50c062 100644 --- a/dav_registration/views.py +++ b/dav_registration/views.py @@ -6,7 +6,7 @@ from django.contrib import messages from django.db.models import Q from django.http import JsonResponse from django.urls import reverse_lazy -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from django.views import generic from dav_events.choices import SPORT_CHOICES, LEVEL_CHOICES From e29e7417906284f75534cb697a1edff6c99df437 Mon Sep 17 00:00:00 2001 From: Jens Kleineheismann Date: Thu, 10 Apr 2025 11:38:37 +0200 Subject: [PATCH 2/9] Fixed invalid escape sequence in message string --- dav_events/tests/test_oneclickactions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dav_events/tests/test_oneclickactions.py b/dav_events/tests/test_oneclickactions.py index 86f4f41..9d91df6 100644 --- a/dav_events/tests/test_oneclickactions.py +++ b/dav_events/tests/test_oneclickactions.py @@ -118,7 +118,7 @@ class ActionTestCase(EmailTestMixin, RoleMixin, EventMixin, TestCase): ' auf \'%(status)s\' gesetzt.') % { 'status': status_label, # 'date': datetime.datetime.now().strftime('%d.%m.%Y %H:%M:%S'), - 'date': '\d{2}\.\d{2}\.\d{4} \d{2}:\d{2}:\d{2}', + 'date': r'\d{2}\.\d{2}\.\d{4} \d{2}:\d{2}:\d{2}', 'user': user.get_full_name(), }) html = message.replace('\'', ''') From e953dcc7e0930d03f4a3297f9e3477fd1e408039 Mon Sep 17 00:00:00 2001 From: Jens Kleineheismann Date: Thu, 10 Apr 2025 11:43:52 +0200 Subject: [PATCH 3/9] Removed providing_args argument for django.dispatch.Signal Was deprecated in Django 3 and removed in Django 4 --- dav_events/signals.py | 8 ++++---- dav_registration/signals.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/dav_events/signals.py b/dav_events/signals.py index 918c472..ebc2f4a 100644 --- a/dav_events/signals.py +++ b/dav_events/signals.py @@ -1,9 +1,9 @@ from django.dispatch import Signal -event_created = Signal(providing_args=['event']) -event_updated = Signal(providing_args=['event', 'diff', 'user']) -event_status_updated = Signal(providing_args=['event', 'flag']) -event_registration_closed = Signal(providing_args=['event', 'user']) +event_created = Signal() +event_updated = Signal() +event_status_updated = Signal() +event_registration_closed = Signal() def signal_handler_for_event_update(sender, **kwargs): diff --git a/dav_registration/signals.py b/dav_registration/signals.py index d33bf24..9b41537 100644 --- a/dav_registration/signals.py +++ b/dav_registration/signals.py @@ -2,7 +2,7 @@ from django.dispatch import Signal from . import emails -registration_created = Signal(providing_args=['registration']) +registration_created = Signal() def send_emails_on_registration(sender, **kwargs): # pylint: disable=unused-argument From b70fbbfa90544d3febaa0f943ccfdb5ef533fd40 Mon Sep 17 00:00:00 2001 From: Jens Kleineheismann Date: Thu, 10 Apr 2025 12:14:35 +0200 Subject: [PATCH 4/9] Replaced django.conf.urls.url by django.urls.re_path --- dav_auth/urls.py | 10 +++---- dav_base/config/modules.py | 4 +-- .../django_project_config/urls.py | 4 +-- dav_base/urls.py | 8 +++--- dav_event_office/urls.py | 10 +++---- dav_events/urls.py | 26 +++++++++---------- dav_registration/urls.py | 16 ++++++------ 7 files changed, 39 insertions(+), 39 deletions(-) diff --git a/dav_auth/urls.py b/dav_auth/urls.py index 8d4bdf7..f627fab 100644 --- a/dav_auth/urls.py +++ b/dav_auth/urls.py @@ -1,12 +1,12 @@ -from django.conf.urls import url +from django.urls import re_path from . import views app_name = 'dav_auth' urlpatterns = [ - url(r'^login$', views.LoginView.as_view(), name='login'), - url(r'^logout$', views.LogoutView.as_view(), name='logout'), - url(r'^password$', views.SetPasswordView.as_view(), name='set_password'), - url(r'^password/recreate$', views.CreateAndSendPasswordView.as_view(), name='recreate_password'), + re_path(r'^login$', views.LoginView.as_view(), name='login'), + re_path(r'^logout$', views.LogoutView.as_view(), name='logout'), + re_path(r'^password$', views.SetPasswordView.as_view(), name='set_password'), + re_path(r'^password/recreate$', views.CreateAndSendPasswordView.as_view(), name='recreate_password'), ] diff --git a/dav_base/config/modules.py b/dav_base/config/modules.py index 6c82e87..063a76e 100644 --- a/dav_base/config/modules.py +++ b/dav_base/config/modules.py @@ -3,7 +3,7 @@ import os import pkg_resources from django.conf import settings -from django.conf.urls import url as django_conf_url, include +from django.urls import re_path, include DJANGO_MAIN_MODULE = 'main' MODULE_CONFIG_FILE_NAME = 'module_config.json' @@ -50,7 +50,7 @@ class ModuleMeta: def url_conf_pattern(self): url_pattern = '^{}/'.format(self.url_prefix) url_conf = self._package_name + '.urls' - return django_conf_url(url_pattern, include(url_conf, self.url_namespace)) + return re_path(url_pattern, include(url_conf, self.url_namespace)) def _load_from_package(self): package_name = self._package_name diff --git a/dav_base/console_scripts/django_project_config/urls.py b/dav_base/console_scripts/django_project_config/urls.py index d1e9a66..23dec90 100644 --- a/dav_base/console_scripts/django_project_config/urls.py +++ b/dav_base/console_scripts/django_project_config/urls.py @@ -1,5 +1,5 @@ from django.conf import settings -from django.conf.urls import url, include +from django.urls import re_path, include urlpatterns = [] @@ -8,5 +8,5 @@ for module_meta_obj in settings.MODULE_CONFIG.modules.values(): urlpatterns.append(module_meta_obj.url_conf_pattern) urlpatterns += [ - url(r'^', include('dav_base.urls')) + re_path(r'^', include('dav_base.urls')) ] diff --git a/dav_base/urls.py b/dav_base/urls.py index 5286e4e..30251a5 100644 --- a/dav_base/urls.py +++ b/dav_base/urls.py @@ -1,11 +1,11 @@ -from django.conf.urls import url +from django.urls import re_path from django.contrib import admin from django.views import generic from . import views urlpatterns = [ - url(r'^$', views.RootView.as_view(), name='root'), - url(r'^css-demo$', generic.TemplateView.as_view(template_name='dav_base/css_demo.html'), name='css-demo'), - url(r'^djangoadmin/', admin.site.urls), + re_path(r'^$', views.RootView.as_view(), name='root'), + re_path(r'^css-demo$', generic.TemplateView.as_view(template_name='dav_base/css_demo.html'), name='css-demo'), + re_path(r'^djangoadmin/', admin.site.urls), ] diff --git a/dav_event_office/urls.py b/dav_event_office/urls.py index 3def02d..6df768b 100644 --- a/dav_event_office/urls.py +++ b/dav_event_office/urls.py @@ -1,12 +1,12 @@ -from django.conf.urls import url +from django.urls import re_path from . import views app_name = 'dav_event_office' urlpatterns = [ - url(r'^home$', views.HomeView.as_view(), name='root'), - url(r'^participants$', views.ParticipantListView.as_view(), name='participant-list'), - url(r'^$', views.EventListView.as_view(), name='event-list'), - url(r'^(?P\d+)/', views.EventDetailView.as_view(), name='event-detail'), + re_path(r'^home$', views.HomeView.as_view(), name='root'), + re_path(r'^participants$', views.ParticipantListView.as_view(), name='participant-list'), + re_path(r'^$', views.EventListView.as_view(), name='event-list'), + re_path(r'^(?P\d+)/', views.EventDetailView.as_view(), name='event-detail'), ] diff --git a/dav_events/urls.py b/dav_events/urls.py index bef399c..6a414d1 100644 --- a/dav_events/urls.py +++ b/dav_events/urls.py @@ -1,20 +1,20 @@ -from django.conf.urls import url +from django.urls import re_path from . import views app_name = 'dav_events' urlpatterns = [ - url(r'^home$', views.base.HomeView.as_view(), name='root'), - url(r'^$', views.events.EventListView.as_view(), name='list'), - url(r'^export$', views.events.EventListExportView.as_view(), name='list_export'), - url(r'^create$', views.events.EventCreateView.as_view(), name='create'), - url(r'^(?P\d+)/registrations', views.events.EventRegistrationsView.as_view(), name='registrations'), - url(r'^(?P\d+)/status/(?P[a-z0-9._-][a-z0-9._-]*)', - views.events.EventUpdateStatusView.as_view(), name='updatestatus'), - url(r'^(?P\d+)/edit', views.events.EventUpdateView.as_view(), name='update'), - url(r'^(?P\d+)/', views.events.EventDetailView.as_view(), name='detail'), - url(r'^registration/(?P\d+)/', views.events.RespondRegistrationView.as_view(), name='respond_registration'), - url(r'^action/(?P[a-fA-F0-9]{8}-([a-fA-F0-9]{4}-){3}[a-fA-F0-9]{12})/', - views.actions.OneClickActionRunView.as_view(), name='action_run'), + re_path(r'^home$', views.base.HomeView.as_view(), name='root'), + re_path(r'^$', views.events.EventListView.as_view(), name='list'), + re_path(r'^export$', views.events.EventListExportView.as_view(), name='list_export'), + re_path(r'^create$', views.events.EventCreateView.as_view(), name='create'), + re_path(r'^(?P\d+)/registrations', views.events.EventRegistrationsView.as_view(), name='registrations'), + re_path(r'^(?P\d+)/status/(?P[a-z0-9._-][a-z0-9._-]*)', + views.events.EventUpdateStatusView.as_view(), name='updatestatus'), + re_path(r'^(?P\d+)/edit', views.events.EventUpdateView.as_view(), name='update'), + re_path(r'^(?P\d+)/', views.events.EventDetailView.as_view(), name='detail'), + re_path(r'^registration/(?P\d+)/', views.events.RespondRegistrationView.as_view(), name='respond_registration'), + re_path(r'^action/(?P[a-fA-F0-9]{8}-([a-fA-F0-9]{4}-){3}[a-fA-F0-9]{12})/', + views.actions.OneClickActionRunView.as_view(), name='action_run'), ] diff --git a/dav_registration/urls.py b/dav_registration/urls.py index d4999ad..c106cca 100644 --- a/dav_registration/urls.py +++ b/dav_registration/urls.py @@ -1,15 +1,15 @@ -from django.conf.urls import url +from django.urls import re_path from . import views app_name = 'dav_registration' urlpatterns = [ - url(r'^$', views.RootView.as_view(), name='root'), - url(r'^home/$', views.HomeView.as_view(), name='home'), - url(r'^event/$', views.EventListView.as_view(), name='events'), - url(r'^event/(?P\d+)/$', views.EventDetailView.as_view(), name='event'), - url(r'^event/(?P\d+)/registration/$', views.RegistrationView.as_view(), name='register'), - url(r'^finished/$', views.RegistrationSuccessView.as_view(), name='registered'), - url(r'^api/v1/event/$', views.EventListAsJSONView, name='api_events'), + re_path(r'^$', views.RootView.as_view(), name='root'), + re_path(r'^home/$', views.HomeView.as_view(), name='home'), + re_path(r'^event/$', views.EventListView.as_view(), name='events'), + re_path(r'^event/(?P\d+)/$', views.EventDetailView.as_view(), name='event'), + re_path(r'^event/(?P\d+)/registration/$', views.RegistrationView.as_view(), name='register'), + re_path(r'^finished/$', views.RegistrationSuccessView.as_view(), name='registered'), + re_path(r'^api/v1/event/$', views.EventListAsJSONView, name='api_events'), ] From 0438cf91c6f5a03e50478bc8af0ea3caea630352 Mon Sep 17 00:00:00 2001 From: Jens Kleineheismann Date: Thu, 10 Apr 2025 12:41:37 +0200 Subject: [PATCH 5/9] Fixed small errors in INSTALL.txt --- INSTALL.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/INSTALL.rst b/INSTALL.rst index bb3207e..ac03e22 100644 --- a/INSTALL.rst +++ b/INSTALL.rst @@ -10,11 +10,11 @@ For production use you surly want a real web server that supports WSGI QUICK INSTALLATION FOR THE IMPATIENT ==================================== -- python -m venv ./etc/python +- python -m venv ./env/python - source env/python/bin/activate - python -m pip install -r requirements.txt - python -m pip install -e . -- django-dav-events-admin setup ./env/django +- django-dav-admin setup ./env/django - python ./env/django/manage.py enable_module dav_auth - python ./env/django/manage.py enable_module dav_events - python ./env/django/manage.py enable_module dav_registration From 62accd41975f63ee5d6d6aa326f32fd20b6a0686 Mon Sep 17 00:00:00 2001 From: Jens Kleineheismann Date: Thu, 10 Apr 2025 15:01:46 +0200 Subject: [PATCH 6/9] Replaced default_app_config variable by module config to locate the AppConfig object --- dav_auth/__init__.py | 1 - dav_auth/module.json | 3 ++- dav_base/__init__.py | 1 - dav_base/config/modules.py | 16 +++++++++++++++- .../django_project_config/additional_settings.py | 2 +- dav_base/views.py | 2 +- dav_event_office/__init__.py | 1 - dav_event_office/module.json | 3 ++- dav_events/__init__.py | 1 - dav_events/module.json | 3 ++- dav_registration/__init__.py | 1 - dav_registration/module.json | 3 ++- 12 files changed, 25 insertions(+), 12 deletions(-) diff --git a/dav_auth/__init__.py b/dav_auth/__init__.py index 7c90b21..e69de29 100644 --- a/dav_auth/__init__.py +++ b/dav_auth/__init__.py @@ -1 +0,0 @@ -default_app_config = 'dav_auth.apps.AppConfig' # pylint: disable=invalid-name diff --git a/dav_auth/module.json b/dav_auth/module.json index 2f1e776..dfc3a65 100644 --- a/dav_auth/module.json +++ b/dav_auth/module.json @@ -1,3 +1,4 @@ { - "url_prefix": "auth" + "url_prefix": "auth", + "app_config": ".apps.AppConfig" } \ No newline at end of file diff --git a/dav_base/__init__.py b/dav_base/__init__.py index c57740f..e69de29 100644 --- a/dav_base/__init__.py +++ b/dav_base/__init__.py @@ -1 +0,0 @@ -default_app_config = 'dav_base.apps.AppConfig' # pylint: disable=invalid-name diff --git a/dav_base/config/modules.py b/dav_base/config/modules.py index 063a76e..ac0f7da 100644 --- a/dav_base/config/modules.py +++ b/dav_base/config/modules.py @@ -19,6 +19,7 @@ class ModuleMeta: def __init__(self, package_name): self._package_name = package_name + self._app_config = None self._additional_apps = [] self._url_prefix = None self._load_from_package() @@ -28,9 +29,19 @@ class ModuleMeta: return t @property - def app(self): + def package(self): return self._package_name + @property + def app(self): + if self._app_config: + app = self._app_config + if app.startswith('.'): + app = self._package_name + app + else: + app = self._package_name + return app + @property def additional_apps(self): return self._additional_apps @@ -61,6 +72,7 @@ class ModuleMeta: def load_from_dict(self, meta_dict): self._package_name = meta_dict.get('package', None) + self._app_config = meta_dict.get('app_config', None) self._additional_apps = meta_dict.get('additional_apps', []) self._url_prefix = meta_dict.get('url_prefix', None) @@ -68,6 +80,8 @@ class ModuleMeta: d = { 'package': self._package_name, } + if self._app_config: + d['app_config'] = self._app_config if self._additional_apps: d['additional_apps'] = self._additional_apps if self._url_prefix: diff --git a/dav_base/console_scripts/django_project_config/additional_settings.py b/dav_base/console_scripts/django_project_config/additional_settings.py index 1bd7468..4bdde64 100644 --- a/dav_base/console_scripts/django_project_config/additional_settings.py +++ b/dav_base/console_scripts/django_project_config/additional_settings.py @@ -16,7 +16,7 @@ INSTALLED_APPS += [ 'django_countries', # 'django_extensions', # Our main app - 'dav_base', + 'dav_base.apps.AppConfig', ] # Add apps from our modules diff --git a/dav_base/views.py b/dav_base/views.py index 76422ba..d07fd7c 100644 --- a/dav_base/views.py +++ b/dav_base/views.py @@ -15,7 +15,7 @@ class RootView(generic.TemplateView): root_url_name = '%s:%s' % (module_meta_obj.url_namespace, root_url_name) try: reverse(root_url_name) - root_urls.append((module_meta_obj.app, root_url_name)) + root_urls.append((module_meta_obj.package, root_url_name)) except NoReverseMatch: pass diff --git a/dav_event_office/__init__.py b/dav_event_office/__init__.py index 2136438..e69de29 100644 --- a/dav_event_office/__init__.py +++ b/dav_event_office/__init__.py @@ -1 +0,0 @@ -default_app_config = 'dav_event_office.apps.AppConfig' # pylint: disable=invalid-name diff --git a/dav_event_office/module.json b/dav_event_office/module.json index 5a4ef89..b851441 100644 --- a/dav_event_office/module.json +++ b/dav_event_office/module.json @@ -1,3 +1,4 @@ { - "url_prefix": "office/events" + "url_prefix": "office/events", + "app_config": ".apps.AppConfig" } \ No newline at end of file diff --git a/dav_events/__init__.py b/dav_events/__init__.py index 54def6e..e69de29 100644 --- a/dav_events/__init__.py +++ b/dav_events/__init__.py @@ -1 +0,0 @@ -default_app_config = 'dav_events.apps.AppConfig' # pylint: disable=invalid-name diff --git a/dav_events/module.json b/dav_events/module.json index ccce349..ea65ba9 100644 --- a/dav_events/module.json +++ b/dav_events/module.json @@ -1,3 +1,4 @@ { - "url_prefix": "events" + "url_prefix": "events", + "app_config": ".apps.AppConfig" } \ No newline at end of file diff --git a/dav_registration/__init__.py b/dav_registration/__init__.py index f6bcdc8..e69de29 100644 --- a/dav_registration/__init__.py +++ b/dav_registration/__init__.py @@ -1 +0,0 @@ -default_app_config = 'dav_registration.apps.AppConfig' # pylint: disable=invalid-name diff --git a/dav_registration/module.json b/dav_registration/module.json index 544b4cf..211a3e9 100644 --- a/dav_registration/module.json +++ b/dav_registration/module.json @@ -1,3 +1,4 @@ { - "url_prefix": "registration" + "url_prefix": "registration", + "app_config": ".apps.AppConfig" } \ No newline at end of file From a143e8e23913c115be3d6ad84537ba6f6b2da849 Mon Sep 17 00:00:00 2001 From: Jens Kleineheismann Date: Thu, 10 Apr 2025 15:02:42 +0200 Subject: [PATCH 7/9] Fixed LogoutView for Django 4 --- dav_auth/views.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/dav_auth/views.py b/dav_auth/views.py index 946faa7..bedb253 100644 --- a/dav_auth/views.py +++ b/dav_auth/views.py @@ -48,9 +48,10 @@ class LoginView(auth_views.LoginView): class LogoutView(auth_views.LogoutView): - def get_next_page(self): - url = super().get_next_page() - if not url and app_config.settings.logout_redirect_url: + @property + def next_page(self): + url = None + if app_config.settings.logout_redirect_url: url = resolve_url(app_config.settings.logout_redirect_url) return url From 86dadac4213b9f5d50adb640dbbaa25856dfa3a2 Mon Sep 17 00:00:00 2001 From: Jens Kleineheismann Date: Thu, 10 Apr 2025 15:08:29 +0200 Subject: [PATCH 8/9] Fixed workflow for django 4 --- dav_events/workflow.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dav_events/workflow.py b/dav_events/workflow.py index 8ead414..515ed77 100644 --- a/dav_events/workflow.py +++ b/dav_events/workflow.py @@ -264,6 +264,9 @@ class BasicWorkflow(object): status_list = [] self._check_status() + if not event.id: + return status_list + heaviest_flag = event.flags.order_by('status').last() if heaviest_flag: flags = [] From e5c1bbed4b1fcdbc8a3d6eeb8554490f88af23ec Mon Sep 17 00:00:00 2001 From: Jens Kleineheismann Date: Fri, 11 Apr 2025 09:37:12 +0200 Subject: [PATCH 9/9] Django 5: LogoutView must be called via POST now --- .../dav_auth/includes/login_widget.html | 8 +++++++- dav_auth/tests/generic.py | 6 +++++- dav_auth/tests/test_screenshots.py | 6 ++++-- dav_auth/tests/test_urls.py | 3 ++- dav_auth/tests/test_views.py | 6 +++--- dav_base/tests/generic.py | 17 +++++++++++++++-- .../templates/dav_events/event_update_form.html | 2 +- dav_events/tests/test_screenshots.py | 2 +- requirements.txt | 2 +- 9 files changed, 39 insertions(+), 13 deletions(-) diff --git a/dav_auth/templates/dav_auth/includes/login_widget.html b/dav_auth/templates/dav_auth/includes/login_widget.html index b19180d..4309e8b 100644 --- a/dav_auth/templates/dav_auth/includes/login_widget.html +++ b/dav_auth/templates/dav_auth/includes/login_widget.html @@ -8,7 +8,13 @@ {% else %} diff --git a/dav_auth/tests/generic.py b/dav_auth/tests/generic.py index eede63a..ce38659 100644 --- a/dav_auth/tests/generic.py +++ b/dav_auth/tests/generic.py @@ -17,6 +17,10 @@ class SeleniumAuthMixin: return driver def logout(self, driver): - driver.get(self.complete_url(reverse('dav_auth:logout'))) + #driver.get(self.complete_url(reverse('dav_auth:logout'))) + dropdown_button = driver.find_element(By.ID, 'user_dropdown_button') + dropdown_button.click() + logout_button = driver.find_element(By.ID, 'id_logout_button') + logout_button.click() self.wait_on_presence(driver, (By.CSS_SELECTOR, "#messages .alert-success")) return driver diff --git a/dav_auth/tests/test_screenshots.py b/dav_auth/tests/test_screenshots.py index 1970895..8e2acd6 100644 --- a/dav_auth/tests/test_screenshots.py +++ b/dav_auth/tests/test_screenshots.py @@ -189,8 +189,10 @@ class TestCase(ScreenshotTestCase): dropdown_button = self.wait_on_presence(c, (By.ID, 'user_dropdown_button')) dropdown_button.click() user_menu = c.find_element(By.CSS_SELECTOR, '#login-widget ul') - link = user_menu.find_element(By.PARTIAL_LINK_TEXT, gettext('Logout')) - link.click() + #link = user_menu.find_element(By.PARTIAL_LINK_TEXT, gettext('Logout')) + #link.click() + button = c.find_element(By.ID, 'id_logout_button') + button.click() self.wait_until_stale(c, user_menu) self.save_screenshot('logout_succeed', sequence=sequence_name) diff --git a/dav_auth/tests/test_urls.py b/dav_auth/tests/test_urls.py index 5acaf2f..5ad1538 100644 --- a/dav_auth/tests/test_urls.py +++ b/dav_auth/tests/test_urls.py @@ -6,7 +6,8 @@ from .. import views class TestCase(UrlsTestCase): urls = ( Url('/auth/login', 'dav_auth:login', views.LoginView.as_view()), - Url('/auth/logout', 'dav_auth:logout', views.LogoutView.as_view(), status_code=302), + Url('/auth/logout', 'dav_auth:logout', views.LogoutView.as_view(), status_code=302, + http_method='POST'), Url('/auth/password', 'dav_auth:set_password', views.SetPasswordView.as_view(), redirect='/auth/login?next=/auth/password'), Url('/auth/password/recreate', 'dav_auth:recreate_password', views.CreateAndSendPasswordView.as_view()), diff --git a/dav_auth/tests/test_views.py b/dav_auth/tests/test_views.py index e9d269a..a086189 100644 --- a/dav_auth/tests/test_views.py +++ b/dav_auth/tests/test_views.py @@ -61,7 +61,7 @@ class ViewsTestCase(TestCase): response = self.client.post(self.login_url, {'username': self.test_username, 'password': self.test_password}) self.assertEqual(response.status_code, 200) - self.assertFormError(response, 'form', None, self.wrong_credentials_message) + self.assertFormError(response.context['form'], None, self.wrong_credentials_message) self.assertFalse(response.context['user'].is_authenticated, 'User is logged in') def test_integrated_login_fail_with_wrong_credentials(self): @@ -69,7 +69,7 @@ class ViewsTestCase(TestCase): response = self.client.post(self.login_url, {'username': self.test_username, 'password': wrong_password}) self.assertEqual(response.status_code, 200) - self.assertFormError(response, 'form', None, self.wrong_credentials_message) + self.assertFormError(response.context['form'],None, self.wrong_credentials_message) self.assertFalse(response.context['user'].is_authenticated, 'User is logged in') def test_integrated_login_succeed(self): @@ -88,7 +88,7 @@ class ViewsTestCase(TestCase): def test_integrated_logout(self): self.client.login(username=self.test_username, password=self.test_password) - response = self.client.get(self.logout_url) + response = self.client.post(self.logout_url) self.assertEqual(response.status_code, 302) self.assertEqual(response.url, self.logout_redirect_url) diff --git a/dav_base/tests/generic.py b/dav_base/tests/generic.py index f631bdf..0320976 100644 --- a/dav_base/tests/generic.py +++ b/dav_base/tests/generic.py @@ -171,6 +171,8 @@ class Url: # pylint: disable=too-few-public-methods self.location = location self.name = name self.func = func + self.http_method = kwargs.get('http_method', "GET") + self.post_data = kwargs.get('post_data', {}) self.redirect = kwargs.get('redirect', False) self.status_code = kwargs.get('status_code', 200) self.follow = kwargs.get('follow', False) @@ -182,7 +184,12 @@ class UrlsTestCase(TestCase): def test_locations(self): for url in self.urls: if url.location: - response = self.client.get(url.location, follow=url.follow) + if url.http_method == "GET": + response = self.client.get(url.location, follow=url.follow) + elif url.http_method == "POST": + response = self.client.post(url.location, data=url.post_data, follow=url.follow) + else: # pragma: no cover + raise NotImplementedError("Method {} is not supported".format(url.http_method)) if url.redirect: self.assertRedirects(response, url.redirect) @@ -198,7 +205,13 @@ class UrlsTestCase(TestCase): def test_names(self): for url in self.urls: if url.name: - response = self.client.get(reverse(url.name), follow=url.follow) + location = reverse(url.name) + if url.http_method == "GET": + response = self.client.get(location, follow=url.follow) + elif url.http_method == "POST": + response = self.client.post(location, data=url.post_data, follow=url.follow) + else: # pragma: no cover + raise NotImplementedError("Method {} is not supported".format(url.http_method)) if url.redirect: self.assertRedirects(response, url.redirect) diff --git a/dav_events/templates/dav_events/event_update_form.html b/dav_events/templates/dav_events/event_update_form.html index 7c72115..7af4472 100644 --- a/dav_events/templates/dav_events/event_update_form.html +++ b/dav_events/templates/dav_events/event_update_form.html @@ -51,7 +51,7 @@ -
+ {% csrf_token %} {% if is_realized %} diff --git a/dav_events/tests/test_screenshots.py b/dav_events/tests/test_screenshots.py index acf2fd6..ef79834 100644 --- a/dav_events/tests/test_screenshots.py +++ b/dav_events/tests/test_screenshots.py @@ -544,7 +544,7 @@ class TestCase(SeleniumAuthMixin, RoleMixin, ScreenshotTestCase): if screenshots: self.save_screenshot('edit-form', sequence=sequence_name) - button = c.find_element(By.CSS_SELECTOR, 'form button[type="submit"]') + button = c.find_element(By.CSS_SELECTOR, '#id_event_update_form button[type="submit"]') button.click() self.wait_until_stale(c, button) diff --git a/requirements.txt b/requirements.txt index d457057..fc5bc0e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ babel -django<3.3 +django<5.1 django-bootstrap3 django-countries django-datetime-widget2