diff --git a/beat/web/algorithms/api.py b/beat/web/algorithms/api.py index feca27acc23a8f677602a2d82373b0f9b6817da3..e9b7c7723807f3a74800b827d5f45febaeee81b5 100644 --- a/beat/web/algorithms/api.py +++ b/beat/web/algorithms/api.py @@ -33,8 +33,10 @@ from .serializers import AlgorithmCreationSerializer from ..code.api import ShareCodeView, RetrieveUpdateDestroyCodeView from ..code.serializers import CodeDiffSerializer -from ..common.api import (CheckContributionNameView, DiffView, - ListContributionView, ListCreateContributionView) +from ..common.api import (CheckContributionNameView, ListContributionView, + ListCreateContributionView) + +from ..code.api import DiffView #---------------------------------------------------------- diff --git a/beat/web/code/api.py b/beat/web/code/api.py index 22ebaac24158c70f09a3f7b0f2b37e2f8950b464..1a0fdd037e3280be4df23274d117e0c84ce9a2e8 100644 --- a/beat/web/code/api.py +++ b/beat/web/code/api.py @@ -29,12 +29,16 @@ from django.utils import six from django.shortcuts import get_object_or_404 from django.core.exceptions import ValidationError +from rest_framework import generics +from rest_framework import permissions from rest_framework.response import Response from rest_framework.exceptions import PermissionDenied, ParseError from rest_framework import serializers +from ..common.responses import ForbiddenResponse from ..common.api import ShareView, RetrieveUpdateDestroyContributionView from ..common.utils import validate_restructuredtext, ensure_html +from ..common.serializers import DiffSerializer from ..code.models import Code from .serializers import CodeSharingSerializer, CodeSerializer @@ -52,6 +56,43 @@ class ShareCodeView(ShareView): obj.share(public=public, users=users, teams=teams) +class DiffView(generics.RetrieveAPIView): + model = Code + permission_classes = [permissions.IsAuthenticated] + serializer_class = DiffSerializer + + 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) + + 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) + + + # Check that the user can access them + accessibility = object1.accessibility_for(request.user) + if not accessibility[1]: + return ForbiddenResponse(object1.fullname()) + + accessibility = object2.accessibility_for(request.user) + if not accessibility[1]: + return ForbiddenResponse(object2.fullname()) + + # Compute the diff + serializer = self.get_serializer({'object1': object1, + 'object2': object2}) + return Response(serializer.data) + + class RetrieveUpdateDestroyCodeView(RetrieveUpdateDestroyContributionView): model = Code serializer_class = CodeSerializer diff --git a/beat/web/libraries/api.py b/beat/web/libraries/api.py index e7e592a3a7f4543d5d97c2cc8bf9694063e6e111..2473d1c9a8ebd08d2b84643cfe9f1c92ef20ff4b 100644 --- a/beat/web/libraries/api.py +++ b/beat/web/libraries/api.py @@ -33,9 +33,10 @@ from .serializers import LibraryCreationSerializer from ..code.api import ShareCodeView, RetrieveUpdateDestroyCodeView from ..code.serializers import CodeDiffSerializer -from ..common.api import (CheckContributionNameView, DiffView, - ListContributionView, ListCreateContributionView) +from ..common.api import (CheckContributionNameView, ListContributionView, + ListCreateContributionView) +from ..code.api import DiffView #---------------------------------------------------------- diff --git a/beat/web/plotters/api.py b/beat/web/plotters/api.py index 0838d40524c9ea3ef1eb4a85ed3202c9552b2a5a..a0960a9a4b234cd34989fe596b26ae612a7b19d2 100644 --- a/beat/web/plotters/api.py +++ b/beat/web/plotters/api.py @@ -34,8 +34,9 @@ from django.db.models import Q from ..code.api import ShareCodeView, RetrieveUpdateDestroyCodeView from ..code.serializers import CodeDiffSerializer +from ..code.api import DiffView -from ..common.api import (CheckContributionNameView, ShareView, DiffView, +from ..common.api import (CheckContributionNameView, ShareView, ListContributionView, ListCreateContributionView, RetrieveUpdateDestroyContributionView) from ..common.utils import validate_restructuredtext, ensure_html from ..common.responses import BadRequestResponse