Exemplo n.º 1
0
def column_summary_boxplot(request, node_id, label, variant_column):
    get_node_subclass_or_404(request.user, node_id)  # Permission check
    graph_class_name = full_class_name(ColumnBoxplotGraph)
    cached_graph = graphcache.async_graph(graph_class_name, node_id, label,
                                          variant_column)
    return HttpResponseRedirect(
        reverse("cached_generated_file_check",
                kwargs={"cgf_id": cached_graph.id}))
Exemplo n.º 2
0
def node_graph(request, node_id, graph_type_id, cmap):
    get_node_subclass_or_404(request.user, node_id)  # Permission check
    node_graph_type = NodeGraphType.objects.get(pk=graph_type_id)
    cached_graph = graphcache.async_graph(node_graph_type.graph_class, cmap,
                                          node_id)
    return HttpResponseRedirect(
        reverse("cached_generated_file_check",
                kwargs={"cgf_id": cached_graph.id}))
Exemplo n.º 3
0
def vcf_locus_filters(request, node_id, vcf_id):
    node = get_node_subclass_or_404(request.user, node_id)
    if vcf_id:
        vcf = VCF.get_for_user(request.user, vcf_id)
    else:
        vcf = None

    context = {"vcf": vcf}
    if vcf:
        vcf_filter_descriptions = {"PASS": "******"}
        set_filters = {}
        for npf in NodeVCFFilter.filter_for_node(node, vcf):
            if npf.vcf_filter:
                filter_id = npf.vcf_filter.filter_id
            else:
                filter_id = "PASS"
            set_filters[filter_id] = True
        existing_filter_settings = {"PASS": "******" in set_filters}

        for vcf_filter in vcf.vcffilter_set.all():
            filter_id = vcf_filter.filter_id
            vcf_filter_descriptions[filter_id] = vcf_filter.description
            existing_filter_settings[filter_id] = filter_id in set_filters

        context["has_filters"] = vcf.has_filters
        context["has_filters_set"] = bool(set_filters)
        context["vlf_form"] = VCFLocusFilterForm(
            vcf_filters=existing_filter_settings)
        context["vlf_descriptions"] = vcf_filter_descriptions

    return render(request, 'analysis/node_editors/vcf_locus_filters.html',
                  context)
Exemplo n.º 4
0
def cohort_zygosity_filters(request, cohort_node_id, cohort_id):
    """ Called from Cohort Node editor - cohort is what's currently selected,
        not what is saved in node """
    cohort_node = get_node_subclass_or_404(request.user, cohort_node_id)
    cohort = Cohort.get_for_user(request.user, cohort_id)

    cnzfc = CohortNodeZygosityFiltersCollection.get_for_node_and_cohort(
        cohort_node, cohort)

    class CohortSampleNameReadOnlyTextInput(forms.TextInput):
        input_type = 'text'

        def render(self, name, value, attrs=None, renderer=None):
            cs = CohortSample.objects.get(pk=value)
            return cs.sample.name

    CNZFFormSet = inlineformset_factory(
        CohortNodeZygosityFiltersCollection,
        CohortNodeZygosityFilter,
        can_delete=False,
        fields=[
            'cohort_sample', 'show_in_grid', 'zygosity_ref', 'zygosity_het',
            'zygosity_hom', 'zygosity_none'
        ],
        widgets={
            'cohort_sample':
            CohortSampleNameReadOnlyTextInput(attrs={'readonly': 'readonly'})
        },
        extra=0)

    formset = CNZFFormSet(request.POST or None, instance=cnzfc)
    context = {'formset': formset}

    template = 'analysis/node_editors/cohort_zygosity_filters.html'
    return render(request, template, context)
Exemplo n.º 5
0
def node_populate_clingen_alleles(request, node_id):
    node = get_node_subclass_or_404(request.user, node_id)
    an_as, _ = AnalysisNodeAlleleSource.objects.get_or_create(node=node)
    populate_clingen_alleles_from_allele_source.si(
        an_as.pk,
        settings.CLINGEN_ALLELE_REGISTRY_MAX_MANUAL_REQUESTS).apply_async()
    return JsonResponse({})
