Esempio n. 1
0
 def has_permission(self, request, view):
     if admin_check(request.user):
         return True
     if request.method in permissions.SAFE_METHODS:
         return True
     return developer_check(
         request.user) and request.method in ("POST", "PATCH")
Esempio n. 2
0
    def get_context_data(self, **kwargs):
        context = super(ContainerRunUpdate, self).get_context_data(**kwargs)
        context['is_dev'] = developer_check(self.request.user)
        state_names = dict(ContainerRun.STATES)
        context['state_name'] = state_names.get(self.object.state)
        data_entries = []

        if self.object.original_run:
            dataset_comparisons = compare_rerun_datasets(
                self.object.original_run, self.object)
            data_entries = [dict(**c._asdict()) for c in dataset_comparisons]
        else:
            data_entries = [
                dict(type=run_dataset.argument.get_type_display(),
                     url=run_dataset.dataset.get_view_url(),
                     name=run_dataset.dataset.name,
                     size=run_dataset.dataset.get_formatted_filesize(),
                     created=run_dataset.dataset.date_created)
                for run_dataset in self.object.datasets.all()
            ]
        inputtype = dict(ContainerArgument.TYPES)[ContainerArgument.INPUT]
        input_count = sum(d["type"] == inputtype for d in data_entries)

        log_names = dict(ContainerLog.TYPES)
        for log in self.object.logs.order_by('type'):
            data_entries.insert(
                input_count,
                dict(type='Log',
                     url=log.get_absolute_url(),
                     name=log_names[log.type],
                     size=log.size_display,
                     created=self.object.end_time))
        context['data_entries'] = data_entries
        return context
Esempio n. 3
0
File: ajax.py Progetto: cfe-lab/Kive
    def pipelines(self, request, pk=None):
        """In this routine, we are responding to an API request which looks something
        like: 'hostname:/api/pipelinefamilies/2/pipelines/'

        """
        qp = self.request.query_params
        if qp.get('is_granted') == 'true':
            is_developer = False
        else:
            is_developer = developer_check(self.request.user)
        only_is_published = qp.get('only_is_published') == 'true'
        LOGGER.debug("ISPUBLISHED {} ISADMIN {}".format(only_is_published, is_developer))

        qs = self.get_object().members.all()
        # Filter out the unpublished ones if necessary.
        if only_is_published:
            qs = qs.filter(published=True)

        member_pipelines = AccessControl.filter_by_user(request.user,
                                                        is_admin=is_developer,
                                                        queryset=qs)

        member_serializer = PipelineSerializer(member_pipelines, many=True,
                                               context={"request": request})
        return Response(member_serializer.data)
Esempio n. 4
0
    def pipelines(self, request, pk=None):
        """In this routine, we are responding to an API request which looks something
        like: 'hostname:/api/pipelinefamilies/2/pipelines/'

        """
        qp = self.request.query_params
        if qp.get('is_granted') == 'true':
            is_developer = False
        else:
            is_developer = developer_check(self.request.user)
        only_is_published = qp.get('only_is_published') == 'true'
        LOGGER.debug("ISPUBLISHED {} ISADMIN {}".format(
            only_is_published, is_developer))

        qs = self.get_object().members.all()
        # Filter out the unpublished ones if necessary.
        if only_is_published:
            qs = qs.filter(published=True)

        member_pipelines = AccessControl.filter_by_user(request.user,
                                                        is_admin=is_developer,
                                                        queryset=qs)

        member_serializer = PipelineSerializer(member_pipelines,
                                               many=True,
                                               context={"request": request})
        return Response(member_serializer.data)
Esempio n. 5
0
File: ajax.py Progetto: cfe-lab/Kive
    def get_serializer_context(self):
        """
        Return the context for the serializer.

        Here, we add the only_is_published flag to the context.
        """
        context = super(PipelineFamilyViewSet, self).get_serializer_context()
        is_developer = developer_check(self.request.user)
        context["only_is_published"] = not is_developer
        return context
Esempio n. 6
0
    def get_serializer_context(self):
        """
        Return the context for the serializer.

        Here, we add the only_is_published flag to the context.
        """
        context = super(PipelineFamilyViewSet, self).get_serializer_context()
        is_developer = developer_check(self.request.user)
        context["only_is_published"] = not is_developer
        return context
