Skip to content

Commit

Permalink
OpenConceptLab/ocl_issues#1338 | refactoring views/mixins to have wri…
Browse files Browse the repository at this point in the history
…te import order
  • Loading branch information
snyaggarwal committed Aug 1, 2022
1 parent 565dd6c commit 757fe08
Show file tree
Hide file tree
Showing 5 changed files with 51 additions and 53 deletions.
4 changes: 2 additions & 2 deletions core/collections/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
from core.common.mixins import (
ConceptDictionaryCreateMixin, ListWithHeadersMixin, ConceptDictionaryUpdateMixin,
ConceptContainerExportMixin,
ConceptContainerProcessingMixin, ConceptContainerExtraRetrieveUpdateDestroyView)
ConceptContainerProcessingMixin)
from core.common.permissions import (
CanViewConceptDictionary, CanEditConceptDictionary, HasAccessToVersionedObject,
CanViewConceptDictionaryVersion
Expand All @@ -53,7 +53,7 @@
index_expansion_mappings, link_references_to_resources, reference_old_to_new_structure, \
link_all_references_to_resources, link_expansions_repo_versions
from core.common.utils import compact_dict_by_values, parse_boolean_query_param
from core.common.views import BaseAPIView, BaseLogoView
from core.common.views import BaseAPIView, BaseLogoView, ConceptContainerExtraRetrieveUpdateDestroyView
from core.concepts.documents import ConceptDocument
from core.concepts.models import Concept
from core.concepts.search import ConceptSearch
Expand Down
48 changes: 1 addition & 47 deletions core/common/mixins.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,11 @@
from django.utils.functional import cached_property
from pydash import compact, get
from rest_framework import status
from rest_framework.generics import RetrieveUpdateDestroyAPIView
from rest_framework.mixins import ListModelMixin, CreateModelMixin
from rest_framework.response import Response

from core.common.constants import HEAD, ACCESS_TYPE_NONE, INCLUDE_FACETS, \
LIST_DEFAULT_LIMIT, HTTP_COMPRESS_HEADER, CSV_DEFAULT_LIMIT, FACETS_ONLY, NOT_FOUND, \
MUST_SPECIFY_EXTRA_PARAM_IN_BODY, INCLUDE_RETIRED_PARAM
LIST_DEFAULT_LIMIT, HTTP_COMPRESS_HEADER, CSV_DEFAULT_LIMIT, FACETS_ONLY, INCLUDE_RETIRED_PARAM
from core.common.permissions import HasPrivateAccess, HasOwnership, CanViewConceptDictionary, \
CanViewConceptDictionaryVersion
from .utils import write_csv_to_s3, get_csv_from_s3, get_query_params_from_url_string, compact_dict_by_values, \
Expand Down Expand Up @@ -714,47 +712,3 @@ def post(self, request, *args, **kwargs): # pylint: disable=unused-argument
version.clear_processing()

return Response(status=status.HTTP_200_OK)


class ConceptContainerExtraRetrieveUpdateDestroyView(RetrieveUpdateDestroyAPIView):
def retrieve(self, request, *args, **kwargs):
key = kwargs.get('extra')
instance = self.get_object()
extras = get(instance, 'extras', {})
if key in extras:
return Response({key: extras[key]})

return Response(dict(detail=NOT_FOUND), status=status.HTTP_404_NOT_FOUND)

def update(self, request, **kwargs): # pylint: disable=arguments-differ
key = kwargs.get('extra')
value = request.data.get(key)
if not value:
return Response([MUST_SPECIFY_EXTRA_PARAM_IN_BODY.format(key)], status=status.HTTP_400_BAD_REQUEST)

instance = self.get_object()
instance.extras = get(instance, 'extras', {})
instance.extras[key] = value
instance.comment = f'Updated extras: {key}={value}.'
head = instance.get_head()
head.extras = get(head, 'extras', {})
head.extras.update(instance.extras)
instance.save()
head.save()
return Response({key: value})

def delete(self, request, *args, **kwargs):
key = kwargs.get('extra')
instance = self.get_object()
instance.extras = get(instance, 'extras', {})
if key in instance.extras:
del instance.extras[key]
instance.comment = f'Deleted extra {key}.'
head = instance.get_head()
head.extras = get(head, 'extras', {})
del head.extras[key]
instance.save()
head.save()
return Response(status=status.HTTP_204_NO_CONTENT)

return Response(dict(detail=NOT_FOUND), status=status.HTTP_404_NOT_FOUND)
44 changes: 44 additions & 0 deletions core/common/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -930,3 +930,47 @@ def post(self, request, *args, **kwargs): # pylint: disable=unused-argument
Concept.batch_index(concepts, ConceptDocument)

return Response(status=status.HTTP_204_NO_CONTENT)


class ConceptContainerExtraRetrieveUpdateDestroyView(RetrieveUpdateDestroyAPIView):
def retrieve(self, request, *args, **kwargs):
key = kwargs.get('extra')
instance = self.get_object()
extras = get(instance, 'extras', {})
if key in extras:
return Response({key: extras[key]})

return Response(dict(detail=NOT_FOUND), status=status.HTTP_404_NOT_FOUND)

def update(self, request, **kwargs): # pylint: disable=arguments-differ
key = kwargs.get('extra')
value = request.data.get(key)
if not value:
return Response([MUST_SPECIFY_EXTRA_PARAM_IN_BODY.format(key)], status=status.HTTP_400_BAD_REQUEST)

instance = self.get_object()
instance.extras = get(instance, 'extras', {})
instance.extras[key] = value
instance.comment = f'Updated extras: {key}={value}.'
head = instance.get_head()
head.extras = get(head, 'extras', {})
head.extras.update(instance.extras)
instance.save()
head.save()
return Response({key: value})

def delete(self, request, *args, **kwargs):
key = kwargs.get('extra')
instance = self.get_object()
instance.extras = get(instance, 'extras', {})
if key in instance.extras:
del instance.extras[key]
instance.comment = f'Deleted extra {key}.'
head = instance.get_head()
head.extras = get(head, 'extras', {})
del head.extras[key]
instance.save()
head.save()
return Response(status=status.HTTP_204_NO_CONTENT)

return Response(dict(detail=NOT_FOUND), status=status.HTTP_404_NOT_FOUND)
4 changes: 2 additions & 2 deletions core/sources/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,15 @@
from core.client_configs.views import ResourceClientConfigsView
from core.common.constants import HEAD, RELEASED_PARAM, PROCESSING_PARAM, ACCESS_TYPE_NONE
from core.common.mixins import ListWithHeadersMixin, ConceptDictionaryCreateMixin, ConceptDictionaryUpdateMixin, \
ConceptContainerExportMixin, ConceptContainerProcessingMixin, ConceptContainerExtraRetrieveUpdateDestroyView
ConceptContainerExportMixin, ConceptContainerProcessingMixin
from core.common.permissions import CanViewConceptDictionary, CanEditConceptDictionary, HasAccessToVersionedObject, \
CanViewConceptDictionaryVersion
from core.common.serializers import TaskSerializer
from core.common.swagger_parameters import q_param, limit_param, sort_desc_param, sort_asc_param, exact_match_param, \
page_param, verbose_param, include_retired_param, updated_since_param, include_facets_header, compress_header
from core.common.tasks import export_source, index_source_concepts, index_source_mappings, delete_source
from core.common.utils import parse_boolean_query_param, compact_dict_by_values
from core.common.views import BaseAPIView, BaseLogoView
from core.common.views import BaseAPIView, BaseLogoView, ConceptContainerExtraRetrieveUpdateDestroyView
from core.sources.constants import DELETE_FAILURE, DELETE_SUCCESS, VERSION_ALREADY_EXISTS
from core.sources.documents import SourceDocument
from core.sources.models import Source
Expand Down
4 changes: 2 additions & 2 deletions core/users/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@
from django.urls import reverse
from rest_framework.authtoken.models import Token

from core.common.mixins import SourceContainerMixin
from core.common.models import BaseModel, CommonLogoModel
from core.common.tasks import send_user_verification_email, send_user_reset_password_email
from core.common.utils import web_url
from core.users.constants import AUTH_GROUPS
from .constants import USER_OBJECT_TYPE
from core.common.mixins import SourceContainerMixin


class UserProfile(AbstractUser, BaseModel, CommonLogoModel, SourceContainerMixin):
Expand All @@ -32,8 +32,8 @@ class Meta:
website = models.TextField(null=True, blank=True)
verified = models.BooleanField(default=True)
verification_token = models.TextField(null=True, blank=True)
mnemonic_attr = 'username'
deactivated_at = models.DateTimeField(null=True, blank=True)
mnemonic_attr = 'username'

es_fields = {
'username': {'sortable': True, 'filterable': True, 'exact': True},
Expand Down

0 comments on commit 757fe08

Please sign in to comment.