diff -r c653f49fabfb -r ba8bc0199464 src/notes/api/views/sync.py --- /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() + })