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))})
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)
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)
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)) })
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, })
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, })
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, })
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, })
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