Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix event creation without physical location #3247

Open
wants to merge 1 commit into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 10 additions & 7 deletions integreat_cms/cms/forms/events/event_form.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,13 +83,6 @@ class Meta:
widgets = {
"icon": IconWidget(),
}
error_messages = {
"location": {
"invalid_choice": _(
"Either disable the event location or provide a valid location"
),
},
}

def __init__(self, **kwargs: Any) -> None:
r"""
Expand Down Expand Up @@ -131,6 +124,16 @@ def clean(self) -> dict[str, Any]:
# make self.data mutable to allow values to be changed manually
self.data = self.data.copy()

if not cleaned_data.get("has_not_location") and not cleaned_data.get(
"location"
):
self.add_error(
"location",
forms.ValidationError(
_("Either disable the event location or provide a valid location"),
code="invalid_choice",
),
)
if cleaned_data.get("is_all_day"):
cleaned_data["start_time"] = time.min
self.data["start_time"] = time.min
Expand Down
16 changes: 13 additions & 3 deletions integreat_cms/cms/views/events/event_form_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ def get(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse:
},
)

# pylint: disable=too-many-locals,too-many-branches
# pylint: disable=too-many-locals,too-many-branches, too-many-statements
def post(self, request: HttpRequest, **kwargs: Any) -> HttpResponse:
r"""
Save event and ender event form for HTTP POST requests
Expand All @@ -144,7 +144,6 @@ def post(self, request: HttpRequest, **kwargs: Any) -> HttpResponse:
"""
region = request.region
language = Language.objects.get(slug=kwargs.get("language_slug"))
poi = POI.objects.filter(id=request.POST.get("location")).first()

event_instance = Event.objects.filter(id=kwargs.get("event_id")).first()
recurrence_rule_instance = RecurrenceRule.objects.filter(
Expand All @@ -154,8 +153,19 @@ def post(self, request: HttpRequest, **kwargs: Any) -> HttpResponse:
event=event_instance, language=language
).first()

data = request.POST.dict()

if data.get("location") == "-1" or data.get("has_not_location"):
data["location"] = ""

poi = (
POI.objects.filter(id=data.get("location")).first()
if data.get("location")
else None
)

event_form = EventForm(
data=request.POST,
data=data,
files=request.FILES,
instance=event_instance,
additional_instance_attributes={"region": region, "location": poi},
Expand Down
2 changes: 2 additions & 0 deletions integreat_cms/release_notes/current/unreleased/3223.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
en: Fix location check of event creation
de: Korrigiere Ortsprüfung bei der Erstellung von Veranstaltungen
120 changes: 120 additions & 0 deletions tests/cms/views/events/test_event_form.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
from __future__ import annotations

import copy
from typing import TYPE_CHECKING

if TYPE_CHECKING:
from _pytest.logging import LogCaptureFixture
from django.test.client import Client
from pytest_django.fixtures import SettingsWrapper

import pytest
from django.test.client import Client
from django.urls import reverse

from integreat_cms.cms.constants import status
from integreat_cms.cms.models import Event, EventTranslation
from tests.conftest import ANONYMOUS, PRIV_STAFF_ROLES, WRITE_ROLES
from tests.utils import assert_message_in_log

REGION_SLUG = "augsburg"
POI_ID = 4 # Use a POI which belongs to the region with REGION_SLUG
EVENT_TITLE = (
"New Event" # Choose a name that does not exist yet as event title in the test data
)


# (<ID of selected POI>, <Whether "no physical location" is checked>, <whether successful or not> )
parameters = [
(-1, False, False),
(-1, True, True),
(POI_ID, False, True),
(POI_ID, True, True),
]


@pytest.mark.django_db
@pytest.mark.parametrize("parameter", parameters)
def test_create_event(
load_test_data: None,
login_role_user: tuple[Client, str],
settings: SettingsWrapper,
caplog: LogCaptureFixture,
parameter: tuple[int, bool, bool],
) -> None:
"""
Test that event creation is working as expected (focus on location check)
"""
client, role = login_role_user
poi_id, has_not_location, successfully_created = parameter
settings.LANGUAGE_CODE = "en"

new_event = reverse(
"new_event",
kwargs={
"region_slug": REGION_SLUG,
"language_slug": "de",
},
)
data = {
"title": EVENT_TITLE,
"content": "Lorem ipsum...",
"start_date": "2030-01-01",
"end_date": "2030-01-01",
"is_all_day": True,
"status": status.PUBLIC,
"location": poi_id,
}
if has_not_location:
data = copy.deepcopy(data)
data.update({"has_not_location": True})
response = client.post(
new_event,
data=data,
)
if role in PRIV_STAFF_ROLES + WRITE_ROLES:
response.status_code == 302

if successfully_created:
redirect_url = response.headers.get("location")
assert_message_in_log(
f'SUCCESS Event "{EVENT_TITLE}" was successfully created',
caplog,
)
assert (
f"Event &quot;{EVENT_TITLE}&quot; was successfully created"
in client.get(redirect_url).content.decode("utf-8")
)

event_translation = EventTranslation.objects.filter(
title=EVENT_TITLE
).first()
assert event_translation

event = Event.objects.filter(id=event_translation.event.id).first()
if poi_id == -1 or has_not_location:
assert not event.location
else:
assert event.location.id == poi_id
else:
assert_message_in_log(
"ERROR Location: Either disable the event location or provide a valid location",
caplog,
)
assert (
"Either disable the event location or provide a valid location"
in response.content.decode("utf-8")
)

event_translation = EventTranslation.objects.filter(
title=EVENT_TITLE
).first()
assert not event_translation

elif role == ANONYMOUS:
assert response.status_code == 302
assert (
response.headers.get("location") == f"{settings.LOGIN_URL}?next={new_event}"
)
else:
assert response.status_code == 403
3 changes: 3 additions & 0 deletions tests/cms/views/view_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -396,6 +396,7 @@
"end_date": "2030-01-01",
"is_all_day": True,
"status": status.DRAFT,
"has_not_location": True,
},
),
("new_page", STAFF_ROLES + [MANAGEMENT, EDITOR, AUTHOR, OBSERVER]),
Expand Down Expand Up @@ -730,6 +731,7 @@
"end_date": "2030-01-01",
"is_all_day": True,
"status": status.DRAFT,
"has_not_location": True,
},
),
("new_page", STAFF_ROLES),
Expand Down Expand Up @@ -1375,6 +1377,7 @@
"end_date": "2030-01-01",
"is_all_day": True,
"status": status.DRAFT,
"has_not_location": True,
},
),
(
Expand Down
1 change: 1 addition & 0 deletions tests/mt_api/mt_api_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -497,6 +497,7 @@ def test_bulk_mt_up_to_date_and_ready_for_mt(
"start_date": "2030-01-01",
"end_date": "2030-01-01",
"is_all_day": True,
"has_not_location": True,
},
),
]
Expand Down
Loading