Esempio n. 7
0
 def get_context_data(self, **kwargs):
     context = super(ContainerRunUpdate, self).get_context_data(**kwargs)
     context['is_dev'] = developer_check(self.request.user)
     state_names = dict(ContainerRun.STATES)
     context['state_name'] = state_names.get(self.object.state)
     data_entries = []
     type_names = dict(ContainerArgument.TYPES)
     input_count = 0
     for run_dataset in self.object.datasets.all():
         data_entry = dict(
             type=type_names[run_dataset.argument.type],
             url=run_dataset.dataset.get_view_url(),
             name=run_dataset.dataset.name,
             size=run_dataset.dataset.get_formatted_filesize(),
             created=run_dataset.dataset.date_created)
         if self.object.original_run:
             # noinspection PyUnresolvedReferences
             try:
                 original_container_dataset = self.object.original_run.datasets.get(
                     argument=run_dataset.argument)
             except ContainerDataset.DoesNotExist:
                 original_md5 = None
             else:
                 original_dataset = original_container_dataset.dataset
                 original_md5 = original_dataset.MD5_checksum
             is_changed = original_md5 == run_dataset.dataset.MD5_checksum
             data_entry['is_changed'] = 'no' if is_changed else 'YES'
         data_entries.append(data_entry)
         if run_dataset.argument.type == ContainerArgument.INPUT:
             input_count += 1
     log_names = dict(ContainerLog.TYPES)
     for log in self.object.logs.order_by('type'):
         data_entries.insert(
             input_count,
             dict(type='Log',
                  url=log.get_absolute_url(),
                  name=log_names[log.type],
                  size=log.size_display,
                  created=self.object.end_time))
     context['data_entries'] = data_entries
     return context
Esempio n. 8
0
 def get_context_data(self, **kwargs):
     context = super(ContainerRunUpdate, self).get_context_data(**kwargs)
     context['is_dev'] = developer_check(self.request.user)
     state_names = dict(ContainerRun.STATES)
     context['state_name'] = state_names.get(self.object.state)
     data_entries = []
     type_names = dict(ContainerArgument.TYPES)
     input_count = 0
     for run_dataset in self.object.datasets.all():
         data_entry = dict(type=type_names[run_dataset.argument.type],
                           url=run_dataset.dataset.get_view_url(),
                           name=run_dataset.dataset.name,
                           size=run_dataset.dataset.get_formatted_filesize(),
                           created=run_dataset.dataset.date_created)
         if self.object.original_run:
             # noinspection PyUnresolvedReferences
             try:
                 original_container_dataset = self.object.original_run.datasets.get(
                     argument=run_dataset.argument)
             except ContainerDataset.DoesNotExist:
                 original_md5 = None
             else:
                 original_dataset = original_container_dataset.dataset
                 original_md5 = original_dataset.MD5_checksum
             is_changed = original_md5 == run_dataset.dataset.MD5_checksum
             data_entry['is_changed'] = 'no' if is_changed else 'YES'
         data_entries.append(data_entry)
         if run_dataset.argument.type == ContainerArgument.INPUT:
             input_count += 1
     log_names = dict(ContainerLog.TYPES)
     for log in self.object.logs.order_by('type'):
         data_entries.insert(input_count, dict(
             type='Log',
             url=log.get_absolute_url(),
             name=log_names[log.type],
             size=log.size_display,
             created=self.object.end_time))
     context['data_entries'] = data_entries
     return context
Esempio n. 9
0
def view_results(request, run_id):
    """View outputs from a pipeline run."""
    go_back_to_view = request.GET.get('back_to_view', None) == 'true'

    four_oh_four = False
    try:
        # If we're going to change the permissions, this will make it faster.
        # FIXME punch this up so it gets the top-level runs of the ExecRecords it reuses
        run = Run.objects.prefetch_related(
            "runsteps__RSICs__outputs__integrity_checks__usurper",
            "runsteps__outputs__integrity_checks__usurper",
            "runoutputcables__outputs__integrity_checks__usurper",
            "runsteps__execrecord__generator__record__runstep__run",
            "runsteps__RSICs__execrecord__generator__record__runsic__runstep__run",
            "runoutputcables__execrecord__generator__record__runoutputcable__run"
        ).get(pk=run_id)

        if run.is_subrun():
            four_oh_four = True

        if not run.can_be_accessed(request.user) and not admin_check(request.user):
            four_oh_four = True
    except Run.DoesNotExist:
        four_oh_four = True
    if four_oh_four:
        raise Http404("ID {} does not exist or is not accessible".format(run_id))

    with transaction.atomic():
        run_complete = run.is_complete()

    if request.method == "POST":
        # We don't allow changing anything until after the Run is finished.
        if not run_complete:
            # A form which we can use to make submission and editing easier.
            run_form = RunDetailsForm(
                users_allowed=User.objects.none(),
                groups_allowed=Group.objects.none(),
                initial={"name": run.name, "description": run.description}
            )
            run_form.add_error(None, "This run cannot be modified until it is complete.")

        else:
            # We are going to try and update this Run.  We don't bother restricting the
            # PermissionsField here; instead we will catch errors at the model validation
            # step.
            run_form = RunDetailsForm(
                request.POST,
                instance=run
            )
            try:
                if run_form.is_valid():
                    with transaction.atomic():
                        run.name = run_form.cleaned_data["name"]
                        run.description = run_form.cleaned_data["description"]
                        run.save()
                        run.increase_permissions_from_json(run_form.cleaned_data["permissions"])
                        run.clean()

                    if go_back_to_view:
                        return HttpResponseRedirect("/view_run/{}".format(run_id))
                    else:
                        return HttpResponseRedirect("/runs")

            except (AttributeError, ValidationError, ValueError) as e:
                LOGGER.exception(e.message)
                run_form.add_error(None, e)

    else:
        # A form which we can use to make submission and editing easier.
        run_form = RunDetailsForm(
            users_allowed=User.objects.none(),
            groups_allowed=Group.objects.none(),
            initial={"name": run.name, "description": run.description}
        )

    template = loader.get_template("sandbox/view_results.html")

    context = {
        "run": run,
        "outputs": JSONRenderer().render(RunOutputsSerializer(run, context={'request': request}).data),
        "run_form": run_form,
        "is_complete": run_complete,
        "is_owner": run.user == request.user,
        "is_user_admin": admin_check(request.user),
        "is_user_developer": developer_check(request.user),
        "back_to_view": go_back_to_view
    }

    return HttpResponse(template.render(context, request))
