From 71c894df7ee3fe68ea218e32590cc6d07c1344b6 Mon Sep 17 00:00:00 2001 From: Daniel Grams Date: Sat, 10 Feb 2024 17:36:57 +0100 Subject: [PATCH] Bugfix for date range filter #569 --- project/services/event.py | 44 +++++++++++++++---------- project/static/vue/planning/list.vue.js | 5 ++- project/views/event.py | 4 ++- 3 files changed, 33 insertions(+), 20 deletions(-) diff --git a/project/services/event.py b/project/services/event.py index 6e13cb2..050d394 100644 --- a/project/services/event.py +++ b/project/services/event.py @@ -238,25 +238,39 @@ def fill_event_admin_unit_filter(event_filter, params: EventSearchParams): return admin_unit_reference, event_filter +def get_event_date_range_filter(params: EventSearchParams): + date_filter = EventDate.start >= datetime.min + + if params.date_from: + date_filter = or_( + EventDate.start >= params.date_from, + and_(EventDate.end.isnot(None), EventDate.end >= params.date_from), + ) + + if params.date_to: + date_to_filter = or_( + EventDate.start < params.date_to, + and_(EventDate.end.isnot(None), EventDate.end < params.date_to), + ) + date_filter = and_(date_filter, date_to_filter) + + # PostgreSQL specific https://stackoverflow.com/a/25597632 + if params.weekday and type(params.weekday) is list: + weekdays = params.weekday + date_filter = and_(date_filter, extract("dow", EventDate.start).in_(weekdays)) + + return date_filter + + def get_event_dates_query(params: EventSearchParams): event_filter = 1 == 1 - date_filter = EventDate.start >= datetime.min event_filter = fill_event_filter(event_filter, params) admin_unit_reference, event_filter = fill_event_admin_unit_filter( event_filter, params ) - if params.date_from: - date_filter = EventDate.start >= params.date_from - - if params.date_to: - date_filter = and_(date_filter, EventDate.start < params.date_to) - - # PostgreSQL specific https://stackoverflow.com/a/25597632 - if params.weekday and type(params.weekday) is list: - weekdays = params.weekday - date_filter = and_(date_filter, extract("dow", EventDate.start).in_(weekdays)) + date_filter = get_event_date_range_filter(params) result = ( EventDate.query.join(EventDate.event) @@ -378,19 +392,13 @@ def get_event_with_details_or_404(event_id): def get_events_query(params: EventSearchParams): event_filter = 1 == 1 - date_filter = EventDate.start >= datetime.min event_filter = fill_event_filter(event_filter, params) admin_unit_reference, event_filter = fill_event_admin_unit_filter( event_filter, params ) - if params.date_from: - date_filter = EventDate.start >= params.date_from - - if params.date_to: - date_filter = and_(date_filter, EventDate.start < params.date_to) - + date_filter = get_event_date_range_filter(params) event_filter = and_(event_filter, Event.dates.any(date_filter)) result = ( Event.query.join(Event.admin_unit) diff --git a/project/static/vue/planning/list.vue.js b/project/static/vue/planning/list.vue.js index c52aab2..ff3243e 100644 --- a/project/static/vue/planning/list.vue.js +++ b/project/static/vue/planning/list.vue.js @@ -276,8 +276,11 @@ const PlanningList = { this.countTitle = ""; } const vm = this; + const req_data = $("#filter_form :input").filter(function () { + return this.value.length > 0 + }).serialize() axios - .get(`/api/v1/event-dates/search?` + $("#filter_form").serialize(), { + .get(`/api/v1/event-dates/search?` + req_data, { withCredentials: true, handleLoading: this.handleLoading, }) diff --git a/project/views/event.py b/project/views/event.py index a84a936..4be9055 100644 --- a/project/views/event.py +++ b/project/views/event.py @@ -127,7 +127,9 @@ def prepare_form_reference_requests(form, admin_unit): [(a.id, a.name) for a in admin_unit_choices], key=lambda a: a[1], ) - form.reference_request_admin_unit_id.data = selected_ids + + if not form.is_submitted(): + form.reference_request_admin_unit_id.data = selected_ids @app.route("/admin_unit//events/create", methods=("GET", "POST"))