Exemplo n.º 6
0
def node_column_summary(request, analysis_version, node_id, node_version,
                        extra_filters, grid_column_name, significant_figures):
    node = get_node_subclass_or_404(request.user,
                                    node_id,
                                    version=node_version)

    grid = VariantGrid(request.user, node, extra_filters)
    cm = grid.get_column_colmodel(grid_column_name)
    variant_column = cm['name']
    sorttype = cm.get('sorttype')
    quantitative = sorttype in ['float', 'int']

    context = {
        "node_id": node.id,
        "node_version": node.version,
        "extra_filters": extra_filters
    }

    if quantitative:
        label = cm['label']

        poll_url = reverse(column_summary_boxplot,
                           kwargs={
                               "node_id": node_id,
                               "label": label,
                               "variant_column": variant_column
                           })
        context["poll_url"] = poll_url
        template = 'analysis/node_data/node_data_graph.html'
        return render(request, template, context)

    context['grid_column_name'] = grid_column_name
    context['significant_figures'] = int(significant_figures)
    template = 'analysis/node_data/node_data_column_summary_grid.html'
    return render(request, template, context)
Exemplo n.º 7
0
def node_method_description(request, node_id, node_version):
    node = get_node_subclass_or_404(request.user,
                                    node_id,
                                    version=node_version)
    nodes = AnalysisNode.depth_first(node)

    context = {"node": node, "nodes": nodes}
    return render(request, 'analysis/node_method_description.html', context)
Exemplo n.º 8
0
def create_filter_child(request, node_id):
    node = get_node_subclass_or_404(request.user, node_id)
    column_name = request.POST['column_name']
    column_filter = request.POST['column_filter']

    child_node = create_filter_child_node(node, column_name, column_filter)

    data = get_rendering_dict(child_node)
    data["node_id"] = node.get_css_id()
    return JsonResponse(data)
Exemplo n.º 9
0
def node_view(request, analysis_version, node_id, node_version, extra_filters):
    """ So we don't fill up urls with lots of different views, just come here and dispatch
        to subclasses of NodeView in analysis.views.nodes based on the model field """
    node = get_node_subclass_or_404(request.user,
                                    node_id,
                                    version=node_version)
    view = NODE_DISPATCHER[node.__class__]
    return view(request,
                pk=node_id,
                version_id=node_version,
                extra_filters=extra_filters)
Exemplo n.º 10
0
def node_cancel_load(request, node_id):
    node = get_node_subclass_or_404(request.user, node_id)
    if node_task := NodeTask.objects.filter(node=node,
                                            version=node.version).first():
        if node_task.celery_task:
            logging.debug("TODO: Cancelling task %s", node_task.celery_task)
            app.control.revoke(node_task.celery_task,
                               terminate=True)  # @UndefinedVariable

            result = AbortableAsyncResult(node_task.celery_task)
            result.abort()

        if node_task.db_pid:
            run_sql("select pg_cancel_backend(%s)", [node_task.db_pid])
Exemplo n.º 11
0
def get_snp_matrix_counts(user: User, node_id, version_id):
    node = get_node_subclass_or_404(user, node_id, version=version_id)
    qs = node.get_queryset().filter(locus__ref__length=1, alt__length=1)
    count_qs = qs.values_list('locus__ref__seq',
                              'alt__seq').distinct().annotate(Count('id'))

    bases = list('ACGT')
    counts_df = pd.DataFrame(index=bases, columns=bases, dtype='i').fillna(0)

    for ref, alt, count in count_qs:
        if alt == Variant.REFERENCE_ALT:
            alt = ref
        counts_df[ref][alt] = count
    return counts_df
Exemplo n.º 12
0
def node_async_wait(request, analysis_version, node_id, node_version,
                    extra_filters):
    node = get_node_subclass_or_404(request.user, node_id)

    context = {
        "analysis_version": analysis_version,
        "node_id": node_id,
        "node_version": node_version,
        "node": node,
        "extra_filters": extra_filters
    }

    template = 'analysis/node_data/node_async_wait.html'
    return render(request, template, context)
Exemplo n.º 13
0
def create_selected_child(request, node_id):
    node = get_node_subclass_or_404(request.user, node_id)
    x = node.x + 50 + random.randrange(-10, 10)
    y = node.y + 100 + random.randrange(-10, 10)

    selected_node = SelectedInParentNode.objects.create(analysis=node.analysis,
                                                        x=x,
                                                        y=y,
                                                        ready=False)
    selected_node.add_parent(node)
    selected_node.save()
    update_analysis(node.analysis.pk)

    data = get_rendering_dict(selected_node)
    data["node_id"] = node.get_css_id()
    return JsonResponse(data)
