diff --git a/AKModel/tests.py b/AKModel/tests.py index 65bd48bcecb1595db8c338702cc57e8f738ddfda..5fb99ca68d30eb13f137eeb92a47e0c6a1f28578 100644 --- a/AKModel/tests.py +++ b/AKModel/tests.py @@ -1,3 +1,4 @@ +import traceback from typing import List from django.contrib.auth.models import User @@ -59,8 +60,11 @@ class BasicViewTests: def test_views_for_200(self): for view_name in self.VIEWS: view_name_with_prefix, url = self._name_and_url(view_name) - response = self.client.get(url) - self.assertEqual(response.status_code, 200, msg=f"{view_name_with_prefix} ({url}) broken") + try: + response = self.client.get(url) + self.assertEqual(response.status_code, 200, msg=f"{view_name_with_prefix} ({url}) broken") + except Exception as e: + self.fail(f"An error occurred during rendering of {view_name_with_prefix} ({url}):\n\n{traceback.format_exc()}") def test_access_control_staff_only(self): self.client.logout() @@ -94,9 +98,12 @@ class ModelViewTests(BasicViewTests, TestCase): (DefaultSlot, 'defaultslot') ] + VIEWS_STAFF_ONLY = [ + ('admin:index', {}) + ] + def test_admin(self): self.client.force_login(self.admin_user) - for model in self.ADMIN_MODELS: if model[1] == "event": continue diff --git a/AKPlan/tests.py b/AKPlan/tests.py index 13f671c6a965e3ccaca873019c6ef330c8efaff1..e19157c076dcb497cf7585767fd048b89c3355ba 100644 --- a/AKPlan/tests.py +++ b/AKPlan/tests.py @@ -26,3 +26,11 @@ class PlanViewTests(BasicViewTests, TestCase): response = self.client.get(url) self.assertNotContains(response, "Plan is not visible (yet).", msg_prefix="Plan is not visible for staff user") + + def test_wall_redirect(self): + view_name_with_prefix, url_wall = self._name_and_url(('plan_wall', {'event_slug': 'kif23'})) + view_name_with_prefix, url_plan = self._name_and_url(('plan_overview', {'event_slug': 'kif23'})) + + response = self.client.get(url_wall) + self.assertRedirects(response, url_plan, + msg_prefix=f"Redirect away from wall not working ({url_wall} -> {url_plan})") diff --git a/AKSubmission/locale/de_DE/LC_MESSAGES/django.po b/AKSubmission/locale/de_DE/LC_MESSAGES/django.po index 2168f6ef7ebd80e7d0634e15867b9c9c22dc78c3..623a98af69d72f8bb4ffaeb22e8ea640e8fbb357 100644 --- a/AKSubmission/locale/de_DE/LC_MESSAGES/django.po +++ b/AKSubmission/locale/de_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: 2022-12-27 00:42+0100\n" +"POT-Creation-Date: 2023-01-01 16:07+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -258,10 +258,17 @@ msgid "AKs" msgstr "AKs" #: AKSubmission/templates/AKSubmission/ak_edit.html:8 -#: AKSubmission/templates/AKSubmission/ak_edit.html:21 +#: AKSubmission/templates/AKSubmission/ak_edit.html:32 msgid "Edit AK" msgstr "AK bearbeiten" +#: AKSubmission/templates/AKSubmission/ak_edit.html:24 +msgid "" +"Add person not in the list yet. Unsaved changes in this form will be lost." +msgstr "" +"Person hinzufügen, die noch nicht in der Liste ist. Ungespeicherte " +"Änderungen in diesem Formular gehen verloren." + #: AKSubmission/templates/AKSubmission/ak_history.html:27 msgid "Back" msgstr "Zurück" @@ -316,7 +323,7 @@ msgstr "Senden" #: AKSubmission/templates/AKSubmission/akmessage_add.html:32 #: AKSubmission/templates/AKSubmission/akowner_create_update.html:27 #: AKSubmission/templates/AKSubmission/akslot_add_update.html:30 -#: AKSubmission/templates/AKSubmission/submit_new.html:54 +#: AKSubmission/templates/AKSubmission/submit_new.html:56 msgid "Reset Form" msgstr "Formular leeren" @@ -324,7 +331,7 @@ msgstr "Formular leeren" #: AKSubmission/templates/AKSubmission/akowner_create_update.html:31 #: AKSubmission/templates/AKSubmission/akslot_add_update.html:34 #: AKSubmission/templates/AKSubmission/akslot_delete.html:46 -#: AKSubmission/templates/AKSubmission/submit_new.html:58 +#: AKSubmission/templates/AKSubmission/submit_new.html:60 msgid "Cancel" msgstr "Abbrechen" @@ -407,7 +414,7 @@ msgstr "" "Dieses Event is nicht aktiv. Es können keine AKs hinzugefügt oder bearbeitet " "werden" -#: AKSubmission/templates/AKSubmission/submit_new.html:50 +#: AKSubmission/templates/AKSubmission/submit_new.html:52 msgid "Submit" msgstr "Eintragen" @@ -437,35 +444,40 @@ msgstr "AK erfolgreich angelegt" msgid "AK successfully updated" msgstr "AK erfolgreich aktualisiert" -#: AKSubmission/views.py:344 +#: AKSubmission/views.py:310 +#, python-brace-format +msgid "Added '{owner}' as new owner of '{ak.name}'" +msgstr "'{owner}' als neue Leitung von '{ak.name}' hinzugefügt" + +#: AKSubmission/views.py:351 msgid "Person Info successfully updated" msgstr "Personen-Info erfolgreich aktualisiert" -#: AKSubmission/views.py:364 +#: AKSubmission/views.py:371 msgid "No user selected" msgstr "Keine Person ausgewählt" -#: AKSubmission/views.py:391 +#: AKSubmission/views.py:398 msgid "AK Slot successfully added" msgstr "AK-Slot erfolgreich angelegt" -#: AKSubmission/views.py:405 +#: AKSubmission/views.py:412 msgid "You cannot edit a slot that has already been scheduled" msgstr "Bereits geplante AK-Slots können nicht mehr bearbeitet werden" -#: AKSubmission/views.py:415 +#: AKSubmission/views.py:422 msgid "AK Slot successfully updated" msgstr "AK-Slot erfolgreich aktualisiert" -#: AKSubmission/views.py:428 +#: AKSubmission/views.py:435 msgid "You cannot delete a slot that has already been scheduled" msgstr "Bereits geplante AK-Slots können nicht mehr gelöscht werden" -#: AKSubmission/views.py:438 +#: AKSubmission/views.py:445 msgid "AK Slot successfully deleted" msgstr "AK-Slot erfolgreich angelegt" -#: AKSubmission/views.py:460 +#: AKSubmission/views.py:467 msgid "Message to organizers successfully saved" msgstr "Nachricht an die Organisator*innen erfolgreich gespeichert" diff --git a/AKSubmission/templates/AKSubmission/ak_edit.html b/AKSubmission/templates/AKSubmission/ak_edit.html index b01443541cb9e20c6e877bd4109723b9c18e99d4..72a454a37f0cdf82c2a2868db58ef084450ea541 100644 --- a/AKSubmission/templates/AKSubmission/ak_edit.html +++ b/AKSubmission/templates/AKSubmission/ak_edit.html @@ -16,6 +16,17 @@ <li class="breadcrumb-item active">{% trans "Edit" %}</li> {% endblock %} +{% block form_contents %} + {% bootstrap_field form.name %} + <div class="form-group"> + {% bootstrap_field form.owners form_group_class="" %} + <a href="{% url 'submit:akowner_create' event_slug=event.slug %}?add_to_existing_ak={{ ak.pk }}"> + {% fa5_icon "plus" "fas" %} {% trans "Add person not in the list yet. Unsaved changes in this form will be lost." %} + </a> + </div> + {% bootstrap_form form exclude='name,owners' %} +{% endblock %} + {% block headline %} <h2>{% trans 'Edit AK' %}</h2> diff --git a/AKSubmission/templates/AKSubmission/submit_new.html b/AKSubmission/templates/AKSubmission/submit_new.html index b3699b3c90c500f8479ee8166dbf01deb1c300c9..985d4326defe68af20ecf66251703ab628520276 100644 --- a/AKSubmission/templates/AKSubmission/submit_new.html +++ b/AKSubmission/templates/AKSubmission/submit_new.html @@ -44,7 +44,9 @@ <h2>{% trans 'New AK' %}</h2> {% endblock %} <form method="POST" class="post-form">{% csrf_token %} - {% bootstrap_form form %} + {% block form_contents %} + {% bootstrap_form form %} + {% endblock %} {% buttons %} <button type="submit" class="save btn btn-primary float-right"> {% fa5_icon "check" 'fas' %} {% trans "Submit" %} diff --git a/AKSubmission/tests.py b/AKSubmission/tests.py index 4cff0830106ccbffcd142edf2940d994257e3148..fe474aadce824d818fa610758ea023dc009eb909 100644 --- a/AKSubmission/tests.py +++ b/AKSubmission/tests.py @@ -159,4 +159,21 @@ class ModelViewTests(BasicViewTests, TestCase): response = self.client.post(invalid_interest_api_url) self.assertEqual(response.status_code, 404, f"Invalid URL reachable ({interest_api_url})") + def test_adding_of_unknown_user(self): + detail_url = reverse_lazy(f"{self.APP_NAME}:ak_detail", kwargs={'event_slug': 'kif42', 'pk': 1}) + response = self.client.get(detail_url) + self.assertEqual(response.status_code, 200, msg="Could not load ak detail view") + edit_url = reverse_lazy(f"{self.APP_NAME}:ak_edit", kwargs={'event_slug': 'kif42', 'pk': 1}) + response = self.client.get(edit_url) + self.assertEqual(response.status_code, 200, msg="Could not load ak detail view") + self.assertContains(response, "Add person not in the list yet", + msg_prefix="Link to add unknown user not contained") + + self.assertEqual(AK.objects.get(pk=1).owners.count(), 1) + add_new_user_to_ak_url = reverse_lazy(f"{self.APP_NAME}:akowner_create", kwargs={'event_slug': 'kif42'}) + f"?add_to_existing_ak=1" + response = self.client.post(add_new_user_to_ak_url, {'name': 'New test owner', 'event': Event.get_by_slug('kif42').pk}) + self.assertRedirects(response, detail_url, + msg_prefix=f"No correct redirect: {add_new_user_to_ak_url} (POST) -> {detail_url}") + self._assert_message(response, "Added 'New test owner' as new owner of 'Test AK Inhalt'") + self.assertEqual(AK.objects.get(pk=1).owners.count(), 2) diff --git a/AKSubmission/views.py b/AKSubmission/views.py index 15d0811d467f4055394cedd0e8de0584adfa972a..044334741fa91a214e3983121908785b482f3c3f 100644 --- a/AKSubmission/views.py +++ b/AKSubmission/views.py @@ -302,6 +302,13 @@ class AKOwnerCreateView(EventSlugMixin, EventInactiveRedirectMixin, CreateView): form_class = AKOwnerForm def get_success_url(self): + if "add_to_existing_ak" in self.request.GET: + ak_pk = self.request.GET['add_to_existing_ak'] + ak = get_object_or_404(AK, pk=ak_pk) + ak.owners.add(self.object) + messages.add_message(self.request, messages.SUCCESS, + _("Added '{owner}' as new owner of '{ak.name}'").format(owner=self.object, ak=ak)) + return reverse_lazy('submit:ak_detail', kwargs={'event_slug': self.kwargs['event_slug'], 'pk': ak.pk}) return reverse_lazy('submit:submit_ak', kwargs={'event_slug': self.kwargs['event_slug'], 'owner_slug': self.object.slug})