Skip to content

Commit

Permalink
source/collection latest version get/update view
Browse files Browse the repository at this point in the history
  • Loading branch information
snyaggarwal committed Aug 4, 2020
1 parent 52e241a commit d6c7990
Show file tree
Hide file tree
Showing 5 changed files with 99 additions and 3 deletions.
5 changes: 5 additions & 0 deletions core/collections/urls.py
Expand Up @@ -17,6 +17,11 @@
name='collection-version-list'
),
re_path(r'^(?P<collection>{pattern})/concepts/atom/$'.format(pattern=NAMESPACE_PATTERN), CollectionFeed()),
re_path(
r'^(?P<collection>{pattern})/latest/$'.format(pattern=NAMESPACE_PATTERN),
views.CollectionLatestVersionRetrieveUpdateView.as_view(),
name='collectionversion-latest-detail'
),
re_path(r"^(?P<collection>{pattern})/concepts/".format(pattern=NAMESPACE_PATTERN), include('core.concepts.urls')),
re_path(r"^(?P<collection>{pattern})/mappings/".format(pattern=NAMESPACE_PATTERN), include('core.mappings.urls')),
re_path(
Expand Down
34 changes: 33 additions & 1 deletion core/collections/views.py
Expand Up @@ -4,6 +4,7 @@
from django.core.exceptions import ValidationError
from django.db import IntegrityError
from django.http import Http404
from django.shortcuts import get_object_or_404
from pydash import get
from rest_framework import status, mixins
from rest_framework.generics import RetrieveAPIView, DestroyAPIView, UpdateAPIView, ListAPIView, \
Expand All @@ -20,7 +21,7 @@
from core.common.mixins import ConceptDictionaryCreateMixin, ListWithHeadersMixin, ConceptDictionaryUpdateMixin, \
ConceptContainerExportMixin
from core.common.permissions import CanViewConceptDictionary, CanEditConceptDictionary, HasAccessToVersionedObject, \
HasOwnership
HasOwnership, CanViewConceptDictionaryVersion
from core.common.tasks import add_references, export_collection
from core.common.utils import compact_dict_by_values, parse_boolean_query_param
from core.common.views import BaseAPIView
Expand Down Expand Up @@ -379,6 +380,37 @@ def get_queryset(self):
return queryset.order_by('-created_at')


class CollectionLatestVersionRetrieveUpdateView(CollectionVersionBaseView, RetrieveAPIView, UpdateAPIView):
serializer_class = CollectionVersionDetailSerializer
permission_classes = (CanViewConceptDictionaryVersion,)

def get_filter_params(self, default_version_to_head=False):
params = super().get_filter_params(default_version_to_head)
params['is_latest'] = True
return params

def get_object(self, queryset=None):
obj = get_object_or_404(self.get_queryset(), released=True)
self.check_object_permissions(self.request, obj)
return obj

def update(self, request, *args, **kwargs):
self.object = self.get_object()
head = self.object.head
if not head:
return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED)

serializer = self.get_serializer(self.object, data=request.data, partial=True)

if serializer.is_valid():
self.object = serializer.save(force_update=True)
if serializer.is_valid():
serializer = CollectionVersionDetailSerializer(self.object, context={'request': request})
return Response(serializer.data, status=status.HTTP_200_OK)

return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


class CollectionVersionRetrieveUpdateDestroyView(CollectionBaseView, RetrieveAPIView, UpdateAPIView):
permission_classes = (HasAccessToVersionedObject,)
serializer_class = CollectionDetailSerializer
Expand Down
22 changes: 22 additions & 0 deletions core/common/permissions.py
Expand Up @@ -90,3 +90,25 @@ def has_object_permission(self, request, view, obj):
if request.user.is_authenticated:
return request.user.organizations.filter(id=versioned_object.parent_id).exists()
return False


class CanViewConceptDictionaryVersion(HasAccessToVersionedObject):
"""
The user can view this source
"""

def has_object_permission(self, request, view, obj):
if obj.public_access in [ACCESS_TYPE_EDIT, ACCESS_TYPE_VIEW]:
return True
return super().has_object_permission(request, view, obj)


class CanEditConceptDictionaryVersion(HasAccessToVersionedObject):
"""
The request is authenticated as a user, and the user can edit this source
"""

def has_object_permission(self, request, view, obj):
if request.user.is_authenticated() and ACCESS_TYPE_EDIT == obj.public_access:
return True
return super().has_object_permission(request, view, obj)
5 changes: 5 additions & 0 deletions core/sources/urls.py
Expand Up @@ -17,6 +17,11 @@
views.SourceVersionListView.as_view(),
name='source-version-list'
),
re_path(
r'^(?P<source>{pattern})/latest/$'.format(pattern=NAMESPACE_PATTERN),
views.SourceLatestVersionRetrieveUpdateView.as_view(),
name='sourceversion-latest-detail'
),
re_path(r"^(?P<source>{pattern})/concepts/".format(pattern=NAMESPACE_PATTERN), include('core.concepts.urls')),
re_path(r"^(?P<source>{pattern})/mappings/".format(pattern=NAMESPACE_PATTERN), include('core.mappings.urls')),
re_path(
Expand Down
36 changes: 34 additions & 2 deletions core/sources/views.py
Expand Up @@ -3,6 +3,7 @@
from celery_once import AlreadyQueued
from django.core.exceptions import ValidationError
from django.db import IntegrityError
from django.shortcuts import get_object_or_404
from pydash import get
from rest_framework import status, mixins
from rest_framework.generics import (
Expand All @@ -14,7 +15,7 @@
from core.common.mixins import ListWithHeadersMixin, ConceptDictionaryCreateMixin, ConceptDictionaryUpdateMixin, \
ConceptContainerExportMixin
from core.common.permissions import CanViewConceptDictionary, CanEditConceptDictionary, HasAccessToVersionedObject, \
HasOwnership
HasOwnership, CanViewConceptDictionaryVersion
from core.common.tasks import export_source
from core.common.utils import parse_boolean_query_param, compact_dict_by_values
from core.common.views import BaseAPIView
Expand Down Expand Up @@ -177,7 +178,38 @@ def get_queryset(self):
return queryset.order_by('-created_at')


class SourceVersionRetrieveUpdateDestroyView(SourceBaseView, RetrieveAPIView, UpdateAPIView):
class SourceLatestVersionRetrieveUpdateView(SourceVersionBaseView, RetrieveAPIView, UpdateAPIView):
serializer_class = SourceVersionDetailSerializer
permission_classes = (CanViewConceptDictionaryVersion,)

def get_filter_params(self, default_version_to_head=False):
params = super().get_filter_params(default_version_to_head)
params['is_latest'] = True
return params

def get_object(self, queryset=None):
obj = get_object_or_404(self.get_queryset(), released=True)
self.check_object_permissions(self.request, obj)
return obj

def update(self, request, *args, **kwargs):
self.object = self.get_object()
head = self.object.head
if not head:
return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED)

serializer = self.get_serializer(self.object, data=request.data, partial=True)

if serializer.is_valid():
self.object = serializer.save(force_update=True)
if serializer.is_valid():
serializer = SourceVersionDetailSerializer(self.object, context={'request': request})
return Response(serializer.data, status=status.HTTP_200_OK)

return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


class SourceVersionRetrieveUpdateDestroyView(SourceVersionBaseView, RetrieveAPIView, UpdateAPIView):
permission_classes = (HasAccessToVersionedObject,)
serializer_class = SourceDetailSerializer

Expand Down

0 comments on commit d6c7990

Please sign in to comment.