--- /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()
+ })