From d00c603697896c9aa3f74c9c95f8bc5b86cbbc76 Mon Sep 17 00:00:00 2001 From: Ferdinand Thiessen Date: Thu, 18 Nov 2021 23:06:03 +0100 Subject: [PATCH] [events] Allow server side pageination --- .../plugins/events/event_controller.py | 48 ++++++++++++++----- flaschengeist/plugins/events/routes.py | 34 +++++++++---- 2 files changed, 61 insertions(+), 21 deletions(-) diff --git a/flaschengeist/plugins/events/event_controller.py b/flaschengeist/plugins/events/event_controller.py index fb50655..b5f7410 100644 --- a/flaschengeist/plugins/events/event_controller.py +++ b/flaschengeist/plugins/events/event_controller.py @@ -124,7 +124,14 @@ def get_templates(): return Event.query.filter(Event.is_template == True).all() -def get_events(start: Optional[datetime] = None, end=None, with_backup=False): +def get_events( + start: Optional[datetime] = None, + end: Optional[datetime] = None, + limit: Optional[int] = None, + offset: Optional[int] = None, + descending: Optional[bool] = False, + with_backup=False, +): """Query events which start from begin until end Args: start (datetime): Earliest start @@ -138,6 +145,14 @@ def get_events(start: Optional[datetime] = None, end=None, with_backup=False): query = query.filter(start <= Event.start) if end is not None: query = query.filter(Event.start < end) + if descending: + query = query.order_by(Event.start.desc()) + else: + query = query.order_by(Event.start) + if limit is not None: + query = query.limit(limit) + if offset is not None and offset > 0: + query = query.offset(offset) events = query.all() if not with_backup: for event in events: @@ -188,7 +203,13 @@ def get_job(job_slot_id, event_id): def add_job(event, job_type, required_services, start, end=None, comment=None): - job = Job(required_services=required_services, type=job_type, start=start, end=end, comment=comment) + job = Job( + required_services=required_services, + type=job_type, + start=start, + end=end, + comment=comment, + ) event.jobs.append(job) update() return job @@ -198,7 +219,10 @@ def update(): try: db.session.commit() except IntegrityError: - logger.debug("Error, looks like a Job with that type already exists on an event", exc_info=True) + logger.debug( + "Error, looks like a Job with that type already exists on an event", + exc_info=True, + ) raise BadRequest() @@ -222,21 +246,19 @@ def assign_job(job: Job, user, value): def unassign_job(job: Job = None, user=None, service=None, notify=False): if service is None: - assert(job is not None and user is not None) + assert job is not None and user is not None service = Service.query.get((job.id, user.id_)) else: user = service.user_ if not service: raise BadRequest - + event_id = service.job_.event_id_ - + db.session.delete(service) db.session.commit() if notify: - EventPlugin.plugin.notify( - user, "Your assignmet was cancelled", {"event_id": event_id} - ) + EventPlugin.plugin.notify(user, "Your assignmet was cancelled", {"event_id": event_id}) @scheduled @@ -249,7 +271,9 @@ def assign_backups(): for service in services: if service.job_.start <= now or service.job_.is_full(): EventPlugin.plugin.notify( - service.user_, "Your backup assignment was cancelled.", {"event_id": service.job_.event_id_} + service.user_, + "Your backup assignment was cancelled.", + {"event_id": service.job_.event_id_}, ) logger.debug(f"Service is outdated or full, removing. {service.serialize()}") db.session.delete(service) @@ -257,6 +281,8 @@ def assign_backups(): service.is_backup = False logger.debug(f"Service not full, assigning backup. {service.serialize()}") EventPlugin.plugin.notify( - service.user_, "Your backup assignment was accepted.", {"event_id": service.job_.event_id_} + service.user_, + "Your backup assignment was accepted.", + {"event_id": service.job_.event_id_}, ) db.session.commit() diff --git a/flaschengeist/plugins/events/routes.py b/flaschengeist/plugins/events/routes.py index fce9416..6e0ec96 100644 --- a/flaschengeist/plugins/events/routes.py +++ b/flaschengeist/plugins/events/routes.py @@ -169,7 +169,8 @@ def get_event(event_id, current_session): JSON encoded event object """ event = event_controller.get_event( - event_id, with_backup=current_session.user_.has_permission(permissions.SEE_BACKUP) + event_id, + with_backup=current_session.user_.has_permission(permissions.SEE_BACKUP), ) return jsonify(event) @@ -177,17 +178,21 @@ def get_event(event_id, current_session): @EventPlugin.blueprint.route("/events", methods=["GET"]) @login_required() def get_filtered_events(current_session): - begin = request.args.get("from") - if begin is not None: - begin = from_iso_format(begin) - end = request.args.get("to") - if end is not None: - end = from_iso_format(end) + begin = request.args.get("from", type=from_iso_format) + end = request.args.get("to", type=from_iso_format) + limit = request.args.get("limit", type=int) + offset = request.args.get("offset", type=int) + descending = "descending" in request.args if begin is None and end is None: begin = datetime.now() return jsonify( event_controller.get_events( - begin, end, with_backup=current_session.user_.has_permission(permissions.SEE_BACKUP) + start=begin, + end=end, + limit=limit, + offset=offset, + descending=descending, + with_backup=current_session.user_.has_permission(permissions.SEE_BACKUP), ) ) @@ -222,7 +227,9 @@ def get_events(current_session, year=datetime.now().year, month=datetime.now().m end = datetime(year=year, month=month + 1, day=1, tzinfo=timezone.utc) events = event_controller.get_events( - begin, end, with_backup=current_session.user_.has_permission(permissions.SEE_BACKUP) + begin, + end, + with_backup=current_session.user_.has_permission(permissions.SEE_BACKUP), ) return jsonify(events) except ValueError: @@ -243,7 +250,14 @@ def _add_job(event, data): raise BadRequest("Missing or invalid POST parameter") job_type = event_controller.get_job_type(job_type) - event_controller.add_job(event, job_type, required_services, start, end, comment=data.get("comment", None)) + event_controller.add_job( + event, + job_type, + required_services, + start, + end, + comment=data.get("comment", None), + ) @EventPlugin.blueprint.route("/events", methods=["POST"])