Exemplo n.º 14
0
def analysis_template_variable(request, node_id):
    node = get_node_subclass_or_404(request.user, node_id, write=True)

    field = request.POST["field"]
    operation = request.POST["op"]

    kwargs = {"node": node, "field": field}
    if operation == 'add':
        class_name = AnalysisVariable.get_node_field_class_name(node, field)
        AnalysisVariable.objects.get_or_create(**kwargs,
                                               defaults={
                                                   "class_name": class_name
                                               })
    elif operation == 'del':
        AnalysisVariable.objects.filter(**kwargs).delete()

    return JsonResponse({})
Exemplo n.º 15
0
def create_extra_filter_child(request, node_id, extra_filters):
    node = get_node_subclass_or_404(request.user, node_id, write=True)
    x = node.x + 50 + random.randrange(-10, 10)
    y = node.y + 100 + random.randrange(-10, 10)
    filter_node = BuiltInFilterNode.objects.create(
        analysis=node.analysis,
        built_in_filter=extra_filters,
        x=x,
        y=y,
        ready=False)
    filter_node.add_parent(node)
    filter_node.save()

    update_analysis(node.analysis.pk)
    data = get_rendering_dict(filter_node)
    data["node_id"] = node.get_css_id()
    return JsonResponse(data)
Exemplo n.º 16
0
def nodes_copy(request, analysis_id):
    node_ids = json.loads(request.POST["nodes"])
    node_ids = set([int(i) for i in node_ids])

    nodes = []
    edges = []

    analysis = get_analysis_or_404(request.user, analysis_id, write=True)
    nodes_qs = analysis.analysisnode_set.filter(
        id__in=node_ids).select_subclasses()
    topo_sorted = get_toposorted_nodes(nodes_qs)

    old_new_map = {}
    for group in topo_sorted:
        for node in group:
            if analysis_id is None:
                analysis_id = node.analysis_id

            template_node = get_node_subclass_or_404(request.user, node.id)
            parents = template_node.analysisnode_ptr.parents().filter(
                id__in=old_new_map).values_list('id', flat=True)

            clone_node = template_node.save_clone()
            clone_node.x += 10
            clone_node.y += 10
            clone_node.status = NodeStatus.DIRTY
            clone_node.save()
            old_new_map[node.id] = clone_node

            clone_node.adjust_cloned_parents(old_new_map)

            for parent_id in parents:
                new_parent = old_new_map[parent_id]
                new_parent.add_child(clone_node)

                edge = clone_node.get_connection_data(new_parent)
                edges.append(edge)

            if not clone_node.is_valid():
                clone_node.count = None

            clone_node.save()
            nodes.append(get_rendering_dict(clone_node))

    update_analysis(analysis.pk)
    return JsonResponse({"nodes": nodes, "edges": edges})
Exemplo n.º 17
0
def node_data_grid(request, analysis_version, node_id, node_version,
                   extra_filters):
    try:
        node = get_node_subclass_or_404(request.user,
                                        node_id,
                                        version=node_version)
    except NodeOutOfDateException:
        return HttpResponseRedirect(
            reverse("node_load", kwargs={"node_id": node_id}))

    context = {
        "analysis_version": analysis_version,
        "node_id": node_id,
        "node_version": node_version,
        "extra_filters": extra_filters,
        "bams_dict": node.get_bams_dict()
    }
    return render(request, 'analysis/node_data/node_data_grid.html', context)
Exemplo n.º 18
0
def set_variant_selected(request, node_id):
    node = get_node_subclass_or_404(request.user, node_id, write=True)
    variant_id = request.POST['variant_id']
    checked = json.loads(request.POST['checked'])

    kwargs = {"variant_id": variant_id, "node_id": node.pk}
    if checked:
        NodeVariant.objects.get_or_create(**kwargs)
    else:
        NodeVariant.objects.filter(**kwargs).delete()

    kids_qs = AnalysisEdge.objects.filter(parent=node).values_list(
        "child_id", flat=True)  # @UndefinedVariable
    for node in SelectedInParentNode.objects.filter(pk__in=kids_qs):
        node.queryset_dirty = True
        node.save()

    update_analysis(node.analysis.pk)
    return JsonResponse({})
