Merge remote-tracking branch 'origin/main' into MK/multi_page_tables

pull/133/head
mariusrklein 10 months ago
commit 5a1c51cd4a

@ -0,0 +1,34 @@
# Generated by Django 4.0.1 on 2025-02-22 21:59
from django.db import migrations, models
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('members', '0037_memberwaitinglist_leave_key'),
]
operations = [
migrations.AlterField(
model_name='invitationtogroup',
name='date',
field=models.DateField(default=django.utils.timezone.now, verbose_name='Invitation date'),
),
migrations.AlterField(
model_name='member',
name='created',
field=models.DateField(default=django.utils.timezone.now, verbose_name='created'),
),
migrations.AlterField(
model_name='memberwaitinglist',
name='last_reminder',
field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='Last reminder'),
),
migrations.AlterField(
model_name='memberwaitinglist',
name='last_wait_confirmation',
field=models.DateField(default=django.utils.timezone.now, verbose_name='Last wait confirmation'),
),
]

@ -14,7 +14,7 @@ from django.utils.html import format_html
from django.urls import reverse from django.urls import reverse
from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from utils import RestrictedFileField from utils import RestrictedFileField, normalize_name
import os import os
from mailer.mailutils import send as send_mail, get_mail_confirmation_link,\ from mailer.mailutils import send as send_mail, get_mail_confirmation_link,\
prepend_base_url, get_registration_link, get_wait_confirmation_link,\ prepend_base_url, get_registration_link, get_wait_confirmation_link,\
@ -312,7 +312,7 @@ class Member(Person):
default=True) default=True)
unsubscribe_key = models.CharField(max_length=32, default="") unsubscribe_key = models.CharField(max_length=32, default="")
unsubscribe_expire = models.DateTimeField(default=timezone.now) unsubscribe_expire = models.DateTimeField(default=timezone.now)
created = models.DateField(auto_now=True, verbose_name=_('created')) created = models.DateField(default=timezone.now, verbose_name=_('created'))
active = models.BooleanField(default=True, verbose_name=_('Active')) active = models.BooleanField(default=True, verbose_name=_('Active'))
registration_form = RestrictedFileField(verbose_name=_('registration form'), registration_form = RestrictedFileField(verbose_name=_('registration form'),
upload_to='registration_forms', upload_to='registration_forms',
@ -866,7 +866,7 @@ class InvitationToGroup(models.Model):
"""An invitation of a waiter to a group.""" """An invitation of a waiter to a group."""
waiter = models.ForeignKey('MemberWaitingList', verbose_name=_('Waiter'), on_delete=models.CASCADE) waiter = models.ForeignKey('MemberWaitingList', verbose_name=_('Waiter'), on_delete=models.CASCADE)
group = models.ForeignKey(Group, verbose_name=_('Group'), on_delete=models.CASCADE) group = models.ForeignKey(Group, verbose_name=_('Group'), on_delete=models.CASCADE)
date = models.DateField(auto_now=True, verbose_name=_('Invitation date')) date = models.DateField(default=timezone.now, verbose_name=_('Invitation date'))
rejected = models.BooleanField(verbose_name=_('Invitation rejected'), default=False) rejected = models.BooleanField(verbose_name=_('Invitation rejected'), default=False)
key = models.CharField(max_length=32, default=gen_key) key = models.CharField(max_length=32, default=gen_key)
@ -898,13 +898,13 @@ class MemberWaitingList(Person):
application_text = models.TextField(_('Do you want to tell us something else?'), default='', blank=True) application_text = models.TextField(_('Do you want to tell us something else?'), default='', blank=True)
application_date = models.DateTimeField(verbose_name=_('application date'), default=timezone.now) application_date = models.DateTimeField(verbose_name=_('application date'), default=timezone.now)
last_wait_confirmation = models.DateField(auto_now=True, verbose_name=_('Last wait confirmation')) last_wait_confirmation = models.DateField(default=timezone.now, verbose_name=_('Last wait confirmation'))
wait_confirmation_key = models.CharField(max_length=32, default="") wait_confirmation_key = models.CharField(max_length=32, default="")
wait_confirmation_key_expire = models.DateTimeField(default=timezone.now) wait_confirmation_key_expire = models.DateTimeField(default=timezone.now)
leave_key = models.CharField(max_length=32, default="") leave_key = models.CharField(max_length=32, default="")
last_reminder = models.DateTimeField(auto_now=True, verbose_name=_('Last reminder')) last_reminder = models.DateTimeField(default=timezone.now, verbose_name=_('Last reminder'))
sent_reminders = models.IntegerField(default=0, verbose_name=_('Missed reminders')) sent_reminders = models.IntegerField(default=0, verbose_name=_('Missed reminders'))
registration_key = models.CharField(max_length=32, default="") registration_key = models.CharField(max_length=32, default="")
@ -948,7 +948,7 @@ class MemberWaitingList(Person):
def ask_for_wait_confirmation(self): def ask_for_wait_confirmation(self):
"""Sends an email to the person asking them to confirm their intention to wait.""" """Sends an email to the person asking them to confirm their intention to wait."""
self.last_reminder = datetime.now() self.last_reminder = timezone.now()
self.sent_reminders += 1 self.sent_reminders += 1
self.leave_key = gen_key() self.leave_key = gen_key()
self.save() self.save()
@ -2020,8 +2020,3 @@ def import_from_csv_waitinglist(path):
for row in rows: for row in rows:
transform_row(row) transform_row(row)
def normalize_name(raw):
noumlaut = raw.replace('ö', 'oe').replace('ä', 'ae').replace('ü', 'ue').replace(' ', '_')
return unicodedata.normalize('NFKD', noumlaut).encode('ascii', 'ignore').decode('ascii')

@ -1,5 +1,6 @@
from django import template from django import template
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
from utils import normalize_name
register = template.Library() register = template.Library()
@ -12,7 +13,7 @@ def checked_if_true(name, value):
@register.filter @register.filter
def esc_all(val): def esc_all(val):
return mark_safe(str(val).replace('_', '\\_').replace('&', '\\&')) return mark_safe(str(normalize_name(val, False)).replace('_', '\\_').replace('&', '\\&'))
@register.filter @register.filter

@ -1473,7 +1473,6 @@ class ConfirmWaitingViewTestCase(BasicMemberTestCase):
waiter = MemberWaitingList.objects.get(pk=self.waiter.pk) waiter = MemberWaitingList.objects.get(pk=self.waiter.pk)
self.assertEqual(waiter.leave_key, '') self.assertEqual(waiter.leave_key, '')
@skip("This currently fails, because `last_wait_confirmation` has `auto_now=True`, which is wrong.")
def test_get_expired(self): def test_get_expired(self):
self.waiter.last_wait_confirmation = datetime.date(1900, 1, 1) self.waiter.last_wait_confirmation = datetime.date(1900, 1, 1)
self.waiter.save() self.waiter.save()

@ -2,6 +2,7 @@ from django.db import models
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from decimal import Decimal, ROUND_HALF_DOWN from decimal import Decimal, ROUND_HALF_DOWN
import unicodedata
def file_size_validator(max_upload_size): def file_size_validator(max_upload_size):
@ -60,3 +61,11 @@ def get_member(request):
return None return None
else: else:
return request.user.member return request.user.member
def normalize_name(raw, nospaces=True):
if nospaces:
noumlaut = raw.replace('ö', 'oe').replace('ä', 'ae').replace('ü', 'ue').replace(' ', '_')
else:
noumlaut = raw.replace('ö', 'oe').replace('ä', 'ae').replace('ü', 'ue')
return unicodedata.normalize('NFKD', noumlaut).encode('ascii', 'ignore').decode('ascii')

Loading…
Cancel
Save