Esempio n. 10
0
def view_results(request, run_id):
    """View outputs from a pipeline run."""
    go_back_to_view = request.GET.get('back_to_view', None) == 'true'

    four_oh_four = False
    try:
        # If we're going to change the permissions, this will make it faster.
        # FIXME punch this up so it gets the top-level runs of the ExecRecords it reuses
        run = Run.objects.prefetch_related(
            "runsteps__RSICs__outputs__integrity_checks__usurper",
            "runsteps__outputs__integrity_checks__usurper",
            "runoutputcables__outputs__integrity_checks__usurper",
            "runsteps__execrecord__generator__record__runstep__run",
            "runsteps__RSICs__execrecord__generator__record__runsic__runstep__run",
            "runoutputcables__execrecord__generator__record__runoutputcable__run"
        ).get(pk=run_id)

        if run.is_subrun():
            four_oh_four = True

        if not run.can_be_accessed(request.user) and not admin_check(
                request.user):
            four_oh_four = True
    except Run.DoesNotExist:
        four_oh_four = True
    if four_oh_four:
        raise Http404(
            "ID {} does not exist or is not accessible".format(run_id))

    with transaction.atomic():
        run_complete = run.is_complete()

    if request.method == "POST":
        # We don't allow changing anything until after the Run is finished.
        if not run_complete:
            # A form which we can use to make submission and editing easier.
            run_form = RunDetailsForm(users_allowed=User.objects.none(),
                                      groups_allowed=Group.objects.none(),
                                      initial={
                                          "name": run.name,
                                          "description": run.description
                                      })
            run_form.add_error(
                None, "This run cannot be modified until it is complete.")

        else:
            # We are going to try and update this Run.  We don't bother restricting the
            # PermissionsField here; instead we will catch errors at the model validation
            # step.
            run_form = RunDetailsForm(request.POST, instance=run)
            try:
                if run_form.is_valid():
                    with transaction.atomic():
                        run.name = run_form.cleaned_data["name"]
                        run.description = run_form.cleaned_data["description"]
                        run.save()
                        run.increase_permissions_from_json(
                            run_form.cleaned_data["permissions"])
                        run.clean()

                    if go_back_to_view:
                        return HttpResponseRedirect(
                            "/view_run/{}".format(run_id))
                    else:
                        return HttpResponseRedirect("/runs")

            except (AttributeError, ValidationError, ValueError) as e:
                LOGGER.exception(e.message)
                run_form.add_error(None, e)

    else:
        # A form which we can use to make submission and editing easier.
        run_form = RunDetailsForm(users_allowed=User.objects.none(),
                                  groups_allowed=Group.objects.none(),
                                  initial={
                                      "name": run.name,
                                      "description": run.description
                                  })

    template = loader.get_template("sandbox/view_results.html")

    context = {
        "run":
        run,
        "outputs":
        JSONRenderer().render(
            RunOutputsSerializer(run, context={
                'request': request
            }).data),
        "run_form":
        run_form,
        "is_complete":
        run_complete,
        "is_owner":
        run.user == request.user,
        "is_user_admin":
        admin_check(request.user),
        "is_user_developer":
        developer_check(request.user),
        "back_to_view":
        go_back_to_view
    }

    return HttpResponse(template.render(context, request))