From 238d5edc037710fdfcbd4e8c6c2ee462cd48b8da Mon Sep 17 00:00:00 2001
From: David Trattnig <david.trattnig@o94.at>
Date: Thu, 25 Jun 2020 21:08:03 +0200
Subject: [PATCH] List playlog implementation.

---
 src/models.py                               |  6 +++--
 src/rest/controllers/internal_controller.py |  8 +++---
 src/service.py                              | 28 ++++++++++++++++++++-
 3 files changed, 35 insertions(+), 7 deletions(-)

diff --git a/src/models.py b/src/models.py
index 5fd43b4..fde3539 100644
--- a/src/models.py
+++ b/src/models.py
@@ -85,12 +85,14 @@ class PlayLog(db.Model):
 
 
     @staticmethod
-    def paginate(page, page_size):
+    def paginate(page, page_size, since_time=None):
         """
-        Returns a list of entries for a given page.
+        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)
+            if isinstance(since_time, datetime.datetime):
+                query = query.filter(PlayLog.track_start >= since_time)
             listen(query, 'before_compile', apply_limit(page, page_size), retval=True)
             return query
 
diff --git a/src/rest/controllers/internal_controller.py b/src/rest/controllers/internal_controller.py
index 3701d38..c000739 100644
--- a/src/rest/controllers/internal_controller.py
+++ b/src/rest/controllers/internal_controller.py
@@ -2,13 +2,13 @@ import connexion
 import six
 
 from src.rest.models.clock_info import ClockInfo  # noqa: E501
-org.joda.time.*  # noqa: E501
 from src.rest.models.health_info import HealthInfo  # noqa: E501
 from src.rest.models.play_log_entry import PlayLogEntry  # noqa: E501
 from src.rest.models.status_entry import StatusEntry  # noqa: E501
 from src.rest import util
 
 from flask import current_app
+from dateutil.parser import parse
 
 
 def activate_engine(engine_number):  # noqa: E501
@@ -33,6 +33,7 @@ def add_playlog():  # noqa: E501
     :rtype: PlayLogEntry
     """
     service = current_app.config['SERVICE']
+    service.store_playlog()
 
 
 def clock_info():  # noqa: E501
@@ -101,10 +102,9 @@ def list_playlog(date_time, page=None, limit=None):  # noqa: E501
 
     :rtype: List[PlayLogEntry]
     """
-    if connexion.request.is_json:
-        date_time = .from_dict(connexion.request.get_json())  # noqa: E501
     service = current_app.config['SERVICE']
-    return 'do some magic!'
+    date_time = parse(date_time)
+    return service.list_playlog(page, limit, date_time)
 
 
 def log_engine_health(engine_number):  # noqa: E501
diff --git a/src/service.py b/src/service.py
index 6223f08..20173cb 100644
--- a/src/service.py
+++ b/src/service.py
@@ -61,11 +61,37 @@ class ApiService():
             (List[PlayLogEntry])
         """
         if not size or size > 50 or size < 1: size = 20
-        tracklist = PlayLog.paginate(page, size)
+        tracklist = PlayLog.paginate(page, size, None)
         tracklist_schema = TrackSchema(many=True)
         return tracklist_schema.dump(tracklist)
 
 
+    def list_playlog(self, page=None, size=None, since_time=None):  
+        """
+        Get paginated playlog entries for since the given timestamp.  
+
+        Args:
+            since_time (datetime): Get entries after this timestamp (e.g. &#x27;2020-08-29T09:12:33.001Z&#x27;)
+            page (Integer): The number of items to skip before starting to collect the result set
+            size (Integer): The numbers of items to return per page
+
+        Returns:
+            (List[PlayLogEntry])
+        """
+        tracklist = PlayLog.paginate(page, size, since_time)
+        tracklist_schema = TrackSchema(many=True)
+        return tracklist_schema.dump(tracklist)
+
+
+    def store_playlog(): 
+        """
+        Stores the passed playlog entry.
+
+        Returns:
+            (PlayLogEntry)
+        """
+
+
     def clock_info(self):
         """
         Retrieves the currently playing playlist.  
-- 
GitLab