diff --git a/project/api/event/schemas.py b/project/api/event/schemas.py index 17fa1fe..b273fe1 100644 --- a/project/api/event/schemas.py +++ b/project/api/event/schemas.py @@ -237,6 +237,10 @@ class EventSearchRequestSchema(PaginationRequestSchema): sort = fields.Str( metadata={"description": "Sort result items."}, ) + status = fields.List( + EnumField(EventStatus), + metadata={"description": "Looks for events with this stati."}, + ) class EventSearchResponseSchema(PaginationResponseSchema): diff --git a/project/services/event.py b/project/services/event.py index 3142450..0879384 100644 --- a/project/services/event.py +++ b/project/services/event.py @@ -68,6 +68,13 @@ def fill_event_filter(event_filter, params): event_filter, Event.categories.any(EventCategory.id.in_(category_ids)) ) + if params.status: + if type(params.status) is list: + stati = params.status + else: # pragma: no cover + stati = [params.status] + event_filter = and_(event_filter, Event.status.in_(stati)) + if params.event_list_id: if type(params.event_list_id) is list: event_list_ids = params.event_list_id diff --git a/project/services/event_search.py b/project/services/event_search.py index 08f9534..fbe92d2 100644 --- a/project/services/event_search.py +++ b/project/services/event_search.py @@ -27,6 +27,7 @@ class EventSearchParams(object): self.event_list_id = None self.weekday = None self.sort = None + self.status = None @property def date_from(self): @@ -95,8 +96,25 @@ class EventSearchParams(object): if len(item_ids) > 0: return item_ids + return None + def load_status_list_param(self): + stati = self.load_list_param("status") + + if stati is None: # pragma: no cover + return None + + from project.models import EventStatus + + result = list() + + for status in stati: + if status in EventStatus.__members__: + result.append(EventStatus.__members__[status]) + + return result + def load_from_request(self): if "date_from" in request.args: self.date_from_str = request.args["date_from"] @@ -130,3 +148,6 @@ class EventSearchParams(object): if "organization_id" in request.args: self.admin_unit_id = request.args["organization_id"] + + if "status" in request.args: + self.status = self.load_status_list_param() diff --git a/tests/api/test_event_date.py b/tests/api/test_event_date.py index 771179a..c464f2a 100644 --- a/tests/api/test_event_date.py +++ b/tests/api/test_event_date.py @@ -40,7 +40,7 @@ def test_list(client, seeder, utils): assert response.json["items"][0]["id"] == 1 -def test_search(client, seeder, utils): +def test_search(client, seeder, utils, app, db): from project.dateutils import create_berlin_date user_id, admin_unit_id = seeder.setup_base() @@ -91,6 +91,25 @@ def test_search(client, seeder, utils): assert len(response.json["items"]) == 1 assert response.json["items"][0]["event"]["id"] == listed_event_id + url = utils.get_url("api_v1_event_date_search", status="scheduled") + response = utils.get_ok(url) + assert len(response.json["items"]) == 2 + + with app.app_context(): + from project.models import Event, EventStatus + + event = Event.query.get(event_id) + event.status = EventStatus.cancelled + db.session.commit() + + url = utils.get_url("api_v1_event_date_search", status="scheduled") + response = utils.get_ok(url) + assert len(response.json["items"]) == 1 + + url = utils.get_url("api_v1_event_date_search", status=["scheduled", "cancelled"]) + response = utils.get_ok(url) + assert len(response.json["items"]) == 2 + def test_search_oneDay(client, seeder, utils): from project.dateutils import create_berlin_date