def release(self, request, pk=None): """ Processes release or not release of output """ if not Task.objects.filter(pk=pk, approver_email=request.user.email): return Response({"output": "Not your file"}) task: Task = Task.objects.get(pk=pk) if request.data["released"]: task.state = Task.OUTPUT_RELEASED result = "approved" else: task.state = Task.RELEASE_REJECTED task.permission.state = Permission.ABORTED task.permission.save() result = "rejected" task.save() mail_service.send_mail( mail_files="request_reviewed", receiver=task.author_email, subject=f"The output of your task was {result}", url=f"http://{request.get_host()}/tasks/{task.pk}", reviewable="algorithm output", result=result, ) return Response({"state": task.state})
def create(self, request): """ Request a new permission """ data = JSONParser().parse(request) data["algorithm_provider"] = request.user.email shared_algorithms = self.shares_client.algorithms_shared_by_user( request.user.email) if not data["algorithm"] in shared_algorithms: return Response("The algorithm is not shared by the user", status=403) serializer = PermissionSerializer(data=data) if not serializer.is_valid(): return JsonResponse(serializer.errors, status=400) try: User.objects.get( email=serializer.validated_data["dataset_provider"]) except User.DoesNotExist: return Response( f"{serializer.validated_data['dataset_provider']} needs to create a Data Exchange account first", status=400, ) model = serializer.save() model.review_output = model.permission_type == Permission.ONE_TIME_PERMISSION model.save() logger.debug(f"Sending permission {model.id} to analysis") task_service.analyze(str(model.id)) domain = request.get_host() scheme = "http" if domain.startswith("localhost") else "https" mail_service.send_mail( mail_files="data_request", receiver=model.dataset_provider, subject=f"New data request", url=f"{scheme}://{domain}/requests/{model.pk}", author=model.algorithm_provider, ) return JsonResponse(PermissionSerializer(model).data)
def reject(self, request, pk=None): logger.debug(f"Rejecting permission {pk}") permission = Permission.objects.get(pk=pk) if permission.dataset_provider != request.user.email: return Response(status=403) permission.state = Permission.REJECTED permission.status_description = f"Rejected by ${request.user.email}" permission.save() mail_service.send_mail( mail_files="request_reviewed", receiver=permission.algorithm_provider, subject=f"Your data request was rejected", url=f"http://{request.get_host()}/requests/{pk}", reviewable="data request", result="rejected", ) return JsonResponse(PermissionSerializer(permission).data)
def remove(self, request, pk=None): """ Removes permission from database """ permission: Permission = get_object_or_404( Permission, pk=pk, dataset_provider=request.user.email) permission.state = Permission.REJECTED permission.status_description = datetime.datetime.now() permission.save() mail_service.send_mail( "permission_revoked", permission.algorithm_provider, "Permission revoked for dataset", dataset=permission.dataset, url=f"http://{request.get_host()}/permissions", ) return self.list(request)
def register(self, request): with transaction.atomic(): email = request.data["email"] user = User(email=email, is_active=False) user.set_password(request.data["password"]) user.save() token = account_activation_token.make_token(user) domain = request.get_host() scheme = "http" if domain.startswith("localhost") else "https" url = f"{scheme}://{domain}/register/activate?pk={user.pk}&token={token}" mail_service.send_mail( mail_files="account_activation", receiver=email, subject="Activate your account", **{"url": url}, ) return Response({})
def callback(self, ch, method, properties, body): logger.debug(f"New message {body}") task_progress = json.loads(body) logger.debug(f"Successfully parsed message {task_progress}") task = Task.objects.get(pk=int(task_progress["taskId"])) logger.debug(f"Updating task '{task}'") task.progress_state = task_progress["state"] if task_progress["state"]["name"] == self.TASKER_STATE_REJECTED: logger.debug(f"Task has been rejected") task.permission.state = Permission.ABORTED task.permission.status_description = ( f"Revoking permission automatically: {task_progress['state']['reason']}" ) task.permission.save() task.state = Task.ERROR task.save() return if "output" in task_progress["state"]: task.output = f"{task_progress['state']['output']['stdout']}\n{task_progress['state']['output']['stderr']}" if ( not task.review_output and task_progress["state"]["name"] == self.TASKER_STATE_SUCCESS ): task.state = Task.OUTPUT_RELEASED else: task.state = task_progress["state"]["name"].lower() task.save() if task_progress["state"]["name"] in self.TASKER_TERMINAL_STATES: mail_service.send_mail( mail_files="finished_running", receiver=task.approver_email, subject="Task output is ready for approval", ) logger.info(f"Successfully updated task {task_progress['taskId']}")
def approve(self, request, pk=None): logger.debug(f"Accepting permission {pk}") permission = Permission.objects.get(pk=pk) if permission.dataset_provider != request.user.email: return Response(status=403) permission.dataset = request.data["path"] permission.dataset_storage = request.data["storage"] permission.state = Permission.ACTIVE permission.save() if (permission.permission_type == Permission.USER_PERMISSION or permission.permission_type == Permission.STREAM_PERMISSION): mail_service.send_mail( mail_files="permission_granted_do", receiver=permission.dataset_provider, subject="You granted someone access to your dataset", url=f"http://{request.get_host()}/manage_data", **PermissionSerializer(permission).data, ) mail_service.send_mail( mail_files="permission_granted_ao", receiver=permission.algorithm_provider, subject="You were granted access to a dataset", url=f"http://{request.get_host()}/manage_algorithms", **PermissionSerializer(permission).data, ) else: mail_service.send_mail( mail_files="request_reviewed", receiver=permission.algorithm_provider, subject=f"Your data request was approved", url=f"http://{request.get_host()}/manage_algorithms", reviewable="data request", result="approved", ) return JsonResponse(PermissionSerializer(permission).data)