src/notes/api/views/sync.py
changeset 126 ba8bc0199464
child 128 34a75bd8d0b9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/notes/api/views/sync.py	Mon Jul 24 16:58:34 2017 +0200
@@ -0,0 +1,85 @@
+import datetime
+
+from auditlog.models import LogEntry
+from django.utils import timezone
+from notes.models import Note, Session
+from rest_framework import permissions
+from rest_framework.response import Response
+from rest_framework.views import APIView
+
+
+class ListLogsView(APIView):
+    """
+    View to list tle log of changes on Note and Sessions.
+
+    * Only registered users are able to access this view.
+    * the results are filtered by connected user
+    """
+    permission_classes = (permissions.IsAuthenticated,)
+
+    def __filter_object(self, queryset, modified_since):
+        log_entries = LogEntry.objects.get_for_objects(queryset)
+        if modified_since:
+            log_entries = log_entries.filter(timestamp__gte=modified_since)
+        return log_entries
+
+    def __process_log_entries(self, queryset, modified_since):
+        '''
+        Process log entries
+        '''
+        log_entries = self.__filter_object(queryset, modified_since)
+
+        res = {}
+        for log_entry in log_entries:
+            ext_id = log_entry.additional_data.get('ext_id')
+            if not ext_id:
+                continue
+            sync_entry = res.get(ext_id, {})
+            new_action = {
+                (None                  , LogEntry.Action.CREATE): LogEntry.Action.CREATE,
+                (LogEntry.Action.CREATE, LogEntry.Action.CREATE): LogEntry.Action.CREATE,
+                (LogEntry.Action.UPDATE, LogEntry.Action.CREATE): LogEntry.Action.UPDATE,
+                (LogEntry.Action.DELETE, LogEntry.Action.CREATE): LogEntry.Action.UPDATE,
+
+                (None                  , LogEntry.Action.UPDATE): LogEntry.Action.UPDATE,
+                (LogEntry.Action.CREATE, LogEntry.Action.UPDATE): LogEntry.Action.CREATE,
+                (LogEntry.Action.UPDATE, LogEntry.Action.UPDATE): LogEntry.Action.UPDATE,
+                (LogEntry.Action.DELETE, LogEntry.Action.UPDATE): LogEntry.Action.DELETE,
+
+                (None                  , LogEntry.Action.DELETE): LogEntry.Action.DELETE,
+                (LogEntry.Action.CREATE, LogEntry.Action.DELETE): None,
+                (LogEntry.Action.UPDATE, LogEntry.Action.DELETE): LogEntry.Action.DELETE,
+                (LogEntry.Action.DELETE, LogEntry.Action.DELETE): LogEntry.Action.DELETE,
+
+            } [(sync_entry.get('action'), log_entry.action)]
+            if new_action is None:
+                del res[ext_id]
+            else:
+                res[ext_id] = {
+                    'type': log_entry.content_type.model,
+                    'ext_id': ext_id,
+                    'action': new_action,
+                    'timestamp': log_entry.timestamp
+                }
+        return res
+
+    def get(self, request, format=None):
+        """
+        Return a list of all users.
+        """
+        modified_since_str = request.query_params.get('modified_since', None)
+        modified_since = None
+        if modified_since_str is not None:
+            modified_since = datetime.datetime.fromtimestamp(
+                float(modified_since_str),
+                timezone.utc
+            )
+
+        user = request.user
+        res_sessions = self.__process_log_entries(Session.objects.filter(owner=user), modified_since)
+        res_notes = self.__process_log_entries(Note.objects.filter(session__owner=user), modified_since)
+
+        return Response({
+            'sessions': res_sessions.values(),
+            'notes': res_notes.values()
+        })