src/notes/api/views/sync.py
changeset 126 ba8bc0199464
child 128 34a75bd8d0b9
equal deleted inserted replaced
125:c653f49fabfb 126:ba8bc0199464
       
     1 import datetime
       
     2 
       
     3 from auditlog.models import LogEntry
       
     4 from django.utils import timezone
       
     5 from notes.models import Note, Session
       
     6 from rest_framework import permissions
       
     7 from rest_framework.response import Response
       
     8 from rest_framework.views import APIView
       
     9 
       
    10 
       
    11 class ListLogsView(APIView):
       
    12     """
       
    13     View to list tle log of changes on Note and Sessions.
       
    14 
       
    15     * Only registered users are able to access this view.
       
    16     * the results are filtered by connected user
       
    17     """
       
    18     permission_classes = (permissions.IsAuthenticated,)
       
    19 
       
    20     def __filter_object(self, queryset, modified_since):
       
    21         log_entries = LogEntry.objects.get_for_objects(queryset)
       
    22         if modified_since:
       
    23             log_entries = log_entries.filter(timestamp__gte=modified_since)
       
    24         return log_entries
       
    25 
       
    26     def __process_log_entries(self, queryset, modified_since):
       
    27         '''
       
    28         Process log entries
       
    29         '''
       
    30         log_entries = self.__filter_object(queryset, modified_since)
       
    31 
       
    32         res = {}
       
    33         for log_entry in log_entries:
       
    34             ext_id = log_entry.additional_data.get('ext_id')
       
    35             if not ext_id:
       
    36                 continue
       
    37             sync_entry = res.get(ext_id, {})
       
    38             new_action = {
       
    39                 (None                  , LogEntry.Action.CREATE): LogEntry.Action.CREATE,
       
    40                 (LogEntry.Action.CREATE, LogEntry.Action.CREATE): LogEntry.Action.CREATE,
       
    41                 (LogEntry.Action.UPDATE, LogEntry.Action.CREATE): LogEntry.Action.UPDATE,
       
    42                 (LogEntry.Action.DELETE, LogEntry.Action.CREATE): LogEntry.Action.UPDATE,
       
    43 
       
    44                 (None                  , LogEntry.Action.UPDATE): LogEntry.Action.UPDATE,
       
    45                 (LogEntry.Action.CREATE, LogEntry.Action.UPDATE): LogEntry.Action.CREATE,
       
    46                 (LogEntry.Action.UPDATE, LogEntry.Action.UPDATE): LogEntry.Action.UPDATE,
       
    47                 (LogEntry.Action.DELETE, LogEntry.Action.UPDATE): LogEntry.Action.DELETE,
       
    48 
       
    49                 (None                  , LogEntry.Action.DELETE): LogEntry.Action.DELETE,
       
    50                 (LogEntry.Action.CREATE, LogEntry.Action.DELETE): None,
       
    51                 (LogEntry.Action.UPDATE, LogEntry.Action.DELETE): LogEntry.Action.DELETE,
       
    52                 (LogEntry.Action.DELETE, LogEntry.Action.DELETE): LogEntry.Action.DELETE,
       
    53 
       
    54             } [(sync_entry.get('action'), log_entry.action)]
       
    55             if new_action is None:
       
    56                 del res[ext_id]
       
    57             else:
       
    58                 res[ext_id] = {
       
    59                     'type': log_entry.content_type.model,
       
    60                     'ext_id': ext_id,
       
    61                     'action': new_action,
       
    62                     'timestamp': log_entry.timestamp
       
    63                 }
       
    64         return res
       
    65 
       
    66     def get(self, request, format=None):
       
    67         """
       
    68         Return a list of all users.
       
    69         """
       
    70         modified_since_str = request.query_params.get('modified_since', None)
       
    71         modified_since = None
       
    72         if modified_since_str is not None:
       
    73             modified_since = datetime.datetime.fromtimestamp(
       
    74                 float(modified_since_str),
       
    75                 timezone.utc
       
    76             )
       
    77 
       
    78         user = request.user
       
    79         res_sessions = self.__process_log_entries(Session.objects.filter(owner=user), modified_since)
       
    80         res_notes = self.__process_log_entries(Note.objects.filter(session__owner=user), modified_since)
       
    81 
       
    82         return Response({
       
    83             'sessions': res_sessions.values(),
       
    84             'notes': res_notes.values()
       
    85         })