예제 #1
0
    def post(self, request, sessions, *args, **kwargs):
        """Lock the given resources one by one.

        Note:
            If one of the resources fails to lock, all the resources that has
            been locked until that resource will be released.
        """
        username = get_username(request)
        session = sessions[request.model.token]
        descriptors = request.model.descriptors

        if not auth_models.User.objects.filter(username=username).exists():
            raise BadRequest(USER_NOT_EXIST.format(username))

        locked_resources = []
        user = auth_models.User.objects.get(username=username)
        groups = list(user.groups.all())
        with transaction.atomic():
            for descriptor_dict in descriptors:
                locked_resources.append(
                    self._try_to_lock_available_resource(
                        username, groups, descriptor_dict))

        for resource in locked_resources:
            session.resources.append(resource)

        encoder = JSONParser()
        response = [
            encoder.encode(_resource) for _resource in locked_resources
        ]
        return Response({"resource_descriptors": response}, status=httplib.OK)
예제 #2
0
    def post(self, request, sessions, *args, **kwargs):
        """Release the given resources one by one."""
        errors = {}
        username = get_username(request)
        session = sessions[request.model.token]
        with transaction.atomic():
            for name in request.model.resources:
                try:
                    resource_data = ResourceData.objects.select_for_update() \
                        .get(name=name)

                except ObjectDoesNotExist:
                    errors[name] = (ResourceDoesNotExistError.ERROR_CODE,
                                    "Resource %r doesn't exist" % name)
                    continue

                resource = get_sub_model(resource_data)

                try:
                    self.release_resource(resource, username)
                    session.resources.remove(resource)

                except ServerError as ex:
                    errors[name] = (ex.ERROR_CODE, ex.get_error_content())

        if len(errors) > 0:
            return Response(
                {
                    "errors": errors,
                    "details": "errors occurred while releasing resource"
                },
                status=httplib.BAD_REQUEST)

        return Response({}, status=httplib.NO_CONTENT)
예제 #3
0
    def post(self, request, sessions, *args, **kwargs):
        """Clean up user's requests and locked resources.

        Args:
            username (str): the username to cleanup.

        Returns:
            SuccessReply. a reply indicating on a successful operation.
        """
        username = get_username(request)
        session = sessions[request.model.token]
        for resource in session.resources:
            ReleaseResources.release_resource(resource, username=None)

        return Response({
            "details": "User {} was successfully cleaned".format(username)
        }, status=http_client.NO_CONTENT)