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)
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)
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)