From c97d26c5b1e8cd737cd87d4a697273e1ae1460f8 Mon Sep 17 00:00:00 2001 From: Christian Merten Date: Sun, 3 Sep 2023 16:56:36 +0200 Subject: [PATCH] members: add waitinglist import from csv --- jdav_web/members/admin.py | 4 +- ...itinglist_add_application_text_and_date.py | 23 ++++++++++ jdav_web/members/models.py | 42 +++++++++++++++++++ 3 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 jdav_web/members/migrations/0013_memberwaitinglist_add_application_text_and_date.py diff --git a/jdav_web/members/admin.py b/jdav_web/members/admin.py index 879600c..d3b41d0 100644 --- a/jdav_web/members/admin.py +++ b/jdav_web/members/admin.py @@ -336,8 +336,8 @@ class WaiterInviteForm(forms.Form): class MemberWaitingListAdmin(CommonAdminMixin, admin.ModelAdmin): - fields = ['prename', 'lastname', 'email', 'email_parents', 'birth_date', 'comments', 'invited_for_group'] - list_display = ('name', 'birth_date', 'age', 'confirmed_mail', 'confirmed_mail_parents', + fields = ['prename', 'lastname', 'email', 'email_parents', 'birth_date', 'application_text', 'application_date', 'comments', 'invited_for_group'] + list_display = ('name', 'birth_date', 'age', 'application_date', 'confirmed_mail', 'confirmed_mail_parents', 'waiting_confirmed') search_fields = ('prename', 'lastname', 'email') list_filter = ('confirmed_mail', 'confirmed_mail_parents') diff --git a/jdav_web/members/migrations/0013_memberwaitinglist_add_application_text_and_date.py b/jdav_web/members/migrations/0013_memberwaitinglist_add_application_text_and_date.py new file mode 100644 index 0000000..233cc5b --- /dev/null +++ b/jdav_web/members/migrations/0013_memberwaitinglist_add_application_text_and_date.py @@ -0,0 +1,23 @@ +# Generated by Django 4.0.1 on 2023-09-03 14:51 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('members', '0012_member_image_group_description'), + ] + + operations = [ + migrations.AddField( + model_name='memberwaitinglist', + name='application_text', + field=models.TextField(blank=True, default='', verbose_name='application text'), + ), + migrations.AddField( + model_name='memberwaitinglist', + name='application_date', + field=models.DateTimeField(blank=True, null=True, verbose_name='application date'), + ), + ] diff --git a/jdav_web/members/models.py b/jdav_web/members/models.py index a59bd80..eed858b 100644 --- a/jdav_web/members/models.py +++ b/jdav_web/members/models.py @@ -1,5 +1,6 @@ from datetime import datetime, timedelta import uuid +import pytz import re import csv from django.db import models @@ -583,6 +584,9 @@ class MemberWaitingList(Person): WAITING_CONFIRMATION_EXPIRED = 1 WAITING_CONFIRMED = 2 + application_text = models.TextField(_('application text'), default='', blank=True) + application_date = models.DateTimeField(verbose_name=_('application date'), null=True, blank=True) + last_wait_confirmation = models.DateField(auto_now=True, verbose_name=_('Last wait confirmation')) wait_confirmation_key = models.CharField(max_length=32, default="") wait_confirmation_key_expire = models.DateTimeField(default=timezone.now) @@ -1271,6 +1275,13 @@ def parse_date(value): return datetime.strptime(value, '%d.%m.%Y').date() +def parse_datetime(value): + tz = pytz.timezone('Europe/Berlin') + if value == '': + return None + return tz.localize(datetime.strptime(value, '%d.%m.%Y %H:%M:%S')) + + def parse_status(value): return value != "Passivmitglied" @@ -1298,6 +1309,7 @@ CLUBDESK_TO_KOMPASS = { 'Zivilstand': 'civil_status', 'Geschlecht': 'gender', 'Geburtsdatum': ('birth_date', parse_date), + 'Geburtstag': ('birth_date', parse_date), 'Bemerkungen': 'comments', 'IBAN': 'iban', 'Vorlage Führungszeugnis': ('good_conduct_certificate_presented_date', parse_date), @@ -1319,5 +1331,35 @@ CLUBDESK_TO_KOMPASS = { 'Kommentar': 'technical_comments', 'Erziehungsberechtigte': 'legal_guardians', 'Mobil Eltern': 'phone_number_parents', + 'Sonstiges': 'application_text', + 'Erhalten am': ('application_date', parse_datetime), } + +def import_from_csv_waitinglist(path): + with open(path, encoding='ISO-8859-1') as csvfile: + reader = csv.DictReader(csvfile, delimiter=';') + rows = list(reader) + + def transform_field(key, value): + new_key = CLUBDESK_TO_KOMPASS[key] + if isinstance(new_key, str): + return (new_key, value) + else: + return (new_key[0], new_key[1](value)) + + def transform_field(key, value): + new_key = CLUBDESK_TO_KOMPASS[key] + if isinstance(new_key, str): + return (new_key, value) + else: + return (new_key[0], new_key[1](value)) + + def transform_row(row): + kwargs = dict([ transform_field(k, v) for k, v in row.items() if k in CLUBDESK_TO_KOMPASS ]) + kwargs_filtered = { k : v for k, v in kwargs.items() if k in ['prename', 'lastname', 'email', 'birth_date', 'application_text', 'application_date'] } + mem = MemberWaitingList(**kwargs_filtered) + mem.save() + + for row in rows: + transform_row(row)