1111from django .utils .functional import cached_property
1212from pydash import compact , get
1313from rest_framework import status
14+ from rest_framework .generics import RetrieveUpdateDestroyAPIView
1415from rest_framework .mixins import ListModelMixin , CreateModelMixin
1516from rest_framework .response import Response
1617
1718from core .common .constants import HEAD , ACCESS_TYPE_EDIT , ACCESS_TYPE_VIEW , ACCESS_TYPE_NONE , INCLUDE_FACETS , \
18- LIST_DEFAULT_LIMIT , HTTP_COMPRESS_HEADER , CSV_DEFAULT_LIMIT , FACETS_ONLY
19+ LIST_DEFAULT_LIMIT , HTTP_COMPRESS_HEADER , CSV_DEFAULT_LIMIT , FACETS_ONLY , NOT_FOUND , \
20+ MUST_SPECIFY_EXTRA_PARAM_IN_BODY
1921from core .common .permissions import HasPrivateAccess , HasOwnership , CanViewConceptDictionary
2022from core .common .services import S3
2123from .utils import write_csv_to_s3 , get_csv_from_s3 , get_query_params_from_url_string , compact_dict_by_values
@@ -128,7 +130,7 @@ def list(self, request, *args, **kwargs): # pylint:disable=too-many-locals
128130
129131 sorted_list = self .object_list
130132
131- headers = dict ()
133+ headers = {}
132134 results = sorted_list
133135 if not compress :
134136 paginator = CustomPaginator (
@@ -460,7 +462,7 @@ def from_uri_queryset(cls, uri):
460462 queryset = cls .objects .none ()
461463
462464 try :
463- kwargs = get (resolve (uri ), 'kwargs' , dict () )
465+ kwargs = get (resolve (uri ), 'kwargs' , {} )
464466 query_params = get_query_params_from_url_string (uri ) # parsing query parameters
465467 kwargs .update (query_params )
466468 if 'concept' in kwargs :
@@ -484,7 +486,7 @@ def global_listing_queryset(cls, params, user):
484486
485487 @staticmethod
486488 def get_parent_and_owner_filters_from_uri (uri ):
487- filters = dict ()
489+ filters = {}
488490 if not uri :
489491 return filters
490492
@@ -639,3 +641,47 @@ def post(self, request, *args, **kwargs): # pylint: disable=unused-argument
639641 version .clear_processing ()
640642
641643 return Response (status = status .HTTP_200_OK )
644+
645+
646+ class ConceptContainerExtraRetrieveUpdateDestroyView (RetrieveUpdateDestroyAPIView ):
647+ def retrieve (self , request , * args , ** kwargs ):
648+ key = kwargs .get ('extra' )
649+ instance = self .get_object ()
650+ extras = get (instance , 'extras' , {})
651+ if key in extras :
652+ return Response ({key : extras [key ]})
653+
654+ return Response (dict (detail = NOT_FOUND ), status = status .HTTP_404_NOT_FOUND )
655+
656+ def update (self , request , ** kwargs ): # pylint: disable=arguments-differ
657+ key = kwargs .get ('extra' )
658+ value = request .data .get (key )
659+ if not value :
660+ return Response ([MUST_SPECIFY_EXTRA_PARAM_IN_BODY .format (key )], status = status .HTTP_400_BAD_REQUEST )
661+
662+ instance = self .get_object ()
663+ instance .extras = get (instance , 'extras' , {})
664+ instance .extras [key ] = value
665+ instance .comment = 'Updated extras: %s=%s.' % (key , value )
666+ head = instance .get_head ()
667+ head .extras = get (head , 'extras' , {})
668+ head .extras .update (instance .extras )
669+ instance .save ()
670+ head .save ()
671+ return Response ({key : value })
672+
673+ def delete (self , request , * args , ** kwargs ):
674+ key = kwargs .get ('extra' )
675+ instance = self .get_object ()
676+ instance .extras = get (instance , 'extras' , {})
677+ if key in instance .extras :
678+ del instance .extras [key ]
679+ instance .comment = 'Deleted extra %s.' % key
680+ head = instance .get_head ()
681+ head .extras = get (head , 'extras' , {})
682+ del head .extras [key ]
683+ instance .save ()
684+ head .save ()
685+ return Response (status = status .HTTP_204_NO_CONTENT )
686+
687+ return Response (dict (detail = NOT_FOUND ), status = status .HTTP_404_NOT_FOUND )
0 commit comments