diff --git a/beat/web/common/api.py b/beat/web/common/api.py index 40e151bcb22869f6ff1d8a902b0d466248f628db..c18ae90a13fbd1040b0c3b46907485d631787f52 100644 --- a/beat/web/common/api.py +++ b/beat/web/common/api.py @@ -37,8 +37,14 @@ from .responses import BadRequestResponse, ForbiddenResponse from .models import Contribution, Versionable from .permissions import IsAuthor from .exceptions import ShareError, BaseCreationError -from .serializers import SharingSerializer, ContributionSerializer, CheckNameSerializer, DiffSerializer +from .serializers import ( + SharingSerializer, + ContributionSerializer, + CheckNameSerializer, + DiffSerializer, +) from .mixins import CommonContextMixin, SerializerFieldsMixin, IsAuthorOrReadOnlyMixin +from .utils import py3_cmp from . import is_true @@ -49,7 +55,7 @@ class CheckContributionNameView(CommonContextMixin, generics.CreateAPIView): def get_serializer_context(self): context = super(CheckContributionNameView, self).get_serializer_context() - context['model'] = self.model + context["model"] = self.model return context def post(self, request): @@ -63,17 +69,19 @@ class ShareView(CommonContextMixin, generics.CreateAPIView): serializer_class = SharingSerializer def get_queryset(self): - author_name = self.kwargs.get('author_name') - object_name = self.kwargs.get('object_name') - version = self.kwargs.get('version') - return get_object_or_404(self.model, - author__username__iexact=author_name, - name__iexact=object_name, - version=version) + author_name = self.kwargs.get("author_name") + object_name = self.kwargs.get("object_name") + version = self.kwargs.get("version") + return get_object_or_404( + self.model, + author__username__iexact=author_name, + name__iexact=object_name, + version=version, + ) def do_share(self, obj, data): - users = data.get('users', None) - teams = data.get('teams', None) + users = data.get("users", None) + teams = data.get("teams", None) obj.share(users=users, teams=teams) def post(self, request, *args, **kwargs): @@ -93,7 +101,9 @@ class ShareView(CommonContextMixin, generics.CreateAPIView): return Response(object_db.sharing_preferences()) -class ListContributionView(CommonContextMixin, SerializerFieldsMixin, generics.ListAPIView): +class ListContributionView( + CommonContextMixin, SerializerFieldsMixin, generics.ListAPIView +): model = Contribution serializer_class = ContributionSerializer permission_classes = [permissions.AllowAny] @@ -103,33 +113,42 @@ class ListContributionView(CommonContextMixin, SerializerFieldsMixin, generics.L def get(self, request, *args, **kwargs): fields_to_return = self.get_serializer_fields(request) - limit_to_latest_versions = is_true(request.query_params.get('latest_versions', False)) + limit_to_latest_versions = is_true( + request.query_params.get("latest_versions", False) + ) all_contributions = self.get_queryset().select_related() - if hasattr(self.model, 'author'): - all_contributions = all_contributions.order_by('author__username', 'name', '-version') + if hasattr(self.model, "author"): + all_contributions = all_contributions.order_by( + "author__username", "name", "-version" + ) else: - all_contributions = all_contributions.order_by('name', '-version') + all_contributions = all_contributions.order_by("name", "-version") if limit_to_latest_versions: all_contributions = self.model.filter_latest_versions(all_contributions) # Sort the data formats and sends the response - all_contributions.sort(lambda x, y: cmp(x.fullname(), y.fullname())) + all_contributions.sort(lambda x, y: py3_cmp(x.fullname(), y.fullname())) - serializer = self.get_serializer(all_contributions, many=True, fields=fields_to_return) + serializer = self.get_serializer( + all_contributions, many=True, fields=fields_to_return + ) return Response(serializer.data) -class ListCreateBaseView(CommonContextMixin, SerializerFieldsMixin, generics.ListCreateAPIView): - +class ListCreateBaseView( + CommonContextMixin, SerializerFieldsMixin, generics.ListCreateAPIView +): def get_serializer(self, *args, **kwargs): - if self.request.method == 'POST': + if self.request.method == "POST": self.serializer_class = self.writing_serializer_class return super(ListCreateBaseView, self).get_serializer(*args, **kwargs) def get(self, request, *args, **kwargs): fields_to_return = self.get_serializer_fields(request) - limit_to_latest_versions = is_true(request.query_params.get('latest_versions', False)) + limit_to_latest_versions = is_true( + request.query_params.get("latest_versions", False) + ) objects = self.get_queryset().select_related() @@ -143,7 +162,7 @@ class ListCreateBaseView(CommonContextMixin, SerializerFieldsMixin, generics.Lis serializer = self.get_serializer(data=request.data) if serializer.is_valid(): try: - if hasattr(self.model, 'author'): + if hasattr(self.model, "author"): db_object = serializer.save(author=request.user) else: db_object = serializer.save() @@ -157,22 +176,25 @@ class ListCreateBaseView(CommonContextMixin, SerializerFieldsMixin, generics.Lis html_view_args.insert(0, db_object.author.username) result = { - 'name': db_object.name, - 'full_name': db_object.fullname(), - 'url': reverse('{}:all'.format(self.namespace)) + db_object.fullname() + '/', - 'object_view': reverse('{}:view'.format(self.namespace.split('_')[1]), args=html_view_args), + "name": db_object.name, + "full_name": db_object.fullname(), + "url": reverse("{}:all".format(self.namespace)) + + db_object.fullname() + + "/", + "object_view": reverse( + "{}:view".format(self.namespace.split("_")[1]), args=html_view_args + ), } response = Response(result, status=201) - response['Location'] = result['url'] + response["Location"] = result["url"] return response class ListCreateContributionView(IsAuthorOrReadOnlyMixin, ListCreateBaseView): - def get_queryset(self): user = self.request.user - author_name = self.kwargs.get('author_name') + author_name = self.kwargs.get("author_name") return self.model.objects.from_author_and_public(user, author_name) @@ -183,19 +205,22 @@ class DiffView(generics.RetrieveAPIView): def get(self, request, author1, name1, version1, author2, name2, version2): # Retrieve the objects try: - object1 = self.model.objects.get(author__username__iexact=author1, - name__iexact=name1, - version=int(version1)) - except: - return Response('%s/%s/%s' % (author1, name1, version1), status=404) + object1 = self.model.objects.get( + author__username__iexact=author1, + name__iexact=name1, + version=int(version1), + ) + except Exception: + return Response("%s/%s/%s" % (author1, name1, version1), status=404) try: - object2 = self.model.objects.get(author__username__iexact=author2, - name__iexact=name2, - version=int(version2)) - except: - return Response('%s/%s/%s' % (author2, name2, version2), status=404) - + object2 = self.model.objects.get( + author__username__iexact=author2, + name__iexact=name2, + version=int(version2), + ) + except Exception: + return Response("%s/%s/%s" % (author2, name2, version2), status=404) # Check that the user can access them accessibility = object1.accessibility_for(request.user) @@ -207,27 +232,39 @@ class DiffView(generics.RetrieveAPIView): return ForbiddenResponse(object2.fullname()) # Compute the diff - serializer = self.get_serializer({'object1': object1, - 'object2': object2}) + serializer = self.get_serializer({"object1": object1, "object2": object2}) return Response(serializer.data) -class RetrieveUpdateDestroyContributionView(CommonContextMixin, SerializerFieldsMixin, IsAuthorOrReadOnlyMixin, generics.RetrieveUpdateDestroyAPIView): +class RetrieveUpdateDestroyContributionView( + CommonContextMixin, + SerializerFieldsMixin, + IsAuthorOrReadOnlyMixin, + generics.RetrieveUpdateDestroyAPIView, +): model = Contribution def get_queryset(self): - version = self.kwargs.get('version', None) - author_name = self.kwargs.get('author_name') - object_name = self.kwargs.get('object_name') + version = self.kwargs.get("version", None) + author_name = self.kwargs.get("author_name") + object_name = self.kwargs.get("object_name") user = self.request.user if version is not None: - queryset = self.model.objects.for_user(user, True).filter(author__username__iexact=author_name, - name__iexact=object_name, - version__gte=version)\ - .order_by('version') + queryset = ( + self.model.objects.for_user(user, True) + .filter( + author__username__iexact=author_name, + name__iexact=object_name, + version__gte=version, + ) + .order_by("version") + ) else: - queryset = self.model.objects.for_user(user, True).filter(author__username__iexact=author_name, - name__iexact=object_name).order_by('-version') + queryset = ( + self.model.objects.for_user(user, True) + .filter(author__username__iexact=author_name, name__iexact=object_name) + .order_by("-version") + ) return queryset @@ -237,40 +274,47 @@ class RetrieveUpdateDestroyContributionView(CommonContextMixin, SerializerFields if db_objects.count() == 0: return Response(status=404) - db_object = db_objects[0] - version = int(self.kwargs.get('version', -1)) + version = int(self.kwargs.get("version", -1)) if version != -1 and db_object.version != version: return Response(status=404) # Process the query string - allow_sharing = hasattr(db_object, 'author') and (request.user == db_object.author) + allow_sharing = hasattr(db_object, "author") and ( + request.user == db_object.author + ) - fields_to_return = self.get_serializer_fields(request, allow_sharing=allow_sharing) + fields_to_return = self.get_serializer_fields( + request, allow_sharing=allow_sharing + ) serializer = self.get_serializer(db_object, fields=fields_to_return) return Response(serializer.data) - def delete(self, request, *args, **kwargs): - author_name = self.kwargs.get('author_name') - object_name = self.kwargs.get('object_name') - version = self.kwargs.get('version', None) + author_name = self.kwargs.get("author_name") + object_name = self.kwargs.get("object_name") + version = self.kwargs.get("version", None) # Retrieve the object if version is None: - return BadRequestResponse('A version number must be provided') + return BadRequestResponse("A version number must be provided") - db_object = get_object_or_404(self.model, - author__username__iexact=author_name, - name__iexact=object_name, - version=version) + db_object = get_object_or_404( + self.model, + author__username__iexact=author_name, + name__iexact=object_name, + version=version, + ) # Check that the object can be deleted - if not(db_object.deletable()): - return ForbiddenResponse("The {} can't be deleted anymore (needed by an attestation, an algorithm or another data format)".format(db_object.model_name())) - + if not (db_object.deletable()): + return ForbiddenResponse( + "The {} can't be deleted anymore (needed by an attestation, an algorithm or another data format)".format( + db_object.model_name() + ) + ) # Deletion of the object db_object.delete()