[docs]@method_decorator(etag(get_permissions_etag))defget(self,_request:Request,common_report_id:str)->Response:"""Return a variant report when requested."""assertcommon_report_idcommon_report=self.gpf_instance.get_common_report(common_report_id,)ifcommon_reportisnotNone:returnResponse(common_report.to_dict())returnResponse({"error":f"Common report {common_report_id} not found"},status=status.HTTP_404_NOT_FOUND,)
[docs]classVariantReportsFullView(QueryBaseView,DatasetAccessRightsView):"""Variants report full view class."""
[docs]@method_decorator(etag(get_permissions_etag))defget(self,_request:Request,common_report_id:str)->Response:"""Return full variant report when requested."""assertcommon_report_idcommon_report=self.gpf_instance.get_common_report(common_report_id,)ifcommon_reportisnotNone:returnResponse(common_report.to_dict(full=True))returnResponse({"error":f"Common report {common_report_id} not found"},status=status.HTTP_404_NOT_FOUND,)
[docs]classFamilyCounterListView(QueryBaseView,DatasetAccessRightsView):"""Family couters list view class."""
[docs]defpost(self,request:Request)->Response:"""Return family counters for specified study and group name."""data=request.datacommon_report_id=data["study_id"]group_name=data["group_name"]counter_id=int(data["counter_id"])assertcommon_report_idcommon_report=self.gpf_instance.get_common_report(common_report_id,)ifcommon_reportisNone:returnResponse({"error":f"Common report {common_report_id} not found"},status=status.HTTP_404_NOT_FOUND,)group=common_report.families_report.families_counters[group_name]counter=group.counters[counter_id]returnResponse(counter.families)
[docs]defpost(self,request:Request)->Response:"""Return family couters for a specified study and group name."""data=parse_query_params(request.data)study_id=data["study_id"]group_name=data["group_name"]counter_id=int(data["counter_id"])assertstudy_idisnotNonecommon_report=self.gpf_instance.get_common_report(study_id,)ifcommon_reportisNone:returnResponse({"error":f"Common report for {study_id} not found"},status=status.HTTP_404_NOT_FOUND,)group=common_report.families_report.families_counters[group_name]counter_families=group.counters[counter_id].familieswrapper=self.gpf_instance.get_wdae_wrapper(study_id)assertwrapperisnotNoneifwrapper.is_genotype:study_families=wrapper.genotype_data.familieselse:study_families=wrapper.phenotype_data.familiescounter_families_data=FamiliesData.from_families({family_id:study_families[family_id]forfamily_idincounter_families})tsv=FamiliesLoader.to_tsv(counter_families_data)lines=[f"{ln}\n"forlnintsv.strip().split("\n")]response=StreamingHttpResponse(lines,content_type="text/tab-separated-values",)response["Content-Disposition"]="attachment; filename=families.ped"response["Expires"]="0"returnresponse
[docs]classFamiliesDataDownloadView(QueryBaseView,DatasetAccessRightsView):"""Families data download view class."""
[docs]@classmethoddefcollect_families(cls,study_families:FamiliesData,tags_query:dict[str,Any]|None,)->FamiliesData:"""Collect and filter families by tags."""iftags_queryisNone:returnstudy_familiesor_mode=tags_query.get("orMode")ifor_modeisNoneornotisinstance(or_mode,bool):raiseValueError("Invalid mode or none specified")include_tags=tags_query.get("includeTags")ifinclude_tagsisNoneornotisinstance(include_tags,list):raiseValueError("Invalid include or none specified")include_tags={FamilyTag.from_label(label)forlabelininclude_tags}exclude_tags=tags_query.get("excludeTags")ifexclude_tagsisNoneornotisinstance(exclude_tags,list):raiseValueError("Invalid exclude or none specified")exclude_tags={FamilyTag.from_label(label)forlabelinexclude_tags}result={family_id:familyforfamily_id,familyinstudy_families.items()ifcheck_family_tags_query(family,or_mode=or_mode,include_tags=include_tags,exclude_tags=exclude_tags,)}returnFamiliesData.from_families(result)
[docs]defget(self,_request:Request,dataset_id:str)->Response:"""Return full family data for a specified study."""ifnotdataset_id:returnResponse(status=status.HTTP_400_BAD_REQUEST)wrapper=self.gpf_instance.get_wdae_wrapper(dataset_id)assertwrapperisnotNoneifwrapperisNone:returnResponse(status=status.HTTP_404_NOT_FOUND)tsv=FamiliesLoader.to_tsv(wrapper.families)lines=[f"{ln}\n"forlnintsv.strip().split("\n")]response=StreamingHttpResponse(lines,content_type="text/tab-separated-values",)response["Content-Disposition"]="attachment; filename=families.ped"response["Expires"]="0"returnresponse
[docs]defpost(self,request:Request,dataset_id:str)->Response:"""Return full family data for a specified study and tags."""data=request.dataif"queryData"indata:data=parse_query_params(data)tags_query=data.get("tagsQuery")ifnotdataset_id:returnResponse(status=status.HTTP_400_BAD_REQUEST)wrapper=self.gpf_instance.get_wdae_wrapper(dataset_id)assertwrapperisnotNoneifwrapperisNone:returnResponse(status=status.HTTP_404_NOT_FOUND)study_families=wrapper.familiestry:result=self.collect_families(study_families,tags_query)exceptValueErroraserr:print(err)returnResponse(status=status.HTTP_400_BAD_REQUEST)tsv=FamiliesLoader.to_tsv(result)lines=[f"{ln}\n"forlnintsv.strip().split("\n")]response=StreamingHttpResponse(lines,content_type="text/tab-separated-values",)response["Content-Disposition"]="attachment; filename=families.ped"response["Expires"]="0"returnresponse