src/notes/api/views/core.py
author ymh <ymh.work@gmail.com>
Wed, 19 Jul 2017 15:57:13 +0200
changeset 119 8ff8e2aee0f9
parent 117 9864fe2067cd
child 120 892980a3af09
permissions -rw-r--r--
add parameter to filter session and note by updated date. Add pagination on sessions and notes. add read only endpoint at root level to list notes
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
117
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
     1
"""
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
     2
Core viewsets
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
     3
"""
119
8ff8e2aee0f9 add parameter to filter session and note by updated date. Add pagination on sessions and notes. add read only endpoint at root level to list notes
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
     4
import datetime
31
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
import logging
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
119
8ff8e2aee0f9 add parameter to filter session and note by updated date. Add pagination on sessions and notes. add read only endpoint at root level to list notes
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
     7
from django.utils import timezone
31
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
from notes.models import Note, Session
117
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
     9
from rest_framework import viewsets
31
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
from ..permissions import NotePermission, SessionPermission
119
8ff8e2aee0f9 add parameter to filter session and note by updated date. Add pagination on sessions and notes. add read only endpoint at root level to list notes
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    12
from ..serializers.core import (CreateNoteSerializer, CreateSessionSerializer,
8ff8e2aee0f9 add parameter to filter session and note by updated date. Add pagination on sessions and notes. add read only endpoint at root level to list notes
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    13
                                DetailNoteSerializer, DetailSessionSerializer,
8ff8e2aee0f9 add parameter to filter session and note by updated date. Add pagination on sessions and notes. add read only endpoint at root level to list notes
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    14
                                ListNoteSerializer, ListSessionSerializer,
8ff8e2aee0f9 add parameter to filter session and note by updated date. Add pagination on sessions and notes. add read only endpoint at root level to list notes
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    15
                                RootDetailNoteSerializer,
8ff8e2aee0f9 add parameter to filter session and note by updated date. Add pagination on sessions and notes. add read only endpoint at root level to list notes
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    16
                                RootListNoteSerializer, UpdateNoteSerializer)
31
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
logger = logging.getLogger(__name__)
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
class SessionViewSet(viewsets.ModelViewSet):
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
    """
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
    API endpoint that allow sessions ro be viewed or edited
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
    """
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
    serializer_class = ListSessionSerializer
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
    lookup_field = 'ext_id'
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
    serializers = {
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
        'list': ListSessionSerializer,
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
        'retrieve':  DetailSessionSerializer,
68
6e18b31b0ad5 Correct session creation and add offline to the persisted state
ymh <ymh.work@gmail.com>
parents: 31
diff changeset
    31
        'create':  CreateSessionSerializer,
31
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
    }
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
    permission_classes = (SessionPermission,)
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
    def get_serializer_class(self):
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
        return self.serializers.get(self.action, ListSessionSerializer)
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
    def get_queryset(self):
119
8ff8e2aee0f9 add parameter to filter session and note by updated date. Add pagination on sessions and notes. add read only endpoint at root level to list notes
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    40
        queryset = Session.objects.filter(owner=self.request.user).order_by('created')
8ff8e2aee0f9 add parameter to filter session and note by updated date. Add pagination on sessions and notes. add read only endpoint at root level to list notes
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    41
        modified_since_str = self.request.query_params.get('modified_since', None)
8ff8e2aee0f9 add parameter to filter session and note by updated date. Add pagination on sessions and notes. add read only endpoint at root level to list notes
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    42
        if modified_since_str is not None:
8ff8e2aee0f9 add parameter to filter session and note by updated date. Add pagination on sessions and notes. add read only endpoint at root level to list notes
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    43
            modified_since = datetime.datetime.fromtimestamp(
8ff8e2aee0f9 add parameter to filter session and note by updated date. Add pagination on sessions and notes. add read only endpoint at root level to list notes
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    44
                float(modified_since_str),
8ff8e2aee0f9 add parameter to filter session and note by updated date. Add pagination on sessions and notes. add read only endpoint at root level to list notes
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    45
                timezone.utc
8ff8e2aee0f9 add parameter to filter session and note by updated date. Add pagination on sessions and notes. add read only endpoint at root level to list notes
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    46
            )
8ff8e2aee0f9 add parameter to filter session and note by updated date. Add pagination on sessions and notes. add read only endpoint at root level to list notes
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    47
            queryset = queryset.filter(updated__gte=modified_since)
8ff8e2aee0f9 add parameter to filter session and note by updated date. Add pagination on sessions and notes. add read only endpoint at root level to list notes
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    48
        return queryset
31
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
class NoteViewSet(viewsets.ModelViewSet):
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
    serializers = {
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
        'list': ListNoteSerializer,
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
        'retrieve': DetailNoteSerializer,
74
043477fd5c5c add api call to save notes. internally use ts for time data for notes and session
ymh <ymh.work@gmail.com>
parents: 68
diff changeset
    56
        'create': CreateNoteSerializer,
83
76a4e4b11762 add server request for note update and delete
ymh <ymh.work@gmail.com>
parents: 74
diff changeset
    57
        'update': UpdateNoteSerializer,
31
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
    }
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
    lookup_field = 'ext_id'
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
    permission_classes = (NotePermission,)
