From 582dd81465a9a5251b2b69924c84eaff6b7a46d8 Mon Sep 17 00:00:00 2001 From: Christian Merten Date: Thu, 6 Feb 2025 00:35:30 +0100 Subject: [PATCH] add postcode and not bw reason --- jdav_web/members/admin.py | 4 +- jdav_web/members/excel.py | 13 +- .../members/locale/de/LC_MESSAGES/django.po | 117 +++++++++++------- .../0036_ljpproposal_not_bw_reason.py | 18 +++ ...eit_postal_code_alter_ljpproposal_title.py | 23 ++++ ..._freizeit_postal_code_freizeit_postcode.py | 22 ++++ jdav_web/members/models.py | 17 ++- 7 files changed, 162 insertions(+), 52 deletions(-) create mode 100644 jdav_web/members/migrations/0036_ljpproposal_not_bw_reason.py create mode 100644 jdav_web/members/migrations/0037_freizeit_postal_code_alter_ljpproposal_title.py create mode 100644 jdav_web/members/migrations/0038_remove_freizeit_postal_code_freizeit_postcode.py diff --git a/jdav_web/members/admin.py b/jdav_web/members/admin.py index 5abb944..3dead73 100644 --- a/jdav_web/members/admin.py +++ b/jdav_web/members/admin.py @@ -1073,8 +1073,8 @@ class FreizeitAdmin(CommonAdminMixin, nested_admin.NestedModelAdmin): view_on_site = False fieldsets = ( (None, { - 'fields': ('name', 'place', 'destination', 'date', 'end', 'description', 'groups', 'jugendleiter', - 'approved_extra_youth_leader_count', + 'fields': ('name', 'place', 'postcode', 'destination', 'date', 'end', 'description', 'groups', + 'jugendleiter', 'approved_extra_youth_leader_count', 'tour_type', 'tour_approach', 'kilometers_traveled', 'activity', 'difficulty'), 'description': _('General information on your excursion. These are partly relevant for the amount of financial compensation (means of transport, travel distance, etc.).') }), diff --git a/jdav_web/members/excel.py b/jdav_web/members/excel.py index 0780652..393e962 100644 --- a/jdav_web/members/excel.py +++ b/jdav_web/members/excel.py @@ -75,6 +75,13 @@ VBK_TEMPLATES = { LJPProposal.LJP_EDUCATIONAL: 'members/LJP_VBK_3-2.xlsx', } +NOT_BW_REASONS = { + LJPProposal.NOT_BW_CONTENT: 'aufgrund der Lehrgangsinhalte', + LJPProposal.NOT_BW_ROOMS: 'trägereigene Räumlichkeiten', + LJPProposal.NOT_BW_CLOSE_BORDER: 'Grenznähe', + LJPProposal.NOT_BW_ECONOMIC: 'wirtschaftliche Sparsamkeit', +} + def generate_ljp_vbk(excursion): """ @@ -87,7 +94,7 @@ def generate_ljp_vbk(excursion): workbook = openpyxl.load_workbook(path) sheet = workbook.active - title = excursion.ljpproposal.title if hasattr(excursion, 'ljpproposal') else excursion.name + title = excursion.ljpproposal.title sheet['I6'] = settings.SEKTION_IBAN sheet['I8'] = settings.SEKTION_ACCOUNT_HOLDER @@ -104,7 +111,9 @@ def generate_ljp_vbk(excursion): sheet['J19'] = f"{excursion.duration}" sheet['L19'] = f"{excursion.ljp_participant_count}" sheet['H19'] = excursion.get_ljp_activity_category() - sheet['M19'] = excursion.place + sheet['M19'] = f"{excursion.postcode}, {excursion.place}" + sheet['N19'] = f"{NOT_BW_REASONS[excursion.ljpproposal.not_bw_reason]}"\ + if not excursion.ljpproposal.not_bw_reason is None else "" if hasattr(excursion, 'statement'): sheet['Q19'] = f"{excursion.statement.total_theoretic}" diff --git a/jdav_web/members/locale/de/LC_MESSAGES/django.po b/jdav_web/members/locale/de/LC_MESSAGES/django.po index f65e3de..c0adc32 100644 --- a/jdav_web/members/locale/de/LC_MESSAGES/django.po +++ b/jdav_web/members/locale/de/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-02-02 18:06+0100\n" +"POT-Creation-Date: 2025-02-06 00:32+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -374,25 +374,10 @@ msgstr "Kriseninterventionsliste erstellen" msgid "Generate overview" msgstr "Hinweise für Jugendleiter erstellen" -#: members/admin.py members/templates/admin/generate_seminar_vbk.html -msgid "Generate LJP V-BK form" -msgstr "Erzeuge LJP V-BK Formular" - #: members/admin.py members/templates/admin/generate_seminar_report.html msgid "Generate seminar report" msgstr "Landesjugendplan Antrag erstellen" -#: members/admin.py members/tests.py -msgid "Please select a mode." -msgstr "Bitte wähle einen Modus aus." - -#: members/admin.py members/tests.py -msgid "" -"Full mode is only available, if the seminar report section is filled out." -msgstr "" -"Der vollständiger Modus ist nur verfügbar, wenn der Seminarbericht " -"ausgefüllt ist. " - #: members/admin.py members/templates/admin/generate_sjr_application.html msgid "Generate SJR application" msgstr "SJR Antrag erstellen" @@ -1008,6 +993,34 @@ msgstr "" "Wie wolltet ihr das Bildungsziel erreichen? Ist das Ziel so erreicht worden? " "Wenn nicht, warum nicht? Wenn ja, was hat geholfen, das Ziel zu erreichen?" +#: members/models.py +msgid "Course content" +msgstr "aufgrund der Lehrgangsinhalte" + +#: members/models.py +msgid "Available rooms" +msgstr "trägereigene Räumlichkeiten" + +#: members/models.py +msgid "Close to the border" +msgstr "Grenznähe" + +#: members/models.py +msgid "Economic reasons" +msgstr "wirtschaftliche Sparsamkeit" + +#: members/models.py +msgid "Explanation if excursion not in Baden-Württemberg" +msgstr "Begründung, falls Kursort nicht in Baden-Württemberg" + +#: members/models.py +msgid "" +"If the excursion takes place outside of Baden-Württemberg, please explain. " +"Otherwise, leave this empty." +msgstr "" +"Falls die Ausfahrt außerhalb von Baden-Württemberg stattfindet, gib bitte " +"eine Begründung an. Sonst lass dieses Feld frei." + #: members/models.py msgid "LJP Proposal" msgstr "Seminarbericht" @@ -1107,7 +1120,6 @@ msgstr "Fortbildungen" #: members/templates/admin/demote_to_waiter.html #: members/templates/admin/freizeit_finance_overview.html #: members/templates/admin/generate_seminar_report.html -#: members/templates/admin/generate_seminar_vbk.html #: members/templates/admin/generate_sjr_application.html #: members/templates/admin/invite_as_user.html #: members/templates/admin/invite_for_group.html @@ -1132,7 +1144,6 @@ msgstr "Zurück auf die Warteliste setzen" #: members/templates/admin/demote_to_waiter.html #: members/templates/admin/freizeit_finance_overview.html -#: members/templates/admin/generate_seminar_vbk.html #: members/templates/admin/generate_sjr_application.html #: members/templates/admin/invite_as_user.html #: members/templates/admin/invite_for_group.html @@ -1425,35 +1436,6 @@ msgstr "" "Eine Kosten- und Teilnehmendenübersicht. Dies ist nicht notwendig für den " "eigentlichen Bericht, muss aber langfristig aufbewahrt werden." -#: members/templates/admin/generate_seminar_vbk.html -msgid "" -"Every LJP application needs a V-BK form containing the most important facts " -"about the seminar.\n" -"Here you can automatically generate such a form in Excel format." -msgstr "" -"Jeder LJP Antrag benötigt ein V-BK Formular, das die wichtigsten Randdaten " -"des Seminars enthält. Hier kannst du automatisch ein solches Formular im " -"Excel Format erstellen." - -#: members/templates/admin/generate_seminar_vbk.html -msgid "" -"Your excursion currently has no cost-plan attached, hence the total costs " -"can't be automatically\n" -"calculated and added to the form." -msgstr "" -"Deine Ausfahrt hat zur Zeit keinen Kostenplan. Daher können die Gesamtkosten " -"nicht automatisch berechnet und dem Formular hinzugefügt werden." - -#: members/templates/admin/generate_seminar_vbk.html -msgid "" -"Depending on the type of seminar, please select one of the two options below." -msgstr "Bitte wähle aus, um welche Art von Seminar es sich handelt." - -#: members/templates/admin/generate_seminar_vbk.html -#: members/templates/admin/generate_sjr_application.html -msgid "Generate" -msgstr "Erstellen" - #: members/templates/admin/generate_sjr_application.html members/tests.py msgid "Here you can generate an allowance application for the SJR." msgstr "Hier kannst du einen SJR-Zuschussantrag erstellen." @@ -1471,6 +1453,10 @@ msgid "" "Please send this application form to the jdav finance officer via email." msgstr "Bitte sende diesen Antrag an den/die JDAV-Finanzwart*in per E-Mail." +#: members/templates/admin/generate_sjr_application.html +msgid "Generate" +msgstr "Erstellen" + #: members/templates/admin/invite_as_user.html #, python-format msgid "" @@ -2001,6 +1987,17 @@ msgstr "" "vorausfüllen lassen und dem Antrag hinzufügen. Bitte fülle die verbleibenden " "Felder im Formblatt selbst aus und unterschreibe das PDF." +#: members/tests.py +msgid "Please select a mode." +msgstr "Bitte wähle einen Modus aus." + +#: members/tests.py +msgid "" +"Full mode is only available, if the seminar report section is filled out." +msgstr "" +"Der vollständiger Modus ist nur verfügbar, wenn der Seminarbericht " +"ausgefüllt ist. " + #: members/tests.py msgid "This field is required." msgstr "" @@ -2043,6 +2040,32 @@ msgstr "Optionale zusätzliche E-Mailadresse" msgid "Invalid emergency contacts" msgstr "Ungültige Notfallkontakte" +#~ msgid "Generate LJP V-BK form" +#~ msgstr "Erzeuge LJP V-BK Formular" + +#~ msgid "" +#~ "Every LJP application needs a V-BK form containing the most important " +#~ "facts about the seminar.\n" +#~ "Here you can automatically generate such a form in Excel format." +#~ msgstr "" +#~ "Jeder LJP Antrag benötigt ein V-BK Formular, das die wichtigsten " +#~ "Randdaten des Seminars enthält. Hier kannst du automatisch ein solches " +#~ "Formular im Excel Format erstellen." + +#~ msgid "" +#~ "Your excursion currently has no cost-plan attached, hence the total costs " +#~ "can't be automatically\n" +#~ "calculated and added to the form." +#~ msgstr "" +#~ "Deine Ausfahrt hat zur Zeit keinen Kostenplan. Daher können die " +#~ "Gesamtkosten nicht automatisch berechnet und dem Formular hinzugefügt " +#~ "werden." + +#~ msgid "" +#~ "Depending on the type of seminar, please select one of the two options " +#~ "below." +#~ msgstr "Bitte wähle aus, um welche Art von Seminar es sich handelt." + #~ msgid "Full report" #~ msgstr "Vollständiger Seminarbericht" diff --git a/jdav_web/members/migrations/0036_ljpproposal_not_bw_reason.py b/jdav_web/members/migrations/0036_ljpproposal_not_bw_reason.py new file mode 100644 index 0000000..e4efdfd --- /dev/null +++ b/jdav_web/members/migrations/0036_ljpproposal_not_bw_reason.py @@ -0,0 +1,18 @@ +# Generated by Django 4.0.1 on 2025-02-05 23:18 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('members', '0035_ljpproposal_redo'), + ] + + operations = [ + migrations.AddField( + model_name='ljpproposal', + name='not_bw_reason', + field=models.IntegerField(blank=True, choices=[(1, 'Course content'), (2, 'Available rooms'), (3, 'Close to the border'), (4, 'Economic reasons')], default=None, help_text='If the excursion takes place outside of Baden-Württemberg, please explain. Otherwise, leave this empty.', null=True, verbose_name='Explanation if excursion not in Baden-Württemberg'), + ), + ] diff --git a/jdav_web/members/migrations/0037_freizeit_postal_code_alter_ljpproposal_title.py b/jdav_web/members/migrations/0037_freizeit_postal_code_alter_ljpproposal_title.py new file mode 100644 index 0000000..95b741f --- /dev/null +++ b/jdav_web/members/migrations/0037_freizeit_postal_code_alter_ljpproposal_title.py @@ -0,0 +1,23 @@ +# Generated by Django 4.0.1 on 2025-02-05 23:29 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('members', '0036_ljpproposal_not_bw_reason'), + ] + + operations = [ + migrations.AddField( + model_name='freizeit', + name='postal_code', + field=models.CharField(default='', max_length=30, verbose_name='Postal code'), + ), + migrations.AlterField( + model_name='ljpproposal', + name='title', + field=models.CharField(blank=True, default='', help_text='Official title of your seminar, this can differ from the informal title. Use e.g. sports climbing course instead of climbing weekend for fun.', max_length=100, verbose_name='Title'), + ), + ] diff --git a/jdav_web/members/migrations/0038_remove_freizeit_postal_code_freizeit_postcode.py b/jdav_web/members/migrations/0038_remove_freizeit_postal_code_freizeit_postcode.py new file mode 100644 index 0000000..e487458 --- /dev/null +++ b/jdav_web/members/migrations/0038_remove_freizeit_postal_code_freizeit_postcode.py @@ -0,0 +1,22 @@ +# Generated by Django 4.0.1 on 2025-02-05 23:31 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('members', '0037_freizeit_postal_code_alter_ljpproposal_title'), + ] + + operations = [ + migrations.RemoveField( + model_name='freizeit', + name='postal_code', + ), + migrations.AddField( + model_name='freizeit', + name='postcode', + field=models.CharField(default='', max_length=30, verbose_name='Postcode'), + ), + ] diff --git a/jdav_web/members/models.py b/jdav_web/members/models.py index a7dd713..0d1f99c 100644 --- a/jdav_web/members/models.py +++ b/jdav_web/members/models.py @@ -1058,6 +1058,7 @@ class Freizeit(CommonModel): name = models.CharField(verbose_name=_('Activity'), default='', max_length=50) place = models.CharField(verbose_name=_('Place'), default='', max_length=50) + postcode = models.CharField(verbose_name=_('Postcode'), default='', max_length=30) destination = models.CharField(verbose_name=_('Destination (optional)'), default='', max_length=50, blank=True, help_text=_('e.g. a peak')) @@ -1478,7 +1479,7 @@ class RegistrationPassword(models.Model): class LJPProposal(CommonModel): """A proposal for LJP""" - title = models.CharField(verbose_name=_('Title'), max_length=30, + title = models.CharField(verbose_name=_('Title'), max_length=100, blank=True, default='', help_text=_('Official title of your seminar, this can differ from the informal title. Use e.g. sports climbing course instead of climbing weekend for fun.')) @@ -1506,6 +1507,20 @@ class LJPProposal(CommonModel): help_text=_('How do you want to reach the learning goal? Has the goal been reached? If not, why not? If yes, what helped you to reach the goal?'), blank=True, default='') + NOT_BW_CONTENT, NOT_BW_ROOMS, NOT_BW_CLOSE_BORDER, NOT_BW_ECONOMIC = 1, 2, 3, 4 + NOT_BW_REASONS = [ + (NOT_BW_CONTENT, _('Course content')), + (NOT_BW_ROOMS, _('Available rooms')), + (NOT_BW_CLOSE_BORDER, _('Close to the border')), + (NOT_BW_ECONOMIC, _('Economic reasons')), + ] + not_bw_reason = models.IntegerField(verbose_name=_('Explanation if excursion not in Baden-Württemberg'), + choices=NOT_BW_REASONS, + default=None, + blank=True, + null=True, + help_text=_('If the excursion takes place outside of Baden-Württemberg, please explain. Otherwise, leave this empty.')) + excursion = models.OneToOneField(Freizeit, verbose_name=_('Excursion'), blank=True,