diff --git a/project/forms/event.py b/project/forms/event.py index 832ebf8..e4381a2 100644 --- a/project/forms/event.py +++ b/project/forms/event.py @@ -380,7 +380,9 @@ class FindEventForm(FlaskForm): csrf = False date_from = CustomDateField(lazy_gettext("From"), validators=[Optional()]) - date_to = CustomDateField(lazy_gettext("to"), validators=[Optional()]) + date_to = CustomDateField( + lazy_gettext("to"), set_end_of_day=True, validators=[Optional()] + ) keyword = StringField(lazy_gettext("Keyword"), validators=[Optional()]) category_id = SelectField( lazy_gettext("Category"), validators=[Optional()], coerce=int diff --git a/project/forms/event_date.py b/project/forms/event_date.py index e9bf9a7..8a8d9f7 100644 --- a/project/forms/event_date.py +++ b/project/forms/event_date.py @@ -13,7 +13,9 @@ class FindEventDateForm(FlaskForm): csrf = False date_from = CustomDateField(lazy_gettext("From"), validators=[Optional()]) - date_to = CustomDateField(lazy_gettext("to"), validators=[Optional()]) + date_to = CustomDateField( + lazy_gettext("to"), set_end_of_day=True, validators=[Optional()] + ) keyword = StringField(lazy_gettext("Keyword"), validators=[Optional()]) category_id = SelectField( lazy_gettext("Category"), validators=[Optional()], coerce=int diff --git a/project/forms/planing.py b/project/forms/planing.py index b682ec4..373a6bc 100644 --- a/project/forms/planing.py +++ b/project/forms/planing.py @@ -12,7 +12,9 @@ class PlaningForm(FlaskForm): csrf = False date_from = CustomDateField(lazy_gettext("From"), validators=[Optional()]) - date_to = CustomDateField(lazy_gettext("to"), validators=[Optional()]) + date_to = CustomDateField( + lazy_gettext("to"), set_end_of_day=True, validators=[Optional()] + ) category_id = SelectField( lazy_gettext("Category"), validators=[Optional()], coerce=int ) diff --git a/project/forms/widgets.py b/project/forms/widgets.py index 729614c..b2bb123 100644 --- a/project/forms/widgets.py +++ b/project/forms/widgets.py @@ -7,7 +7,7 @@ from wtforms.fields.core import StringField from wtforms.validators import Length, StopValidation from wtforms.widgets import CheckboxInput, ListWidget, html_params -from project.dateutils import berlin_tz +from project.dateutils import berlin_tz, date_set_end_of_day class MultiCheckboxField(SelectMultipleField): @@ -88,8 +88,20 @@ class CustomDateWidget: class CustomDateField(DateTimeField): + set_end_of_day = False widget = CustomDateWidget() + def __init__( + self, + label=None, + validators=None, + format="%Y-%m-%d %H:%M:%S", + set_end_of_day=False, + **kwargs + ): + super(CustomDateField, self).__init__(label, validators, format, **kwargs) + self.set_end_of_day = set_end_of_day + def process_formdata(self, valuelist): if valuelist: try: @@ -99,7 +111,12 @@ class CustomDateField(DateTimeField): return date = datetime.strptime(date_str, "%Y-%m-%d") - self.data = berlin_tz.localize(date) + localized_date = berlin_tz.localize(date) + + if self.set_end_of_day: + localized_date = date_set_end_of_day(localized_date) + + self.data = localized_date except Exception: raise ValueError("Not a valid date value. Looking for YYYY-MM-DD.") diff --git a/project/services/event_search.py b/project/services/event_search.py index 2d4e5d0..3f249aa 100644 --- a/project/services/event_search.py +++ b/project/services/event_search.py @@ -61,7 +61,7 @@ class EventSearchParams(object): @date_to_str.setter def date_to_str(self, value): self._date_to_str = value - self._date_to = form_input_to_date(value) + self._date_to = form_input_to_date(value, 23, 59, 59) @property def coordinate(self): diff --git a/tests/api/test_event_date.py b/tests/api/test_event_date.py index 1e0d732..254baea 100644 --- a/tests/api/test_event_date.py +++ b/tests/api/test_event_date.py @@ -61,3 +61,21 @@ def test_search(client, seeder, utils): organizer_id = seeder.upsert_default_event_organizer(admin_unit_id) url = utils.get_url("api_v1_event_date_search", organizer_id=organizer_id) response = utils.get_ok(url) + + +def test_search_oneDay(client, seeder, utils): + from project.dateutils import create_berlin_date + + user_id, admin_unit_id = seeder.setup_base() + + start = create_berlin_date(2020, 10, 3, 10) + end = create_berlin_date(2020, 10, 3, 11) + name = "Spezialveranstaltung" + event_id = seeder.create_event(admin_unit_id, name=name, start=start, end=end) + + url = utils.get_url( + "api_v1_event_date_search", date_from="2020-10-03", date_to="2020-10-03" + ) + response = utils.get_ok(url) + assert len(response.json["items"]) == 1 + assert response.json["items"][0]["event"]["id"] == event_id diff --git a/tests/seeder.py b/tests/seeder.py index 95c74f0..127691a 100644 --- a/tests/seeder.py +++ b/tests/seeder.py @@ -190,6 +190,7 @@ class Seeder(object): end=None, draft=False, name="Name", + start=None, ): from project.models import Event, EventAttendanceMode, PublicStatus from project.services.event import insert_event, upsert_event_category @@ -199,8 +200,8 @@ class Seeder(object): event.admin_unit_id = admin_unit_id event.categories = [upsert_event_category("Other")] event.name = name - event.description = "Beschreibung" - event.start = self.get_now_by_minute() + event.description = ("Beschreibung",) + event.start = start if start else self.get_now_by_minute() event.end = end event.event_place_id = self.upsert_default_event_place(admin_unit_id) event.organizer_id = self.upsert_default_event_organizer(admin_unit_id) diff --git a/tests/views/test_widget.py b/tests/views/test_widget.py index 29f9c41..1090a02 100644 --- a/tests/views/test_widget.py +++ b/tests/views/test_widget.py @@ -43,6 +43,27 @@ def test_event_dates(client, seeder, utils): utils.get_ok(url) +def test_event_dates_oneDay(client, seeder, utils): + from project.dateutils import create_berlin_date + + user_id, admin_unit_id = seeder.setup_base() + au_short_name = "meinecrew" + + start = create_berlin_date(2020, 10, 3, 10) + end = create_berlin_date(2020, 10, 3, 11) + name = "Spezialveranstaltung" + seeder.create_event(admin_unit_id, name=name, start=start, end=end) + + url = utils.get_url( + "widget_event_dates", + au_short_name=au_short_name, + date_from="2020-10-03", + date_to="2020-10-03", + ) + response = utils.get_ok(url) + utils.assert_response_contains(response, name) + + def test_event_date(client, seeder, utils, app, db): user_id, admin_unit_id = seeder.setup_base(log_in=False) seeder.create_event(admin_unit_id)