src/notes/api/views/core.py
author ymh <ymh.work@gmail.com>
Wed, 18 Jul 2018 17:32:09 +0200
changeset 142 56850f5c73f6
parent 132 906a6c7c7943
permissions -rw-r--r--
- upgrade libraries - python 3.7 compatibility - First protocol management implementation
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
128
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents: 120
diff changeset
     8
from django_filters.rest_framework import DjangoFilterBackend
31
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
from notes.models import Note, Session
117
9864fe2067cd Add api endpoints for group management
ymh <ymh.work@gmail.com>
parents: 99
diff changeset
    10
from rest_framework import viewsets
31
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
128
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents: 120
diff changeset
    12
from ..filters import NoteFilterSet, SessionFilterSet
31
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
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
    14
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
    15
                                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
    16
                                ListNoteSerializer, ListSessionSerializer,
142
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 132
diff changeset
    17
                                RootDetailNoteSerializer, UpdateNoteSerializer,
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 132
diff changeset
    18
                                UpdateSessionSerializer)
31
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
logger = logging.getLogger(__name__)
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
class SessionViewSet(viewsets.ModelViewSet):
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
    """
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
    API endpoint that allow sessions ro be viewed or edited
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
    """
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
    serializer_class = ListSessionSerializer
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
    lookup_field = 'ext_id'
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
    serializers = {
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
        'list': ListSessionSerializer,
142
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 132
diff changeset
    32
        'retrieve': DetailSessionSerializer,
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 132
diff changeset
    33
        'update': UpdateSessionSerializer,
56850f5c73f6 - upgrade libraries
ymh <ymh.work@gmail.com>
parents: 132
diff changeset
    34
        'create': CreateSessionSerializer,
31
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
    }
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
    permission_classes = (SessionPermission,)
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
128
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents: 120
diff changeset
    39
    filter_backends = (DjangoFilterBackend,)
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents: 120
diff changeset
    40
    filter_class = SessionFilterSet
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents: 120
diff changeset
    41
31
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
    def get_serializer_class(self):
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
        return self.serializers.get(self.action, ListSessionSerializer)
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
    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
    46
        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
    47
        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
    48
        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
    49
            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
    50
                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
    51
                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
    52
            )
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
    53
            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
    54
        return queryset
31
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
class NoteViewSet(viewsets.ModelViewSet):
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
    serializers = {
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
        'list': ListNoteSerializer,
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
        '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
    62
        'create': CreateNoteSerializer,
83
76a4e4b11762 add server request for note update and delete
ymh <ymh.work@gmail.com>
parents: 74
diff changeset
    63
        'update': UpdateNoteSerializer,
31
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
    }
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
    lookup_field = 'ext_id'
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
    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
    68
    pagination_class = None
31
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
    def get_serializer_class(self):
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
        return self.serializers.get(self.action, ListNoteSerializer)
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
    def get_queryset(self):
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
        return Note.objects.filter(
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
            session__ext_id=self.kwargs['session_ext_id'],
63be3ce389f7 improve api
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
            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
    77
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
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
    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
    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
    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
    permission_classes = (NotePermission,)
120
892980a3af09 for notes api, the end point list all properties.
ymh <ymh.work@gmail.com>
parents: 119
diff changeset
    84
    serializer_class = RootDetailNoteSerializer
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
    85
128
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents: 120
diff changeset
    86
    filter_backends = (DjangoFilterBackend,)
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents: 120
diff changeset
    87
    filter_class = NoteFilterSet
34a75bd8d0b9 add filter on session and node list to recover specific objects
ymh <ymh.work@gmail.com>
parents: 120
diff changeset
    88
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
    89
    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
    90
        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
    91
        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
    92
        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
    93
            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
    94
                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
    95
                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
    96
            )
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
    97
            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
    98
        return queryset