Exemplo n.º 1
0
def add_family_group_submit(request, project_id):
    project = get_object_or_404(Project, project_id=project_id)
    if not project.can_admin(request.user):
        raise PermissionDenied

    error = None

    form = AddFamilyGroupForm(project, request.POST)
    if form.is_valid():
        # todo: move to sample_anagement
        family_group, created = get_or_create_xbrowse_model(
            FamilyGroup,
            project=project,
            slug=form.cleaned_data['family_group_slug'],
        )
        update_xbrowse_model(family_group, name=form.cleaned_data['name'], description=form.cleaned_data['description'])

        seqr_analysis_group = find_matching_seqr_model(family_group)
        for family in form.cleaned_data['families']:
            family_group.families.add(family)
            seqr_analysis_group.families.add(find_matching_seqr_model(family))
    else:
        error = server_utils.form_error_string(form)

    if error:
        return server_utils.JSONResponse({'is_error': True, 'error': error})
    else:
        return server_utils.JSONResponse({'is_error': False, 'new_url': reverse('family_group_home', args=(project.project_id, family_group.slug))})
Exemplo n.º 2
0
    def handle(self, *args, **options):
        """For each xbrowse_server.base.models.FamilyGroup, create a corresponding seqr.models.AnalysisGroup
        """
        counters = collections.defaultdict(int)
        errors = []
        for source_group in tqdm(
                FamilyGroup.objects.filter(seqr_analysis_group__isnull=True),
                unit=" family groups"):
            counters['FamilyGroups processed'] += 1
            analysis_group = _create_seqr_model(
                source_group,
                name=source_group.name,
                description=source_group.description,
                project=source_group.project,
            )

            if analysis_group:
                analysis_group.families.add(*[
                    find_matching_seqr_model(family)
                    for family in source_group.families.all()
                ])
                counters['AnalysisGroups created'] += 1
            else:
                counters['Errors'] += 1
                errors.append(
                    'Error: unable to transfer "{}" (Project: "{}")'.format(
                        source_group.name, source_group.project.project_name))

        logger.info("Done")
        logger.info("Stats: ")
        for k, v in counters.items():
            logger.info("  %s: %s" % (k, v))
        for error in errors:
            logger.info(error)
Exemplo n.º 3
0
    def handle(self, *args, **options):
        """For each xbrowse_server.base.models.FamilyGroup, create a corresponding seqr.models.AnalysisGroup
        """
        counters = collections.defaultdict(int)
        errors = []
        for source_group in tqdm(FamilyGroup.objects.filter(seqr_analysis_group__isnull=True), unit=" family groups"):
            counters['FamilyGroups processed'] += 1
            analysis_group = _create_seqr_model(
                source_group,
                name=source_group.name,
                description=source_group.description,
                project=source_group.project,
            )

            if analysis_group:
                analysis_group.families.add(*[find_matching_seqr_model(family) for family in source_group.families.all()])
                counters['AnalysisGroups created'] += 1
            else:
                counters['Errors'] += 1
                errors.append('Error: unable to transfer "{}" (Project: "{}")'.format(source_group.name, source_group.project.project_name))

        logger.info("Done")
        logger.info("Stats: ")
        for k, v in counters.items():
            logger.info("  %s: %s" % (k, v))
        for error in errors:
            logger.info(error)
Exemplo n.º 4
0
def add_family_group_submit(request, project_id):
    project = get_object_or_404(Project, project_id=project_id)
    if not project.can_admin(request.user):
        raise PermissionDenied

    error = None

    form = AddFamilyGroupForm(project, request.POST)
    if form.is_valid():
        # todo: move to sample_anagement
        family_group, created = get_or_create_xbrowse_model(
            FamilyGroup,
            project=project,
            slug=form.cleaned_data['family_group_slug'],
        )
        update_xbrowse_model(family_group,
                             name=form.cleaned_data['name'],
                             description=form.cleaned_data['description'])

        seqr_analysis_group = find_matching_seqr_model(family_group)
        for family in form.cleaned_data['families']:
            family_group.families.add(family)
            seqr_analysis_group.families.add(find_matching_seqr_model(family))
    else:
        error = server_utils.form_error_string(form)

    if error:
        return server_utils.JSONResponse({'is_error': True, 'error': error})
    else:
        return server_utils.JSONResponse({
            'is_error':
            False,
            'new_url':
            reverse('family_group_home',
                    args=(project.project_id, family_group.slug))
        })