Exemplo n.º 19
0
def node_doc(request, node_id):
    node = get_node_subclass_or_404(request.user, node_id)
    has_write_permission = node.analysis.can_write(request.user)
    form = forms.AnalysisNodeForm(request.POST or None, instance=node)
    if not has_write_permission:
        set_form_read_only(form)

    if request.method == "POST":
        node.analysis.check_can_write(request.user)
        if form.is_valid():
            # Doesn't set "queryset_dirty" so won't cause expensive reloads
            node = form.save()

    context = {
        "form": form,
        "node": node,
        "has_write_permission": has_write_permission
    }
    return render(request, "analysis/node_editors/grid_editor_doc_tab.html",
                  context)
Exemplo n.º 20
0
def node_data_graph(request, analysis_version, node_id, node_version,
                    graph_type_id, cmap):
    context = {
        "node_id": node_id,
        "node_version": node_version,
        "extra_filters": None
    }

    node = get_node_subclass_or_404(request.user,
                                    node_id,
                                    version=node_version)
    poll_url = reverse(node_graph,
                       kwargs={
                           "node_id": node.id,
                           "graph_type_id": graph_type_id,
                           "cmap": cmap
                       })
    context["poll_url"] = poll_url
    template = 'analysis/node_data/node_data_graph.html'
    return render(request, template, context)
Exemplo n.º 21
0
def node_errors(request, analysis_version, node_id, node_version,
                extra_filters):
    try:
        node = get_node_subclass_or_404(request.user,
                                        node_id,
                                        version=node_version)
    except NodeOutOfDateException:
        return HttpResponseRedirect(
            reverse("node_load", kwargs={"node_id": node_id}))

    context = {
        "analysis_version": analysis_version,
        "node_id": node_id,
        "node_version": node_version,
        "node": node,
        "errors": node.get_errors(flat=True),
        "extra_filters": extra_filters,
        "status": node.status
    }

    template = 'analysis/node_data/node_errors.html'
    return render(request, template, context)
Exemplo n.º 22
0
    def __init__(self, user, node_id, node_version, extra_filters,
                 variant_column, significant_figures):
        super().__init__()

        self.node = get_node_subclass_or_404(user,
                                             node_id,
                                             version=node_version)
        grid = VariantGrid(user, self.node, extra_filters)
        cm = grid.get_column_colmodel(variant_column)
        grid_column_name = cm["label"]
        field_formatters = grid.get_field_formatters()
        self.formatter = field_formatters.get(variant_column)
        self.extra_filters = extra_filters
        self.variant_column = variant_column
        self.significant_figures = significant_figures
        self.grid_column_name = grid_column_name
        self._overrides["labels"]["label"] = grid_column_name
        self.extra_config.update({'sortname': 'Counts', 'sortorder': 'desc'})

        # Only want to
        variantgrid_column = VariantGridColumn.objects.filter(
            variant_column=variant_column).first()
        if variantgrid_column:
            self.extra_config["create_filter_child_links"] = True
Exemplo n.º 23
0
def node_debug(request, analysis_version, node_id, node_version,
               extra_filters):
    node = get_node_subclass_or_404(request.user,
                                    node_id,
                                    version=node_version)
    model_name = node._meta.label
    node_serializers = AnalysisNodeSerializer.get_node_serializers()
    serializer_klass = node_serializers.get(model_name, AnalysisNodeSerializer)
    serializer = serializer_klass(node, context={"request": request})

    context = {
        "node": node,
        "node_data": dict(sorted(serializer.data.items()))
    }
    if node.valid:
        grid = VariantGrid(request.user, node, extra_filters)
        try:
            node_sql_, grid_sql = get_node_sql(grid)
            context['node_sql'] = node_sql_
            context['grid_sql'] = grid_sql
        except EmptyResultSet:
            pass
    return render(request, "analysis/node_editors/grid_editor_debug_tab.html",
                  context)
Exemplo n.º 24
0
 def __init__(self, user, node_id, version):
     self.node = get_node_subclass_or_404(user, node_id, version=version)
     super().__init__()
Exemplo n.º 25
0
def node_data(request, node_id):
    node = get_node_subclass_or_404(request.user, node_id)
    return JsonResponse(get_rendering_dict(node))