diff --git a/src/models.py b/src/models.py index 18bb1d7d911f49c30b624a8f5e72592169bd2aca..71684938b56a37e6fca3769a58f093b21f726735 100644 --- a/src/models.py +++ b/src/models.py @@ -86,14 +86,19 @@ class PlayLog(db.Model): @staticmethod - def paginate(page, page_size, since_time=None): + def paginate(page, page_size, from_time=None, to_time=None, skip_synced=False): """ Returns a list of entries for a given page and an start time (optional). """ def q(page=0, page_size=None): query = db.session.query(PlayLog).order_by(PlayLog.track_start.desc()) - if isinstance(since_time, datetime.datetime): - query = query.filter(PlayLog.track_start >= since_time) + if isinstance(from_time, datetime.datetime): + if isinstance(from_time, datetime.datetime): + query = query.filter(PlayLog.track_start >= from_time and PlayLog.track_start < to_time) + else: + query = query.filter(PlayLog.track_start >= from_time) + if skip_synced == True: + query = query.filter(PlayLog.is_synced == False) listen(query, 'before_compile', apply_limit(page, page_size), retval=True) return query @@ -231,7 +236,7 @@ class HealthHistory(db.Model): log_source = Column(Integer) # The source the history entry relates to is_healthy = Column(Boolean) # Indicates if source is "healthy enough" to be used for play-out is_synced = Column(Boolean) # Only relevant for main nodes, in a multi-node setup - health_info = Column(String(2048)) # Stringified JSON object, or other, if needed + health_info = Column(String(2048)) # Stringified JSON object or other, if needed def __init__(self, source_number, is_healthy, health_info): diff --git a/src/rest/controllers/internal_controller.py b/src/rest/controllers/internal_controller.py index 7872e79272e9c55d3fe21d6deb61d7a25c2d7395..e545aab5cee9d344ef97edf05f663c36a4a4c02f 100644 --- a/src/rest/controllers/internal_controller.py +++ b/src/rest/controllers/internal_controller.py @@ -1,7 +1,7 @@ import connexion import six -import datetime +from dateutil.parser import parse from flask import current_app from src.rest.models.clock_info import ClockInfo # noqa: E501 @@ -77,7 +77,7 @@ def get_source_health(number): # noqa: E501 return service.get_source_health(number) -def list_playlog(date_time, page=None, limit=None, skip_synced=None): # noqa: E501 +def list_playlog(from_date=None, to_dat=None, page=None, limit=None, skip_synced=None): # noqa: E501 """List tracks in the play-log since the given timestamp Get paginated playlog entries for since the given timestamp. # noqa: E501 @@ -94,8 +94,9 @@ def list_playlog(date_time, page=None, limit=None, skip_synced=None): # noqa: E :rtype: List[PlayLog] """ service = current_app.config['SERVICE'] - date_time = parse(date_time) - return service.list_playlog(page, limit, date_time) + from_date = parse(from_date) + to_date = parse(to_date) + return service.list_playlog(page, limit, from_date, to_date, skip_synced) def log_source_health(body, number): # noqa: E501 diff --git a/src/rest/swagger/swagger.yaml b/src/rest/swagger/swagger.yaml index cfea2b75b60b44e1a3393d4ff35ad599a7253256..42ac6c2d67fbaad2294005da38a80a0f1a4a036b 100644 --- a/src/rest/swagger/swagger.yaml +++ b/src/rest/swagger/swagger.yaml @@ -137,7 +137,7 @@ paths: schema: $ref: '#/components/schemas/inline_response_400' x-openapi-router-controller: src.rest.controllers.internal_controller - /playlog/since/{date_time}: + /playlog: get: tags: - internal @@ -146,14 +146,24 @@ paths: Get paginated playlog entries for since the given timestamp. operationId: list_playlog parameters: - - name: date_time - in: path - description: Get entries after this timestamp (e.g. '2020-08-29T09:12:33.001Z') + - name: from + in: query + description: Get entries after this timestamp required: true - style: simple - explode: false + style: form + explode: true + schema: + type: string + example: 2020-08-29T09:12:33.001Z + - name: to + in: query + description: Get entries before this timestamp + required: true + style: form + explode: true schema: type: string + example: 2020-11-29T09:12:33.001Z - name: page in: query description: The number of items to skip before starting to collect the result diff --git a/src/rest/test/test_internal_controller.py b/src/rest/test/test_internal_controller.py index 3213fe9c6268d206ff03eddd7f2932ed04808a57..8a1dbbcf27167fd12da13e8e6a9c7fdb15516f18 100644 --- a/src/rest/test/test_internal_controller.py +++ b/src/rest/test/test_internal_controller.py @@ -75,7 +75,7 @@ class TestInternalController(BaseTestCase): Report for one month """ response = self.client.open( - '/api/v1/playlog/report/{year_month}'.format(year_month='year_month_example'), + '/api/v1/playlog/report/{year_month}'.format(year_month='2020_02'), method='GET') self.assert200(response, 'Response body is : ' + response.data.decode('utf-8')) @@ -98,9 +98,11 @@ class TestInternalController(BaseTestCase): """ query_string = [('page', 56), ('limit', 200), - ('skip_synced', true)] + ('skip_synced', true), + ('from', '2020-08-15T15:40:44'), + ('to', '2020-10-15T15:40:44'))] response = self.client.open( - '/api/v1/playlog/since/{date_time}'.format(date_time='date_time_example'), + '/api/v1/playlog/', method='GET', query_string=query_string) self.assert200(response,