Exemplo n.º 5
0
def remove_gene_list(request, project_id, gene_list_slug):
    """
    Manager can edit project settings
    """
    project = get_object_or_404(Project, project_id=project_id)
    gene_list = get_object_or_404(GeneList, slug=gene_list_slug)
    if not project.can_admin(request.user):
        raise PermissionDenied

    if request.method == 'POST':
        ProjectGeneList.objects.filter(project=project, gene_list=gene_list).delete()
        if project.seqr_project:
            seqr_locus_list = find_matching_seqr_model(gene_list)
            remove_perm(user_or_group=project.seqr_project.can_view_group, perm=CAN_VIEW, obj=seqr_locus_list)
        return redirect('project_gene_list_settings', project.project_id)

    return render(request, 'project/remove_gene_list.html', {
        'project': project,
        'gene_list': gene_list,
        'new_page_url': '/project/{}/project_page'.format(project.seqr_project.guid) if project.seqr_project else None,
    })
Exemplo n.º 6
0
def remove_gene_list(request, project_id, gene_list_slug):
    """
    Manager can edit project settings
    """
    project = get_object_or_404(Project, project_id=project_id)
    gene_list = get_object_or_404(GeneList, slug=gene_list_slug)
    if not project.can_admin(request.user):
        raise PermissionDenied

    if request.method == 'POST':
        ProjectGeneList.objects.filter(project=project, gene_list=gene_list).delete()
        if project.seqr_project:
            seqr_locus_list = find_matching_seqr_model(gene_list)
            remove_perm(user_or_group=project.seqr_project.can_view_group, perm=CAN_VIEW, obj=seqr_locus_list)
        return redirect('project_gene_list_settings', project.project_id)

    return render(request, 'project/remove_gene_list.html', {
        'project': project,
        'gene_list': gene_list,
        'new_page_url': '/project/{}/project_page'.format(project.seqr_project.guid) if project.seqr_project else None,
    })
Exemplo n.º 7
0
def add_gene_list(request, project_id):
    """
    Manager can edit project settings
    """
    project = get_object_or_404(Project, project_id=project_id)
    if not project.can_admin(request.user):
        raise PermissionDenied

    error = None

    if request.method == 'POST':
        for slug in request.POST.getlist('gene_list_slug'):
            try:
                genelist = GeneList.objects.get(slug=slug)
            except ObjectDoesNotExist:
                error = 'Invalid gene list'
                break
            if not genelist.is_public and genelist.owner != request.user:
                error = 'Unauthorized'
                break

            ProjectGeneList.objects.get_or_create(project=project, gene_list=genelist)
            if project.seqr_project:
                seqr_locus_list = find_matching_seqr_model(genelist)
                assign_perm(user_or_group=project.seqr_project.can_view_group, perm=CAN_VIEW, obj=seqr_locus_list)

        if not error:
            return redirect('project_gene_list_settings', project_id=project_id)

    public_lists = GeneList.objects.filter(is_public=True)

    return render(request, 'project/add_gene_list.html', {
        'project': project,
        'my_lists': GeneList.objects.filter(owner=request.user),
        'public_lists': public_lists,
        'error': error,
        'new_page_url': '/project/{}/project_page'.format(project.seqr_project.guid) if project.seqr_project else None,
    })
Exemplo n.º 8
0
def add_gene_list(request, project_id):
    """
    Manager can edit project settings
    """
    project = get_object_or_404(Project, project_id=project_id)
    if not project.can_admin(request.user):
        raise PermissionDenied

    error = None

    if request.method == 'POST':
        for slug in request.POST.getlist('gene_list_slug'):
            try:
                genelist = GeneList.objects.get(slug=slug)
            except ObjectDoesNotExist:
                error = 'Invalid gene list'
                break
            if not genelist.is_public and genelist.owner != request.user:
                error = 'Unauthorized'
                break

            ProjectGeneList.objects.get_or_create(project=project, gene_list=genelist)
            if project.seqr_project:
                seqr_locus_list = find_matching_seqr_model(genelist)
                assign_perm(user_or_group=project.seqr_project.can_view_group, perm=CAN_VIEW, obj=seqr_locus_list)

        if not error:
            return redirect('project_gene_list_settings', project_id=project_id)

    public_lists = GeneList.objects.filter(is_public=True)

    return render(request, 'project/add_gene_list.html', {
        'project': project,
        'my_lists': GeneList.objects.filter(owner=request.user),
        'public_lists': public_lists,
        'error': error,
        'new_page_url': '/project/{}/project_page'.format(project.seqr_project.guid) if project.seqr_project else None,
    })