119
8ff8e2aee0f9 add parameter to filter session and note by updated date. Add pagination on sessions and notes. add read only endpoint at root level to list notes
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    62
    pagination_class = None
31
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
    def get_serializer_class(self):
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
        return self.serializers.get(self.action, ListNoteSerializer)
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
    def get_queryset(self):
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
        return Note.objects.filter(
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
            session__ext_id=self.kwargs['session_ext_id'],
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
            session__owner=self.request.user)
119
8ff8e2aee0f9 add parameter to filter session and note by updated date. Add pagination on sessions and notes. add read only endpoint at root level to list notes
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    71
8ff8e2aee0f9 add parameter to filter session and note by updated date. Add pagination on sessions and notes. add read only endpoint at root level to list notes
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    72
8ff8e2aee0f9 add parameter to filter session and note by updated date. Add pagination on sessions and notes. add read only endpoint at root level to list notes
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    73
class RootNoteViewSet(viewsets.ReadOnlyModelViewSet):
8ff8e2aee0f9 add parameter to filter session and note by updated date. Add pagination on sessions and notes. add read only endpoint at root level to list notes
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    74
8ff8e2aee0f9 add parameter to filter session and note by updated date. Add pagination on sessions and notes. add read only endpoint at root level to list notes
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    75
    serializers = {
8ff8e2aee0f9 add parameter to filter session and note by updated date. Add pagination on sessions and notes. add read only endpoint at root level to list notes
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    76
        'list': RootListNoteSerializer,
8ff8e2aee0f9 add parameter to filter session and note by updated date. Add pagination on sessions and notes. add read only endpoint at root level to list notes
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    77
        'retrieve': RootDetailNoteSerializer,
8ff8e2aee0f9 add parameter to filter session and note by updated date. Add pagination on sessions and notes. add read only endpoint at root level to list notes
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    78
    }
8ff8e2aee0f9 add parameter to filter session and note by updated date. Add pagination on sessions and notes. add read only endpoint at root level to list notes
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    79
    lookup_field = 'ext_id'
8ff8e2aee0f9 add parameter to filter session and note by updated date. Add pagination on sessions and notes. add read only endpoint at root level to list notes
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    80
8ff8e2aee0f9 add parameter to filter session and note by updated date. Add pagination on sessions and notes. add read only endpoint at root level to list notes
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    81
    permission_classes = (NotePermission,)
8ff8e2aee0f9 add parameter to filter session and note by updated date. Add pagination on sessions and notes. add read only endpoint at root level to list notes
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    82
8ff8e2aee0f9 add parameter to filter session and note by updated date. Add pagination on sessions and notes. add read only endpoint at root level to list notes
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    83
    def get_serializer_class(self):
8ff8e2aee0f9 add parameter to filter session and note by updated date. Add pagination on sessions and notes. add read only endpoint at root level to list notes
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    84
        return self.serializers.get(self.action, RootListNoteSerializer)
8ff8e2aee0f9 add parameter to filter session and note by updated date. Add pagination on sessions and notes. add read only endpoint at root level to list notes
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    85
8ff8e2aee0f9 add parameter to filter session and note by updated date. Add pagination on sessions and notes. add read only endpoint at root level to list notes
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    86
    def get_queryset(self):
8ff8e2aee0f9 add parameter to filter session and note by updated date. Add pagination on sessions and notes. add read only endpoint at root level to list notes
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    87
        queryset = Note.objects.filter(session__owner=self.request.user).order_by('created')
8ff8e2aee0f9 add parameter to filter session and note by updated date. Add pagination on sessions and notes. add read only endpoint at root level to list notes
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    88
        modified_since_str = self.request.query_params.get('modified_since', None)
8ff8e2aee0f9 add parameter to filter session and note by updated date. Add pagination on sessions and notes. add read only endpoint at root level to list notes
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    89
        if modified_since_str is not None:
8ff8e2aee0f9 add parameter to filter session and note by updated date. Add pagination on sessions and notes. add read only endpoint at root level to list notes
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    90
            modified_since = datetime.datetime.fromtimestamp(
8ff8e2aee0f9 add parameter to filter session and note by updated date. Add pagination on sessions and notes. add read only endpoint at root level to list notes
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    91
                float(modified_since_str),
8ff8e2aee0f9 add parameter to filter session and note by updated date. Add pagination on sessions and notes. add read only endpoint at root level to list notes
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    92
                timezone.utc
8ff8e2aee0f9 add parameter to filter session and note by updated date. Add pagination on sessions and notes. add read only endpoint at root level to list notes
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    93
            )
8ff8e2aee0f9 add parameter to filter session and note by updated date. Add pagination on sessions and notes. add read only endpoint at root level to list notes
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    94
            queryset = queryset.filter(updated__gte=modified_since)
8ff8e2aee0f9 add parameter to filter session and note by updated date. Add pagination on sessions and notes. add read only endpoint at root level to list notes
ymh <ymh.work@gmail.com>
parents: 117
diff changeset
    95
        return queryset