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