Exemplo n.º 9
0
def safe_get_or_create(xbrowse_model):
    seqr_model = find_matching_seqr_model(xbrowse_model)
    if seqr_model:
        return seqr_model, False
    else:
        return _create_seqr_model(xbrowse_model), True
    def handle(self, *args, **options):
        from_project = BaseProject.objects.get(project_id=options['from_project'])
        to_project = BaseProject.objects.get(project_id=options['to_project'])
        to_seqr_project = find_matching_seqr_model(to_project)
        family_ids = options['family_ids']
        families = BaseFamily.objects.filter(project=from_project, family_id__in=family_ids)
        print('Found {} out of {} families. No match for: {}.'.format(len(families), len(set(family_ids)), set(family_ids) - set([f.family_id for f in families])))

        for f in families:
            print("==> Moving {}".format(f))
            for individual in f.individual_set.all():
                individual.project = to_project
                individual.save()
                # Update individuals in phenotips
                if _phenotips_patient_exists(individual.seqr_individual):
                    # make sure phenotips_patient_id is up to date
                    seqr_individual = individual.seqr_individual
                    data_json = _get_patient_data(
                        from_project.seqr_project,
                        seqr_individual,
                    )

                    seqr_individual.phenotips_patient_id = data_json["id"]
                    seqr_individual.save()

                    # update permissions
                    phenotips_readonly_username, _ = _get_phenotips_uname_and_pwd_for_project(to_project.seqr_project.phenotips_user_id, read_only=True)
                    _add_user_to_patient(phenotips_readonly_username, seqr_individual.phenotips_patient_id, allow_edit=False)

                    phenotips_readwrite_username, _ = _get_phenotips_uname_and_pwd_for_project(to_project.seqr_project.phenotips_user_id, read_only=False)
                    _add_user_to_patient(phenotips_readwrite_username, seqr_individual.phenotips_patient_id, allow_edit=True)

                # Update individuals samples/ VCFs
                for from_vcf_file in individual.vcf_files.all():
                    to_vcf_file, _ = VCFFile.objects.get_or_create(
                        project=to_project,
                        elasticsearch_index=from_vcf_file.elasticsearch_index,
                        file_path=from_vcf_file.file_path,
                        dataset_type=from_vcf_file.dataset_type,
                        sample_type=from_vcf_file.sample_type,
                        loaded_date=from_vcf_file.loaded_date,
                    )
                    individual.vcf_files.add(to_vcf_file)
                    individual.vcf_files.remove(from_vcf_file)

            # Update variant tags/ notes
            saved_variants = set()
            for note in BaseVariantNote.objects.filter(family=f):
                seqr_note = find_matching_seqr_model(note)
                if seqr_note:
                    saved_variants.add(seqr_note.saved_variant)
                note.project = to_project
                note.save()

            for variant_tag in BaseVariantTag.objects.filter(family=f):
                to_project_tag, created = get_or_create_xbrowse_model(
                    ProjectTag, project=to_project, tag=variant_tag.project_tag.tag
                )
                if created:
                    update_xbrowse_model(
                        to_project_tag,
                        category=variant_tag.project_tag.category,
                        title=variant_tag.project_tag.title,
                        color=variant_tag.project_tag.color,
                        order=variant_tag.project_tag.order,
                    )
                update_xbrowse_model(variant_tag, project_tag=to_project_tag)
                seqr_variant_tag = find_matching_seqr_model(variant_tag)
                if seqr_variant_tag:
                    saved_variants.add(seqr_variant_tag.saved_variant)

            for saved_variant in saved_variants:
                saved_variant.project = to_seqr_project
                saved_variant.save()

            # Update families
            update_xbrowse_model(f, project=to_project)

        print("Done.")
def safe_get_or_create(xbrowse_model):
    seqr_model = find_matching_seqr_model(xbrowse_model)
    if seqr_model:
        return seqr_model, False
    else:
        return _create_seqr_model(xbrowse_model), True