예제 #1
0
    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})
예제 #2
0
    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)
예제 #3
0
    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)
예제 #4
0
    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)
예제 #5
0
    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({})
예제 #6
0
    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']}")
예제 #7
0
    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)