mirror of
https://github.com/galaxyproject/galaxy.git
synced 2026-09-24 16:30:27 +08:00
merge
This commit is contained in:
+221
-208
@@ -1,211 +1,224 @@
|
||||
<?xml version="1.0"?>
|
||||
<datatypes>
|
||||
<registration converters_path="lib/galaxy/datatypes/converters">
|
||||
<datatype extension="ab1" type="galaxy.datatypes.images:Ab1" mimetype="application/octet-stream" display_in_upload="true"/>
|
||||
<datatype extension="axt" type="galaxy.datatypes.sequence:Axt" display_in_upload="true"/>
|
||||
<datatype extension="bam" type="galaxy.datatypes.images:Bam" mimetype="application/octet-stream"/>
|
||||
<datatype extension="bed" type="galaxy.datatypes.interval:Bed" display_in_upload="true">
|
||||
<converter file="bed_to_gff_converter.xml" target_datatype="gff"/>
|
||||
<converter file="interval_to_coverage.xml" target_datatype="coverage"/>
|
||||
<converter file="bed_to_interval_index_converter.xml" target_datatype="interval_index"/>
|
||||
</datatype>
|
||||
<datatype extension="binseq.zip" type="galaxy.datatypes.images:Binseq" mimetype="application/zip" display_in_upload="true"/>
|
||||
<datatype extension="len" type="galaxy.datatypes.chrominfo:ChromInfo" display_in_upload="true">
|
||||
<!-- no converters yet -->
|
||||
</datatype>
|
||||
<datatype extension="coverage" type="galaxy.datatypes.coverage:LastzCoverage" display_in_upload="true">
|
||||
<indexer file="coverage.xml" />
|
||||
</datatype>
|
||||
<datatype extension="customtrack" type="galaxy.datatypes.interval:CustomTrack"/>
|
||||
<datatype extension="csfasta" type="galaxy.datatypes.sequence:csFasta" display_in_upload="true"/>
|
||||
<datatype extension="data" type="galaxy.datatypes.data:Data" mimetype="application/octet-stream"/>
|
||||
<datatype extension="fasta" type="galaxy.datatypes.sequence:Fasta" display_in_upload="true">
|
||||
<converter file="fasta_to_tabular_converter.xml" target_datatype="tabular"/>
|
||||
</datatype>
|
||||
<datatype extension="fastq" type="galaxy.datatypes.sequence:Fastq" display_in_upload="true"/>
|
||||
<datatype extension="fastqsanger" type="galaxy.datatypes.sequence:FastqSanger" display_in_upload="true"/>
|
||||
<datatype extension="genetrack" type="galaxy.datatypes.tracks:GeneTrack"/>
|
||||
<datatype extension="gff" type="galaxy.datatypes.interval:Gff" display_in_upload="true">
|
||||
<converter file="gff_to_bed_converter.xml" target_datatype="bed"/>
|
||||
</datatype>
|
||||
<datatype extension="gff3" type="galaxy.datatypes.interval:Gff3" display_in_upload="true"/>
|
||||
<datatype extension="gif" type="galaxy.datatypes.images:Image" mimetype="image/gif"/>
|
||||
<datatype extension="gmaj.zip" type="galaxy.datatypes.images:Gmaj" mimetype="application/zip"/>
|
||||
<datatype extension="html" type="galaxy.datatypes.images:Html" mimetype="text/html"/>
|
||||
<datatype extension="interval" type="galaxy.datatypes.interval:Interval" display_in_upload="true">
|
||||
<converter file="interval_to_bed_converter.xml" target_datatype="bed"/>
|
||||
<indexer file="interval_awk.xml" />
|
||||
</datatype>
|
||||
<datatype extension="jpg" type="galaxy.datatypes.images:Image" mimetype="image/jpeg"/>
|
||||
<datatype extension="laj" type="galaxy.datatypes.images:Laj"/>
|
||||
<datatype extension="lav" type="galaxy.datatypes.sequence:Lav" display_in_upload="true"/>
|
||||
<datatype extension="maf" type="galaxy.datatypes.sequence:Maf" display_in_upload="true">
|
||||
<converter file="maf_to_fasta_converter.xml" target_datatype="fasta"/>
|
||||
<converter file="maf_to_interval_converter.xml" target_datatype="interval"/>
|
||||
</datatype>
|
||||
<datatype extension="pdf" type="galaxy.datatypes.images:Image" mimetype="application/pdf"/>
|
||||
<datatype extension="png" type="galaxy.datatypes.images:Image" mimetype="image/png"/>
|
||||
<datatype extension="qualsolexa" type="galaxy.datatypes.qualityscore:QualityScoreSolexa" display_in_upload="true"/>
|
||||
<datatype extension="qualsolid" type="galaxy.datatypes.qualityscore:QualityScoreSOLiD" display_in_upload="true"/>
|
||||
<datatype extension="qual454" type="galaxy.datatypes.qualityscore:QualityScore454" display_in_upload="true"/>
|
||||
<datatype extension="sam" type="galaxy.datatypes.tabular:Sam" display_in_upload="true"/>
|
||||
<datatype extension="scf" type="galaxy.datatypes.images:Scf" mimetype="application/octet-stream" display_in_upload="true"/>
|
||||
<datatype extension="taxonomy" type="galaxy.datatypes.tabular:Taxonomy" display_in_upload="true"/>
|
||||
<datatype extension="tabular" type="galaxy.datatypes.tabular:Tabular" display_in_upload="true"/>
|
||||
<datatype extension="txt" type="galaxy.datatypes.data:Text" display_in_upload="true"/>
|
||||
<datatype extension="blastxml" type="galaxy.datatypes.xml:BlastXml" display_in_upload="true"/>
|
||||
<datatype extension="txtseq.zip" type="galaxy.datatypes.images:Txtseq" mimetype="application/zip" display_in_upload="true"/>
|
||||
<datatype extension="wig" type="galaxy.datatypes.interval:Wiggle" display_in_upload="true">
|
||||
<converter file="wiggle_to_array_tree_converter.xml" target_datatype="array_tree"/>
|
||||
</datatype>
|
||||
<datatype extension="array_tree" type="galaxy.datatypes.data:Data" />
|
||||
<datatype extension="interval_index" type="galaxy.datatypes.data:Data" />
|
||||
<!-- EMBOSS TOOLS -->
|
||||
<datatype extension="acedb" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="asn1" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="btwisted" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="cai" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="charge" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="checktrans" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="chips" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="clustal" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="codata" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="codcmp" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="coderet" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="compseq" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="cpgplot" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="cpgreport" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="cusp" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="cut" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="dan" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="dbmotif" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="diffseq" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="digest" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="dreg" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="einverted" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="embl" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="epestfind" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="equicktandem" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="est2genome" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="etandem" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="excel" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="feattable" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="fitch" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="freak" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="fuzznuc" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="fuzzpro" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="fuzztran" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="garnier" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="gcg" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="geecee" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="genbank" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="helixturnhelix" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="hennig86" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="hmoment" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="ig" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="isochore" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="jackknifer" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="jackknifernon" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="markx10" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="markx1" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="markx0" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="markx3" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="markx2" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="match" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="mega" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="meganon" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="motif" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="msf" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="nametable" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="ncbi" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="needle" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="newcpgreport" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="newcpgseek" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="nexus" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="nexusnon" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="noreturn" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="pair" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="palindrome" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="pepcoil" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="pepinfo" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="pepstats" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="phylip" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="phylipnon" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="pir" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="polydot" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="preg" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="prettyseq" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="primersearch" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="regions" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="score" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="selex" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="seqtable" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="showfeat" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="showorf" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="simple" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="sixpack" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="srs" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="srspair" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="staden" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="strider" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="supermatcher" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="swiss" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="syco" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="table" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="textsearch" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="vectorstrip" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="wobble" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="wordcount" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="tagseq" type="galaxy.datatypes.data:Text"/>
|
||||
<!-- Start RGenetics Datatypes -->
|
||||
<!-- genome graphs ucsc file - first col is always marker then numeric values to plot -->
|
||||
<datatype extension="gg" type="galaxy.datatypes.genetics:GenomeGraphs"/>
|
||||
<datatype extension="rgenetics" type="galaxy.datatypes.genetics:Rgenetics"/>
|
||||
<!-- linkage format pedigree (separate .map file) -->
|
||||
<datatype extension="lped" type="galaxy.datatypes.genetics:Lped" display_in_upload="true"/>
|
||||
<!-- plink compressed file - has bed extension unfortunately -->
|
||||
<datatype extension="pbed" type="galaxy.datatypes.genetics:Pbed" display_in_upload="true"/>
|
||||
<!-- eigenstrat pedigree input file -->
|
||||
<datatype extension="eigenstratgeno" type="galaxy.datatypes.genetics:Eigenstratgeno"/>
|
||||
<!-- eigenstrat pca output file for adjusted eigenQTL eg -->
|
||||
<datatype extension="eigenstratpca" type="galaxy.datatypes.genetics:Eigenstratpca"/>
|
||||
<!-- fbat/pbat format pedigree (header row of marker names) -->
|
||||
<datatype extension="fped" type="galaxy.datatypes.genetics:Fped"/>
|
||||
<!-- part of linkage format pedigree -->
|
||||
<datatype extension="lmap" type="galaxy.datatypes.genetics:Lmap"/>
|
||||
<!-- phenotype file - fbat format -->
|
||||
<datatype extension="fphe" type="galaxy.datatypes.genetics:Fphe"/>
|
||||
<!-- phenotype file - plink format -->
|
||||
<datatype extension="pphe" type="galaxy.datatypes.genetics:Pphe"/>
|
||||
<datatype extension="snptest" type="galaxy.datatypes.genetics:Snptest"/>
|
||||
<datatype extension="snpmatrix" type="galaxy.datatypes.genetics:SNPMatrix"/>
|
||||
<datatype extension="xls" type="galaxy.datatypes.tabular:Tabular"/>
|
||||
<!-- End RGenetics Datatypes -->
|
||||
</registration>
|
||||
<sniffers>
|
||||
<!--
|
||||
The order in which Galaxy attempts to determine data types is
|
||||
important because some formats are much more loosely defined
|
||||
than others. The following list should be the most rigidly
|
||||
defined format first, followed by next-most rigidly defined,
|
||||
and so on.
|
||||
-->
|
||||
<sniffer type="galaxy.datatypes.xml:BlastXml"/>
|
||||
<sniffer type="galaxy.datatypes.sequence:Maf"/>
|
||||
<sniffer type="galaxy.datatypes.sequence:Lav"/>
|
||||
<sniffer type="galaxy.datatypes.sequence:csFasta"/>
|
||||
<sniffer type="galaxy.datatypes.qualityscore:QualityScoreSOLiD"/>
|
||||
<sniffer type="galaxy.datatypes.qualityscore:QualityScore454"/>
|
||||
<sniffer type="galaxy.datatypes.sequence:Fasta"/>
|
||||
<sniffer type="galaxy.datatypes.sequence:Fastq"/>
|
||||
<sniffer type="galaxy.datatypes.interval:Wiggle"/>
|
||||
<sniffer type="galaxy.datatypes.images:Html"/>
|
||||
<sniffer type="galaxy.datatypes.sequence:Axt"/>
|
||||
<sniffer type="galaxy.datatypes.interval:Bed"/>
|
||||
<sniffer type="galaxy.datatypes.interval:CustomTrack"/>
|
||||
<sniffer type="galaxy.datatypes.interval:Gff"/>
|
||||
<sniffer type="galaxy.datatypes.interval:Gff3"/>
|
||||
<sniffer type="galaxy.datatypes.interval:Interval"/>
|
||||
<sniffer type="galaxy.datatypes.tabular:Sam"/>
|
||||
</sniffers>
|
||||
<registration converters_path="lib/galaxy/datatypes/converters">
|
||||
<datatype extension="ab1" type="galaxy.datatypes.binary:Ab1" mimetype="application/octet-stream" display_in_upload="true"/>
|
||||
<datatype extension="axt" type="galaxy.datatypes.sequence:Axt" display_in_upload="true"/>
|
||||
<datatype extension="bam" type="galaxy.datatypes.binary:Bam" mimetype="application/octet-stream"/>
|
||||
<datatype extension="bed" type="galaxy.datatypes.interval:Bed" display_in_upload="true">
|
||||
<converter file="bed_to_gff_converter.xml" target_datatype="gff"/>
|
||||
<converter file="interval_to_coverage.xml" target_datatype="coverage"/>
|
||||
<converter file="bed_to_interval_index_converter.xml" target_datatype="interval_index"/>
|
||||
</datatype>
|
||||
<datatype extension="binseq.zip" type="galaxy.datatypes.binary:Binseq" mimetype="application/zip" display_in_upload="true"/>
|
||||
<datatype extension="len" type="galaxy.datatypes.chrominfo:ChromInfo" display_in_upload="true">
|
||||
<!-- no converters yet -->
|
||||
</datatype>
|
||||
<datatype extension="coverage" type="galaxy.datatypes.coverage:LastzCoverage" display_in_upload="true">
|
||||
<indexer file="coverage.xml" />
|
||||
</datatype>
|
||||
<datatype extension="customtrack" type="galaxy.datatypes.interval:CustomTrack"/>
|
||||
<datatype extension="csfasta" type="galaxy.datatypes.sequence:csFasta" display_in_upload="true"/>
|
||||
<datatype extension="data" type="galaxy.datatypes.data:Data" mimetype="application/octet-stream"/>
|
||||
<datatype extension="fasta" type="galaxy.datatypes.sequence:Fasta" display_in_upload="true">
|
||||
<converter file="fasta_to_tabular_converter.xml" target_datatype="tabular"/>
|
||||
</datatype>
|
||||
<datatype extension="fastq" type="galaxy.datatypes.sequence:Fastq" display_in_upload="true"/>
|
||||
<datatype extension="fastqsanger" type="galaxy.datatypes.sequence:FastqSanger" display_in_upload="true"/>
|
||||
<datatype extension="genetrack" type="galaxy.datatypes.tracks:GeneTrack"/>
|
||||
<datatype extension="gff" type="galaxy.datatypes.interval:Gff" display_in_upload="true">
|
||||
<converter file="gff_to_bed_converter.xml" target_datatype="bed"/>
|
||||
</datatype>
|
||||
<datatype extension="gff3" type="galaxy.datatypes.interval:Gff3" display_in_upload="true"/>
|
||||
<datatype extension="gif" type="galaxy.datatypes.images:Image" mimetype="image/gif"/>
|
||||
<datatype extension="gmaj.zip" type="galaxy.datatypes.images:Gmaj" mimetype="application/zip"/>
|
||||
<datatype extension="html" type="galaxy.datatypes.images:Html" mimetype="text/html"/>
|
||||
<datatype extension="interval" type="galaxy.datatypes.interval:Interval" display_in_upload="true">
|
||||
<converter file="interval_to_bed_converter.xml" target_datatype="bed"/>
|
||||
<indexer file="interval_awk.xml" />
|
||||
</datatype>
|
||||
<datatype extension="jpg" type="galaxy.datatypes.images:Image" mimetype="image/jpeg"/>
|
||||
<datatype extension="laj" type="galaxy.datatypes.images:Laj"/>
|
||||
<datatype extension="lav" type="galaxy.datatypes.sequence:Lav" display_in_upload="true"/>
|
||||
<datatype extension="maf" type="galaxy.datatypes.sequence:Maf" display_in_upload="true">
|
||||
<converter file="maf_to_fasta_converter.xml" target_datatype="fasta"/>
|
||||
<converter file="maf_to_interval_converter.xml" target_datatype="interval"/>
|
||||
</datatype>
|
||||
<datatype extension="pdf" type="galaxy.datatypes.images:Image" mimetype="application/pdf"/>
|
||||
<datatype extension="png" type="galaxy.datatypes.images:Image" mimetype="image/png"/>
|
||||
<datatype extension="qualsolexa" type="galaxy.datatypes.qualityscore:QualityScoreSolexa" display_in_upload="true"/>
|
||||
<datatype extension="qualsolid" type="galaxy.datatypes.qualityscore:QualityScoreSOLiD" display_in_upload="true"/>
|
||||
<datatype extension="qual454" type="galaxy.datatypes.qualityscore:QualityScore454" display_in_upload="true"/>
|
||||
<datatype extension="sam" type="galaxy.datatypes.tabular:Sam" display_in_upload="true"/>
|
||||
<datatype extension="scf" type="galaxy.datatypes.binary:Scf" mimetype="application/octet-stream" display_in_upload="true"/>
|
||||
<datatype extension="sff" type="galaxy.datatypes.binary:Sff" mimetype="application/octet-stream" display_in_upload="true"/>
|
||||
<datatype extension="taxonomy" type="galaxy.datatypes.tabular:Taxonomy" display_in_upload="true"/>
|
||||
<datatype extension="tabular" type="galaxy.datatypes.tabular:Tabular" display_in_upload="true"/>
|
||||
<datatype extension="txt" type="galaxy.datatypes.data:Text" display_in_upload="true"/>
|
||||
<datatype extension="blastxml" type="galaxy.datatypes.xml:BlastXml" display_in_upload="true"/>
|
||||
<datatype extension="txtseq.zip" type="galaxy.datatypes.data:Txtseq" mimetype="application/zip" display_in_upload="true"/>
|
||||
<datatype extension="wig" type="galaxy.datatypes.interval:Wiggle" display_in_upload="true">
|
||||
<converter file="wiggle_to_array_tree_converter.xml" target_datatype="array_tree"/>
|
||||
</datatype>
|
||||
<datatype extension="array_tree" type="galaxy.datatypes.data:Data" />
|
||||
<datatype extension="interval_index" type="galaxy.datatypes.data:Data" />
|
||||
<!-- Start EMBOSS tools -->
|
||||
<datatype extension="acedb" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="asn1" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="btwisted" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="cai" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="charge" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="checktrans" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="chips" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="clustal" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="codata" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="codcmp" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="coderet" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="compseq" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="cpgplot" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="cpgreport" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="cusp" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="cut" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="dan" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="dbmotif" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="diffseq" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="digest" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="dreg" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="einverted" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="embl" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="epestfind" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="equicktandem" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="est2genome" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="etandem" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="excel" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="feattable" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="fitch" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="freak" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="fuzznuc" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="fuzzpro" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="fuzztran" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="garnier" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="gcg" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="geecee" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="genbank" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="helixturnhelix" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="hennig86" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="hmoment" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="ig" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="isochore" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="jackknifer" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="jackknifernon" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="markx10" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="markx1" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="markx0" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="markx3" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="markx2" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="match" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="mega" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="meganon" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="motif" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="msf" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="nametable" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="ncbi" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="needle" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="newcpgreport" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="newcpgseek" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="nexus" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="nexusnon" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="noreturn" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="pair" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="palindrome" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="pepcoil" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="pepinfo" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="pepstats" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="phylip" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="phylipnon" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="pir" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="polydot" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="preg" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="prettyseq" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="primersearch" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="regions" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="score" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="selex" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="seqtable" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="showfeat" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="showorf" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="simple" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="sixpack" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="srs" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="srspair" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="staden" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="strider" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="supermatcher" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="swiss" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="syco" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="table" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="textsearch" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="vectorstrip" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="wobble" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="wordcount" type="galaxy.datatypes.data:Text"/>
|
||||
<datatype extension="tagseq" type="galaxy.datatypes.data:Text"/>
|
||||
<!-- End EMBOSS tools -->
|
||||
<!-- Start RGenetics Datatypes -->
|
||||
<datatype extension="affybatch" type="galaxy.datatypes.genetics:Affybatch" display_in_upload="true"/>
|
||||
<!-- eigenstrat pedigree input file -->
|
||||
<datatype extension="eigenstratgeno" type="galaxy.datatypes.genetics:Eigenstratgeno"/>
|
||||
<!-- eigenstrat pca output file for adjusted eigenQTL eg -->
|
||||
<datatype extension="eigenstratpca" type="galaxy.datatypes.genetics:Eigenstratpca"/>
|
||||
<datatype extension="eset" type="galaxy.datatypes.genetics:Eset" display_in_upload="true" />
|
||||
<!-- fbat/pbat format pedigree (header row of marker names) -->
|
||||
<datatype extension="fped" type="galaxy.datatypes.genetics:Fped" display_in_upload="true"/>
|
||||
<!-- phenotype file - fbat format -->
|
||||
<datatype extension="fphe" type="galaxy.datatypes.genetics:Fphe" display_in_upload="true" mimetype="text/html"/>
|
||||
<!-- genome graphs ucsc file - first col is always marker then numeric values to plot -->
|
||||
<datatype extension="gg" type="galaxy.datatypes.genetics:GenomeGraphs"/>
|
||||
<!-- part of linkage format pedigree -->
|
||||
<datatype extension="lmap" type="galaxy.datatypes.genetics:Lmap" display_in_upload="true"/>
|
||||
<datatype extension="malist" type="galaxy.datatypes.genetics:MAlist" display_in_upload="true"/>
|
||||
<!-- linkage format pedigree (separate .map file) -->
|
||||
<datatype extension="lped" type="galaxy.datatypes.genetics:Lped" display_in_upload="true">
|
||||
<converter file="lped_to_fped_converter.xml" target_datatype="fped"/>
|
||||
<converter file="lped_to_pbed_converter.xml" target_datatype="pbed"/>
|
||||
</datatype>
|
||||
<!-- plink compressed file - has bed extension unfortunately -->
|
||||
<datatype extension="pbed" type="galaxy.datatypes.genetics:Pbed" display_in_upload="true">
|
||||
<converter file="pbed_to_lped_converter.xml" target_datatype="lped"/>
|
||||
</datatype>
|
||||
<datatype extension="pheno" type="galaxy.datatypes.genetics:Pheno"/>
|
||||
<!-- phenotype file - plink format -->
|
||||
<datatype extension="pphe" type="galaxy.datatypes.genetics:Pphe" display_in_upload="true" mimetype="text/html"/>
|
||||
<datatype extension="rexpbase" type="galaxy.datatypes.genetics:RexpBase"/>
|
||||
<datatype extension="rgenetics" type="galaxy.datatypes.genetics:Rgenetics"/>
|
||||
<datatype extension="snptest" type="galaxy.datatypes.genetics:Snptest" display_in_upload="true"/>
|
||||
<datatype extension="snpmatrix" type="galaxy.datatypes.genetics:SNPMatrix" display_in_upload="true"/>
|
||||
<datatype extension="xls" type="galaxy.datatypes.tabular:Tabular"/>
|
||||
<!-- End RGenetics Datatypes -->
|
||||
</registration>
|
||||
<sniffers>
|
||||
<!--
|
||||
The order in which Galaxy attempts to determine data types is
|
||||
important because some formats are much more loosely defined
|
||||
than others. The following list should be the most rigidly
|
||||
defined format first, followed by next-most rigidly defined,
|
||||
and so on.
|
||||
-->
|
||||
<sniffer type="galaxy.datatypes.binary:Sff"/>
|
||||
<sniffer type="galaxy.datatypes.xml:BlastXml"/>
|
||||
<sniffer type="galaxy.datatypes.sequence:Maf"/>
|
||||
<sniffer type="galaxy.datatypes.sequence:Lav"/>
|
||||
<sniffer type="galaxy.datatypes.sequence:csFasta"/>
|
||||
<sniffer type="galaxy.datatypes.qualityscore:QualityScoreSOLiD"/>
|
||||
<sniffer type="galaxy.datatypes.qualityscore:QualityScore454"/>
|
||||
<sniffer type="galaxy.datatypes.sequence:Fasta"/>
|
||||
<sniffer type="galaxy.datatypes.sequence:Fastq"/>
|
||||
<sniffer type="galaxy.datatypes.interval:Wiggle"/>
|
||||
<sniffer type="galaxy.datatypes.images:Html"/>
|
||||
<sniffer type="galaxy.datatypes.sequence:Axt"/>
|
||||
<sniffer type="galaxy.datatypes.interval:Bed"/>
|
||||
<sniffer type="galaxy.datatypes.interval:CustomTrack"/>
|
||||
<sniffer type="galaxy.datatypes.interval:Gff"/>
|
||||
<sniffer type="galaxy.datatypes.interval:Gff3"/>
|
||||
<sniffer type="galaxy.datatypes.interval:Interval"/>
|
||||
<sniffer type="galaxy.datatypes.tabular:Sam"/>
|
||||
</sniffers>
|
||||
</datatypes>
|
||||
|
||||
+6
-3
@@ -23,6 +23,9 @@ py2.4-macosx-10.3-fat-ucs2 = medeski.bx.psu.edu /usr/local/bin/python2.4
|
||||
py2.5-macosx-10.3-fat-ucs2 = medeski.bx.psu.edu /usr/local/bin/python2.5
|
||||
py2.6-macosx-10.3-fat-ucs2 = medeski.bx.psu.edu /usr/local/bin/python2.6
|
||||
py2.5-macosx-10.5-i386-ucs2 = lion.bx.psu.edu /usr/bin/python2.5
|
||||
py2.4-solaris-2.10-i86pc-ucs2 = thumper.bx.psu.edu /depot/projects/pythons/solaris-2.10-i86pc-ucs2/bin/python2.4
|
||||
py2.5-solaris-2.10-i86pc-ucs2 = thumper.bx.psu.edu /depot/projects/pythons/solaris-2.10-i86pc-ucs2/bin/python2.5
|
||||
py2.6-solaris-2.10-i86pc-ucs2 = thumper.bx.psu.edu /depot/projects/pythons/solaris-2.10-i86pc-ucs2/bin/python2.6
|
||||
py2.4-solaris-2.11-i86pc-ucs2 = victory.bx.psu.edu /depot/projects/pythons/solaris-2.11-i86pc-ucs2/bin/python2.4
|
||||
py2.5-solaris-2.11-i86pc-ucs2 = victory.bx.psu.edu /depot/projects/pythons/solaris-2.11-i86pc-ucs2/bin/python2.5
|
||||
py2.6-solaris-2.11-i86pc-ucs2 = victory.bx.psu.edu /depot/projects/pythons/solaris-2.11-i86pc-ucs2/bin/python2.6
|
||||
@@ -47,9 +50,9 @@ py2.4-macosx = py2.4-macosx-10.3-fat-ucs2
|
||||
py2.5-macosx = py2.5-macosx-10.3-fat-ucs2 py2.5-macosx-10.5-i386-ucs2
|
||||
py2.6-macosx = py2.6-macosx-10.3-fat-ucs2
|
||||
macosx = py2.4-macosx py2.5-macosx py2.6-macosx
|
||||
py2.4-solaris = py2.4-solaris-2.11-i86pc-ucs2 py2.4-solaris-2.10-sun4u-ucs2
|
||||
py2.5-solaris = py2.5-solaris-2.11-i86pc-ucs2 py2.5-solaris-2.10-sun4u-ucs2
|
||||
py2.6-solaris = py2.6-solaris-2.11-i86pc-ucs2 py2.6-solaris-2.10-sun4u-ucs2
|
||||
py2.4-solaris = py2.4-solaris-2.10-i86pc-ucs2 py2.4-solaris-2.11-i86pc-ucs2 py2.4-solaris-2.10-sun4u-ucs2
|
||||
py2.5-solaris = py2.5-solaris-2.10-i86pc-ucs2 py2.5-solaris-2.11-i86pc-ucs2 py2.5-solaris-2.10-sun4u-ucs2
|
||||
py2.6-solaris = py2.6-solaris-2.10-i86pc-ucs2 py2.6-solaris-2.11-i86pc-ucs2 py2.6-solaris-2.10-sun4u-ucs2
|
||||
solaris = py2.4-solaris py2.5-solaris py2.6-solaris
|
||||
py2.4-all = py2.4-linux py2.4-macosx py2.4-solaris
|
||||
py2.5-all = py2.5-linux py2.5-macosx py2.5-solaris
|
||||
|
||||
@@ -19,7 +19,7 @@ MySQL_python = 1.2.2
|
||||
pbs_python = 2.9.4
|
||||
psycopg2 = 2.0.6
|
||||
pycrypto = 2.0.1
|
||||
pysqlite = 2.3.5
|
||||
pysqlite = 2.5.6
|
||||
python_lzo = 1.08
|
||||
threadframe = 0.2
|
||||
guppy = 0.1.8
|
||||
@@ -57,11 +57,12 @@ boto = 1.8d
|
||||
; extra version information
|
||||
[tags]
|
||||
psycopg2 = _8.2.6_static
|
||||
pysqlite = _3.5.4_static
|
||||
pysqlite = _static
|
||||
MySQL_python = _5.0.67_static
|
||||
python_lzo = _static
|
||||
bx_python = _dev_r4bf1f32e6b76
|
||||
GeneTrack = _dev_raa786e9fc131d998e532a1aef39d108850c9e93d
|
||||
GeneTrack = _dev_e380f21c704218622155b9d230a44b3c9c452524
|
||||
SQLAlchemy = _dev_r6498
|
||||
; nose = .dev_r7156749efc58
|
||||
|
||||
; source location, necessary for scrambling
|
||||
@@ -73,7 +74,7 @@ MySQL_python = http://superb-west.dl.sourceforge.net/sourceforge/mysql-python/My
|
||||
pbs_python = http://ftp.sara.nl/pub/outgoing/pbs_python-2.9.4.tar.gz
|
||||
psycopg2 = http://initd.org/pub/software/psycopg/PSYCOPG-2-0/psycopg2-2.0.6.tar.gz ftp://ftp-archives.postgresql.org/pub/source/v8.2.6/postgresql-8.2.6.tar.bz2
|
||||
pycrypto = http://www.amk.ca/files/python/crypto/pycrypto-2.0.1.tar.gz
|
||||
pysqlite = http://initd.org/pub/software/pysqlite/releases/2.3/2.3.5/pysqlite-2.3.5.tar.gz http://www.sqlite.org/sqlite-source-3_5_4.zip
|
||||
pysqlite = http://pypi.python.org/packages/source/p/pysqlite/pysqlite-2.5.6.tar.gz
|
||||
python_lzo = http://www.oberhumer.com/opensource/lzo/download/LZO-v1/python-lzo-1.08.tar.gz http://www.oberhumer.com/opensource/lzo/download/LZO-v1/lzo-1.08.tar.gz
|
||||
threadframe = http://www.majid.info/python/threadframe/threadframe-0.2.tar.gz
|
||||
guppy = http://pypi.python.org/packages/source/g/guppy/guppy-0.1.8.tar.gz
|
||||
@@ -82,7 +83,7 @@ Beaker = http://cheeseshop.python.org/packages/source/B/Beaker/Beaker-1.4.tar.gz
|
||||
decorator = http://pypi.python.org/packages/source/d/decorator/decorator-3.1.2.tar.gz
|
||||
docutils = http://downloads.sourceforge.net/docutils/docutils-0.4.tar.gz
|
||||
elementtree = http://effbot.org/downloads/elementtree-1.2.6-20050316.tar.gz
|
||||
GeneTrack = http://github.com/ialbert/genetrack-central/tarball/aa786e9fc131d998e532a1aef39d108850c9e93d
|
||||
GeneTrack = http://github.com/ialbert/genetrack-central/tarball/e380f21c704218622155b9d230a44b3c9c452524
|
||||
lrucache = http://evan.prodromou.name/lrucache/lrucache-0.2.tar.gz
|
||||
Mako = http://www.makotemplates.org/downloads/Mako-0.2.5.tar.gz
|
||||
nose = http://pypi.python.org/packages/source/n/nose/nose-0.11.1.tar.gz
|
||||
@@ -93,7 +94,7 @@ PasteScript = http://cheeseshop.python.org/packages/source/P/PasteScript/PasteSc
|
||||
PSI = http://pypi.python.org/packages/source/P/PSI/PSI-0.3b1.1.tar.gz
|
||||
Routes = http://pypi.python.org/packages/source/R/Routes/Routes-1.11.tar.gz
|
||||
simplejson = http://cheeseshop.python.org/packages/source/s/simplejson/simplejson-1.5.tar.gz
|
||||
SQLAlchemy = http://pypi.python.org/packages/source/S/SQLAlchemy/SQLAlchemy-0.5.6.tar.gz
|
||||
SQLAlchemy = http://dist.g2.bx.psu.edu/SQLAlchemy-0.5.6_r6498.tar.bz2
|
||||
sqlalchemy_migrate = http://pypi.python.org/packages/source/s/sqlalchemy-migrate/sqlalchemy-migrate-0.5.4.tar.gz
|
||||
Tempita = http://pypi.python.org/packages/source/T/Tempita/Tempita-0.1.tar.gz
|
||||
twill = http://darcs.idyll.org/~t/projects/twill-0.9.tar.gz
|
||||
|
||||
@@ -0,0 +1,156 @@
|
||||
"""
|
||||
Binary classes
|
||||
"""
|
||||
|
||||
import data, logging, binascii
|
||||
from galaxy.datatypes.metadata import MetadataElement
|
||||
from galaxy.datatypes import metadata
|
||||
from galaxy.datatypes.sniff import *
|
||||
from urllib import urlencode, quote_plus
|
||||
import zipfile
|
||||
import os, subprocess, tempfile
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
sniffable_binary_formats = [ 'sff' ]
|
||||
# Currently these supported binary data types must be manually set on upload
|
||||
unsniffable_binary_formats = [ 'ab1', 'scf' ]
|
||||
|
||||
class Binary( data.Data ):
|
||||
"""Binary data"""
|
||||
def set_peek( self, dataset ):
|
||||
"""Set the peek and blurb text"""
|
||||
if not dataset.dataset.purged:
|
||||
dataset.peek = 'binary data'
|
||||
dataset.blurb = 'data'
|
||||
else:
|
||||
dataset.peek = 'file does not exist'
|
||||
dataset.blurb = 'file purged from disk'
|
||||
|
||||
class Ab1( Binary ):
|
||||
"""Class describing an ab1 binary sequence file"""
|
||||
file_ext = "ab1"
|
||||
def set_peek( self, dataset ):
|
||||
if not dataset.dataset.purged:
|
||||
export_url = "/history_add_to?" + urlencode( {'history_id':dataset.history_id,'ext':'ab1','name':'ab1 sequence','info':'Sequence file','dbkey':dataset.dbkey} )
|
||||
dataset.peek = "Binary ab1 sequence file"
|
||||
dataset.blurb = data.nice_size( dataset.get_size() )
|
||||
else:
|
||||
dataset.peek = 'file does not exist'
|
||||
dataset.blurb = 'file purged from disk'
|
||||
def display_peek( self, dataset ):
|
||||
try:
|
||||
return dataset.peek
|
||||
except:
|
||||
return "Binary ab1 sequence file (%s)" % ( data.nice_size( dataset.get_size() ) )
|
||||
|
||||
class Bam( Binary ):
|
||||
"""Class describing a BAM binary file"""
|
||||
file_ext = "bam"
|
||||
MetadataElement( name="bam_index", desc="BAM Index File", param=metadata.FileParameter, readonly=True, no_value=None, visible=False, optional=True )
|
||||
def init_meta( self, dataset, copy_from=None ):
|
||||
Binary.init_meta( self, dataset, copy_from=copy_from )
|
||||
def set_meta( self, dataset, overwrite = True, **kwd ):
|
||||
"""
|
||||
Sets index for BAM file.
|
||||
"""
|
||||
index_file = dataset.metadata.bam_index
|
||||
if not index_file:
|
||||
index_file = dataset.metadata.spec['bam_index'].param.new_file( dataset = dataset )
|
||||
tmp_dir = tempfile.gettempdir()
|
||||
tmpf1 = tempfile.NamedTemporaryFile( dir=tmp_dir )
|
||||
tmpf1bai = '%s.bai' % tmpf1.name
|
||||
try:
|
||||
os.system( 'cd %s' % tmp_dir )
|
||||
os.system( 'cp %s %s' % ( dataset.file_name, tmpf1.name ) )
|
||||
os.system( 'samtools index %s' % tmpf1.name )
|
||||
os.system( 'cp %s %s' % ( tmpf1bai, index_file.file_name ) )
|
||||
except Exception, ex:
|
||||
sys.stderr.write( 'There was a problem creating the index for the BAM file\n%s\n' + str( ex ) )
|
||||
tmpf1.close()
|
||||
if os.path.exists( tmpf1bai ):
|
||||
os.remove( tmpf1bai )
|
||||
dataset.metadata.bam_index = index_file
|
||||
def set_peek( self, dataset ):
|
||||
if not dataset.dataset.purged:
|
||||
export_url = "/history_add_to?" + urlencode( {'history_id':dataset.history_id,'ext':'bam','name':'bam alignments','info':'Alignments file','dbkey':dataset.dbkey} )
|
||||
dataset.peek = "Binary bam alignments file"
|
||||
dataset.blurb = data.nice_size( dataset.get_size() )
|
||||
else:
|
||||
dataset.peek = 'file does not exist'
|
||||
dataset.blurb = 'file purged from disk'
|
||||
def display_peek( self, dataset ):
|
||||
try:
|
||||
return dataset.peek
|
||||
except:
|
||||
return "Binary bam alignments file (%s)" % ( data.nice_size( dataset.get_size() ) )
|
||||
def get_mime( self ):
|
||||
"""Returns the mime type of the datatype"""
|
||||
return 'application/octet-stream'
|
||||
|
||||
class Binseq( Binary ):
|
||||
"""Class describing a zip archive of binary sequence files"""
|
||||
file_ext = "binseq.zip"
|
||||
def set_peek( self, dataset ):
|
||||
if not dataset.dataset.purged:
|
||||
zip_file = zipfile.ZipFile( dataset.file_name, "r" )
|
||||
num_files = len( zip_file.namelist() )
|
||||
dataset.peek = "Archive of %s binary sequence files" % ( str( num_files ) )
|
||||
dataset.blurb = data.nice_size( dataset.get_size() )
|
||||
else:
|
||||
dataset.peek = 'file does not exist'
|
||||
dataset.blurb = 'file purged from disk'
|
||||
def display_peek( self, dataset ):
|
||||
try:
|
||||
return dataset.peek
|
||||
except:
|
||||
return "Binary sequence file archive (%s)" % ( data.nice_size( dataset.get_size() ) )
|
||||
def get_mime( self ):
|
||||
"""Returns the mime type of the datatype"""
|
||||
return 'application/zip'
|
||||
|
||||
class Scf( Binary ):
|
||||
"""Class describing an scf binary sequence file"""
|
||||
file_ext = "scf"
|
||||
def set_peek( self, dataset ):
|
||||
if not dataset.dataset.purged:
|
||||
export_url = "/history_add_to?" + urlencode({'history_id':dataset.history_id,'ext':'scf','name':'scf sequence','info':'Sequence file','dbkey':dataset.dbkey})
|
||||
dataset.peek = "Binary scf sequence file"
|
||||
dataset.blurb = data.nice_size( dataset.get_size() )
|
||||
else:
|
||||
dataset.peek = 'file does not exist'
|
||||
dataset.blurb = 'file purged from disk'
|
||||
def display_peek( self, dataset ):
|
||||
try:
|
||||
return dataset.peek
|
||||
except:
|
||||
return "Binary scf sequence file (%s)" % ( data.nice_size( dataset.get_size() ) )
|
||||
|
||||
class Sff( Binary ):
|
||||
""" Standard Flowgram Format (SFF) """
|
||||
file_ext = "sff"
|
||||
def __init__( self, **kwd ):
|
||||
Binary.__init__( self, **kwd )
|
||||
def sniff( self, filename ):
|
||||
# The first 4 bytes of any sff file is '.sff', and the file is binary. For details
|
||||
# about the format, see http://www.ncbi.nlm.nih.gov/Traces/trace.cgi?cmd=show&f=formats&m=doc&s=format
|
||||
try:
|
||||
header = open( filename ).read(4)
|
||||
if binascii.b2a_hex( header ) == binascii.hexlify( '.sff' ):
|
||||
return True
|
||||
return False
|
||||
except Exception, e:
|
||||
return False
|
||||
def set_peek( self, dataset ):
|
||||
if not dataset.dataset.purged:
|
||||
export_url = "/history_add_to?" + urlencode( {'history_id':dataset.history_id,'ext':'sff','name':'sff file','info':'sff file','dbkey':dataset.dbkey} )
|
||||
dataset.peek = "Binary sff file"
|
||||
dataset.blurb = data.nice_size( dataset.get_size() )
|
||||
else:
|
||||
dataset.peek = 'file does not exist'
|
||||
dataset.blurb = 'file purged from disk'
|
||||
def display_peek( self, dataset ):
|
||||
try:
|
||||
return dataset.peek
|
||||
except:
|
||||
return "Binary sff file (%s)" % ( data.nice_size( dataset.get_size() ) )
|
||||
@@ -1,4 +1,4 @@
|
||||
import logging, os, sys, time, tempfile, binascii
|
||||
import logging, os, sys, time, tempfile
|
||||
from galaxy import util
|
||||
from galaxy.util.odict import odict
|
||||
from galaxy.util.bunch import Bunch
|
||||
@@ -40,20 +40,18 @@ class Data( object ):
|
||||
|
||||
"""
|
||||
__metaclass__ = DataMeta
|
||||
|
||||
"""Add metadata elements"""
|
||||
# Add metadata elements
|
||||
MetadataElement( name="dbkey", desc="Database/Build", default="?", param=metadata.DBKeyParameter, multiple=False, no_value="?" )
|
||||
|
||||
"""Stores the set of display applications, and viewing methods, supported by this datatype """
|
||||
# Stores the set of display applications, and viewing methods, supported by this datatype
|
||||
supported_display_apps = {}
|
||||
|
||||
"""If False, the peek is regenerated whenever a dataset of this type is copied"""
|
||||
# If False, the peek is regenerated whenever a dataset of this type is copied
|
||||
copy_safe_peek = True
|
||||
|
||||
is_binary = True #The dataset contains binary data --> do not space_to_tab or convert newlines, etc. Allow binary file uploads of this type when True.
|
||||
|
||||
allow_datatype_change = True #Allow user to change between this datatype and others. If False, this datatype cannot be changed from or into.
|
||||
|
||||
# The dataset contains binary data --> do not space_to_tab or convert newlines, etc.
|
||||
# Allow binary file uploads of this type when True.
|
||||
is_binary = True
|
||||
# Allow user to change between this datatype and others. If False, this datatype
|
||||
# cannot be changed from or into.
|
||||
allow_datatype_change = True
|
||||
#Composite datatypes
|
||||
composite_type = None
|
||||
composite_files = odict()
|
||||
@@ -162,6 +160,11 @@ class Data( object ):
|
||||
info = info.replace( '\r', '<br/>' )
|
||||
if info.find( '\n' ) >= 0:
|
||||
info = info.replace( '\n', '<br/>' )
|
||||
|
||||
# Convert to unicode to display non-ascii characters.
|
||||
if type( info ) is not unicode:
|
||||
info = unicode( info, 'utf-8')
|
||||
|
||||
return info
|
||||
except:
|
||||
return "info unavailable"
|
||||
@@ -270,8 +273,6 @@ class Data( object ):
|
||||
def add_composite_file( self, name, **kwds ):
|
||||
#self.composite_files = self.composite_files.copy()
|
||||
self.composite_files[ name ] = self.__new_composite_file( name, **kwds )
|
||||
|
||||
|
||||
def __substitute_composite_key( self, key, composite_file, dataset = None ):
|
||||
if composite_file.substitute_name_with_metadata:
|
||||
if dataset:
|
||||
@@ -303,7 +304,6 @@ class Data( object ):
|
||||
return files
|
||||
def generate_auto_primary_file( self, dataset = None ):
|
||||
raise Exception( "generate_auto_primary_file is not implemented for this datatype." )
|
||||
|
||||
@property
|
||||
def has_resolution(self):
|
||||
return False
|
||||
@@ -364,23 +364,37 @@ class Text( Data ):
|
||||
dataset.peek = 'file does not exist'
|
||||
dataset.blurb = 'file purged from disk'
|
||||
|
||||
class Binary( Data ):
|
||||
"""Binary data"""
|
||||
class Txtseq( Data ):
|
||||
"""Class describing a zip archive of text sequence files"""
|
||||
file_ext = "txtseq.zip"
|
||||
def set_peek( self, dataset ):
|
||||
"""Set the peek and blurb text"""
|
||||
if not dataset.dataset.purged:
|
||||
dataset.peek = 'binary data'
|
||||
dataset.blurb = 'data'
|
||||
zip_file = zipfile.ZipFile( dataset.file_name, "r" )
|
||||
num_files = len( zip_file.namelist() )
|
||||
dataset.peek = "Archive of %s text sequence files" % ( str( num_files ) )
|
||||
dataset.blurb = data.nice_size( dataset.get_size() )
|
||||
else:
|
||||
dataset.peek = 'file does not exist'
|
||||
dataset.blurb = 'file purged from disk'
|
||||
def display_peek(self, dataset):
|
||||
try:
|
||||
return dataset.peek
|
||||
except:
|
||||
return "Text sequence file archive (%s)" % ( data.nice_size( dataset.get_size() ) )
|
||||
def get_mime(self):
|
||||
"""Returns the mime type of the datatype"""
|
||||
return 'application/zip'
|
||||
|
||||
class Newick( Text ):
|
||||
pass
|
||||
|
||||
# ------------- Utility methods --------------
|
||||
|
||||
def get_test_fname( fname ):
|
||||
"""Returns test data filename"""
|
||||
path, name = os.path.split(__file__)
|
||||
full_path = os.path.join( path, 'test', fname )
|
||||
return full_path
|
||||
|
||||
def nice_size(size):
|
||||
"""
|
||||
Returns a readably formatted string with the size
|
||||
@@ -406,7 +420,6 @@ def nice_size(size):
|
||||
out = "%.1f %s" % (size, word)
|
||||
return out
|
||||
return '??? bytes'
|
||||
|
||||
def get_file_peek( file_name, is_multi_byte=False, WIDTH=256, LINE_COUNT=5 ):
|
||||
"""
|
||||
Returns the first LINE_COUNT lines wrapped to WIDTH
|
||||
@@ -443,7 +456,6 @@ def get_file_peek( file_name, is_multi_byte=False, WIDTH=256, LINE_COUNT=5 ):
|
||||
else:
|
||||
text = unicode( '\n'.join( lines ), 'utf-8' )
|
||||
return text
|
||||
|
||||
def get_line_count(file_name):
|
||||
"""Returns the number of lines in a file that are neither null nor comments"""
|
||||
count = 0
|
||||
@@ -452,38 +464,3 @@ def get_line_count(file_name):
|
||||
if line and line[0] != '#':
|
||||
count += 1
|
||||
return count
|
||||
|
||||
class Newick( Text ):
|
||||
pass
|
||||
|
||||
class Sff( Binary ):
|
||||
""" Standard Flowgram Format (SFF) """
|
||||
file_ext = "sff"
|
||||
def __init__( self, **kwd ):
|
||||
Binary.__init__(self, **kwd)
|
||||
def init_meta( self, dataset, copy_from=None ):
|
||||
Binary.init_meta( self, dataset, copy_from=copy_from )
|
||||
def sniff( self, filename ):
|
||||
'''
|
||||
The first 4 bytes of any sff file is '.sff'
|
||||
|
||||
>>> fname = get_test_fname( '1.sff' )
|
||||
>>> Sff().sniff( fname )
|
||||
True
|
||||
'''
|
||||
header = open( filename ).read(4)
|
||||
if binascii.b2a_hex( header ) == binascii.hexlify( '.sff' ):
|
||||
return True
|
||||
return False
|
||||
def set_peek( self, dataset ):
|
||||
if not dataset.dataset.purged:
|
||||
dataset.peek = "Binary sff file"
|
||||
dataset.blurb = nice_size( dataset.get_size() )
|
||||
else:
|
||||
dataset.peek = 'file does not exist'
|
||||
dataset.blurb = 'file purged from disk'
|
||||
def display_peek(self, dataset):
|
||||
try:
|
||||
return dataset.peek
|
||||
except:
|
||||
return "sff file (%s)" % ( nice_size( dataset.get_size() ) )
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
"""
|
||||
rgenetics datatypes
|
||||
Use at your peril
|
||||
Ross Lazarus
|
||||
for the rgenetics and galaxy projects
|
||||
|
||||
@@ -11,7 +10,6 @@ subsequent row values are all numeric ! Will fail if any non numeric (eg '+' or
|
||||
ross lazarus for rgenetics
|
||||
august 20 2007
|
||||
"""
|
||||
|
||||
import logging, os, sys, time, tempfile, shutil, string, glob
|
||||
import data
|
||||
from galaxy import util
|
||||
@@ -26,8 +24,7 @@ from galaxy.datatypes.images import Html
|
||||
from galaxy.datatypes.interval import Interval
|
||||
from galaxy.util.hash_util import *
|
||||
|
||||
gal_Log = logging.getLogger(__name__)
|
||||
verbose = False
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
class GenomeGraphs(Interval):
|
||||
|
||||
@@ -48,10 +45,8 @@ class GenomeGraphs(Interval):
|
||||
"""Initialize datatype, by adding GBrowse display app"""
|
||||
Interval.__init__(self, **kwd)
|
||||
self.add_display_app ( 'ucsc', 'display at UCSC', 'as_ucsc_display_file', 'ucsc_links' )
|
||||
|
||||
def as_ucsc_display_file( self, dataset, **kwd ):
|
||||
return open( dataset.file_name )
|
||||
|
||||
def set_meta( self, dataset, overwrite = True, **kwd ):
|
||||
i = 0
|
||||
for i, line in enumerate( file ( dataset.file_name ) ):
|
||||
@@ -66,7 +61,6 @@ class GenomeGraphs(Interval):
|
||||
except:
|
||||
pass
|
||||
Interval.set_meta( self, dataset, overwrite = overwrite, skip = i )
|
||||
|
||||
def make_html_table( self, dataset, skipchars=[] ):
|
||||
"""Create HTML table, used for displaying peek"""
|
||||
out = ['<table cellspacing="0" cellpadding="3">']
|
||||
@@ -82,7 +76,6 @@ class GenomeGraphs(Interval):
|
||||
except Exception, exc:
|
||||
out = "Can't create peek %s" % exc
|
||||
return out
|
||||
|
||||
def get_estimated_display_viewport( self, dataset ):
|
||||
"""
|
||||
Return a chrom, start, stop tuple for viewing a file. There are slight differences between gff 2 and gff 3
|
||||
@@ -118,7 +111,6 @@ class GenomeGraphs(Interval):
|
||||
return ( seqid, str( start ), str( stop ) )
|
||||
else:
|
||||
return ( '', '', '' )
|
||||
|
||||
def gbrowse_links( self, dataset, type, app, base_url ):
|
||||
ret_val = []
|
||||
if dataset.has_data:
|
||||
@@ -132,7 +124,6 @@ class GenomeGraphs(Interval):
|
||||
link = "%s?start=%s&stop=%s&ref=%s&dbkey=%s" % ( site_url, start, stop, seqid, dataset.dbkey )
|
||||
ret_val.append( ( site_name, link ) )
|
||||
return ret_val
|
||||
|
||||
def ucsc_links( self, dataset, type, app, base_url ):
|
||||
ret_val = []
|
||||
if dataset.has_data:
|
||||
@@ -160,10 +151,8 @@ class GenomeGraphs(Interval):
|
||||
link = '%s?redirect_url=%s&display_url=%s' % ( internal_url, redirect_url, display_url )
|
||||
ret_val.append( (site_name, link) )
|
||||
else:
|
||||
gal_Log.debug('@@@ gg ucsc_links - no viewport_tuple')
|
||||
log.debug('@@@ gg ucsc_links - no viewport_tuple')
|
||||
return ret_val
|
||||
|
||||
|
||||
def sniff( self, filename ):
|
||||
"""
|
||||
Determines whether the file is in gff format
|
||||
@@ -202,20 +191,17 @@ class GenomeGraphs(Interval):
|
||||
except:
|
||||
return False
|
||||
|
||||
|
||||
|
||||
class rgTabList(Tabular):
|
||||
""" for sampleid and for featureid lists of exclusions or inclusions in the clean tool
|
||||
"""
|
||||
for sampleid and for featureid lists of exclusions or inclusions in the clean tool
|
||||
featureid subsets on statistical criteria -> specialized display such as gg
|
||||
"""
|
||||
file_ext = "rgTList"
|
||||
|
||||
|
||||
def __init__(self, **kwd):
|
||||
"""Initialize featurelistt datatype"""
|
||||
Tabular.__init__( self, **kwd )
|
||||
self.column_names = []
|
||||
|
||||
def make_html_table( self, dataset, skipchars=[] ):
|
||||
"""Create HTML table, used for displaying peek"""
|
||||
out = ['<table cellspacing="0" cellpadding="3">']
|
||||
@@ -236,23 +222,24 @@ class rgTabList(Tabular):
|
||||
out = "Can't create peek %s" % exc
|
||||
return out
|
||||
|
||||
|
||||
class rgSampleList(rgTabList):
|
||||
""" for sampleid exclusions or inclusions in the clean tool
|
||||
output from QC eg excess het, gender error, ibd pair member,eigen outlier,excess mendel errors,...
|
||||
since they can be uploaded, should be flexible
|
||||
but they are persistent at least
|
||||
same infrastructure for expression?
|
||||
"""
|
||||
for sampleid exclusions or inclusions in the clean tool
|
||||
output from QC eg excess het, gender error, ibd pair member,eigen outlier,excess mendel errors,...
|
||||
since they can be uploaded, should be flexible
|
||||
but they are persistent at least
|
||||
same infrastructure for expression?
|
||||
"""
|
||||
file_ext = "rgSList"
|
||||
|
||||
def __init__(self, **kwd):
|
||||
"""Initialize samplelist datatype"""
|
||||
"""
|
||||
Initialize samplelist datatype
|
||||
"""
|
||||
rgTabList.__init__( self, **kwd )
|
||||
self.column_names[0] = 'FID'
|
||||
self.column_names[1] = 'IID'
|
||||
# this is what Plink wants as at 2009
|
||||
|
||||
def sniff(self,filename):
|
||||
"""
|
||||
"""
|
||||
@@ -264,10 +251,11 @@ class rgSampleList(rgTabList):
|
||||
return False
|
||||
|
||||
class rgFeatureList( rgTabList ):
|
||||
""" for featureid lists of exclusions or inclusions in the clean tool
|
||||
output from QC eg low maf, high missingness, bad hwe in controls, excess mendel errors,...
|
||||
featureid subsets on statistical criteria -> specialized display such as gg
|
||||
same infrastructure for expression?
|
||||
"""
|
||||
for featureid lists of exclusions or inclusions in the clean tool
|
||||
output from QC eg low maf, high missingness, bad hwe in controls, excess mendel errors,...
|
||||
featureid subsets on statistical criteria -> specialized display such as gg
|
||||
same infrastructure for expression?
|
||||
"""
|
||||
file_ext = "rgFList"
|
||||
|
||||
@@ -276,26 +264,23 @@ class rgFeatureList( rgTabList ):
|
||||
rgTabList.__init__( self, **kwd )
|
||||
for i,s in enumerate(['#FeatureId', 'Chr', 'Genpos', 'Mappos']):
|
||||
self.column_names[i] = s
|
||||
|
||||
|
||||
class Rgenetics(Html):
|
||||
"""class to use for rgenetics"""
|
||||
|
||||
MetadataElement( name="base_name", desc="base name for all transformed versions of this genetic dataset", default="rgenetics",
|
||||
readonly=True, set_in_upload=True)
|
||||
"""
|
||||
class to use for rgenetics
|
||||
"""
|
||||
MetadataElement( name="base_name", desc="base name for all transformed versions of this genetic dataset", default="rgenetics", readonly=True, set_in_upload=True)
|
||||
|
||||
composite_type = 'auto_primary_file'
|
||||
allow_datatype_change = False
|
||||
file_ext = 'rgenetics'
|
||||
|
||||
|
||||
def missing_meta( self, dataset=None, **kwargs):
|
||||
"""Checks for empty meta values"""
|
||||
for key, value in dataset.metadata.items():
|
||||
if not value:
|
||||
return True
|
||||
return False
|
||||
|
||||
def generate_primary_file( self, dataset = None ):
|
||||
rval = ['<html><head><title>Rgenetics Galaxy Composite Dataset </title></head><p/>']
|
||||
rval.append('<div>This composite dataset is composed of the following files:<p/><ul>')
|
||||
@@ -306,9 +291,9 @@ class Rgenetics(Html):
|
||||
rval.append( '<li><a href="%s" type="application/binary">%s</a>%s' % ( composite_name, composite_name, opt_text ) )
|
||||
rval.append( '</ul></div></html>' )
|
||||
return "\n".join( rval )
|
||||
|
||||
def regenerate_primary_file(self,dataset):
|
||||
"""cannot do this until we are setting metadata
|
||||
"""
|
||||
cannot do this until we are setting metadata
|
||||
"""
|
||||
def fix(oldpath,newbase):
|
||||
old,e = os.path.splitext(oldpath)
|
||||
@@ -332,30 +317,25 @@ class Rgenetics(Html):
|
||||
f.write("\n".join( rval ))
|
||||
f.write('\n')
|
||||
f.close()
|
||||
|
||||
def set_meta( self, dataset, **kwd ):
|
||||
|
||||
"""for lped/pbed eg
|
||||
|
||||
"""
|
||||
for lped/pbed eg
|
||||
"""
|
||||
if kwd.get('overwrite') == False:
|
||||
if verbose:
|
||||
gal_Log.debug('@@@ rgenetics set_meta called with overwrite = False')
|
||||
#log.debug('@@@ rgenetics set_meta called with overwrite = False')
|
||||
return True
|
||||
try:
|
||||
efp = dataset.extra_files_path
|
||||
except:
|
||||
if verbose:
|
||||
gal_Log.debug('@@@rgenetics set_meta failed %s - dataset %s has no efp ?' % (sys.exc_info()[0], dataset.name))
|
||||
#log.debug('@@@rgenetics set_meta failed %s - dataset %s has no efp ?' % (sys.exc_info()[0], dataset.name))
|
||||
return False
|
||||
try:
|
||||
flist = os.listdir(efp)
|
||||
except:
|
||||
if verbose: gal_Log.debug('@@@rgenetics set_meta failed %s - dataset %s has no efp ?' % (sys.exc_info()[0],dataset.name))
|
||||
flist = os.listdir(efp)
|
||||
except:
|
||||
#log.debug('@@@rgenetics set_meta failed %s - dataset %s has no efp ?' % (sys.exc_info()[0],dataset.name))
|
||||
return False
|
||||
if len(flist) == 0:
|
||||
if verbose:
|
||||
gal_Log.debug('@@@rgenetics set_meta failed - %s efp %s is empty?' % (dataset.name,efp))
|
||||
#log.debug('@@@rgenetics set_meta failed - %s efp %s is empty?' % (dataset.name,efp))
|
||||
return False
|
||||
bn = None
|
||||
for f in flist:
|
||||
@@ -372,9 +352,9 @@ class Rgenetics(Html):
|
||||
dataset.blurb = 'Composite file - Rgenetics Galaxy toolkit'
|
||||
return True
|
||||
|
||||
|
||||
class SNPMatrix(Rgenetics):
|
||||
"""fake class to distinguish different species of Rgenetics data collections
|
||||
"""
|
||||
fake class to distinguish different species of Rgenetics data collections
|
||||
"""
|
||||
file_ext="snpmatrix"
|
||||
|
||||
@@ -385,9 +365,9 @@ class SNPMatrix(Rgenetics):
|
||||
else:
|
||||
dataset.peek = 'file does not exist'
|
||||
dataset.blurb = 'file purged from disk'
|
||||
|
||||
def sniff(self,filename):
|
||||
""" need to check the file header hex code
|
||||
"""
|
||||
need to check the file header hex code
|
||||
"""
|
||||
infile = open(dataset.file_name, "b")
|
||||
head = infile.read(16)
|
||||
@@ -397,9 +377,9 @@ class SNPMatrix(Rgenetics):
|
||||
else:
|
||||
return True
|
||||
|
||||
|
||||
class Lped(Rgenetics):
|
||||
"""fake class to distinguish different species of Rgenetics data collections
|
||||
"""
|
||||
fake class to distinguish different species of Rgenetics data collections
|
||||
"""
|
||||
file_ext="lped"
|
||||
|
||||
@@ -408,9 +388,9 @@ class Lped(Rgenetics):
|
||||
self.add_composite_file( '%s.ped', description = 'Pedigree File', substitute_name_with_metadata = 'base_name', is_binary = True )
|
||||
self.add_composite_file( '%s.map', description = 'Map File', substitute_name_with_metadata = 'base_name', is_binary = True )
|
||||
|
||||
|
||||
class Pphe(Rgenetics):
|
||||
"""fake class to distinguish different species of Rgenetics data collections
|
||||
"""
|
||||
fake class to distinguish different species of Rgenetics data collections
|
||||
"""
|
||||
file_ext="pphe"
|
||||
|
||||
@@ -418,14 +398,15 @@ class Pphe(Rgenetics):
|
||||
Rgenetics.__init__(self, **kwd)
|
||||
self.add_composite_file( '%s.pphe', description = 'Plink Phenotype File', substitute_name_with_metadata = 'base_name' )
|
||||
|
||||
|
||||
class Lmap(Rgenetics):
|
||||
"""fake class to distinguish different species of Rgenetics data collections
|
||||
"""
|
||||
fake class to distinguish different species of Rgenetics data collections
|
||||
"""
|
||||
file_ext="lmap"
|
||||
|
||||
class Fphe(Rgenetics):
|
||||
"""fake class to distinguish different species of Rgenetics data collections
|
||||
"""
|
||||
fake class to distinguish different species of Rgenetics data collections
|
||||
"""
|
||||
file_ext="fphe"
|
||||
|
||||
@@ -434,7 +415,8 @@ class Fphe(Rgenetics):
|
||||
self.add_composite_file( '%s.fphe', description = 'FBAT Phenotype File', substitute_name_with_metadata = 'base_name' )
|
||||
|
||||
class Phe(Rgenetics):
|
||||
"""fake class to distinguish different species of Rgenetics data collections
|
||||
"""
|
||||
fake class to distinguish different species of Rgenetics data collections
|
||||
"""
|
||||
file_ext="phe"
|
||||
|
||||
@@ -442,10 +424,9 @@ class Phe(Rgenetics):
|
||||
Rgenetics.__init__(self, **kwd)
|
||||
self.add_composite_file( '%s.phe', description = 'Phenotype File', substitute_name_with_metadata = 'base_name' )
|
||||
|
||||
|
||||
|
||||
class Fped(Rgenetics):
|
||||
"""fake class to distinguish different species of Rgenetics data collections
|
||||
"""
|
||||
fake class to distinguish different species of Rgenetics data collections
|
||||
"""
|
||||
file_ext="fped"
|
||||
|
||||
@@ -453,9 +434,9 @@ class Fped(Rgenetics):
|
||||
Rgenetics.__init__(self, **kwd)
|
||||
self.add_composite_file( '%s.fped', description = 'FBAT format pedfile', substitute_name_with_metadata = 'base_name' )
|
||||
|
||||
|
||||
class Pbed(Rgenetics):
|
||||
"""fake class to distinguish different species of Rgenetics data collections
|
||||
"""
|
||||
fake class to distinguish different species of Rgenetics data collections
|
||||
"""
|
||||
file_ext="pbed"
|
||||
|
||||
@@ -466,7 +447,8 @@ class Pbed(Rgenetics):
|
||||
self.add_composite_file( '%s.fam', substitute_name_with_metadata = 'base_name', is_binary = True )
|
||||
|
||||
class Eigenstratgeno(Rgenetics):
|
||||
"""fake class to distinguish different species of Rgenetics data collections
|
||||
"""
|
||||
fake class to distinguish different species of Rgenetics data collections
|
||||
"""
|
||||
file_ext="eigenstratgeno"
|
||||
|
||||
@@ -475,11 +457,10 @@ class Eigenstratgeno(Rgenetics):
|
||||
self.add_composite_file( '%s.eigenstratgeno', substitute_name_with_metadata = 'base_name', is_binary = True )
|
||||
self.add_composite_file( '%s.ind', substitute_name_with_metadata = 'base_name', is_binary = True )
|
||||
self.add_composite_file( '%s.map', substitute_name_with_metadata = 'base_name', is_binary = True )
|
||||
|
||||
|
||||
|
||||
class Eigenstratpca(Rgenetics):
|
||||
"""fake class to distinguish different species of Rgenetics data collections
|
||||
"""
|
||||
fake class to distinguish different species of Rgenetics data collections
|
||||
"""
|
||||
file_ext="eigenstratpca"
|
||||
|
||||
@@ -487,22 +468,21 @@ class Eigenstratpca(Rgenetics):
|
||||
Rgenetics.__init__(self, **kwd)
|
||||
self.add_composite_file( '%s.eigenstratpca', description = 'Eigenstrat PCA file', substitute_name_with_metadata = 'base_name' )
|
||||
|
||||
|
||||
class Snptest(Rgenetics):
|
||||
"""fake class to distinguish different species of Rgenetics data collections
|
||||
"""
|
||||
fake class to distinguish different species of Rgenetics data collections
|
||||
"""
|
||||
file_ext="snptest"
|
||||
|
||||
|
||||
class Pheno(Tabular):
|
||||
"""
|
||||
base class for pheno files
|
||||
"""
|
||||
file_ext = 'pheno'
|
||||
|
||||
|
||||
class RexpBase( Html ):
|
||||
"""base class for BioC data structures in Galaxy
|
||||
"""
|
||||
base class for BioC data structures in Galaxy
|
||||
must be constructed with the pheno data in place since that
|
||||
goes into the metadata for each instance
|
||||
"""
|
||||
@@ -518,18 +498,16 @@ class RexpBase( Html ):
|
||||
composite_type = 'auto_primary_file'
|
||||
allow_datatype_change = False
|
||||
|
||||
|
||||
def __init__( self, **kwd ):
|
||||
Html.__init__(self,**kwd)
|
||||
self.add_composite_file( '%s.pheno', description = 'Phenodata tab text file',
|
||||
substitute_name_with_metadata = 'base_name', is_binary=True)
|
||||
|
||||
def generate_primary_file( self, dataset = None ):
|
||||
""" This is called only at upload to write the html file
|
||||
"""
|
||||
This is called only at upload to write the html file
|
||||
cannot rename the datasets here - they come with the default unfortunately
|
||||
"""
|
||||
return '<html><head></head><body>AutoGenerated Primary File for Composite Dataset</body></html>'
|
||||
|
||||
def get_phecols(self, phenolist=[], maxConc=20):
|
||||
"""
|
||||
sept 2009: cannot use whitespace to split - make a more complex structure here
|
||||
@@ -555,7 +533,7 @@ class RexpBase( Html ):
|
||||
else:
|
||||
for col,code in enumerate(row): # keep column order correct
|
||||
if col >= totcols:
|
||||
gal_Log.warning('### get_phecols error in pheno file - row %d col %d (%s) longer than header %s' % (nrows, col, row, head))
|
||||
log.warning('### get_phecols error in pheno file - row %d col %d (%s) longer than header %s' % (nrows, col, row, head))
|
||||
else:
|
||||
concordance[col].setdefault(code,0) # first one is zero
|
||||
concordance[col][code] += 1
|
||||
@@ -601,10 +579,9 @@ class RexpBase( Html ):
|
||||
res = [('no usable phenotype columns found',[('?',0),]),]
|
||||
return res
|
||||
|
||||
|
||||
|
||||
def get_pheno(self,dataset):
|
||||
"""expects a .pheno file in the extra_files_dir - ugh
|
||||
"""
|
||||
expects a .pheno file in the extra_files_dir - ugh
|
||||
note that R is wierd and adds the row.name in
|
||||
the header so the columns are all wrong - unless you tell it not to.
|
||||
A file can be written as
|
||||
@@ -620,11 +597,12 @@ class RexpBase( Html ):
|
||||
else:
|
||||
p = []
|
||||
return '\n'.join(p)
|
||||
|
||||
def set_peek( self, dataset ):
|
||||
"""expects a .pheno file in the extra_files_dir - ugh
|
||||
"""
|
||||
expects a .pheno file in the extra_files_dir - ugh
|
||||
note that R is wierd and does not include the row.name in
|
||||
the header. why?"""
|
||||
the header. why?
|
||||
"""
|
||||
if not dataset.dataset.purged:
|
||||
pp = os.path.join(dataset.extra_files_path,'%s.pheno' % dataset.metadata.base_name)
|
||||
try:
|
||||
@@ -636,17 +614,14 @@ class RexpBase( Html ):
|
||||
else:
|
||||
dataset.peek = 'file does not exist\n'
|
||||
dataset.blurb = 'file purged from disk'
|
||||
|
||||
def get_peek( self, dataset ):
|
||||
"""expects a .pheno file in the extra_files_dir - ugh
|
||||
"""
|
||||
"""expects a .pheno file in the extra_files_dir - ugh"""
|
||||
pp = os.path.join(dataset.extra_files_path,'%s.pheno' % dataset.metadata.base_name)
|
||||
try:
|
||||
p = file(pp,'r').readlines()
|
||||
except:
|
||||
p = ['##failed to find %s' % pp]
|
||||
return ''.join(p[:5])
|
||||
|
||||
def get_file_peek(self,filename):
|
||||
"""
|
||||
can't really peek at a filename - need the extra_files_path and such?
|
||||
@@ -657,7 +632,6 @@ class RexpBase( Html ):
|
||||
except:
|
||||
pass
|
||||
return ''.join(h[:5])
|
||||
|
||||
def regenerate_primary_file(self,dataset):
|
||||
"""cannot do this until we are setting metadata
|
||||
"""
|
||||
@@ -672,24 +646,19 @@ class RexpBase( Html ):
|
||||
f.write("\n".join( rval ))
|
||||
f.write('\n')
|
||||
f.close()
|
||||
|
||||
"""Add metadata elements"""
|
||||
def init_meta( self, dataset, copy_from=None ):
|
||||
"""Add metadata elements"""
|
||||
if copy_from:
|
||||
dataset.metadata = copy_from.metadata
|
||||
|
||||
def set_meta( self, dataset, **kwd ):
|
||||
|
||||
"""
|
||||
NOTE we apply the tabular machinary to the phenodata extracted
|
||||
from a BioC eSet or affybatch.
|
||||
|
||||
"""
|
||||
try:
|
||||
flist = os.listdir(dataset.extra_files_path)
|
||||
except:
|
||||
if verbose:
|
||||
gal_Log.debug('@@@rexpression set_meta failed - no dataset?')
|
||||
#log.debug('@@@rexpression set_meta failed - no dataset?')
|
||||
return False
|
||||
bn = None
|
||||
for f in flist:
|
||||
@@ -727,7 +696,6 @@ class RexpBase( Html ):
|
||||
if not dataset.blurb:
|
||||
dataset.blurb = 'R loadable BioC expression object for the Rexpression Galaxy toolkit'
|
||||
return True
|
||||
|
||||
def make_html_table( self, pp='nothing supplied from peek\n'):
|
||||
"""Create HTML table, used for displaying peek"""
|
||||
out = ['<table cellspacing="0" cellpadding="3">',]
|
||||
@@ -750,20 +718,16 @@ class RexpBase( Html ):
|
||||
except Exception, exc:
|
||||
out = "Can't create html table %s" % str( exc )
|
||||
return out
|
||||
|
||||
def display_peek( self, dataset ):
|
||||
"""Returns formatted html of peek"""
|
||||
out=self.make_html_table(dataset.peek)
|
||||
return out
|
||||
|
||||
def get_mime(self):
|
||||
"""Returns the mime type of the datatype"""
|
||||
return 'text/html'
|
||||
|
||||
|
||||
class Affybatch( RexpBase ):
|
||||
"""derived class for BioC data structures in Galaxy """
|
||||
|
||||
file_ext = "affybatch"
|
||||
|
||||
def __init__( self, **kwd ):
|
||||
@@ -780,7 +744,6 @@ class Eset( RexpBase ):
|
||||
self.add_composite_file( '%s.eset', description = 'ESet R object saved to file',
|
||||
substitute_name_with_metadata = 'base_name', is_binary = True )
|
||||
|
||||
|
||||
class MAlist( RexpBase ):
|
||||
"""derived class for BioC data structures in Galaxy """
|
||||
file_ext = "malist"
|
||||
@@ -790,9 +753,6 @@ class MAlist( RexpBase ):
|
||||
self.add_composite_file( '%s.malist', description = 'MAlist R object saved to file',
|
||||
substitute_name_with_metadata = 'base_name', is_binary = True )
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
import doctest, sys
|
||||
doctest.testmod(sys.modules[__name__])
|
||||
|
||||
|
||||
|
||||
@@ -13,82 +13,6 @@ import os, subprocess, tempfile
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
class Ab1( data.Data ):
|
||||
"""Class describing an ab1 binary sequence file"""
|
||||
file_ext = "ab1"
|
||||
def set_peek( self, dataset ):
|
||||
if not dataset.dataset.purged:
|
||||
export_url = "/history_add_to?" + urlencode({'history_id':dataset.history_id,'ext':'ab1','name':'ab1 sequence','info':'Sequence file','dbkey':dataset.dbkey})
|
||||
dataset.peek = "Binary ab1 sequence file"
|
||||
dataset.blurb = data.nice_size( dataset.get_size() )
|
||||
else:
|
||||
dataset.peek = 'file does not exist'
|
||||
dataset.blurb = 'file purged from disk'
|
||||
def display_peek(self, dataset):
|
||||
try:
|
||||
return dataset.peek
|
||||
except:
|
||||
return "Binary ab1 sequence file (%s)" % ( data.nice_size( dataset.get_size() ) )
|
||||
|
||||
class Scf( data.Data ):
|
||||
"""Class describing an scf binary sequence file"""
|
||||
file_ext = "scf"
|
||||
def set_peek( self, dataset ):
|
||||
if not dataset.dataset.purged:
|
||||
export_url = "/history_add_to?" + urlencode({'history_id':dataset.history_id,'ext':'scf','name':'scf sequence','info':'Sequence file','dbkey':dataset.dbkey})
|
||||
dataset.peek = "Binary scf sequence file"
|
||||
dataset.blurb = data.nice_size( dataset.get_size() )
|
||||
else:
|
||||
dataset.peek = 'file does not exist'
|
||||
dataset.blurb = 'file purged from disk'
|
||||
def display_peek(self, dataset):
|
||||
try:
|
||||
return dataset.peek
|
||||
except:
|
||||
return "Binary scf sequence file (%s)" % ( data.nice_size( dataset.get_size() ) )
|
||||
|
||||
class Binseq( data.Data ):
|
||||
"""Class describing a zip archive of binary sequence files"""
|
||||
file_ext = "binseq.zip"
|
||||
def set_peek( self, dataset ):
|
||||
if not dataset.dataset.purged:
|
||||
zip_file = zipfile.ZipFile( dataset.file_name, "r" )
|
||||
num_files = len( zip_file.namelist() )
|
||||
dataset.peek = "Archive of %s binary sequence files" % ( str( num_files ) )
|
||||
dataset.blurb = data.nice_size( dataset.get_size() )
|
||||
else:
|
||||
dataset.peek = 'file does not exist'
|
||||
dataset.blurb = 'file purged from disk'
|
||||
def display_peek(self, dataset):
|
||||
try:
|
||||
return dataset.peek
|
||||
except:
|
||||
return "Binary sequence file archive (%s)" % ( data.nice_size( dataset.get_size() ) )
|
||||
def get_mime(self):
|
||||
"""Returns the mime type of the datatype"""
|
||||
return 'application/zip'
|
||||
|
||||
class Txtseq( data.Data ):
|
||||
"""Class describing a zip archive of text sequence files"""
|
||||
file_ext = "txtseq.zip"
|
||||
def set_peek( self, dataset ):
|
||||
if not dataset.dataset.purged:
|
||||
zip_file = zipfile.ZipFile( dataset.file_name, "r" )
|
||||
num_files = len( zip_file.namelist() )
|
||||
dataset.peek = "Archive of %s text sequence files" % ( str( num_files ) )
|
||||
dataset.blurb = data.nice_size( dataset.get_size() )
|
||||
else:
|
||||
dataset.peek = 'file does not exist'
|
||||
dataset.blurb = 'file purged from disk'
|
||||
def display_peek(self, dataset):
|
||||
try:
|
||||
return dataset.peek
|
||||
except:
|
||||
return "Text sequence file archive (%s)" % ( data.nice_size( dataset.get_size() ) )
|
||||
def get_mime(self):
|
||||
"""Returns the mime type of the datatype"""
|
||||
return 'application/zip'
|
||||
|
||||
class Image( data.Data ):
|
||||
"""Class describing an image"""
|
||||
def set_peek( self, dataset ):
|
||||
@@ -236,47 +160,3 @@ class Laj( data.Text ):
|
||||
return dataset.peek
|
||||
except:
|
||||
return "peek unavailable"
|
||||
|
||||
class Bam( data.Binary ):
|
||||
"""Class describing a BAM binary file"""
|
||||
file_ext = "bam"
|
||||
MetadataElement( name="bam_index", desc="BAM Index File", param=metadata.FileParameter, readonly=True, no_value=None, visible=False, optional=True )
|
||||
def init_meta( self, dataset, copy_from=None ):
|
||||
data.Binary.init_meta( self, dataset, copy_from=copy_from )
|
||||
def set_meta( self, dataset, overwrite = True, **kwd ):
|
||||
"""
|
||||
Sets index for BAM file.
|
||||
"""
|
||||
index_file = dataset.metadata.bam_index
|
||||
if not index_file:
|
||||
index_file = dataset.metadata.spec['bam_index'].param.new_file( dataset = dataset )
|
||||
tmp_dir = tempfile.gettempdir()
|
||||
tmpf1 = tempfile.NamedTemporaryFile(dir=tmp_dir)
|
||||
tmpf1bai = '%s.bai' % tmpf1.name
|
||||
try:
|
||||
os.system('cd %s' % tmp_dir)
|
||||
os.system('cp %s %s' % (dataset.file_name, tmpf1.name))
|
||||
os.system('samtools index %s' % tmpf1.name)
|
||||
os.system('cp %s %s' % (tmpf1bai, index_file.file_name))
|
||||
except Exception, ex:
|
||||
sys.stderr.write('There was a problem creating the index for the BAM file\n%s\n' + str(ex))
|
||||
tmpf1.close()
|
||||
if os.path.exists(tmpf1bai):
|
||||
os.remove(tmpf1bai)
|
||||
dataset.metadata.bam_index = index_file
|
||||
def set_peek( self, dataset ):
|
||||
if not dataset.dataset.purged:
|
||||
export_url = "/history_add_to?" + urlencode({'history_id':dataset.history_id,'ext':'bam','name':'bam alignments','info':'Alignments file','dbkey':dataset.dbkey})
|
||||
dataset.peek = "Binary bam alignments file"
|
||||
dataset.blurb = data.nice_size( dataset.get_size() )
|
||||
else:
|
||||
dataset.peek = 'file does not exist'
|
||||
dataset.blurb = 'file purged from disk'
|
||||
def display_peek(self, dataset):
|
||||
try:
|
||||
return dataset.peek
|
||||
except:
|
||||
return "Binary bam alignments file (%s)" % ( data.nice_size( dataset.get_size() ) )
|
||||
def get_mime(self):
|
||||
"""Returns the mime type of the datatype"""
|
||||
return 'application/octet-stream'
|
||||
|
||||
@@ -509,7 +509,7 @@ class JobExternalOutputMetadataWrapper( object ):
|
||||
# need to make different keys for them, since ids can overlap
|
||||
return "%s_%d" % ( dataset.__class__.__name__, dataset.id )
|
||||
def setup_external_metadata( self, datasets, sa_session, exec_dir=None, tmp_dir=None, dataset_files_path=None,
|
||||
output_fnames=None, config_root=None, datatypes_config=None, kwds={} ):
|
||||
output_fnames=None, config_root=None, datatypes_config=None, job_metadata=None, kwds={} ):
|
||||
#fill in metadata_files_dict and return the command with args required to set metadata
|
||||
def __metadata_files_list_to_cmd_line( metadata_files ):
|
||||
def __get_filename_override():
|
||||
@@ -564,7 +564,7 @@ class JobExternalOutputMetadataWrapper( object ):
|
||||
sa_session.flush()
|
||||
metadata_files_list.append( metadata_files )
|
||||
#return command required to build
|
||||
return "%s %s %s %s %s %s" % ( os.path.join( exec_dir, 'set_metadata.sh' ), dataset_files_path, tmp_dir, config_root, datatypes_config, " ".join( map( __metadata_files_list_to_cmd_line, metadata_files_list ) ) )
|
||||
return "%s %s %s %s %s %s %s" % ( os.path.join( exec_dir, 'set_metadata.sh' ), dataset_files_path, tmp_dir, config_root, datatypes_config, job_metadata, " ".join( map( __metadata_files_list_to_cmd_line, metadata_files_list ) ) )
|
||||
|
||||
def external_metadata_set_successfully( self, dataset, sa_session ):
|
||||
metadata_files = self.get_output_filenames_by_dataset( dataset, sa_session )
|
||||
|
||||
@@ -3,7 +3,7 @@ Provides mapping between extensions and datatypes, mime-types, etc.
|
||||
"""
|
||||
import os, tempfile
|
||||
import logging
|
||||
import data, tabular, interval, images, sequence, qualityscore, genetics, xml, coverage, tracks, chrominfo
|
||||
import data, tabular, interval, images, sequence, qualityscore, genetics, xml, coverage, tracks, chrominfo, binary
|
||||
import galaxy.util
|
||||
from galaxy.util.odict import odict
|
||||
|
||||
@@ -109,11 +109,11 @@ class Registry( object ):
|
||||
#default values
|
||||
if len(self.datatypes_by_extension) < 1:
|
||||
self.datatypes_by_extension = {
|
||||
'ab1' : images.Ab1(),
|
||||
'ab1' : binary.Ab1(),
|
||||
'axt' : sequence.Axt(),
|
||||
'bam' : images.Bam(),
|
||||
'bam' : binary.Bam(),
|
||||
'bed' : interval.Bed(),
|
||||
'binseq.zip' : images.Binseq(),
|
||||
'binseq.zip' : binary.Binseq(),
|
||||
'blastxml' : xml.BlastXml(),
|
||||
'coverage' : coverage.LastzCoverage(),
|
||||
'customtrack' : interval.CustomTrack(),
|
||||
@@ -132,12 +132,12 @@ class Registry( object ):
|
||||
'qualsolexa' : qualityscore.QualityScoreSolexa(),
|
||||
'qual454' : qualityscore.QualityScore454(),
|
||||
'sam' : tabular.Sam(),
|
||||
'scf' : images.Scf(),
|
||||
'sff' : data.Sff(),
|
||||
'scf' : binary.Scf(),
|
||||
'sff' : binary.Sff(),
|
||||
'tabular' : tabular.Tabular(),
|
||||
'taxonomy' : tabular.Taxonomy(),
|
||||
'txt' : data.Text(),
|
||||
'txtseq.zip' : images.Txtseq(),
|
||||
'txtseq.zip' : data.Txtseq(),
|
||||
'wig' : interval.Wiggle()
|
||||
}
|
||||
self.mimetypes_by_extension = {
|
||||
@@ -174,7 +174,7 @@ class Registry( object ):
|
||||
# because some formats are much more flexibly defined than others.
|
||||
if len(self.sniff_order) < 1:
|
||||
self.sniff_order = [
|
||||
data.Sff(),
|
||||
binary.Sff(),
|
||||
xml.BlastXml(),
|
||||
sequence.Maf(),
|
||||
sequence.Lav(),
|
||||
|
||||
@@ -3,10 +3,7 @@ Datatype classes for tracks/track views within galaxy.
|
||||
"""
|
||||
|
||||
import data
|
||||
import logging
|
||||
import re
|
||||
import binascii
|
||||
from cgi import escape
|
||||
import tabular, binascii, logging
|
||||
from galaxy.datatypes.metadata import MetadataElement
|
||||
from galaxy.datatypes import metadata
|
||||
import galaxy.model
|
||||
@@ -17,7 +14,7 @@ from galaxy.util.hash_util import *
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
class GeneTrack( data.Binary ):
|
||||
class GeneTrack( tabular.Tabular ):
|
||||
file_ext = "genetrack"
|
||||
|
||||
MetadataElement( name="genetrack", default="data.genetrack", desc="HDF index", readonly=True, visible=True, no_value=0 )
|
||||
@@ -27,7 +24,7 @@ class GeneTrack( data.Binary ):
|
||||
super( GeneTrack, self ).__init__( **kwargs )
|
||||
self.add_display_app( 'genetrack', 'View in', '', 'genetrack_link' )
|
||||
def get_display_links( self, dataset, type, app, base_url, target_frame='galaxy_main', **kwd ):
|
||||
return data.Binary.get_display_links( self, dataset, type, app, base_url, target_frame=target_frame, **kwd )
|
||||
return data.Data.get_display_links( self, dataset, type, app, base_url, target_frame=target_frame, **kwd )
|
||||
def genetrack_link( self, hda, type, app, base_url ):
|
||||
ret_val = []
|
||||
if hda.has_data:
|
||||
|
||||
@@ -139,10 +139,15 @@ class JobQueue( object ):
|
||||
JobWrapper( job, None, self ).fail( 'This tool was disabled before the job completed. Please contact your Galaxy administrator, or' )
|
||||
elif job.job_runner_name is None:
|
||||
log.debug( "no runner: %s is still in queued state, adding to the jobs queue" %job.id )
|
||||
self.queue.put( ( job.id, job.tool_id ) )
|
||||
if self.track_jobs_in_database:
|
||||
job.state = model.Job.states.NEW
|
||||
else:
|
||||
self.queue.put( ( job.id, job.tool_id ) )
|
||||
else:
|
||||
job_wrapper = JobWrapper( job, self.app.toolbox.tools_by_id[ job.tool_id ], self )
|
||||
self.dispatcher.recover( job, job_wrapper )
|
||||
if self.sa_session.dirty:
|
||||
self.sa_session.flush()
|
||||
|
||||
def __monitor( self ):
|
||||
"""
|
||||
@@ -526,6 +531,7 @@ class JobWrapper( object ):
|
||||
# If the tool was expected to set the extension, attempt to retrieve it
|
||||
if dataset.ext == 'auto':
|
||||
dataset.extension = context.get( 'ext', 'data' )
|
||||
dataset.init_meta( copy_from=dataset )
|
||||
#if a dataset was copied, it won't appear in our dictionary:
|
||||
#either use the metadata from originating output dataset, or call set_meta on the copies
|
||||
#it would be quicker to just copy the metadata from the originating output dataset,
|
||||
@@ -715,14 +721,15 @@ class JobWrapper( object ):
|
||||
for outfile in [ str( o ) for o in output_paths ]:
|
||||
sizes.append( ( outfile, os.stat( outfile ).st_size ) )
|
||||
return sizes
|
||||
def setup_external_metadata( self, exec_dir = None, tmp_dir = None, dataset_files_path = None, config_root = None, datatypes_config = None, **kwds ):
|
||||
def setup_external_metadata( self, exec_dir = None, tmp_dir = None, dataset_files_path = None, config_root = None, datatypes_config = None, set_extension = True, **kwds ):
|
||||
# extension could still be 'auto' if this is the upload tool.
|
||||
job = self.sa_session.query( model.Job ).get( self.job_id )
|
||||
for output_dataset_assoc in job.output_datasets:
|
||||
if output_dataset_assoc.dataset.ext == 'auto':
|
||||
context = self.get_dataset_finish_context( dict(), output_dataset_assoc.dataset.dataset )
|
||||
output_dataset_assoc.dataset.extension = context.get( 'ext', 'data' )
|
||||
self.sa_session.flush()
|
||||
if set_extension:
|
||||
for output_dataset_assoc in job.output_datasets:
|
||||
if output_dataset_assoc.dataset.ext == 'auto':
|
||||
context = self.get_dataset_finish_context( dict(), output_dataset_assoc.dataset.dataset )
|
||||
output_dataset_assoc.dataset.extension = context.get( 'ext', 'data' )
|
||||
self.sa_session.flush()
|
||||
if tmp_dir is None:
|
||||
#this dir should should relative to the exec_dir
|
||||
tmp_dir = self.app.config.new_file_path
|
||||
@@ -739,6 +746,7 @@ class JobWrapper( object ):
|
||||
dataset_files_path = dataset_files_path,
|
||||
config_root = config_root,
|
||||
datatypes_config = datatypes_config,
|
||||
job_metadata = os.path.join( self.working_directory, TOOL_PROVIDED_JOB_METADATA_FILE ),
|
||||
**kwds )
|
||||
|
||||
class DefaultJobDispatcher( object ):
|
||||
|
||||
@@ -106,7 +106,9 @@ class LocalJobRunner( object ):
|
||||
#this is terminatable when output dataset/job is deleted
|
||||
#so that long running set_meta()s can be cancelled without having to reboot the server
|
||||
if job_wrapper.get_state() not in [ model.Job.states.ERROR, model.Job.states.DELETED ] and self.app.config.set_metadata_externally and job_wrapper.output_paths:
|
||||
external_metadata_script = job_wrapper.setup_external_metadata( output_fnames = job_wrapper.get_output_fnames(), kwds = { 'overwrite' : False } ) #we don't want to overwrite metadata that was copied over in init_meta(), as per established behavior
|
||||
external_metadata_script = job_wrapper.setup_external_metadata( output_fnames = job_wrapper.get_output_fnames(),
|
||||
set_extension = True,
|
||||
kwds = { 'overwrite' : False } ) #we don't want to overwrite metadata that was copied over in init_meta(), as per established behavior
|
||||
log.debug( 'executing external set_meta script for job %d: %s' % ( job_wrapper.job_id, external_metadata_script ) )
|
||||
external_metadata_proc = subprocess.Popen( args = external_metadata_script,
|
||||
shell = True,
|
||||
|
||||
@@ -29,7 +29,6 @@ if [ "$GALAXY_LIB" != "None" ]; then
|
||||
fi
|
||||
cd %s
|
||||
%s
|
||||
%s
|
||||
"""
|
||||
|
||||
pbs_symlink_template = """#!/bin/sh
|
||||
@@ -178,7 +177,9 @@ class PBSJobRunner( object ):
|
||||
pbs_queue_name = self.determine_pbs_queue( runner_url )
|
||||
c = pbs.pbs_connect( pbs_server_name )
|
||||
if c <= 0:
|
||||
raise Exception( "Connection to PBS server for submit failed" )
|
||||
job_wrapper.fail( "Unable to queue job for execution. Resubmitting the job may succeed." )
|
||||
log.error( "Connection to PBS server for submit failed" )
|
||||
return
|
||||
|
||||
# define job attributes
|
||||
ofile = "%s/%s.o" % (self.app.config.cluster_files_directory, job_wrapper.job_id)
|
||||
@@ -221,11 +222,15 @@ class PBSJobRunner( object ):
|
||||
if self.app.config.pbs_stage_path != '':
|
||||
script = pbs_symlink_template % (job_wrapper.galaxy_lib_dir, " ".join(job_wrapper.get_input_fnames() + output_files), self.app.config.pbs_stage_path, exec_dir, command_line)
|
||||
else:
|
||||
script = pbs_template % ( job_wrapper.galaxy_lib_dir, exec_dir, command_line )
|
||||
if self.app.config.set_metadata_externally:
|
||||
external_metadata_script = job_wrapper.setup_external_metadata( exec_dir = os.path.abspath( os.getcwd() ), tmp_dir = self.app.config.new_file_path, dataset_files_path = self.app.model.Dataset.file_path, output_fnames = output_fnames, kwds = { 'overwrite' : False } ) #we don't want to overwrite metadata that was copied over in init_meta(), as per established behavior
|
||||
else:
|
||||
external_metadata_script = ""
|
||||
script = pbs_template % ( job_wrapper.galaxy_lib_dir, exec_dir, command_line, external_metadata_script )
|
||||
script += "cd %s\n" % os.path.abspath( os.getcwd() )
|
||||
script += "%s\n" % job_wrapper.setup_external_metadata( exec_dir = os.path.abspath( os.getcwd() ),
|
||||
tmp_dir = self.app.config.new_file_path,
|
||||
dataset_files_path = self.app.model.Dataset.file_path,
|
||||
output_fnames = output_fnames,
|
||||
set_extension = False,
|
||||
kwds = { 'overwrite' : False } ) #we don't want to overwrite metadata that was copied over in init_meta(), as per established behavior
|
||||
job_file = "%s/%s.sh" % (self.app.config.cluster_files_directory, job_wrapper.job_id)
|
||||
fh = file(job_file, "w")
|
||||
fh.write(script)
|
||||
|
||||
@@ -41,6 +41,7 @@ class SetMetadataToolAction( ToolAction ):
|
||||
output_fnames = None,
|
||||
config_root = None,
|
||||
datatypes_config = None,
|
||||
job_metadata = None,
|
||||
kwds = { 'overwrite' : True } )
|
||||
incoming[ '__SET_EXTERNAL_METADATA_COMMAND_LINE__' ] = cmd_line
|
||||
for name, value in tool.params_to_strings( incoming, trans.app ).iteritems():
|
||||
|
||||
@@ -20,25 +20,38 @@ GALAXY TOOL ERROR REPORT
|
||||
This error report was sent from the Galaxy instance hosted on the server
|
||||
"${host}"
|
||||
-----------------------------------------------------------------------------
|
||||
This is in reference to output dataset ${dataset_id}.
|
||||
This is in reference to dataset id ${dataset_id} from history id ${history_id}
|
||||
-----------------------------------------------------------------------------
|
||||
You should be able to view the history containing the related history item
|
||||
|
||||
${hid}: ${history_item_name}
|
||||
|
||||
by logging in as a Galaxy admin user to the Galaxy instance referenced above
|
||||
and pointing your browser to the following link.
|
||||
|
||||
${history_view_link}
|
||||
-----------------------------------------------------------------------------
|
||||
The user '${email}' provided the following information:
|
||||
|
||||
${message}
|
||||
-----------------------------------------------------------------------------
|
||||
job id: ${job_id}
|
||||
tool id: ${tool_id}
|
||||
tool id: ${job_tool_id}
|
||||
-----------------------------------------------------------------------------
|
||||
job command line:
|
||||
${job_command_line}
|
||||
-----------------------------------------------------------------------------
|
||||
job stderr:
|
||||
${stderr}
|
||||
${job_stderr}
|
||||
-----------------------------------------------------------------------------
|
||||
job stdout:
|
||||
${stdout}
|
||||
${job_stdout}
|
||||
-----------------------------------------------------------------------------
|
||||
job info:
|
||||
${info}
|
||||
${job_info}
|
||||
-----------------------------------------------------------------------------
|
||||
job traceback:
|
||||
${traceback}
|
||||
${job_traceback}
|
||||
-----------------------------------------------------------------------------
|
||||
(This is an automated message).
|
||||
"""
|
||||
@@ -103,41 +116,45 @@ class DatasetInterface( BaseController ):
|
||||
|
||||
@web.expose
|
||||
def errors( self, trans, id ):
|
||||
dataset = trans.sa_session.query( model.HistoryDatasetAssociation ).get( id )
|
||||
return trans.fill_template( "dataset/errors.mako", dataset=dataset )
|
||||
|
||||
hda = trans.sa_session.query( model.HistoryDatasetAssociation ).get( id )
|
||||
return trans.fill_template( "dataset/errors.mako", hda=hda )
|
||||
@web.expose
|
||||
def stderr( self, trans, id ):
|
||||
dataset = trans.sa_session.query( model.HistoryDatasetAssociation ).get( id )
|
||||
job = dataset.creating_job_associations[0].job
|
||||
trans.response.set_content_type( 'text/plain' )
|
||||
return job.stderr
|
||||
|
||||
@web.expose
|
||||
def report_error( self, trans, id, email='', message="" ):
|
||||
smtp_server = trans.app.config.smtp_server
|
||||
if smtp_server is None:
|
||||
return trans.show_error_message( "Sorry, mail is not configured for this galaxy instance" )
|
||||
return trans.show_error_message( "Mail is not configured for this galaxy instance" )
|
||||
to_address = trans.app.config.error_email_to
|
||||
if to_address is None:
|
||||
return trans.show_error_message( "Sorry, error reporting has been disabled for this galaxy instance" )
|
||||
return trans.show_error_message( "Error reporting has been disabled for this galaxy instance" )
|
||||
# Get the dataset and associated job
|
||||
dataset = trans.sa_session.query( model.HistoryDatasetAssociation ).get( id )
|
||||
job = dataset.creating_job_associations[0].job
|
||||
hda = trans.sa_session.query( model.HistoryDatasetAssociation ).get( id )
|
||||
job = hda.creating_job_associations[0].job
|
||||
# Get the name of the server hosting the Galaxy instance from which this report originated
|
||||
host = trans.request.host
|
||||
history_view_link = "%s/history/view?id=%s" % ( str( host ), trans.security.encode_id( hda.history_id ) )
|
||||
# Build the email message
|
||||
msg = MIMEText( string.Template( error_report_template )
|
||||
.safe_substitute( host=host,
|
||||
dataset_id=dataset.id,
|
||||
email=email,
|
||||
message=message,
|
||||
dataset_id=hda.dataset_id,
|
||||
history_id=hda.history_id,
|
||||
hid=hda.hid,
|
||||
history_item_name=hda.get_display_name(),
|
||||
history_view_link=history_view_link,
|
||||
job_id=job.id,
|
||||
tool_id=job.tool_id,
|
||||
stderr=job.stderr,
|
||||
stdout=job.stdout,
|
||||
traceback=job.traceback,
|
||||
info=job.info ) )
|
||||
job_tool_id=job.tool_id,
|
||||
job_command_line=job.command_line,
|
||||
job_stderr=job.stderr,
|
||||
job_stdout=job.stdout,
|
||||
job_info=job.info,
|
||||
job_traceback=job.traceback,
|
||||
email=email,
|
||||
message=message ) )
|
||||
frm = to_address
|
||||
# Check email a bit
|
||||
email = email.strip()
|
||||
|
||||
@@ -8,9 +8,71 @@ from galaxy.tools.parameters.basic import parameter_types
|
||||
from elementtree.ElementTree import XML, Element
|
||||
from galaxy.util.odict import odict
|
||||
import copy
|
||||
from galaxy.web.framework.helpers import time_ago, iff, grids
|
||||
|
||||
log = logging.getLogger( __name__ )
|
||||
|
||||
class FormsGrid( grids.Grid ):
|
||||
# Custom column types
|
||||
class NameColumn( grids.TextColumn ):
|
||||
def get_value(self, trans, grid, form):
|
||||
return form.latest_form.name
|
||||
class DescriptionColumn( grids.TextColumn ):
|
||||
def get_value(self, trans, grid, form):
|
||||
return form.latest_form.desc
|
||||
class TypeColumn( grids.TextColumn ):
|
||||
def get_value(self, trans, grid, form):
|
||||
return form.latest_form.type
|
||||
class DeletedColumn( grids.GridColumn ):
|
||||
def get_accepted_filters( self ):
|
||||
""" Returns a list of accepted filters for this column. """
|
||||
accepted_filter_labels_and_vals = { "active" : "False", "deleted" : "True", "all": "All" }
|
||||
accepted_filters = []
|
||||
for label, val in accepted_filter_labels_and_vals.items():
|
||||
args = { self.key: val }
|
||||
accepted_filters.append( grids.GridColumnFilter( label, args) )
|
||||
return accepted_filters
|
||||
# Grid definition
|
||||
title = "Forms"
|
||||
template = "admin/forms/grid.mako"
|
||||
model_class = model.FormDefinitionCurrent
|
||||
default_sort_key = "-create_time"
|
||||
num_rows_per_page = 50
|
||||
preserve_state = True
|
||||
use_paging = True
|
||||
default_filter = dict( deleted="False" )
|
||||
columns = [
|
||||
NameColumn( "Name",
|
||||
key="name",
|
||||
model_class=model.FormDefinition,
|
||||
link=( lambda item: iff( item.deleted, None, dict( operation="view", id=item.id ) ) ),
|
||||
attach_popup=True,
|
||||
filterable="advanced" ),
|
||||
DescriptionColumn( "Description",
|
||||
key='desc',
|
||||
model_class=model.FormDefinition,
|
||||
filterable="advanced" ),
|
||||
TypeColumn( "Type" ),
|
||||
DeletedColumn( "Deleted",
|
||||
key="deleted",
|
||||
visible=False,
|
||||
filterable="advanced" )
|
||||
]
|
||||
columns.append( grids.MulticolFilterColumn( "Search",
|
||||
cols_to_filter=[ columns[0], columns[1] ],
|
||||
key="free-text-search",
|
||||
visible=False,
|
||||
filterable="standard" ) )
|
||||
operations = [
|
||||
grids.GridOperation( "Edit", allow_multiple=False, condition=( lambda item: not item.deleted ) ),
|
||||
grids.GridOperation( "Delete", allow_multiple=True, condition=( lambda item: not item.deleted ) ),
|
||||
grids.GridOperation( "Undelete", condition=( lambda item: item.deleted ) ),
|
||||
]
|
||||
global_actions = [
|
||||
grids.GridAction( "Create new form", dict( controller='forms',
|
||||
action='new' ) )
|
||||
]
|
||||
|
||||
class Forms( BaseController ):
|
||||
# Empty form field
|
||||
empty_field = { 'label': '',
|
||||
@@ -20,38 +82,38 @@ class Forms( BaseController ):
|
||||
'type': BaseField.form_field_types()[0],
|
||||
'selectlist': [],
|
||||
'layout': 'none' }
|
||||
forms_grid = FormsGrid()
|
||||
|
||||
@web.expose
|
||||
@web.require_admin
|
||||
def index( self, trans, **kwd ):
|
||||
params = util.Params( kwd )
|
||||
msg = util.restore_text( params.get( 'msg', '' ) )
|
||||
messagetype = params.get( 'messagetype', 'done' )
|
||||
return trans.fill_template( "/sample/index.mako",
|
||||
default_action=params.get( 'default_action', None ),
|
||||
msg=msg,
|
||||
messagetype=messagetype )
|
||||
@web.expose
|
||||
@web.require_admin
|
||||
def manage( self, trans, **kwd ):
|
||||
params = util.Params( kwd )
|
||||
msg = util.restore_text( params.get( 'msg', '' ) )
|
||||
messagetype = params.get( 'messagetype', 'done' )
|
||||
show_filter = params.get( 'show_filter', 'Active' )
|
||||
return self._show_forms_list(trans, msg, messagetype, show_filter)
|
||||
def _show_forms_list(self, trans, msg, messagetype, show_filter='Active'):
|
||||
all_forms = trans.sa_session.query( trans.app.model.FormDefinitionCurrent )
|
||||
if show_filter == 'All':
|
||||
forms_list = all_forms
|
||||
elif show_filter == 'Deleted':
|
||||
forms_list = [form for form in all_forms if form.deleted]
|
||||
else:
|
||||
forms_list = [form for form in all_forms if not form.deleted]
|
||||
return trans.fill_template( '/admin/forms/manage_forms.mako',
|
||||
fdc_list=forms_list,
|
||||
all_forms=all_forms,
|
||||
show_filter=show_filter,
|
||||
msg=msg,
|
||||
messagetype=messagetype )
|
||||
def manage( self, trans, **kwd ):
|
||||
if 'operation' in kwd:
|
||||
operation = kwd['operation'].lower()
|
||||
if not kwd.get( 'id', None ):
|
||||
return trans.response.send_redirect( web.url_for( controller='forms',
|
||||
action='manage',
|
||||
status='error',
|
||||
message="Invalid form ID") )
|
||||
if operation == "view":
|
||||
return self.__view( trans, **kwd )
|
||||
elif operation == "delete":
|
||||
return self.__delete( trans, **kwd )
|
||||
elif operation == "undelete":
|
||||
return self.__undelete( trans, **kwd )
|
||||
elif operation == "edit":
|
||||
return self.__edit( trans, **kwd )
|
||||
return self.forms_grid( trans, **kwd )
|
||||
def __view(self, trans, **kwd):
|
||||
try:
|
||||
fdc = trans.sa_session.query( trans.app.model.FormDefinitionCurrent )\
|
||||
.get( trans.security.decode_id(kwd['id']) )
|
||||
except:
|
||||
return trans.response.send_redirect( web.url_for( controller='forms',
|
||||
action='manage',
|
||||
msg='Invalid form',
|
||||
messagetype='error' ) )
|
||||
return trans.fill_template( '/admin/forms/show_form_read_only.mako',
|
||||
form=fdc.latest_form )
|
||||
def __form_types_widget(self, trans, selected='none'):
|
||||
form_type_selectbox = SelectField( 'form_type_selectbox',
|
||||
refresh_on_change=True,
|
||||
@@ -86,13 +148,14 @@ class Forms( BaseController ):
|
||||
self.__get_saved_form( fd )
|
||||
if self.__imported_from_file:
|
||||
return trans.response.send_redirect( web.url_for( controller='forms',
|
||||
action='edit',
|
||||
show_form=True,
|
||||
form_id=fd.id) )
|
||||
action='manage',
|
||||
operation='edit',
|
||||
id=trans.security.encode_id(fd.current.id)) )
|
||||
else:
|
||||
return trans.response.send_redirect( web.url_for( controller='forms',
|
||||
action='edit',
|
||||
form_id=fd.id,
|
||||
action='manage',
|
||||
operation='edit',
|
||||
id=trans.security.encode_id(fd.current.id),
|
||||
add_field_button='Add field',
|
||||
name=fd.name,
|
||||
description=fd.desc,
|
||||
@@ -105,35 +168,43 @@ class Forms( BaseController ):
|
||||
inputs=inputs,
|
||||
msg=msg,
|
||||
messagetype=messagetype )
|
||||
@web.expose
|
||||
@web.require_admin
|
||||
def delete( self, trans, **kwd ):
|
||||
params = util.Params( kwd )
|
||||
msg = util.restore_text( params.get( 'msg', '' ) )
|
||||
messagetype = params.get( 'messagetype', 'done' )
|
||||
fd = trans.sa_session.query( trans.app.model.FormDefinition ).get( int( util.restore_text( params.form_id ) ) )
|
||||
fd.form_definition_current.deleted = True
|
||||
trans.sa_session.add( fd.form_definition_current )
|
||||
trans.sa_session.flush()
|
||||
return self._show_forms_list(trans,
|
||||
msg='The form definition named %s is deleted.' % fd.name,
|
||||
messagetype='done')
|
||||
@web.expose
|
||||
@web.require_admin
|
||||
def undelete( self, trans, **kwd ):
|
||||
params = util.Params( kwd )
|
||||
msg = util.restore_text( params.get( 'msg', '' ) )
|
||||
messagetype = params.get( 'messagetype', 'done' )
|
||||
fd = trans.sa_session.query( trans.app.model.FormDefinition ).get( int( util.restore_text( params.form_id ) ) )
|
||||
fd.form_definition_current.deleted = False
|
||||
trans.sa_session.add( fd.form_definition_current )
|
||||
trans.sa_session.flush()
|
||||
return self._show_forms_list(trans,
|
||||
msg='The form definition named %s is undeleted.' % fd.name,
|
||||
messagetype='done')
|
||||
@web.expose
|
||||
@web.require_admin
|
||||
def edit( self, trans, **kwd ):
|
||||
def __delete( self, trans, **kwd ):
|
||||
id_list = util.listify( kwd['id'] )
|
||||
delete_failed = []
|
||||
for id in id_list:
|
||||
try:
|
||||
fdc = trans.sa_session.query( trans.app.model.FormDefinitionCurrent ).get( trans.security.decode_id(id) )
|
||||
except:
|
||||
return trans.response.send_redirect( web.url_for( controller='forms',
|
||||
action='manage',
|
||||
message='Invalid form',
|
||||
status='error' ) )
|
||||
fdc.deleted = True
|
||||
trans.sa_session.add( fdc )
|
||||
trans.sa_session.flush()
|
||||
return trans.response.send_redirect( web.url_for( controller='forms',
|
||||
action='manage',
|
||||
message='%i form(s) is deleted.' % len(id_list),
|
||||
status='done') )
|
||||
def __undelete( self, trans, **kwd ):
|
||||
id_list = util.listify( kwd['id'] )
|
||||
delete_failed = []
|
||||
for id in id_list:
|
||||
try:
|
||||
fdc = trans.sa_session.query( trans.app.model.FormDefinitionCurrent ).get( trans.security.decode_id(id) )
|
||||
except:
|
||||
return trans.response.send_redirect( web.url_for( controller='forms',
|
||||
action='manage',
|
||||
message='Invalid form',
|
||||
status='error' ) )
|
||||
fdc.deleted = False
|
||||
trans.sa_session.add( fdc )
|
||||
trans.sa_session.flush()
|
||||
return trans.response.send_redirect( web.url_for( controller='forms',
|
||||
action='manage',
|
||||
message='%i form(s) is undeleted.' % len(id_list),
|
||||
status='done') )
|
||||
def __edit( self, trans, **kwd ):
|
||||
'''
|
||||
This callback method is for handling all the editing functions like
|
||||
renaming fields, adding/deleting fields, changing fields attributes.
|
||||
@@ -142,17 +213,28 @@ class Forms( BaseController ):
|
||||
msg = util.restore_text( params.get( 'msg', '' ) )
|
||||
messagetype = params.get( 'messagetype', 'done' )
|
||||
try:
|
||||
fd = trans.sa_session.query( trans.app.model.FormDefinition ).get( int( params.get( 'form_id', None ) ) )
|
||||
fdc = trans.sa_session.query( trans.app.model.FormDefinitionCurrent ).get( trans.security.decode_id(kwd['id']) )
|
||||
except:
|
||||
return trans.response.send_redirect( web.url_for( controller='forms',
|
||||
action='manage',
|
||||
msg='Invalid form',
|
||||
messagetype='error' ) )
|
||||
message='Invalid form',
|
||||
status='error' ) )
|
||||
fd = fdc.latest_form
|
||||
#
|
||||
# Show the form for editing
|
||||
# Save changes
|
||||
#
|
||||
if params.get( 'show_form', False ):
|
||||
if params.get( 'save_changes_button', False ):
|
||||
fd_new, msg = self.__save_form( trans, fdc_id=fd.form_definition_current.id, **kwd )
|
||||
# if validation error encountered while saving the form, show the
|
||||
# unsaved form, with the error message
|
||||
if not fd_new:
|
||||
current_form = self.__get_form( trans, **kwd )
|
||||
return self.__show( trans=trans, form=fd, current_form=current_form,
|
||||
msg=msg, messagetype='error', **kwd )
|
||||
# everything went fine. form saved successfully. Show the saved form
|
||||
fd = fd_new
|
||||
current_form = self.__get_saved_form( fd )
|
||||
msg = "The form '%s' has been updated with the changes." % fd.name
|
||||
return self.__show( trans=trans, form=fd, current_form=current_form,
|
||||
msg=msg, messagetype=messagetype, **kwd )
|
||||
#
|
||||
@@ -193,31 +275,6 @@ class Forms( BaseController ):
|
||||
return self.__show( trans=trans, form=fd, current_form=current_form,
|
||||
msg=msg, messagetype=messagetype, **kwd )
|
||||
#
|
||||
# Save changes
|
||||
#
|
||||
elif params.get( 'save_changes_button', False ):
|
||||
fd_new, msg = self.__save_form( trans, fdc_id=fd.form_definition_current.id, **kwd )
|
||||
# if validation error encountered while saving the form, show the
|
||||
# unsaved form, with the error message
|
||||
if not fd_new:
|
||||
current_form = self.__get_form( trans, **kwd )
|
||||
return self.__show( trans=trans, form=fd, current_form=current_form,
|
||||
msg=msg, messagetype='error', **kwd )
|
||||
# everything went fine. form saved successfully. Show the saved form
|
||||
fd = fd_new
|
||||
current_form = self.__get_saved_form( fd )
|
||||
msg = "The form '%s' has been updated with the changes." % fd.name
|
||||
return self.__show( trans=trans, form=fd, current_form=current_form,
|
||||
msg=msg, messagetype=messagetype, **kwd )
|
||||
#
|
||||
# Show form read-only
|
||||
#
|
||||
elif params.get( 'read_only', False ):
|
||||
return trans.fill_template( '/admin/forms/show_form_read_only.mako',
|
||||
form=fd,
|
||||
msg=msg,
|
||||
messagetype=messagetype )
|
||||
#
|
||||
# Add SelectField option
|
||||
#
|
||||
elif 'Add' in kwd.values():
|
||||
@@ -234,6 +291,13 @@ class Forms( BaseController ):
|
||||
current_form = self.__get_form( trans, **kwd )
|
||||
return self.__show( trans=trans, form=fd, current_form=current_form,
|
||||
msg=msg, messagetype=messagetype, **kwd )
|
||||
#
|
||||
# Show the form for editing
|
||||
#
|
||||
else:
|
||||
current_form = self.__get_saved_form( fd )
|
||||
return self.__show( trans=trans, form=fd, current_form=current_form,
|
||||
msg=msg, messagetype=messagetype, **kwd )
|
||||
|
||||
def __add_selectbox_option( self, trans, fd, msg, messagetype, **kwd ):
|
||||
'''
|
||||
|
||||
@@ -87,7 +87,7 @@ class HistoryListGrid( grids.Grid ):
|
||||
# Grid definition
|
||||
title = "Saved Histories"
|
||||
model_class = model.History
|
||||
template='/history/grid.mako'
|
||||
template='/grid_base.mako'
|
||||
default_sort_key = "-create_time"
|
||||
columns = [
|
||||
NameColumn( "Name", key="name", model_class=model.History,
|
||||
@@ -110,14 +110,14 @@ class HistoryListGrid( grids.Grid ):
|
||||
)
|
||||
|
||||
operations = [
|
||||
grids.GridOperation( "Switch", allow_multiple=False, condition=( lambda item: not item.deleted ) ),
|
||||
grids.GridOperation( "Share", condition=( lambda item: not item.deleted ) ),
|
||||
grids.GridOperation( "Unshare", condition=( lambda item: not item.deleted ) ),
|
||||
grids.GridOperation( "Rename", condition=( lambda item: not item.deleted ) ),
|
||||
grids.GridOperation( "Delete", condition=( lambda item: not item.deleted ) ),
|
||||
grids.GridOperation( "Undelete", condition=( lambda item: item.deleted ) ),
|
||||
grids.GridOperation( "Enable import via link", condition=( lambda item: item.deleted ) ),
|
||||
grids.GridOperation( "Disable import via link", condition=( lambda item: item.deleted ) )
|
||||
grids.GridOperation( "Switch", allow_multiple=False, condition=( lambda item: not item.deleted ), async_compatible=True ),
|
||||
grids.GridOperation( "Share", condition=( lambda item: not item.deleted ), async_compatible=False ),
|
||||
grids.GridOperation( "Unshare", condition=( lambda item: not item.deleted ), async_compatible=False ),
|
||||
grids.GridOperation( "Rename", condition=( lambda item: not item.deleted ), async_compatible=False ),
|
||||
grids.GridOperation( "Delete", condition=( lambda item: not item.deleted ), async_compatible=True ),
|
||||
grids.GridOperation( "Undelete", condition=( lambda item: item.deleted ), async_compatible=True ),
|
||||
grids.GridOperation( "Enable import via link", condition=( lambda item: item.deleted ), async_compatible=True ),
|
||||
grids.GridOperation( "Disable import via link", condition=( lambda item: item.deleted ), async_compatible=True )
|
||||
]
|
||||
standard_filters = [
|
||||
grids.GridColumnFilter( "Active", args=dict( deleted=False ) ),
|
||||
@@ -262,7 +262,7 @@ class HistoryController( BaseController ):
|
||||
n_deleted += 1
|
||||
status = SUCCESS
|
||||
if n_deleted:
|
||||
message_parts.append( "Deleted %d histories. " % n_deleted )
|
||||
message_parts.append( "Deleted %d %s. " % ( n_deleted, iff( n_deleted != 1, "histories", "history" ) ) )
|
||||
if deleted_current:
|
||||
message_parts.append( "Your active history was deleted, a new empty history is now active. " )
|
||||
status = INFO
|
||||
@@ -290,7 +290,7 @@ class HistoryController( BaseController ):
|
||||
status = SUCCESS
|
||||
message_parts = []
|
||||
if n_undeleted:
|
||||
message_parts.append( "Undeleted %d histories." % n_undeleted )
|
||||
message_parts.append( "Undeleted %d %s. " % ( n_undeleted, iff( n_undeleted != 1, "histories", "history" ) ) )
|
||||
if n_already_purged:
|
||||
message_parts.append( "%d histories have already been purged and cannot be undeleted." % n_already_purged )
|
||||
status = WARNING
|
||||
@@ -438,23 +438,20 @@ class HistoryController( BaseController ):
|
||||
Warning! If you import this history, you will lose your current
|
||||
history. Click <a href="%s">here</a> to confirm.
|
||||
""" % web.url_for( id=id, confirm=True ) )
|
||||
|
||||
@web.expose
|
||||
def view( self, trans, id=None ):
|
||||
"""View a history. If a history is importable, then it is viewable by any user."""
|
||||
|
||||
# Get history to view.
|
||||
if not id:
|
||||
return trans.show_error_message( "You must specify a history you want to view." )
|
||||
history_to_view = get_history( trans, id, False)
|
||||
|
||||
# Integrity checks.
|
||||
if not history_to_view:
|
||||
return trans.show_error_message( "The specified history does not exist.")
|
||||
return trans.show_error_message( "The specified history does not exist." )
|
||||
# Admin users can view any history
|
||||
# TODO: Use a new flag to determine if history is viewable?
|
||||
if not history_to_view.importable:
|
||||
error( "The owner of this history has not published this history." )
|
||||
|
||||
if not trans.user_is_admin and not history_to_view.importable:
|
||||
error( "Either you are not allowed to view this history or the owner of this history has not published it." )
|
||||
# View history.
|
||||
query = trans.sa_session.query( model.HistoryDatasetAssociation ) \
|
||||
.filter( model.HistoryDatasetAssociation.history == history_to_view ) \
|
||||
@@ -469,7 +466,6 @@ class HistoryController( BaseController ):
|
||||
datasets = query.all(),
|
||||
user_owns_history = user_owns_history,
|
||||
show_deleted = False )
|
||||
|
||||
@web.expose
|
||||
@web.require_login( "share histories with other users" )
|
||||
def share( self, trans, id=None, email="", **kwd ):
|
||||
|
||||
@@ -117,7 +117,7 @@ class LibraryCommon( BaseController ):
|
||||
uploaded_dataset.link_data_only = True
|
||||
uploaded_dataset.data.file_name = os.path.abspath( path )
|
||||
trans.sa_session.add( uploaded_dataset.data )
|
||||
trans.sa_session.data.flush()
|
||||
trans.sa_session.flush()
|
||||
return uploaded_dataset
|
||||
def get_server_dir_uploaded_datasets( self, trans, params, full_dir, import_dir_desc, library_bunch, err_redirect, msg ):
|
||||
files = []
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
from galaxy.web.base.controller import *
|
||||
from galaxy.web.framework.helpers import time_ago, grids
|
||||
from galaxy.util.sanitize_html import sanitize_html
|
||||
from galaxy.util.odict import odict
|
||||
|
||||
import re
|
||||
|
||||
@@ -69,21 +70,66 @@ class PageAllPublishedGrid( grids.Grid ):
|
||||
]
|
||||
def apply_default_filter( self, trans, query, **kwargs ):
|
||||
return query.filter_by( deleted=False, published=True )
|
||||
|
||||
|
||||
class NameColumn( grids.TextColumn ):
|
||||
def get_value(self, trans, grid, history):
|
||||
return history.get_display_name()
|
||||
|
||||
class HistorySelectionGrid( grids.Grid ):
|
||||
# Custom columns.
|
||||
class NameColumn( grids.TextColumn ):
|
||||
def get_value(self, trans, grid, history):
|
||||
return history.get_display_name()
|
||||
|
||||
class DeletedColumn( grids.GridColumn ):
|
||||
def get_accepted_filters( self ):
|
||||
""" Returns a list of accepted filters for this column. """
|
||||
accepted_filter_labels_and_vals = { "active" : "False", "deleted" : "True", "all": "All" }
|
||||
accepted_filters = []
|
||||
for label, val in accepted_filter_labels_and_vals.items():
|
||||
args = { self.key: val }
|
||||
accepted_filters.append( grids.GridColumnFilter( label, args) )
|
||||
return accepted_filters
|
||||
|
||||
class SharingColumn( grids.GridColumn ):
|
||||
def filter( self, db_session, query, column_filter ):
|
||||
""" Modify query to filter histories by sharing status. """
|
||||
if column_filter == "All":
|
||||
pass
|
||||
elif column_filter:
|
||||
if column_filter == "private":
|
||||
query = query.filter( model.History.users_shared_with == None )
|
||||
query = query.filter( model.History.importable == False )
|
||||
elif column_filter == "shared":
|
||||
query = query.filter( model.History.users_shared_with != None )
|
||||
elif column_filter == "importable":
|
||||
query = query.filter( model.History.importable == True )
|
||||
return query
|
||||
def get_accepted_filters( self ):
|
||||
""" Returns a list of accepted filters for this column. """
|
||||
accepted_filter_labels_and_vals = odict()
|
||||
accepted_filter_labels_and_vals["private"] = "private"
|
||||
accepted_filter_labels_and_vals["shared"] = "shared"
|
||||
accepted_filter_labels_and_vals["importable"] = "importable"
|
||||
accepted_filter_labels_and_vals["all"] = "All"
|
||||
accepted_filters = []
|
||||
for label, val in accepted_filter_labels_and_vals.items():
|
||||
args = { self.key: val }
|
||||
accepted_filters.append( grids.GridColumnFilter( label, args) )
|
||||
return accepted_filters
|
||||
|
||||
# Grid definition.
|
||||
title = "Saved Histories"
|
||||
template = "grid_base_async.mako"
|
||||
async_template = "grid_body_async.mako"
|
||||
model_class = model.History
|
||||
default_filter = { "deleted" : "False" , "shared" : "All" }
|
||||
default_sort_key = "-update_time"
|
||||
use_paging = True
|
||||
num_rows_per_page = 5
|
||||
columns = [
|
||||
NameColumn( "Name", key="name", model_class=model.History, filterable="advanced" ),
|
||||
grids.TagsColumn( "Tags", "tags", model.History, model.HistoryTagAssociation, filterable="advanced"),
|
||||
grids.GridColumn( "Last Updated", key="update_time", format=time_ago ),
|
||||
# Columns that are valid for filtering but are not visible.
|
||||
DeletedColumn( "Deleted", key="deleted", visible=False, filterable="advanced" ),
|
||||
SharingColumn( "Shared", key="shared", visible=False, filterable="advanced" ),
|
||||
]
|
||||
columns.append(
|
||||
grids.MulticolFilterColumn(
|
||||
@@ -91,6 +137,8 @@ class HistorySelectionGrid( grids.Grid ):
|
||||
cols_to_filter=[ columns[0], columns[1] ],
|
||||
key="free-text-search", visible=False, filterable="standard" )
|
||||
)
|
||||
def apply_default_filter( self, trans, query, **kwargs ):
|
||||
return query.filter_by( user=trans.user, purged=False )
|
||||
|
||||
class PageController( BaseController ):
|
||||
|
||||
@@ -268,4 +316,4 @@ class PageController( BaseController ):
|
||||
@web.require_login("select a history from saved histories")
|
||||
def list_histories_for_selection( self, trans, **kwargs ):
|
||||
# Render the list view
|
||||
return self._history_selection_grid( trans, status=status, message=message, **kwargs )
|
||||
return self._history_selection_grid( trans, **kwargs )
|
||||
@@ -12,57 +12,109 @@ from cgi import escape, FieldStorage
|
||||
|
||||
log = logging.getLogger( __name__ )
|
||||
|
||||
class RequestsListGrid( grids.Grid ):
|
||||
class RequestsGrid( grids.Grid ):
|
||||
# Custom column types
|
||||
class NameColumn( grids.TextColumn ):
|
||||
def get_value(self, trans, grid, request):
|
||||
return request.name
|
||||
class DescriptionColumn( grids.TextColumn ):
|
||||
def get_value(self, trans, grid, request):
|
||||
return request.desc
|
||||
class SamplesColumn( grids.GridColumn ):
|
||||
def get_value(self, trans, grid, request):
|
||||
return str(len(request.samples))
|
||||
class TypeColumn( grids.TextColumn ):
|
||||
def get_value(self, trans, grid, request):
|
||||
return request.type.name
|
||||
class LastUpdateColumn( grids.TextColumn ):
|
||||
def get_value(self, trans, grid, request):
|
||||
return request.update_time
|
||||
class StateColumn( grids.GridColumn ):
|
||||
def filter( self, db_session, query, column_filter ):
|
||||
""" Modify query to filter request by state. """
|
||||
if column_filter == "All":
|
||||
return query
|
||||
if column_filter:
|
||||
query = query.filter( model.Request.state == column_filter )
|
||||
return query
|
||||
def get_accepted_filters( self ):
|
||||
""" Returns a list of accepted filters for this column. """
|
||||
accepted_filter_labels_and_vals = [ model.Request.states.UNSUBMITTED,
|
||||
model.Request.states.SUBMITTED,
|
||||
model.Request.states.COMPLETE,
|
||||
"All"]
|
||||
accepted_filters = []
|
||||
for val in accepted_filter_labels_and_vals:
|
||||
label = val.lower()
|
||||
args = { self.key: val }
|
||||
accepted_filters.append( grids.GridColumnFilter( label, args) )
|
||||
return accepted_filters
|
||||
class DeletedColumn( grids.GridColumn ):
|
||||
def get_accepted_filters( self ):
|
||||
""" Returns a list of accepted filters for this column. """
|
||||
accepted_filter_labels_and_vals = { "active" : "False", "deleted" : "True", "all": "All" }
|
||||
accepted_filters = []
|
||||
for label, val in accepted_filter_labels_and_vals.items():
|
||||
args = { self.key: val }
|
||||
accepted_filters.append( grids.GridColumnFilter( label, args) )
|
||||
return accepted_filters
|
||||
# Grid definition
|
||||
title = "Sequencing Requests"
|
||||
template = '/requests/grid.mako'
|
||||
template = 'requests/grid.mako'
|
||||
model_class = model.Request
|
||||
default_sort_key = "-create_time"
|
||||
show_filter = model.Request.states.UNSUBMITTED
|
||||
num_rows_per_page = 50
|
||||
preserve_state = True
|
||||
use_paging = True
|
||||
default_filter = dict( deleted="False", state=model.Request.states.UNSUBMITTED)
|
||||
columns = [
|
||||
grids.GridColumn( "Name", key="name",
|
||||
link=( lambda item: iff( item.deleted, None, dict( operation="show_request", id=item.id ) ) ),
|
||||
attach_popup=True ),
|
||||
grids.GridColumn( "Description", key='desc'),
|
||||
grids.GridColumn( "Sample(s)", method='number_of_samples',
|
||||
link=( lambda item: iff( item.deleted, None, dict( operation="show_request", id=item.id ) ) ), ),
|
||||
grids.GridColumn( "Type", key="request_type_id", method='get_request_type'),
|
||||
grids.GridColumn( "Last update", key="update_time", format=time_ago ),
|
||||
grids.GridColumn( "State", key='state'),
|
||||
NameColumn( "Name",
|
||||
key="name",
|
||||
model_class=model.Request,
|
||||
link=( lambda item: iff( item.deleted, None, dict( operation="show_request", id=item.id ) ) ),
|
||||
attach_popup=True,
|
||||
filterable="advanced" ),
|
||||
DescriptionColumn( "Description",
|
||||
key='desc',
|
||||
model_class=model.Request,
|
||||
filterable="advanced" ),
|
||||
SamplesColumn( "Sample(s)",
|
||||
link=( lambda item: iff( item.deleted, None, dict( operation="show_request", id=item.id ) ) ), ),
|
||||
TypeColumn( "Type" ),
|
||||
LastUpdateColumn( "Last update",
|
||||
format=time_ago ),
|
||||
StateColumn( "State",
|
||||
key='state',
|
||||
filterable="advanced"),
|
||||
DeletedColumn( "Deleted",
|
||||
key="deleted",
|
||||
visible=True,
|
||||
filterable="advanced" )
|
||||
]
|
||||
columns.append( grids.MulticolFilterColumn( "Search",
|
||||
cols_to_filter=[ columns[0], columns[1] ],
|
||||
key="free-text-search",
|
||||
visible=False,
|
||||
filterable="standard" ) )
|
||||
operations = [
|
||||
grids.GridOperation( "Submit", allow_multiple=False, condition=( lambda item: not item.deleted and item.unsubmitted() and item.samples ) ),
|
||||
grids.GridOperation( "Edit", allow_multiple=False, condition=( lambda item: not item.deleted and item.unsubmitted() ) ),
|
||||
grids.GridOperation( "Delete", allow_multiple=False, condition=( lambda item: not item.deleted and item.unsubmitted() ) ),
|
||||
grids.GridOperation( "Undelete", allow_multiple=False, condition=( lambda item: item.deleted ) )
|
||||
grids.GridOperation( "Delete", allow_multiple=True, condition=( lambda item: not item.deleted and item.unsubmitted() ) ),
|
||||
grids.GridOperation( "Undelete", allow_multiple=True, condition=( lambda item: item.deleted ) )
|
||||
|
||||
]
|
||||
standard_filters = [
|
||||
grids.GridColumnFilter( model.Request.states.UNSUBMITTED,
|
||||
args=dict( state=model.Request.states.UNSUBMITTED, deleted=False ) ),
|
||||
grids.GridColumnFilter( model.Request.states.SUBMITTED,
|
||||
args=dict( state=model.Request.states.SUBMITTED, deleted=False ) ),
|
||||
grids.GridColumnFilter( model.Request.states.COMPLETE, args=dict( state=model.Request.states.COMPLETE, deleted=False ) ),
|
||||
grids.GridColumnFilter( "Deleted", args=dict( deleted=True ) ),
|
||||
grids.GridColumnFilter( "All", args={} )
|
||||
global_actions = [
|
||||
grids.GridAction( "Create new request", dict( controller='requests',
|
||||
action='new',
|
||||
select_request_type='True' ) )
|
||||
]
|
||||
#default_filter = dict( deleted=False )
|
||||
def get_current_item( self, trans ):
|
||||
return None
|
||||
def get_request_type(self, trans, request):
|
||||
return request.type.name
|
||||
def apply_default_filter( self, trans, query, **kwargs ):
|
||||
query = query.filter_by( user=trans.user )
|
||||
if self.default_filter:
|
||||
return query.filter_by( **self.default_filter )
|
||||
else:
|
||||
return query
|
||||
def number_of_samples(self, trans, request):
|
||||
return str(len(request.samples))
|
||||
def get_state(self, trans, request):
|
||||
return request.state
|
||||
def apply_default_filter( self, trans, query, **kwd ):
|
||||
return query.filter_by( user=trans.user )
|
||||
def build_initial_query( self, session ):
|
||||
return session.query( self.model_class )
|
||||
|
||||
class Requests( BaseController ):
|
||||
request_grid = RequestsListGrid()
|
||||
request_grid = RequestsGrid()
|
||||
|
||||
@web.expose
|
||||
@web.require_login( "create/submit sequencing requests" )
|
||||
@@ -71,50 +123,43 @@ class Requests( BaseController ):
|
||||
|
||||
@web.expose
|
||||
@web.require_login( "create/submit sequencing requests" )
|
||||
def list( self, trans, **kwargs ):
|
||||
def list( self, trans, **kwd ):
|
||||
'''
|
||||
List all request made by the current user
|
||||
'''
|
||||
status = message = None
|
||||
self.request_grid.default_filter = dict(state=trans.app.model.Request.states.UNSUBMITTED,
|
||||
deleted=False)
|
||||
if 'operation' in kwargs:
|
||||
operation = kwargs['operation'].lower()
|
||||
|
||||
if 'operation' in kwd:
|
||||
operation = kwd['operation'].lower()
|
||||
if not kwd.get( 'id', None ):
|
||||
return trans.response.send_redirect( web.url_for( controller='requests',
|
||||
action='list',
|
||||
status='error',
|
||||
message="Invalid request ID") )
|
||||
if operation == "show_request":
|
||||
id = trans.security.decode_id(kwargs['id'])
|
||||
return self.__show_request(trans, id, kwargs.get('add_sample', False))
|
||||
return self.__show_request( trans, **kwd )
|
||||
elif operation == "submit":
|
||||
id = trans.security.decode_id(kwargs['id'])
|
||||
return self.__submit_request(trans, id)
|
||||
return self.__submit_request( trans, **kwd )
|
||||
elif operation == "delete":
|
||||
id = trans.security.decode_id(kwargs['id'])
|
||||
return self.__delete_request(trans, id)
|
||||
return self.__delete_request( trans, **kwd )
|
||||
elif operation == "undelete":
|
||||
id = trans.security.decode_id(kwargs['id'])
|
||||
return self.__undelete_request(trans, id)
|
||||
return self.__undelete_request( trans, **kwd )
|
||||
elif operation == "edit":
|
||||
id = trans.security.decode_id(kwargs['id'])
|
||||
return self.__edit_request(trans, id)
|
||||
if 'show_filter' in kwargs.keys():
|
||||
if kwargs['show_filter'] == 'All':
|
||||
self.request_grid.default_filter = {}
|
||||
elif kwargs['show_filter'] == 'Deleted':
|
||||
self.request_grid.default_filter = dict(deleted=True)
|
||||
else:
|
||||
self.request_grid.default_filter = dict(state=kwargs['show_filter'], deleted=False)
|
||||
self.request_grid.show_filter = kwargs.get('show_filter', trans.app.model.Request.states.UNSUBMITTED)
|
||||
return self.__edit_request( trans, **kwd )
|
||||
# Render the list view
|
||||
return self.request_grid( trans, **kwargs )
|
||||
return self.request_grid( trans, **kwd )
|
||||
|
||||
def __show_request(self, trans, id, add_sample=False):
|
||||
def __show_request(self, trans, **kwd):
|
||||
params = util.Params( kwd )
|
||||
msg = util.restore_text( params.get( 'msg', '' ) )
|
||||
messagetype = params.get( 'messagetype', 'done' )
|
||||
add_sample = params.get('add_sample', False)
|
||||
try:
|
||||
request = trans.sa_session.query( trans.app.model.Request ).get( id )
|
||||
request = trans.sa_session.query( trans.app.model.Request ).get( trans.security.decode_id(kwd['id']) )
|
||||
except:
|
||||
return trans.response.send_redirect( web.url_for( controller='requests',
|
||||
action='list',
|
||||
status='error',
|
||||
message="Invalid request ID",
|
||||
**kwd) )
|
||||
message="Invalid request ID" ) )
|
||||
current_samples = []
|
||||
for s in request.samples:
|
||||
current_samples.append([s.name, s.values.content])
|
||||
@@ -122,10 +167,11 @@ class Requests( BaseController ):
|
||||
current_samples.append(['Sample_%i' % (len(current_samples)+1),['' for field in request.type.sample_form.fields]])
|
||||
return trans.fill_template( '/requests/show_request.mako',
|
||||
request=request,
|
||||
request_details=self.request_details(trans, id),
|
||||
request_details=self.request_details(trans, request.id),
|
||||
current_samples = current_samples,
|
||||
sample_copy=self.__copy_sample(current_samples),
|
||||
details='hide', edit_mode='False')
|
||||
details='hide', edit_mode='False',
|
||||
msg=msg, messagetype=messagetype )
|
||||
def request_details(self, trans, id):
|
||||
'''
|
||||
Shows the request details
|
||||
@@ -685,7 +731,7 @@ class Requests( BaseController ):
|
||||
message="Invalid request ID",
|
||||
**kwd) )
|
||||
if params.get('show', False) == 'True':
|
||||
return self.__edit_request(trans, request.id, **kwd)
|
||||
return self.__edit_request(trans, **kwd)
|
||||
elif params.get('save_changes_request_button', False) == 'Save changes' \
|
||||
or params.get('edit_samples_button', False) == 'Edit samples':
|
||||
request_type = trans.sa_session.query( trans.app.model.RequestType ).get( int( params.select_request_type ) )
|
||||
@@ -714,11 +760,11 @@ class Requests( BaseController ):
|
||||
messagetype='done',
|
||||
**new_kwd) )
|
||||
elif params.get('refresh', False) == 'true':
|
||||
return self.__edit_request(trans, request.id, **kwd)
|
||||
return self.__edit_request(trans, **kwd)
|
||||
|
||||
def __edit_request(self, trans, id, **kwd):
|
||||
def __edit_request(self, trans, **kwd):
|
||||
try:
|
||||
request = trans.sa_session.query( trans.app.model.Request ).get( id )
|
||||
request = trans.sa_session.query( trans.app.model.Request ).get( trans.security.decode_id(kwd['id']) )
|
||||
except:
|
||||
msg = "Invalid request ID"
|
||||
log.warn( msg )
|
||||
@@ -758,59 +804,61 @@ class Requests( BaseController ):
|
||||
msg=msg,
|
||||
messagetype=messagetype)
|
||||
return self.__show_request_form(trans)
|
||||
def __delete_request(self, trans, id):
|
||||
try:
|
||||
request = trans.sa_session.query( trans.app.model.Request ).get( id )
|
||||
except:
|
||||
msg = "Invalid request ID"
|
||||
log.warn( msg )
|
||||
return trans.response.send_redirect( web.url_for( controller='requests',
|
||||
action='list',
|
||||
status='error',
|
||||
message=msg,
|
||||
**kwd) )
|
||||
# change request's submitted field
|
||||
if not request.unsubmitted():
|
||||
return trans.response.send_redirect( web.url_for( controller='requests',
|
||||
action='list',
|
||||
status='error',
|
||||
message='This request cannot be deleted as it is already been submitted',
|
||||
**kwd) )
|
||||
request.deleted = True
|
||||
trans.sa_session.add( request )
|
||||
trans.sa_session.flush()
|
||||
kwd = {}
|
||||
kwd['id'] = trans.security.encode_id(request.id)
|
||||
def __delete_request(self, trans, **kwd):
|
||||
id_list = util.listify( kwd['id'] )
|
||||
delete_failed = []
|
||||
for id in id_list:
|
||||
try:
|
||||
request = trans.sa_session.query( trans.app.model.Request ).get( trans.security.decode_id(id) )
|
||||
except:
|
||||
msg = "Invalid request ID"
|
||||
log.warn( msg )
|
||||
return trans.response.send_redirect( web.url_for( controller='requests',
|
||||
action='list',
|
||||
status='error',
|
||||
message=msg,
|
||||
**kwd) )
|
||||
# a request cannot be deleted once its submitted
|
||||
if not request.unsubmitted():
|
||||
delete_failed.append(request.name)
|
||||
else:
|
||||
request.deleted = True
|
||||
trans.sa_session.add( request )
|
||||
trans.sa_session.flush()
|
||||
if not len(delete_failed):
|
||||
msg = '%i request(s) has been deleted.' % len(id_list)
|
||||
status = 'done'
|
||||
else:
|
||||
msg = '%i request(s) has been deleted. %i request %s could not be deleted as they have been submitted.' % (len(id_list)-len(delete_failed),
|
||||
len(delete_failed), str(delete_failed))
|
||||
status = 'warning'
|
||||
return trans.response.send_redirect( web.url_for( controller='requests',
|
||||
action='list',
|
||||
status=status,
|
||||
message=msg) )
|
||||
def __undelete_request(self, trans, **kwd):
|
||||
id_list = util.listify( kwd['id'] )
|
||||
for id in id_list:
|
||||
try:
|
||||
request = trans.sa_session.query( trans.app.model.Request ).get( trans.security.decode_id(id) )
|
||||
except:
|
||||
msg = "Invalid request ID"
|
||||
log.warn( msg )
|
||||
return trans.response.send_redirect( web.url_for( controller='requests',
|
||||
action='list',
|
||||
status='error',
|
||||
message=msg,
|
||||
**kwd) )
|
||||
request.deleted = False
|
||||
trans.sa_session.add( request )
|
||||
trans.sa_session.flush()
|
||||
return trans.response.send_redirect( web.url_for( controller='requests',
|
||||
action='list',
|
||||
status='done',
|
||||
message='The request <b>%s</b> has been deleted.' % request.name,
|
||||
**kwd) )
|
||||
def __undelete_request(self, trans, id):
|
||||
message='%i request(s) has been undeleted.' % len(id_list) ) )
|
||||
def __submit_request(self, trans, **kwd):
|
||||
try:
|
||||
request = trans.sa_session.query( trans.app.model.Request ).get( id )
|
||||
except:
|
||||
msg = "Invalid request ID"
|
||||
log.warn( msg )
|
||||
return trans.response.send_redirect( web.url_for( controller='requests',
|
||||
action='list',
|
||||
status='error',
|
||||
message=msg,
|
||||
**kwd) )
|
||||
# change request's submitted field
|
||||
request.deleted = False
|
||||
trans.sa_session.add( request )
|
||||
trans.sa_session.flush()
|
||||
kwd = {}
|
||||
kwd['id'] = trans.security.encode_id(request.id)
|
||||
return trans.response.send_redirect( web.url_for( controller='requests',
|
||||
action='list',
|
||||
status='done',
|
||||
message='The request <b>%s</b> has been undeleted.' % request.name,
|
||||
**kwd) )
|
||||
def __submit_request(self, trans, id):
|
||||
try:
|
||||
request = trans.sa_session.query( trans.app.model.Request ).get( id )
|
||||
request = trans.sa_session.query( trans.app.model.Request ).get( trans.security.decode_id(kwd['id']) )
|
||||
except:
|
||||
msg = "Invalid request ID"
|
||||
log.warn( msg )
|
||||
@@ -837,14 +885,12 @@ class Requests( BaseController ):
|
||||
request.state = request.states.SUBMITTED
|
||||
trans.sa_session.add( request )
|
||||
trans.sa_session.flush()
|
||||
kwd = {}
|
||||
kwd['id'] = trans.security.encode_id(request.id)
|
||||
kwd['status'] = 'done'
|
||||
kwd['message'] = 'The request <b>%s</b> has been submitted.' % request.name
|
||||
return trans.response.send_redirect( web.url_for( controller='requests',
|
||||
action='list',
|
||||
show_filter=trans.app.model.Request.states.SUBMITTED,
|
||||
**kwd) )
|
||||
id=trans.security.encode_id(request.id),
|
||||
status='done',
|
||||
message='The request <b>%s</b> has been submitted.' % request.name
|
||||
) )
|
||||
@web.expose
|
||||
@web.require_login( "create/submit sequencing requests" )
|
||||
def show_events(self, trans, **kwd):
|
||||
|
||||
@@ -15,63 +15,187 @@ log = logging.getLogger( __name__ )
|
||||
# ---- Request Grid ------------------------------------------------------------
|
||||
#
|
||||
|
||||
class RequestsListGrid( grids.Grid ):
|
||||
class RequestsGrid( grids.Grid ):
|
||||
# Custom column types
|
||||
class NameColumn( grids.TextColumn ):
|
||||
def get_value(self, trans, grid, request):
|
||||
return request.name
|
||||
class DescriptionColumn( grids.TextColumn ):
|
||||
def get_value(self, trans, grid, request):
|
||||
return request.desc
|
||||
class SamplesColumn( grids.GridColumn ):
|
||||
def get_value(self, trans, grid, request):
|
||||
return str(len(request.samples))
|
||||
class TypeColumn( grids.TextColumn ):
|
||||
def get_value(self, trans, grid, request):
|
||||
return request.type.name
|
||||
class LastUpdateColumn( grids.TextColumn ):
|
||||
def get_value(self, trans, grid, request):
|
||||
return request.update_time
|
||||
class StateColumn( grids.GridColumn ):
|
||||
def filter( self, db_session, query, column_filter ):
|
||||
""" Modify query to filter request by state. """
|
||||
if column_filter == "All":
|
||||
return query
|
||||
if column_filter:
|
||||
query = query.filter( model.Request.state == column_filter )
|
||||
return query
|
||||
def get_accepted_filters( self ):
|
||||
""" Returns a list of accepted filters for this column. """
|
||||
accepted_filter_labels_and_vals = [ model.Request.states.UNSUBMITTED,
|
||||
model.Request.states.SUBMITTED,
|
||||
model.Request.states.COMPLETE,
|
||||
"All"]
|
||||
accepted_filters = []
|
||||
for val in accepted_filter_labels_and_vals:
|
||||
label = val.lower()
|
||||
args = { self.key: val }
|
||||
accepted_filters.append( grids.GridColumnFilter( label, args) )
|
||||
return accepted_filters
|
||||
class UserColumn( grids.TextColumn ):
|
||||
def get_value(self, trans, grid, request):
|
||||
return request.user.email
|
||||
class DeletedColumn( grids.GridColumn ):
|
||||
def get_accepted_filters( self ):
|
||||
""" Returns a list of accepted filters for this column. """
|
||||
accepted_filter_labels_and_vals = { "active" : "False", "deleted" : "True", "all": "All" }
|
||||
accepted_filters = []
|
||||
for label, val in accepted_filter_labels_and_vals.items():
|
||||
args = { self.key: val }
|
||||
accepted_filters.append( grids.GridColumnFilter( label, args) )
|
||||
return accepted_filters
|
||||
# Grid definition
|
||||
title = "Sequencing Requests"
|
||||
template = "admin/requests/grid.mako"
|
||||
model_class = model.Request
|
||||
default_sort_key = "-create_time"
|
||||
show_filter = model.Request.states.SUBMITTED
|
||||
num_rows_per_page = 50
|
||||
preserve_state = True
|
||||
use_paging = True
|
||||
default_filter = dict( deleted="False", state=model.Request.states.SUBMITTED)
|
||||
columns = [
|
||||
grids.GridColumn( "Name", key="name",
|
||||
link=( lambda item: iff( item.deleted, None, dict( operation="show_request", id=item.id ) ) ),
|
||||
attach_popup=True ),
|
||||
grids.GridColumn( "Description", key="desc"),
|
||||
grids.GridColumn( "Sample(s)", method='number_of_samples',
|
||||
link=( lambda item: iff( item.deleted, None, dict( operation="show_request", id=item.id ) ) ), ),
|
||||
grids.GridColumn( "Type", key="request_type_id", method='get_request_type'),
|
||||
grids.GridColumn( "Last update", key="update_time", format=time_ago ),
|
||||
grids.GridColumn( "State", key='state'),
|
||||
grids.GridColumn( "User", key="user_id", method='get_user')
|
||||
|
||||
NameColumn( "Name",
|
||||
key="name",
|
||||
model_class=model.Request,
|
||||
link=( lambda item: iff( item.deleted, None, dict( operation="show_request", id=item.id ) ) ),
|
||||
attach_popup=True,
|
||||
filterable="advanced" ),
|
||||
DescriptionColumn( "Description",
|
||||
key='desc',
|
||||
model_class=model.Request,
|
||||
filterable="advanced" ),
|
||||
SamplesColumn( "Sample(s)",
|
||||
link=( lambda item: iff( item.deleted, None, dict( operation="show_request", id=item.id ) ) ), ),
|
||||
TypeColumn( "Type" ),
|
||||
LastUpdateColumn( "Last update",
|
||||
format=time_ago ),
|
||||
StateColumn( "State",
|
||||
key='state',
|
||||
filterable="advanced"),
|
||||
UserColumn( "User",
|
||||
key='user.email',
|
||||
model_class=model.Request,
|
||||
filterable="advanced" ),
|
||||
DeletedColumn( "Deleted",
|
||||
key="deleted",
|
||||
visible=True,
|
||||
filterable="advanced" )
|
||||
]
|
||||
columns.append( grids.MulticolFilterColumn( "Search",
|
||||
cols_to_filter=[ columns[0], columns[1], columns[6] ],
|
||||
key="free-text-search",
|
||||
visible=False,
|
||||
filterable="standard" ) )
|
||||
operations = [
|
||||
grids.GridOperation( "Submit", allow_multiple=False, condition=( lambda item: not item.deleted and item.unsubmitted() and item.samples ) ),
|
||||
grids.GridOperation( "Edit", allow_multiple=False, condition=( lambda item: not item.deleted ) ),
|
||||
grids.GridOperation( "Reject", allow_multiple=False, condition=( lambda item: not item.deleted and item.submitted() ) ),
|
||||
grids.GridOperation( "Delete", allow_multiple=False, condition=( lambda item: not item.deleted and item.unsubmitted() ) ),
|
||||
grids.GridOperation( "Delete", allow_multiple=True, condition=( lambda item: not item.deleted and item.unsubmitted() ) ),
|
||||
grids.GridOperation( "Undelete", condition=( lambda item: item.deleted ) ),
|
||||
]
|
||||
standard_filters = [
|
||||
grids.GridColumnFilter( model.Request.states.UNSUBMITTED,
|
||||
args=dict( state=model.Request.states.UNSUBMITTED, deleted=False ) ),
|
||||
grids.GridColumnFilter( model.Request.states.SUBMITTED,
|
||||
args=dict( state=model.Request.states.SUBMITTED, deleted=False ) ),
|
||||
grids.GridColumnFilter( model.Request.states.COMPLETE, args=dict( state=model.Request.states.COMPLETE, deleted=False ) ),
|
||||
grids.GridColumnFilter( "Deleted", args=dict( deleted=True ) ),
|
||||
grids.GridColumnFilter( "All", args=dict( deleted=False ) )
|
||||
global_actions = [
|
||||
grids.GridAction( "Create new request", dict( controller='requests_admin',
|
||||
action='new',
|
||||
select_request_type='True' ) )
|
||||
]
|
||||
def get_user(self, trans, request):
|
||||
return trans.sa_session.query( trans.app.model.User ).get( request.user_id ).email
|
||||
def get_current_item( self, trans ):
|
||||
return None
|
||||
def get_request_type(self, trans, request):
|
||||
request_type = trans.sa_session.query( trans.app.model.RequestType ).get( request.request_type_id )
|
||||
return request_type.name
|
||||
def number_of_samples(self, trans, request):
|
||||
return str(len(request.samples))
|
||||
def apply_default_filter( self, trans, query, **kwargs ):
|
||||
if self.default_filter:
|
||||
return query.filter_by( **self.default_filter )
|
||||
else:
|
||||
return query
|
||||
|
||||
|
||||
|
||||
#
|
||||
# ---- Request Type Gridr ------------------------------------------------------
|
||||
#
|
||||
class RequestTypeGrid( grids.Grid ):
|
||||
# Custom column types
|
||||
class NameColumn( grids.TextColumn ):
|
||||
def get_value(self, trans, grid, request_type):
|
||||
return request_type.name
|
||||
class DescriptionColumn( grids.TextColumn ):
|
||||
def get_value(self, trans, grid, request_type):
|
||||
return request_type.desc
|
||||
class RequestFormColumn( grids.TextColumn ):
|
||||
def get_value(self, trans, grid, request_type):
|
||||
return request_type.request_form.name
|
||||
class SampleFormColumn( grids.TextColumn ):
|
||||
def get_value(self, trans, grid, request_type):
|
||||
return request_type.sample_form.name
|
||||
class DeletedColumn( grids.GridColumn ):
|
||||
def get_accepted_filters( self ):
|
||||
""" Returns a list of accepted filters for this column. """
|
||||
accepted_filter_labels_and_vals = { "active" : "False", "deleted" : "True", "all": "All" }
|
||||
accepted_filters = []
|
||||
for label, val in accepted_filter_labels_and_vals.items():
|
||||
args = { self.key: val }
|
||||
accepted_filters.append( grids.GridColumnFilter( label, args) )
|
||||
return accepted_filters
|
||||
# Grid definition
|
||||
title = "Requests Types"
|
||||
template = "admin/requests/manage_request_types.mako"
|
||||
model_class = model.RequestType
|
||||
default_sort_key = "-create_time"
|
||||
num_rows_per_page = 50
|
||||
preserve_state = True
|
||||
use_paging = True
|
||||
default_filter = dict( deleted="False" )
|
||||
columns = [
|
||||
NameColumn( "Name",
|
||||
key="name",
|
||||
model_class=model.RequestType,
|
||||
link=( lambda item: iff( item.deleted, None, dict( operation="view", id=item.id ) ) ),
|
||||
attach_popup=True,
|
||||
filterable="advanced" ),
|
||||
DescriptionColumn( "Description",
|
||||
key='desc',
|
||||
model_class=model.Request,
|
||||
filterable="advanced" ),
|
||||
RequestFormColumn( "Request Form",
|
||||
link=( lambda item: iff( item.deleted, None, dict( operation="view_form", id=item.request_form.id ) ) ), ),
|
||||
SampleFormColumn( "Sample Form",
|
||||
link=( lambda item: iff( item.deleted, None, dict( operation="view_form", id=item.sample_form.id ) ) ), ),
|
||||
DeletedColumn( "Deleted",
|
||||
key="deleted",
|
||||
visible=False,
|
||||
filterable="advanced" )
|
||||
]
|
||||
columns.append( grids.MulticolFilterColumn( "Search",
|
||||
cols_to_filter=[ columns[0], columns[1] ],
|
||||
key="free-text-search",
|
||||
visible=False,
|
||||
filterable="standard" ) )
|
||||
operations = [
|
||||
#grids.GridOperation( "Update", allow_multiple=False, condition=( lambda item: not item.deleted ) ),
|
||||
grids.GridOperation( "Delete", allow_multiple=True, condition=( lambda item: not item.deleted ) ),
|
||||
grids.GridOperation( "Undelete", condition=( lambda item: item.deleted ) ),
|
||||
]
|
||||
global_actions = [
|
||||
grids.GridAction( "Create new request type", dict( controller='requests_admin',
|
||||
action='create_request_type' ) )
|
||||
]
|
||||
#
|
||||
# ---- Request Controller ------------------------------------------------------
|
||||
#
|
||||
|
||||
class Requests( BaseController ):
|
||||
request_grid = RequestsListGrid()
|
||||
request_grid = RequestsGrid()
|
||||
requesttype_grid = RequestTypeGrid()
|
||||
|
||||
@web.expose
|
||||
@web.require_admin
|
||||
@@ -80,67 +204,59 @@ class Requests( BaseController ):
|
||||
|
||||
@web.expose
|
||||
@web.require_admin
|
||||
def list( self, trans, **kwargs ):
|
||||
def list( self, trans, **kwd ):
|
||||
'''
|
||||
List all request made by the current user
|
||||
'''
|
||||
message = util.restore_text( kwargs.get( 'message', '' ) )
|
||||
status = kwargs.get( 'status', 'done' )
|
||||
self.request_grid.default_filter = dict(state=trans.app.model.Request.states.SUBMITTED,
|
||||
deleted=False)
|
||||
if 'operation' in kwargs:
|
||||
operation = kwargs['operation'].lower()
|
||||
if 'operation' in kwd:
|
||||
operation = kwd['operation'].lower()
|
||||
if not kwd.get( 'id', None ):
|
||||
return trans.response.send_redirect( web.url_for( controller='requests_admin',
|
||||
action='list',
|
||||
status='error',
|
||||
message="Invalid request ID") )
|
||||
if operation == "show_request":
|
||||
id = trans.security.decode_id(kwargs['id'])
|
||||
return self.__show_request(trans, id, status, message)
|
||||
return self.__show_request( trans, **kwd )
|
||||
elif operation == "submit":
|
||||
id = trans.security.decode_id(kwargs['id'])
|
||||
return self.__submit_request(trans, id)
|
||||
elif operation == "edit":
|
||||
id = trans.security.decode_id(kwargs['id'])
|
||||
return self.__edit_request(trans, id)
|
||||
return self.__submit_request( trans, **kwd )
|
||||
elif operation == "delete":
|
||||
id = trans.security.decode_id(kwargs['id'])
|
||||
return self.__delete_request(trans, id)
|
||||
return self.__delete_request( trans, **kwd )
|
||||
elif operation == "undelete":
|
||||
id = trans.security.decode_id(kwargs['id'])
|
||||
return self.__undelete_request(trans, id)
|
||||
return self.__undelete_request( trans, **kwd )
|
||||
elif operation == "edit":
|
||||
return self.__edit_request( trans, **kwd )
|
||||
elif operation == "reject":
|
||||
id = trans.security.decode_id(kwargs['id'])
|
||||
return self.__reject_request(trans, id)
|
||||
if 'show_filter' in kwargs.keys():
|
||||
if kwargs['show_filter'] == 'All':
|
||||
self.request_grid.default_filter = {}
|
||||
elif kwargs['show_filter'] == 'Deleted':
|
||||
self.request_grid.default_filter = dict(deleted=True)
|
||||
else:
|
||||
self.request_grid.default_filter = dict(state=kwargs['show_filter'], deleted=False)
|
||||
self.request_grid.show_filter = kwargs.get('show_filter', trans.app.model.Request.states.SUBMITTED)
|
||||
# Render the list view
|
||||
return self.request_grid( trans, **kwargs )
|
||||
def __show_request(self, trans, id, messagetype, msg):
|
||||
return self.__reject_request( trans, **kwd )
|
||||
# Render the grid view
|
||||
return self.request_grid( trans, **kwd )
|
||||
def __show_request(self, trans, **kwd):
|
||||
params = util.Params( kwd )
|
||||
msg = util.restore_text( params.get( 'msg', '' ) )
|
||||
messagetype = params.get( 'messagetype', 'done' )
|
||||
add_sample = params.get('add_sample', False)
|
||||
try:
|
||||
request = trans.sa_session.query( trans.app.model.Request ).get( id )
|
||||
request = trans.sa_session.query( trans.app.model.Request ).get( trans.security.decode_id(kwd['id']) )
|
||||
except:
|
||||
return trans.response.send_redirect( web.url_for( controller='requests_admin',
|
||||
action='list',
|
||||
status='error',
|
||||
message="Invalid request ID",
|
||||
**kwd) )
|
||||
message="Invalid request ID") )
|
||||
current_samples = []
|
||||
for s in request.samples:
|
||||
current_samples.append([s.name, s.values.content])
|
||||
if add_sample:
|
||||
current_samples.append(['Sample_%i' % (len(current_samples)+1),['' for field in request.type.sample_form.fields]])
|
||||
return trans.fill_template( '/admin/requests/show_request.mako',
|
||||
request=request,
|
||||
request_details=self.request_details(trans, id),
|
||||
request_details=self.request_details(trans, request.id),
|
||||
current_samples = current_samples,
|
||||
sample_copy=self.__copy_sample(current_samples),
|
||||
details='hide', edit_mode='False',
|
||||
msg=msg, messagetype=messagetype)
|
||||
msg=msg, messagetype=messagetype )
|
||||
|
||||
def __edit_request(self, trans, id, **kwd):
|
||||
def __edit_request(self, trans, **kwd):
|
||||
try:
|
||||
request = trans.sa_session.query( trans.app.model.Request ).get( id )
|
||||
request = trans.sa_session.query( trans.app.model.Request ).get( trans.security.decode_id(kwd['id']) )
|
||||
except:
|
||||
msg = "Invalid request ID"
|
||||
log.warn( msg )
|
||||
@@ -180,61 +296,61 @@ class Requests( BaseController ):
|
||||
msg=msg,
|
||||
messagetype=messagetype)
|
||||
return self.__show_request_form(trans)
|
||||
def __delete_request(self, trans, id):
|
||||
try:
|
||||
request = trans.sa_session.query( trans.app.model.Request ).get( id )
|
||||
except:
|
||||
msg = "Invalid request ID"
|
||||
log.warn( msg )
|
||||
return trans.response.send_redirect( web.url_for( controller='requests_admin',
|
||||
action='list',
|
||||
status='error',
|
||||
message=msg,
|
||||
**kwd) )
|
||||
# change request's submitted field
|
||||
if not request.unsubmitted():
|
||||
return trans.response.send_redirect( web.url_for( controller='requests_admin',
|
||||
action='list',
|
||||
status='error',
|
||||
message='This request cannot be deleted as it is already been submitted',
|
||||
**kwd) )
|
||||
request.deleted = True
|
||||
trans.sa_session.add( request )
|
||||
trans.sa_session.flush()
|
||||
kwd = {}
|
||||
kwd['id'] = trans.security.encode_id(request.id)
|
||||
def __delete_request(self, trans, **kwd):
|
||||
id_list = util.listify( kwd['id'] )
|
||||
delete_failed = []
|
||||
for id in id_list:
|
||||
try:
|
||||
request = trans.sa_session.query( trans.app.model.Request ).get( trans.security.decode_id(id) )
|
||||
except:
|
||||
msg = "Invalid request ID"
|
||||
log.warn( msg )
|
||||
return trans.response.send_redirect( web.url_for( controller='requests_admin',
|
||||
action='list',
|
||||
status='error',
|
||||
message=msg,
|
||||
**kwd) )
|
||||
# a request cannot be deleted once its submitted
|
||||
if not request.unsubmitted():
|
||||
delete_failed.append(request.name)
|
||||
else:
|
||||
request.deleted = True
|
||||
trans.sa_session.add( request )
|
||||
trans.sa_session.flush()
|
||||
if not len(delete_failed):
|
||||
msg = '%i request(s) has been deleted.' % len(id_list)
|
||||
status = 'done'
|
||||
else:
|
||||
msg = '%i request(s) has been deleted. %i request %s could not be deleted as they have been submitted.' % (len(id_list)-len(delete_failed),
|
||||
len(delete_failed), str(delete_failed))
|
||||
status = 'warning'
|
||||
return trans.response.send_redirect( web.url_for( controller='requests_admin',
|
||||
action='list',
|
||||
show_filter=trans.app.model.Request.states.UNSUBMITTED,
|
||||
status='done',
|
||||
message='The request <b>%s</b> has been deleted.' % request.name,
|
||||
**kwd) )
|
||||
def __undelete_request(self, trans, id):
|
||||
try:
|
||||
request = trans.sa_session.query( trans.app.model.Request ).get( id )
|
||||
except:
|
||||
msg = "Invalid request ID"
|
||||
log.warn( msg )
|
||||
return trans.response.send_redirect( web.url_for( controller='requests_admin',
|
||||
action='list',
|
||||
status='error',
|
||||
message=msg,
|
||||
**kwd) )
|
||||
# change request's submitted field
|
||||
request.deleted = False
|
||||
trans.sa_session.add( request )
|
||||
trans.sa_session.flush()
|
||||
kwd = {}
|
||||
kwd['id'] = trans.security.encode_id(request.id)
|
||||
status=status,
|
||||
message=msg) )
|
||||
def __undelete_request(self, trans, **kwd):
|
||||
id_list = util.listify( kwd['id'] )
|
||||
for id in id_list:
|
||||
try:
|
||||
request = trans.sa_session.query( trans.app.model.Request ).get( trans.security.decode_id(id) )
|
||||
except:
|
||||
msg = "Invalid request ID"
|
||||
log.warn( msg )
|
||||
return trans.response.send_redirect( web.url_for( controller='requests_admin',
|
||||
action='list',
|
||||
status='error',
|
||||
message=msg,
|
||||
**kwd) )
|
||||
request.deleted = False
|
||||
trans.sa_session.add( request )
|
||||
trans.sa_session.flush()
|
||||
return trans.response.send_redirect( web.url_for( controller='requests_admin',
|
||||
action='list',
|
||||
show_filter=trans.app.model.Request.states.UNSUBMITTED,
|
||||
status='done',
|
||||
message='The request <b>%s</b> has been undeleted.' % request.name,
|
||||
**kwd) )
|
||||
def __submit_request(self, trans, id):
|
||||
message='%i request(s) has been undeleted.' % len(id_list) ) )
|
||||
def __submit_request(self, trans, **kwd):
|
||||
try:
|
||||
request = trans.sa_session.query( trans.app.model.Request ).get( id )
|
||||
request = trans.sa_session.query( trans.app.model.Request ).get( trans.security.decode_id(kwd['id']) )
|
||||
except:
|
||||
msg = "Invalid request ID"
|
||||
log.warn( msg )
|
||||
@@ -260,15 +376,32 @@ class Requests( BaseController ):
|
||||
request.state = request.states.SUBMITTED
|
||||
trans.sa_session.add( request )
|
||||
trans.sa_session.flush()
|
||||
kwd = {}
|
||||
kwd['id'] = trans.security.encode_id(request.id)
|
||||
kwd['status'] = 'done'
|
||||
kwd['message'] = 'The request <b>%s</b> has been submitted.' % request.name
|
||||
return trans.response.send_redirect( web.url_for( controller='requests_admin',
|
||||
action='list',
|
||||
show_filter=trans.app.model.Request.states.SUBMITTED,
|
||||
**kwd) )
|
||||
|
||||
id=trans.security.encode_id(request.id),
|
||||
status='done',
|
||||
message='The request <b>%s</b> has been submitted.' % request.name
|
||||
) )
|
||||
def __reject_request(self, trans, **kwd):
|
||||
try:
|
||||
request = trans.sa_session.query( trans.app.model.Request ).get( trans.security.decode_id(kwd['id']) )
|
||||
except:
|
||||
msg = "Invalid request ID"
|
||||
log.warn( msg )
|
||||
return trans.response.send_redirect( web.url_for( controller='requests_admin',
|
||||
action='list',
|
||||
status='error',
|
||||
message=msg,
|
||||
**kwd) )
|
||||
# change request's submitted field
|
||||
request.state = request.states.UNSUBMITTED
|
||||
trans.sa_session.add( request )
|
||||
trans.sa_session.flush()
|
||||
return trans.response.send_redirect( web.url_for( controller='requests_admin',
|
||||
action='list',
|
||||
status='done',
|
||||
message='The request <b>%s</b> is now unsubmitted.' % request.name
|
||||
) )
|
||||
#
|
||||
#---- Request Creation ----------------------------------------------------------
|
||||
#
|
||||
@@ -325,7 +458,6 @@ class Requests( BaseController ):
|
||||
if params.get('create_request_button', False) == 'Save':
|
||||
return trans.response.send_redirect( web.url_for( controller='requests_admin',
|
||||
action='list',
|
||||
show_filter=trans.app.model.Request.states.UNSUBMITTED,
|
||||
message=msg ,
|
||||
status='done') )
|
||||
elif params.get('create_request_samples_button', False) == 'Add samples':
|
||||
@@ -664,29 +796,6 @@ class Requests( BaseController ):
|
||||
**new_kwd) )
|
||||
elif params.get('refresh', False) == 'true':
|
||||
return self.__edit_request(trans, request.id, **kwd)
|
||||
def __reject_request(self, trans, id):
|
||||
try:
|
||||
request = trans.sa_session.query( trans.app.model.Request ).get( id )
|
||||
except:
|
||||
msg = "Invalid request ID"
|
||||
log.warn( msg )
|
||||
return trans.response.send_redirect( web.url_for( controller='requests_admin',
|
||||
action='list',
|
||||
status='error',
|
||||
message=msg,
|
||||
**kwd) )
|
||||
# change request's submitted field
|
||||
request.state = request.states.UNSUBMITTED
|
||||
trans.sa_session.add( request )
|
||||
trans.sa_session.flush()
|
||||
kwd = {}
|
||||
kwd['id'] = trans.security.encode_id(request.id)
|
||||
kwd['status'] = 'done'
|
||||
kwd['message'] = 'The request <b>%s</b> is now unsubmitted.' % request.name
|
||||
return trans.response.send_redirect( web.url_for( controller='requests_admin',
|
||||
action='list',
|
||||
show_filter=trans.app.model.Request.states.UNSUBMITTED,
|
||||
**kwd) )
|
||||
def __update_samples(self, request, **kwd):
|
||||
'''
|
||||
This method retrieves all the user entered sample information and
|
||||
@@ -1049,8 +1158,8 @@ class Requests( BaseController ):
|
||||
action='list',
|
||||
operation='show_request',
|
||||
id=trans.security.encode_id(request.id),
|
||||
message='Bar codes have been saved for this request',
|
||||
status='done'))
|
||||
msg='Bar codes have been saved for this request',
|
||||
messagetype='done'))
|
||||
def __set_request_state( self, trans, request ):
|
||||
# check if all the samples of the current request are in the final state
|
||||
complete = True
|
||||
@@ -1138,50 +1247,72 @@ class Requests( BaseController ):
|
||||
##
|
||||
@web.expose
|
||||
@web.require_admin
|
||||
def manage_request_types( self, trans, **kwd ):
|
||||
params = util.Params( kwd )
|
||||
msg = util.restore_text( params.get( 'msg', '' ) )
|
||||
messagetype = params.get( 'messagetype', 'done' )
|
||||
show_filter = util.restore_text( params.get( 'show_filter', 'Active' ) )
|
||||
forms = get_all_forms(trans, all_versions=True)
|
||||
request_types_list = trans.sa_session.query( trans.app.model.RequestType )
|
||||
if show_filter == 'All':
|
||||
request_types = request_types_list
|
||||
elif show_filter == 'Deleted':
|
||||
request_types = [rt for rt in request_types_list if rt.deleted]
|
||||
else:
|
||||
request_types = [rt for rt in request_types_list if not rt.deleted]
|
||||
return trans.fill_template( '/admin/requests/manage_request_types.mako',
|
||||
request_types=request_types,
|
||||
forms=forms,
|
||||
show_filter=show_filter,
|
||||
msg=msg,
|
||||
messagetype=messagetype )
|
||||
def manage_request_types( self, trans, **kwd ):
|
||||
if 'operation' in kwd:
|
||||
operation = kwd['operation'].lower()
|
||||
if not kwd.get( 'id', None ):
|
||||
return trans.response.send_redirect( web.url_for( controller='requests_admin',
|
||||
action='manage_request_types',
|
||||
status='error',
|
||||
message="Invalid requesttype ID") )
|
||||
if operation == "view":
|
||||
return self.__view_request_type( trans, **kwd )
|
||||
elif operation == "view_form":
|
||||
return self.__view_form( trans, **kwd )
|
||||
elif operation == "delete":
|
||||
return self.__delete_request_type( trans, **kwd )
|
||||
elif operation == "undelete":
|
||||
return self.__undelete_request_type( trans, **kwd )
|
||||
# elif operation == "update":
|
||||
# return self.__edit_request( trans, **kwd )
|
||||
# Render the grid view
|
||||
return self.requesttype_grid( trans, **kwd )
|
||||
def __view_request_type(self, trans, **kwd):
|
||||
try:
|
||||
rt = trans.sa_session.query( trans.app.model.RequestType ).get( trans.security.decode_id(kwd['id']) )
|
||||
except:
|
||||
return trans.response.send_redirect( web.url_for( controller='requests_admin',
|
||||
action='manage_request_types',
|
||||
status='error',
|
||||
message="Invalid requesttype ID") )
|
||||
return trans.fill_template( '/admin/requests/view_request_type.mako',
|
||||
request_type=rt,
|
||||
forms=get_all_forms( trans ),
|
||||
states_list=rt.states )
|
||||
def __view_form(self, trans, **kwd):
|
||||
try:
|
||||
fd = trans.sa_session.query( trans.app.model.FormDefinition ).get( trans.security.decode_id(kwd['id']) )
|
||||
except:
|
||||
return trans.response.send_redirect( web.url_for( controller='requests_admin',
|
||||
action='manage_request_types',
|
||||
status='error',
|
||||
message="Invalid form ID") )
|
||||
return trans.fill_template( '/admin/forms/show_form_read_only.mako',
|
||||
form=fd )
|
||||
|
||||
@web.expose
|
||||
@web.require_admin
|
||||
def request_type( self, trans, **kwd ):
|
||||
def create_request_type( self, trans, **kwd ):
|
||||
params = util.Params( kwd )
|
||||
msg = util.restore_text( params.get( 'msg', '' ) )
|
||||
messagetype = params.get( 'messagetype', 'done' )
|
||||
if params.get( 'create', False ):
|
||||
if params.get( 'add_state_button', False ):
|
||||
rt_info, rt_states = self.__create_request_type_form(trans, **kwd)
|
||||
rt_states.append(("", ""))
|
||||
return trans.fill_template( '/admin/requests/create_request_type.mako',
|
||||
request_forms=get_all_forms( trans,
|
||||
filter=dict(deleted=False),
|
||||
form_type=trans.app.model.FormDefinition.types.REQUEST ),
|
||||
sample_forms=get_all_forms( trans,
|
||||
filter=dict(deleted=False),
|
||||
form_type=trans.app.model.FormDefinition.types.SAMPLE ),
|
||||
rt_info_widgets=rt_info,
|
||||
rt_states_widgets=rt_states,
|
||||
msg=msg,
|
||||
messagetype=messagetype)
|
||||
elif params.get( 'define_states_button', False ):
|
||||
return trans.fill_template( '/admin/requests/add_states.mako',
|
||||
request_type_name=util.restore_text( params.name ),
|
||||
desc=util.restore_text( params.description ),
|
||||
num_states=int(util.restore_text( params.num_states )),
|
||||
request_form_id=int(util.restore_text( params.request_form_id )),
|
||||
sample_form_id=int(util.restore_text( params.sample_form_id )),
|
||||
elif params.get( 'remove_state_button', False ):
|
||||
rt_info, rt_states = self.__create_request_type_form(trans, **kwd)
|
||||
index = int(params.get( 'remove_state_button', '' ).split(" ")[2])
|
||||
del rt_states[index-1]
|
||||
return trans.fill_template( '/admin/requests/create_request_type.mako',
|
||||
rt_info_widgets=rt_info,
|
||||
rt_states_widgets=rt_states,
|
||||
msg=msg,
|
||||
messagetype=messagetype)
|
||||
messagetype=messagetype)
|
||||
elif params.get( 'save_request_type', False ):
|
||||
st, msg = self.__save_request_type(trans, **kwd)
|
||||
if not st:
|
||||
@@ -1191,32 +1322,65 @@ class Requests( BaseController ):
|
||||
messagetype='error')
|
||||
return trans.response.send_redirect( web.url_for( controller='requests_admin',
|
||||
action='manage_request_types',
|
||||
msg='Request type <b>%s</b> has been created' % st.name,
|
||||
messagetype='done') )
|
||||
elif params.get('view', False):
|
||||
rt = trans.sa_session.query( trans.app.model.RequestType ).get( int( util.restore_text( params.id ) ) )
|
||||
return trans.fill_template( '/admin/requests/view_request_type.mako',
|
||||
request_type=rt,
|
||||
forms=get_all_forms( trans ),
|
||||
states_list=rt.states,
|
||||
deleted=False,
|
||||
show_deleted=False,
|
||||
message='Request type <b>%s</b> has been created' % st.name,
|
||||
status='done') )
|
||||
else:
|
||||
rt_info, rt_states = self.__create_request_type_form(trans, **kwd)
|
||||
return trans.fill_template( '/admin/requests/create_request_type.mako',
|
||||
rt_info_widgets=rt_info,
|
||||
rt_states_widgets=rt_states,
|
||||
msg=msg,
|
||||
messagetype=messagetype )
|
||||
messagetype=messagetype)
|
||||
def __create_request_type_form(self, trans, **kwd):
|
||||
request_forms=get_all_forms( trans,
|
||||
filter=dict(deleted=False),
|
||||
form_type=trans.app.model.FormDefinition.types.REQUEST )
|
||||
sample_forms=get_all_forms( trans,
|
||||
filter=dict(deleted=False),
|
||||
form_type=trans.app.model.FormDefinition.types.SAMPLE )
|
||||
if not len(request_forms) or not len(sample_forms):
|
||||
return [],[]
|
||||
params = util.Params( kwd )
|
||||
rt_info = []
|
||||
rt_info.append(dict(label='Name',
|
||||
widget=TextField('name', 40, util.restore_text( params.get( 'name', '' ) ) ) ))
|
||||
rt_info.append(dict(label='Description',
|
||||
widget=TextField('desc', 40, util.restore_text( params.get( 'desc', '' ) ) ) ))
|
||||
|
||||
rf_selectbox = SelectField('request_form_id')
|
||||
for fd in request_forms:
|
||||
if str(fd.id) == params.get( 'request_form_id', '' ):
|
||||
rf_selectbox.add_option(fd.name, fd.id, selected=True)
|
||||
else:
|
||||
rf_selectbox.add_option(fd.name, fd.id)
|
||||
rt_info.append(dict(label='Request form',
|
||||
widget=rf_selectbox ))
|
||||
|
||||
sf_selectbox = SelectField('sample_form_id')
|
||||
for fd in sample_forms:
|
||||
if str(fd.id) == params.get( 'sample_form_id', '' ):
|
||||
sf_selectbox.add_option(fd.name, fd.id, selected=True)
|
||||
else:
|
||||
sf_selectbox.add_option(fd.name, fd.id)
|
||||
rt_info.append(dict(label='Sample form',
|
||||
widget=sf_selectbox ))
|
||||
# possible sample states
|
||||
rt_states = []
|
||||
i=0
|
||||
while True:
|
||||
if kwd.has_key( 'state_name_%i' % i ):
|
||||
rt_states.append((params.get( 'state_name_%i' % i, '' ),
|
||||
params.get( 'state_desc_%i' % i, '' )))
|
||||
i=i+1
|
||||
else:
|
||||
break
|
||||
return rt_info, rt_states
|
||||
|
||||
def __save_request_type(self, trans, **kwd):
|
||||
params = util.Params( kwd )
|
||||
num_states = int( util.restore_text( params.get( 'num_states', 0 ) ))
|
||||
proceed = True
|
||||
for i in range( num_states ):
|
||||
if not util.restore_text( params.get( 'state_name_%i' % i, None ) ):
|
||||
proceed = False
|
||||
break
|
||||
if not proceed:
|
||||
msg = "All the state name(s) must be completed."
|
||||
return None, msg
|
||||
rt = trans.app.model.RequestType()
|
||||
rt.name = util.restore_text( params.name )
|
||||
rt.desc = util.restore_text( params.description ) or ""
|
||||
rt.name = util.restore_text( params.get( 'name', '' ) )
|
||||
rt.desc = util.restore_text( params.get( 'desc', '' ) )
|
||||
rt.request_form = trans.sa_session.query( trans.app.model.FormDefinition ).get( int( params.request_form_id ) )
|
||||
rt.sample_form = trans.sa_session.query( trans.app.model.FormDefinition ).get( int( params.sample_form_id ) )
|
||||
trans.sa_session.add( rt )
|
||||
@@ -1226,37 +1390,50 @@ class Requests( BaseController ):
|
||||
for ss in ss_list:
|
||||
trans.sa_session.delete( ss )
|
||||
trans.sa_session.flush()
|
||||
for i in range( num_states ):
|
||||
name = util.restore_text( params.get( 'state_name_%i' % i, None ))
|
||||
desc = util.restore_text( params.get( 'state_desc_%i' % i, None ))
|
||||
ss = trans.app.model.SampleState(name, desc, rt)
|
||||
trans.sa_session.add( ss )
|
||||
trans.sa_session.flush()
|
||||
msg = "The new request type named '%s' with %s state(s) has been created" % (rt.name, num_states)
|
||||
i=0
|
||||
while True:
|
||||
if kwd.has_key( 'state_name_%i' % i ):
|
||||
name = util.restore_text( params.get( 'state_name_%i' % i, None ))
|
||||
desc = util.restore_text( params.get( 'state_desc_%i' % i, None ))
|
||||
ss = trans.app.model.SampleState(name, desc, rt)
|
||||
trans.sa_session.add( ss )
|
||||
trans.sa_session.flush()
|
||||
i = i + 1
|
||||
else:
|
||||
break
|
||||
msg = "The new request type named '%s' with %s state(s) has been created" % (rt.name, i)
|
||||
return rt, msg
|
||||
@web.expose
|
||||
@web.require_admin
|
||||
def delete_request_type( self, trans, **kwd ):
|
||||
params = util.Params( kwd )
|
||||
msg = util.restore_text( params.get( 'msg', '' ) )
|
||||
messagetype = params.get( 'messagetype', 'done' )
|
||||
rt = trans.sa_session.query( trans.app.model.RequestType ).get( int( util.restore_text( params.request_type_id ) ) )
|
||||
rt.deleted = True
|
||||
trans.sa_session.flush()
|
||||
def __delete_request_type( self, trans, **kwd ):
|
||||
id_list = util.listify( kwd['id'] )
|
||||
for id in id_list:
|
||||
try:
|
||||
rt = trans.sa_session.query( trans.app.model.RequestType ).get( trans.security.decode_id(id) )
|
||||
except:
|
||||
return trans.response.send_redirect( web.url_for( controller='requests_admin',
|
||||
action='manage_request_types',
|
||||
msg='Invalid request type ID',
|
||||
messagetype='error') )
|
||||
rt.deleted = True
|
||||
trans.sa_session.add( rt )
|
||||
trans.sa_session.flush()
|
||||
return trans.response.send_redirect( web.url_for( controller='requests_admin',
|
||||
action='manage_request_types',
|
||||
msg='Request type <b>%s</b> has been deleted' % rt.name,
|
||||
msg='%i request type(s) has been deleted' % len(id_list),
|
||||
messagetype='done') )
|
||||
@web.expose
|
||||
@web.require_admin
|
||||
def undelete_request_type( self, trans, **kwd ):
|
||||
params = util.Params( kwd )
|
||||
msg = util.restore_text( params.get( 'msg', '' ) )
|
||||
messagetype = params.get( 'messagetype', 'done' )
|
||||
rt = trans.sa_session.query( trans.app.model.RequestType ).get( int( util.restore_text( params.request_type_id ) ) )
|
||||
rt.deleted = False
|
||||
trans.sa_session.flush()
|
||||
def __undelete_request_type( self, trans, **kwd ):
|
||||
id_list = util.listify( kwd['id'] )
|
||||
for id in id_list:
|
||||
try:
|
||||
rt = trans.sa_session.query( trans.app.model.RequestType ).get( trans.security.decode_id(id) )
|
||||
except:
|
||||
return trans.response.send_redirect( web.url_for( controller='requests_admin',
|
||||
action='manage_request_types',
|
||||
msg='Invalid request type ID',
|
||||
messagetype='error') )
|
||||
rt.deleted = False
|
||||
trans.sa_session.add( rt )
|
||||
trans.sa_session.flush()
|
||||
return trans.response.send_redirect( web.url_for( controller='requests_admin',
|
||||
action='manage_request_types',
|
||||
msg='Request type <b>%s</b> has been undeleted' % rt.name,
|
||||
msg='%i request type(s) has been undeleted' % len(id_list),
|
||||
messagetype='done') )
|
||||
|
||||
@@ -181,9 +181,7 @@ class User( BaseController ):
|
||||
refresh_frames = [ 'masthead', 'history' ]
|
||||
if not trans.app.config.allow_user_creation and not trans.user_is_admin():
|
||||
return trans.show_error_message( 'User registration is disabled. Please contact your Galaxy administrator for an account.' )
|
||||
#
|
||||
# Create the user, save all the user info and login to Galaxy
|
||||
#
|
||||
if params.get('create_user_button', None) == "Submit":
|
||||
# check email and password validity
|
||||
error = self.__validate(trans, params, email, password, confirm)
|
||||
|
||||
@@ -446,13 +446,11 @@ class UniverseWebTransaction( base.DefaultWebTransaction ):
|
||||
self.sa_session.flush()
|
||||
# This method is not called from the Galaxy reports, so the cookie will always be galaxysession
|
||||
self.__update_session_cookie( name='galaxysession' )
|
||||
|
||||
def get_galaxy_session( self ):
|
||||
"""
|
||||
Return the current galaxy session
|
||||
"""
|
||||
return self.galaxy_session
|
||||
|
||||
def get_history( self, create=False ):
|
||||
"""
|
||||
Load the current history, creating a new one only if there is not
|
||||
@@ -497,7 +495,6 @@ class UniverseWebTransaction( base.DefaultWebTransaction ):
|
||||
self.sa_session.add_all( ( self.galaxy_session, history ) )
|
||||
self.sa_session.flush()
|
||||
return history
|
||||
|
||||
def get_user( self ):
|
||||
"""Return the current user if logged in or None."""
|
||||
return self.galaxy_session.user
|
||||
@@ -507,7 +504,6 @@ class UniverseWebTransaction( base.DefaultWebTransaction ):
|
||||
self.sa_session.add( self.galaxy_session )
|
||||
self.sa_session.flush()
|
||||
user = property( get_user, set_user )
|
||||
|
||||
def get_user_and_roles( self ):
|
||||
user = self.get_user()
|
||||
if user:
|
||||
@@ -515,13 +511,9 @@ class UniverseWebTransaction( base.DefaultWebTransaction ):
|
||||
else:
|
||||
roles = []
|
||||
return user, roles
|
||||
|
||||
def user_is_admin( self ):
|
||||
admin_users = self.app.config.get( "admin_users", "" ).split( "," )
|
||||
if self.user and admin_users and self.user.email in admin_users:
|
||||
return True
|
||||
return False
|
||||
|
||||
return self.user and admin_users and self.user.email in admin_users
|
||||
def get_toolbox(self):
|
||||
"""Returns the application toolbox"""
|
||||
return self.app.toolbox
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
from galaxy.model import *
|
||||
from galaxy.model.orm import *
|
||||
|
||||
from galaxy.web.framework.helpers import iff
|
||||
from galaxy.tags.tag_handler import TagHandler
|
||||
from galaxy.web import url_for
|
||||
from galaxy.util.json import from_json_string, to_json_string
|
||||
@@ -16,7 +17,9 @@ class Grid( object ):
|
||||
title = ""
|
||||
exposed = True
|
||||
model_class = None
|
||||
# To use grid's async features, set template="grid_base_async.mako"
|
||||
template = "grid_base.mako"
|
||||
async_template = "grid_body_async.mako"
|
||||
global_actions = []
|
||||
columns = []
|
||||
operations = []
|
||||
@@ -213,7 +216,7 @@ class Grid( object ):
|
||||
return url_for( **new_kwargs )
|
||||
|
||||
|
||||
return trans.fill_template( self.template,
|
||||
return trans.fill_template( iff( 'async' not in kwargs, self.template, self.async_template),
|
||||
grid=self,
|
||||
query=query,
|
||||
cur_page_num = page_num,
|
||||
@@ -390,7 +393,7 @@ class MulticolFilterColumn( TextColumn ):
|
||||
return query.filter( complete_filter )
|
||||
|
||||
class GridOperation( object ):
|
||||
def __init__( self, label, key=None, condition=None, allow_multiple=True, allow_popup=True, target=None, url_args=None ):
|
||||
def __init__( self, label, key=None, condition=None, allow_multiple=True, allow_popup=True, target=None, url_args=None, async_compatible=False ):
|
||||
self.label = label
|
||||
self.key = key
|
||||
self.allow_multiple = allow_multiple
|
||||
@@ -398,6 +401,7 @@ class GridOperation( object ):
|
||||
self.condition = condition
|
||||
self.target = target
|
||||
self.url_args = url_args
|
||||
self.async_compatible = async_compatible
|
||||
def get_url_args( self, item ):
|
||||
if self.url_args:
|
||||
temp = dict( self.url_args )
|
||||
|
||||
@@ -1,4 +1,23 @@
|
||||
#!/bin/sh
|
||||
|
||||
cd `dirname $0`
|
||||
|
||||
# explicitly attempt to fetch eggs before running
|
||||
FETCH_EGGS=1
|
||||
for arg in "$@"; do
|
||||
[ "$arg" = "--stop-daemon" ] && FETCH_EGGS=0; break
|
||||
done
|
||||
if [ $FETCH_EGGS -eq 1 ]; then
|
||||
python -ES ./scripts/check_eggs.py quiet
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Some eggs are out of date, attempting to fetch..."
|
||||
python -ES ./scripts/fetch_eggs.py
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "Fetch successful."
|
||||
else
|
||||
echo "Fetch failed."
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
python -ES ./scripts/paster.py serve universe_wsgi.ini $@
|
||||
|
||||
+11
-3
@@ -11,6 +11,12 @@ root.addHandler( logging.StreamHandler( sys.stdout ) )
|
||||
lib = os.path.abspath( os.path.join( os.path.dirname( __file__ ), "..", "lib" ) )
|
||||
sys.path.append( lib )
|
||||
|
||||
try:
|
||||
assert sys.argv[1] == 'quiet'
|
||||
quiet = True
|
||||
except:
|
||||
quiet = False
|
||||
|
||||
from galaxy.eggs import *
|
||||
|
||||
c = Crate()
|
||||
@@ -21,7 +27,9 @@ for name in c.get_names():
|
||||
if not galaxy_config.check_conditional( name ):
|
||||
ignore.append( name )
|
||||
if not c.find( ignore=ignore ):
|
||||
print "Some of your Galaxy eggs are out of date. Please update them"
|
||||
print "by running:"
|
||||
print " python scripts/fetch_eggs.py"
|
||||
if not quiet:
|
||||
print "Some of your Galaxy eggs are out of date. Please update them"
|
||||
print "by running:"
|
||||
print " python scripts/fetch_eggs.py"
|
||||
sys.exit( 1 )
|
||||
sys.exit( 0 )
|
||||
|
||||
+8
-11
@@ -1,19 +1,16 @@
|
||||
import os, sys
|
||||
|
||||
msg = """ERROR: Your Python version is: %s
|
||||
Galaxy is currently supported on Python 2.4, 2.5 and 2.6. To run Galaxy,
|
||||
please download and install a supported version from python.org. If a
|
||||
supported version is installed but is not your default, getgalaxy.org
|
||||
contains instructions on how to force Galaxy to use a different version.""" % sys.version[:3]
|
||||
|
||||
def check_python():
|
||||
return
|
||||
try:
|
||||
assert sys.version_info[:2] >= ( 2, 4 ) and sys.version_info[:2] <= ( 2, 5 )
|
||||
assert sys.version_info[:2] >= ( 2, 4 ) and sys.version_info[:2] <= ( 2, 6 )
|
||||
except AssertionError:
|
||||
print >>sys.stderr, "ERROR: Your Python version is:", sys.version.split( ' ', 1 )[0]
|
||||
print >>sys.stderr, "Galaxy is currently only supported on Python 2.4 and Python 2.5."
|
||||
if sys.version_info[:2] < ( 2, 4 ):
|
||||
print >>sys.stderr, "To run Galaxy, please download and install Python 2.5 from http://python.org"
|
||||
else:
|
||||
print >>sys.stderr, "To track the progress of Python 2.6 support, please see:"
|
||||
print >>sys.stderr, " http://bitbucket.org/galaxy/galaxy-central/issue/76/support-python-26"
|
||||
print >>sys.stderr, "For hints on how to direct Galaxy to use a different python installation, see:"
|
||||
print >>sys.stderr, " http://bitbucket.org/galaxy/galaxy-central/wiki/GetGalaxy"
|
||||
print >>sys.stderr, msg
|
||||
raise
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
@@ -276,7 +276,7 @@ def purge_datasets( app, cutoff_time, remove_from_disk, info_only = False, force
|
||||
app.model.Dataset.table.c.update_time < cutoff_time ) )
|
||||
for dataset in datasets:
|
||||
file_size = dataset.file_size
|
||||
_purge_dataset( dataset, remove_from_disk, info_only = info_only )
|
||||
_purge_dataset( app, dataset, remove_from_disk, info_only = info_only )
|
||||
dataset_count += 1
|
||||
try:
|
||||
disk_space += file_size
|
||||
@@ -349,7 +349,7 @@ def _delete_dataset( dataset, app, remove_from_disk, info_only=False, is_deletab
|
||||
app.sa_session.add( dataset )
|
||||
app.sa_session.flush()
|
||||
|
||||
def _purge_dataset( dataset, remove_from_disk, info_only = False ):
|
||||
def _purge_dataset( app, dataset, remove_from_disk, info_only = False ):
|
||||
if dataset.deleted:
|
||||
try:
|
||||
if dataset.purgable and _dataset_is_deletable( dataset ):
|
||||
|
||||
@@ -1,18 +1,4 @@
|
||||
import os, sys, subprocess, tarfile, zipfile, shutil
|
||||
|
||||
def unpack_sqlite_source():
|
||||
print "unpack_sqlite_source(): Found a previously downloaded sqlite source."
|
||||
print "unpack_sqlite_source(): To force a new download, remove the archive:"
|
||||
print " ", SQLITE_ARCHIVE
|
||||
os.makedirs( "sqlite" )
|
||||
z = zipfile.ZipFile( SQLITE_ARCHIVE, "r" )
|
||||
for fn in z.namelist():
|
||||
if fn == "tclsqlite.c" or fn == "shell.c" or fn == "icu.c":
|
||||
continue
|
||||
o = open( os.path.join( "sqlite", fn ), "wb" )
|
||||
o.write( z.read( fn ) )
|
||||
o.close()
|
||||
z.close()
|
||||
import os, sys, shutil
|
||||
|
||||
# change back to the build dir
|
||||
if os.path.dirname( sys.argv[0] ) != "":
|
||||
@@ -38,42 +24,16 @@ if os.access( ".galaxy_tag", os.F_OK ):
|
||||
else:
|
||||
tag = None
|
||||
|
||||
SQLITE_VERSION = ( tag.split( "_" ) )[1]
|
||||
SQLITE_ARCHIVE = os.path.abspath( os.path.join( "..", "..", "..", "archives", "sqlite-source-%s.zip" %SQLITE_VERSION.replace( ".", "_" ) ) )
|
||||
|
||||
# clean, in case you're running this by hand from a dirty module source dir
|
||||
for dir in [ "build", "dist", "sqlite" ]:
|
||||
if os.access( dir, os.F_OK ):
|
||||
print "scramble_it.py: removing dir:", dir
|
||||
shutil.rmtree( dir )
|
||||
|
||||
# build/unpack SQLite
|
||||
unpack_sqlite_source()
|
||||
|
||||
# changes to setup.py
|
||||
file = "setup.py"
|
||||
print "build(): Patching", file
|
||||
if not os.access( "%s.orig" %file, os.F_OK ):
|
||||
shutil.copyfile( file, "%s.orig" %file )
|
||||
i = open( "%s.orig" %file, "r" )
|
||||
o = open( file, "w" )
|
||||
for line in i.readlines():
|
||||
if line == ' "src/util.c", "src/row.c"]\n':
|
||||
line += 'sources += glob.glob("./sqlite/*.c")\n'
|
||||
if line == "include_dirs = []\n":
|
||||
line = "include_dirs = [ './sqlite' ]\n"
|
||||
if line == "define_macros = []\n":
|
||||
line = "define_macros = [ ('THREADSAFE','1') ]\n"
|
||||
print >>o, line,
|
||||
i.close()
|
||||
o.close()
|
||||
|
||||
# don't want setup.cfg
|
||||
os.rename( "setup.cfg", "setup.cfg.orig" )
|
||||
|
||||
# tag
|
||||
me = sys.argv[0]
|
||||
sys.argv = [ me ]
|
||||
sys.argv.append( "build_static" )
|
||||
if tag is not None:
|
||||
sys.argv.append( "egg_info" )
|
||||
sys.argv.append( "--tag-build=%s" %tag )
|
||||
|
||||
+14
-1
@@ -25,6 +25,7 @@ import galaxy.model.mapping #need to load this before we unpickle, in order to s
|
||||
galaxy.model.Job() #this looks REAL stupid, but it is REQUIRED in order for SA to insert parameters into the classes defined by the mappers --> it appears that instantiating ANY mapper'ed class would suffice here
|
||||
galaxy.datatypes.metadata.DATABASE_CONNECTION_AVAILABLE = False #Let metadata know that there is no database connection, and to just assume object ids are valid
|
||||
from galaxy.util import stringify_dictionary_keys
|
||||
from galaxy.util.json import from_json_string
|
||||
from sqlalchemy.orm import clear_mappers
|
||||
|
||||
def __main__():
|
||||
@@ -37,13 +38,25 @@ def __main__():
|
||||
config_root = sys.argv.pop( 1 )
|
||||
datatypes_config = sys.argv.pop( 1 )
|
||||
galaxy.model.set_datatypes_registry( galaxy.datatypes.registry.Registry( config_root, datatypes_config ) )
|
||||
|
||||
|
||||
job_metadata = sys.argv.pop( 1 )
|
||||
ext_override = dict()
|
||||
if job_metadata != "None" and os.path.exists( job_metadata ):
|
||||
for line in open( job_metadata, 'r' ):
|
||||
try:
|
||||
line = stringify_dictionary_keys( from_json_string( line ) )
|
||||
assert line['type'] == 'dataset'
|
||||
ext_override[line['dataset_id']] = line['ext']
|
||||
except:
|
||||
continue
|
||||
for filenames in sys.argv[1:]:
|
||||
filename_in, filename_kwds, filename_out, filename_results_code, dataset_filename_override = filenames.split( ',' )
|
||||
try:
|
||||
dataset = cPickle.load( open( filename_in ) ) #load DatasetInstance
|
||||
if dataset_filename_override:
|
||||
dataset.dataset.external_filename = dataset_filename_override
|
||||
if ext_override.get( dataset.dataset.id, None ):
|
||||
dataset.extension = ext_override[ dataset.dataset.id ]
|
||||
kwds = stringify_dictionary_keys( simplejson.load( open( filename_kwds ) ) )#load kwds; need to ensure our keywords are not unicode
|
||||
dataset.datatype.set_meta( dataset, **kwds )
|
||||
dataset.metadata.to_JSON_dict( filename_out ) # write out results of set_meta
|
||||
|
||||
@@ -19,6 +19,12 @@ jQuery(document).ready( function() {
|
||||
jQuery( "a[confirm]" ).click( function() {
|
||||
return confirm( jQuery(this).attr( "confirm" ) )
|
||||
});
|
||||
// Make popup menus.
|
||||
make_popup_menus();
|
||||
});
|
||||
|
||||
function make_popup_menus()
|
||||
{
|
||||
jQuery( "div[popupmenu]" ).each( function() {
|
||||
var options = {};
|
||||
$(this).find( "a" ).each( function() {
|
||||
@@ -40,7 +46,7 @@ jQuery(document).ready( function() {
|
||||
$(this).remove();
|
||||
b.show();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function ensure_popup_helper() {
|
||||
// And the helper below the popup menus
|
||||
@@ -103,3 +109,15 @@ function attach_popupmenu( button_element, wrapper ) {
|
||||
};
|
||||
$( button_element ).click( click );
|
||||
};
|
||||
|
||||
// Returns the number of keys (elements) in an array/dictionary.
|
||||
var array_length = function(an_array)
|
||||
{
|
||||
if (an_array.length)
|
||||
return an_array.length;
|
||||
|
||||
var count = 0;
|
||||
for (element in an_array)
|
||||
count++;
|
||||
return count;
|
||||
};
|
||||
|
||||
@@ -85,7 +85,7 @@ $( function() {
|
||||
|
||||
<div class="toolForm">
|
||||
<div class="toolFormTitle">Edit form definition "${form.name}"</div>
|
||||
<form id="edit_form" name="edit_form" action="${h.url_for( controller='forms', action='edit', form_id=form.id )}" method="post" >
|
||||
<form id="edit_form" name="edit_form" action="${h.url_for( controller='forms', action='manage', operation="Edit", id=trans.security.encode_id(form.current.id) )}" method="post" >
|
||||
%for label, input in form_details:
|
||||
<div class="form-row">
|
||||
<label>${label}</label>
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
<%inherit file="/grid_base.mako"/>
|
||||
@@ -1,76 +0,0 @@
|
||||
<%inherit file="/base.mako"/>
|
||||
<%namespace file="/message.mako" import="render_msg" />
|
||||
|
||||
<%def name="title()">Manage Form Definitions</%def>
|
||||
|
||||
%if msg:
|
||||
${render_msg( msg, messagetype )}
|
||||
%endif
|
||||
|
||||
## Render a row
|
||||
<%def name="render_row( form, ctr )">
|
||||
%if ctr % 2 == 1:
|
||||
<tr class="odd_row">
|
||||
%else:
|
||||
<tr>
|
||||
%endif
|
||||
<td>
|
||||
<a href="${h.url_for( controller='forms', action='edit', form_id=form.id, read_only=True )}">${form.name}</a>
|
||||
<a id="form-${form.id}-popup" class="popup-arrow" style="display: none;">▼</a>
|
||||
%if form.form_definition_current.deleted:
|
||||
<div popupmenu="form-${form.id}-popup">
|
||||
<a class="action-button" href="${h.url_for( action='undelete', form_id=form.id )}">Undelete</a>
|
||||
</div>
|
||||
%else:
|
||||
<div popupmenu="form-${form.id}-popup">
|
||||
<a class="action-button" href="${h.url_for( action='edit', form_id=form.id, show_form=True )}">Edit</a>
|
||||
<a class="action-button" confirm="Click OK to delete the form ${form.name}." href="${h.url_for( action='delete', form_id=form.id )}">Delete</a>
|
||||
</div>
|
||||
%endif
|
||||
</td>
|
||||
<td><i>${form.desc}</i></td>
|
||||
<td>${form.type}</td>
|
||||
</tr>
|
||||
</%def>
|
||||
|
||||
<h2>Forms</h2>
|
||||
|
||||
<ul class="manage-table-actions">
|
||||
<li>
|
||||
<a class="action-button" href="${h.url_for( controller='forms', action='new' )}">
|
||||
<span>Create a new form</span></a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
%if not all_forms:
|
||||
There are no forms.
|
||||
%else:
|
||||
<div class="grid-header">
|
||||
%for i, filter in enumerate( ['Active', 'Deleted', 'All'] ):
|
||||
%if i > 0:
|
||||
<span>|</span>
|
||||
%endif
|
||||
%if show_filter == filter:
|
||||
<span class="filter"><a href="${h.url_for( controller='forms', action='manage', show_filter=filter )}"><b>${filter}</b></a></span>
|
||||
%else:
|
||||
<span class="filter"><a href="${h.url_for( controller='forms', action='manage', show_filter=filter )}">${filter}</a></span>
|
||||
%endif
|
||||
%endfor
|
||||
</div>
|
||||
<table class="grid">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Description</th>
|
||||
<th>Type</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
%for ctr, fdc in enumerate( fdc_list ):
|
||||
<tr>
|
||||
${render_row( fdc.latest_form, ctr )}
|
||||
</tr>
|
||||
%endfor
|
||||
</tbody>
|
||||
</table>
|
||||
%endif
|
||||
@@ -66,14 +66,14 @@
|
||||
<div class="toolFormTitle">${form.name} - <i> ${form.desc}</i> (${form.type})
|
||||
<a id="form-${form.id}-popup" class="popup-arrow" style="display: none;">▼</a>
|
||||
<div popupmenu="form-${form.id}-popup">
|
||||
<a class="action-button" href="${h.url_for( action='edit', form_id=form.id, show_form=True )}">Edit</a>
|
||||
<a class="action-button" href="${h.url_for( controller='forms', action='manage', operation='Edit', id=trans.security.encode_id(form.current.id) )}">Edit</a>
|
||||
</div>
|
||||
</div>
|
||||
%else:
|
||||
<div class="toolFormTitle">${form.name} (${form.type})
|
||||
<a id="form-${form.id}-popup" class="popup-arrow" style="display: none;">▼</a>
|
||||
<div popupmenu="form-${form.id}-popup">
|
||||
<a class="action-button" href="${h.url_for( action='edit', form_id=form.id, show_form=True )}">Edit</a>
|
||||
<a class="action-button" href="${h.url_for( controller='forms', action='manage', operation='Edit', id=trans.security.encode_id(form.current.id) )}">Edit</a>
|
||||
</div>
|
||||
</div>
|
||||
%endif
|
||||
|
||||
@@ -6,63 +6,59 @@
|
||||
${render_msg( msg, messagetype )}
|
||||
%endif
|
||||
|
||||
<%def name="render_state( element_count, state_name, state_desc )">
|
||||
<div class="repeat-group-item">
|
||||
<div class="form-row">
|
||||
<label>${1+element_count}. State name:</label>
|
||||
<input type="text" name="state_name_${element_count}" value="${state_name}" size="40"/>
|
||||
<input type="submit" name="remove_state_button" value="Remove state ${1+element_count}"/>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<label>Description:</label>
|
||||
<input type="text" name="state_desc_${element_count}" value="${state_desc}" size="40"/>
|
||||
<div class="toolParamHelp" style="clear: both;">
|
||||
optional
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div style="clear: both"></div>
|
||||
</div>
|
||||
</%def>
|
||||
|
||||
<div class="toolForm">
|
||||
<div class="toolFormTitle">Create a new request type</div>
|
||||
%if not request_forms or not sample_forms:
|
||||
%if not rt_info_widgets:
|
||||
Create a request & sample form definition first to create a new request type.
|
||||
%else:
|
||||
<div class="toolFormBody">
|
||||
<form name="create_request_type" action="${h.url_for( controller='requests_admin', action='request_type')}" method="post" >
|
||||
<form name="create_request_type" action="${h.url_for( controller='requests_admin', action='create_request_type')}" method="post" >
|
||||
%for rt_info in rt_info_widgets:
|
||||
<div class="form-row">
|
||||
<label>Name:</label>
|
||||
<label>${rt_info['label']}</label>
|
||||
<div style="float: left; width: 250px; margin-right: 10px;">
|
||||
<input type="text" name="name" value="New Request Type" size="40"/>
|
||||
${rt_info['widget'].get_html()}
|
||||
</div>
|
||||
<div style="clear: both"></div>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<label>Description:</label>
|
||||
<div style="float: left; width: 250px; margin-right: 10px;">
|
||||
<input type="text" name="description" value="" size="40"/>
|
||||
</div>
|
||||
<div style="clear: both"></div>
|
||||
%endfor
|
||||
<div class="toolFormTitle">Possible sample states</div>
|
||||
%if len(rt_states_widgets):
|
||||
%for index, info in enumerate(rt_states_widgets):
|
||||
${render_state( index, info[0], info[1] )}
|
||||
%endfor
|
||||
%endif
|
||||
<div class="form-row">
|
||||
<input type="submit" name="add_state_button" value="Add state"/>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<div style="float: left; width: 250px; margin-right: 10px;">
|
||||
<input type="hidden" name="new" value="submitted" size="40"/>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<label>
|
||||
Request Form definition:
|
||||
</label>
|
||||
<select name="request_form_id">
|
||||
%for form in request_forms:
|
||||
<option value="${form.id}">${form.name}</option>
|
||||
%endfor
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<label>
|
||||
Sample Form definition:
|
||||
</label>
|
||||
<select name="sample_form_id">
|
||||
%for form in sample_forms:
|
||||
<option value="${form.id}">${form.name}</option>
|
||||
%endfor
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<label>Number of sample states:</label>
|
||||
<div style="float: left; width: 250px; margin-right: 10px;">
|
||||
<input type="text" size="3" name="num_states" value="1"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<div style="float: left; width: 250px; margin-right: 10px;">
|
||||
<input type="hidden" name="new" value="submitted" size="40"/>
|
||||
</div>
|
||||
<div style="clear: both"></div>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<input type="submit" name="define_states_button" value="Define states"/>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div style="clear: both"></div>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<input type="submit" name="save_request_type" value="Save"/>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
%endif
|
||||
</div>
|
||||
@@ -1,217 +1 @@
|
||||
<%inherit file="/base.mako"/>
|
||||
<%namespace file="/message.mako" import="render_msg" />
|
||||
|
||||
<%def name="title()">Browse Requests</%def>
|
||||
|
||||
%if message:
|
||||
<p>
|
||||
<div class="${message_type}message transient-message">${message}</div>
|
||||
<div style="clear: both"></div>
|
||||
</p>
|
||||
%endif
|
||||
|
||||
<%def name="javascripts()">
|
||||
${parent.javascripts()}
|
||||
<script type="text/javascript">
|
||||
## TODO: generalize and move into galaxy.base.js
|
||||
$(document).ready(function() {
|
||||
$(".grid").each( function() {
|
||||
var grid = this;
|
||||
var checkboxes = $(this).find("input.grid-row-select-checkbox");
|
||||
var update = $(this).find( "span.grid-selected-count" );
|
||||
$(checkboxes).each( function() {
|
||||
$(this).change( function() {
|
||||
var n = $(checkboxes).filter("[checked]").size();
|
||||
update.text( n );
|
||||
});
|
||||
})
|
||||
});
|
||||
});
|
||||
## Can this be moved into base.mako?
|
||||
%if refresh_frames:
|
||||
%if 'masthead' in refresh_frames:
|
||||
## Refresh masthead == user changes (backward compatibility)
|
||||
if ( parent.user_changed ) {
|
||||
%if trans.user:
|
||||
parent.user_changed( "${trans.user.email}", ${int( app.config.is_admin_user( trans.user ) )} );
|
||||
%else:
|
||||
parent.user_changed( null, false );
|
||||
%endif
|
||||
}
|
||||
%endif
|
||||
%if 'history' in refresh_frames:
|
||||
if ( parent.frames && parent.frames.galaxy_history ) {
|
||||
parent.frames.galaxy_history.location.href="${h.url_for( controller='root', action='history')}";
|
||||
if ( parent.force_right_panel ) {
|
||||
parent.force_right_panel( 'show' );
|
||||
}
|
||||
}
|
||||
%endif
|
||||
%if 'tools' in refresh_frames:
|
||||
if ( parent.frames && parent.frames.galaxy_tools ) {
|
||||
parent.frames.galaxy_tools.location.href="${h.url_for( controller='root', action='tool_menu')}";
|
||||
if ( parent.force_left_panel ) {
|
||||
parent.force_left_panel( 'show' );
|
||||
}
|
||||
}
|
||||
%endif
|
||||
%endif
|
||||
</script>
|
||||
</%def>
|
||||
|
||||
<%def name="stylesheets()">
|
||||
<link href="${h.url_for('/static/style/base.css')}" rel="stylesheet" type="text/css" />
|
||||
<style>
|
||||
## Not generic to all grids -- move to base?
|
||||
.count-box {
|
||||
min-width: 1.1em;
|
||||
padding: 5px;
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
text-align: center;
|
||||
display: inline-block;
|
||||
}
|
||||
</style>
|
||||
</%def>
|
||||
|
||||
<div class="grid-header">
|
||||
<h2>${grid.title}</h2>
|
||||
%if trans.sa_session.query( trans.app.model.Request ).count():
|
||||
##<span class="title">Filter:</span>
|
||||
%for i, filter in enumerate( grid.standard_filters ):
|
||||
%if i > 0:
|
||||
<span>|</span>
|
||||
%endif
|
||||
%if grid.show_filter == filter.label:
|
||||
<span class="filter"><a href="${h.url_for( controller='requests_admin', action='list', show_filter=filter.label )}"><b>${filter.label}</b></a></span>
|
||||
%else:
|
||||
<span class="filter"><a href="${h.url_for( controller='requests_admin', action='list', show_filter=filter.label )}">${filter.label}</a></span>
|
||||
%endif
|
||||
%endfor
|
||||
%endif
|
||||
</div>
|
||||
|
||||
<ul class="manage-table-actions">
|
||||
<li>
|
||||
<a class="action-button" href="${h.url_for( controller='requests_admin', action='new', select_request_type=True )}">
|
||||
<img src="${h.url_for('/static/images/silk/add.png')}" />
|
||||
<span>Create a new request</span></a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
%if not len(query.all()):
|
||||
There are no requests.
|
||||
%else:
|
||||
<form name="history_actions" action="${url()}" method="post" >
|
||||
<table class="grid">
|
||||
<thead>
|
||||
<tr>
|
||||
##<th></th>
|
||||
%for column in grid.columns:
|
||||
%if column.visible:
|
||||
<%
|
||||
href = ""
|
||||
extra = ""
|
||||
if column.sortable:
|
||||
if sort_key == column.key:
|
||||
if sort_order == "asc":
|
||||
href = url( sort=( "-" + column.key ) )
|
||||
extra = "↓"
|
||||
else:
|
||||
href = url( sort=( column.key ) )
|
||||
extra = "↑"
|
||||
else:
|
||||
href = url( sort=column.key )
|
||||
%>
|
||||
<th\
|
||||
%if column.ncells > 1:
|
||||
colspan="${column.ncells}"
|
||||
%endif
|
||||
>
|
||||
%if href:
|
||||
<a href="${href}">${column.label}</a>
|
||||
%else:
|
||||
${column.label}
|
||||
%endif
|
||||
<span>${extra}</span>
|
||||
</th>
|
||||
%endif
|
||||
%endfor
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
%for i, item in enumerate( query ):
|
||||
<tr \
|
||||
%if current_item == item:
|
||||
class="current" \
|
||||
%endif
|
||||
>
|
||||
## Item selection column
|
||||
##<td style="width: 1.5em;">
|
||||
## <input type="checkbox" name="id" value=${trans.security.encode_id( item.id )} class="grid-row-select-checkbox" />
|
||||
##</td>
|
||||
## Data columns
|
||||
%for column in grid.columns:
|
||||
%if column.visible:
|
||||
<%
|
||||
# Link
|
||||
if column.link and column.link( item ):
|
||||
href = url( **column.link( item ) )
|
||||
else:
|
||||
href = None
|
||||
# Value (coerced to list so we can loop)
|
||||
value = column.get_value( trans, grid, item )
|
||||
if column.ncells == 1:
|
||||
value = [ value ]
|
||||
%>
|
||||
%for cellnum, v in enumerate( value ):
|
||||
<%
|
||||
# Attach popup menu?
|
||||
if column.attach_popup and cellnum == 0:
|
||||
extra = '<a id="grid-%d-popup" class="popup-arrow" style="display: none;">▼</a>' % i
|
||||
else:
|
||||
extra = ""
|
||||
%>
|
||||
%if href:
|
||||
<td><a href="${href}">${v}</a> ${extra}</td>
|
||||
%else:
|
||||
<td >${v}${extra}</td>
|
||||
%endif
|
||||
</td>
|
||||
%endfor
|
||||
%endif
|
||||
%endfor
|
||||
## Actions column
|
||||
<td>
|
||||
<div popupmenu="grid-${i}-popup">
|
||||
%for operation in grid.operations:
|
||||
%if operation.allowed( item ):
|
||||
%if operation.label == 'Submit':
|
||||
<a class="action-button" confirm="More samples cannot be added to this request once it is submitted. Click OK to submit." href="${url( operation=operation.label, id=item.id )}">${operation.label}</a>
|
||||
%else:
|
||||
<a class="action-button" href="${url( operation=operation.label, id=item.id )}">${operation.label}</a>
|
||||
%endif
|
||||
%endif
|
||||
%endfor
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
%endfor
|
||||
</tbody>
|
||||
## <tfoot>
|
||||
## <tr>
|
||||
## <td></td>
|
||||
## <td colspan="100">
|
||||
## For <span class="grid-selected-count"></span> selected requests:
|
||||
## %for operation in grid.operations:
|
||||
## %if operation.allow_multiple:
|
||||
## <input type="submit" name="operation" value="${operation.label}" class="action-button">
|
||||
## %endif
|
||||
## %endfor
|
||||
## </td>
|
||||
## </tr>
|
||||
## </tfoot>
|
||||
</table>
|
||||
</form>
|
||||
%endif
|
||||
<%inherit file="/grid_base.mako"/>
|
||||
@@ -1,68 +1 @@
|
||||
<%inherit file="/base.mako"/>
|
||||
<%namespace file="/message.mako" import="render_msg" />
|
||||
|
||||
<%def name="title()">request Types</%def>
|
||||
|
||||
%if msg:
|
||||
${render_msg( msg, messagetype )}
|
||||
%endif
|
||||
|
||||
<h2>
|
||||
Request Types
|
||||
</h2>
|
||||
|
||||
<ul class="manage-table-actions">
|
||||
<li>
|
||||
<a class="action-button" href="${h.url_for( controller='requests_admin', action='request_type', create=True )}"><span>Create a new request type</span></a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<div class="grid-header">
|
||||
##<span class="title">Filter:</span>
|
||||
%for i, filter in enumerate( ['Active', 'Deleted', 'All'] ):
|
||||
%if i > 0:
|
||||
<span>|</span>
|
||||
%endif
|
||||
%if show_filter == filter:
|
||||
<span class="filter"><a href="${h.url_for( controller='requests_admin', action='manage_request_types', show_filter=filter )}"><b>${filter}</b></a></span>
|
||||
%else:
|
||||
<span class="filter"><a href="${h.url_for( controller='requests_admin', action='manage_request_types', show_filter=filter )}">${filter}</a></span>
|
||||
%endif
|
||||
%endfor
|
||||
</div>
|
||||
%if not request_types:
|
||||
There are no request types.
|
||||
%else:
|
||||
<table class="grid">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Description</th>
|
||||
<th>Request Form</th>
|
||||
<th>Sample Form</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
%for request_type in request_types:
|
||||
<tr>
|
||||
<td>
|
||||
<a href="${h.url_for( controller='requests_admin', action='request_type', view='True', id=request_type.id)}">${request_type.name}</a>
|
||||
<a id="request_type-${request_type.id}-popup" class="popup-arrow" style="display: none;">▼</a>
|
||||
%if request_type.deleted:
|
||||
<div popupmenu="request_type-${request_type.id}-popup">
|
||||
<a class="action-button" href="${h.url_for( action='undelete_request_type', request_type_id=request_type.id )}">Undelete</a>
|
||||
</div>
|
||||
%else:
|
||||
<div popupmenu="request_type-${request_type.id}-popup">
|
||||
<a class="action-button" confirm="Click OK to delete the request type ${request_type.name}." href="${h.url_for( action='delete_request_type', request_type_id=request_type.id )}">Delete</a>
|
||||
</div>
|
||||
%endif
|
||||
</td>
|
||||
<td><i>${request_type.desc}</i></td>
|
||||
<td><a href="${h.url_for( controller='forms', action='edit', form_id=request_type.request_form.id, read_only=True)}">${request_type.request_form.name}</a></td>
|
||||
<td><a href="${h.url_for( controller='forms', action='edit', form_id=request_type.sample_form.id, read_only=True)}">${request_type.sample_form.name}</a></td>
|
||||
</tr>
|
||||
%endfor
|
||||
</tbody>
|
||||
</table>
|
||||
%endif
|
||||
<%inherit file="/grid_base.mako"/>
|
||||
@@ -127,7 +127,7 @@
|
||||
<div class="form-row">
|
||||
<ul class="manage-table-actions">
|
||||
<li>
|
||||
<a class="action-button" href="${h.url_for( controller='requests_admin', action='edit', show=True, request_id=request.id)}">
|
||||
<a class="action-button" href="${h.url_for( controller='requests_admin', action='list', operation='Edit', id=trans.security.encode_id(request.id))}">
|
||||
<span>Edit request details</span></a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
@@ -7,43 +7,37 @@
|
||||
%endif
|
||||
|
||||
<div class="toolForm">
|
||||
<div class="toolFormTitle">View request type details</div>
|
||||
<div class="toolFormBody">
|
||||
<form name="library">
|
||||
<div class="form-row">
|
||||
<label>Name</label>
|
||||
${request_type.name}
|
||||
<div class="toolFormTitle">Request type information</div>
|
||||
<form name="library">
|
||||
<div class="form-row">
|
||||
<label>Name</label>
|
||||
${request_type.name}
|
||||
<div style="clear: both"></div>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<label>Description</label>
|
||||
${request_type.desc}
|
||||
<div style="clear: both"></div>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<label>
|
||||
Request Form definition
|
||||
</label>
|
||||
${request_type.request_form.name}
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<label>
|
||||
Sample Form definition
|
||||
</label>
|
||||
${request_type.sample_form.name}
|
||||
</div>
|
||||
<div class="toolFormTitle">Possible sample states</div>
|
||||
%for element_count, state in enumerate(states_list):
|
||||
<div class="form-row">
|
||||
<label>${1+element_count}. ${state.name}</label>
|
||||
${state.desc}
|
||||
</div>
|
||||
<div style="clear: both"></div>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<label>Description</label>
|
||||
${request_type.desc}
|
||||
<div style="clear: both"></div>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<label>
|
||||
Request Form definition
|
||||
</label>
|
||||
${request_type.request_form.name}
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<label>
|
||||
Sample Form definition
|
||||
</label>
|
||||
${request_type.sample_form.name}
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<label>
|
||||
Possible states
|
||||
</label>
|
||||
%for element_count, state in enumerate(states_list):
|
||||
<div class="form-row">
|
||||
<label>${1+element_count}. ${state.name}</label>
|
||||
${state.desc}
|
||||
</div>
|
||||
<div style="clear: both"></div>
|
||||
%endfor
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
%endfor
|
||||
</form>
|
||||
</div>
|
||||
@@ -18,10 +18,10 @@
|
||||
|
||||
<body>
|
||||
<h2>Dataset generation errors</h2>
|
||||
<p><b>Dataset ${dataset.hid}: ${dataset.display_name()}</b></p>
|
||||
<p><b>Dataset ${hda.hid}: ${hda.display_name()}</b></p>
|
||||
|
||||
%if dataset.creating_job_associations:
|
||||
<% job = dataset.creating_job_associations[0].job %>
|
||||
%if hda.creating_job_associations:
|
||||
<% job = hda.creating_job_associations[0].job %>
|
||||
%if job.traceback:
|
||||
The Galaxy framework encountered the following error while attempting to run the tool:
|
||||
<pre>${job.traceback}</pre>
|
||||
@@ -43,7 +43,12 @@
|
||||
%else:
|
||||
The tool did not create any additional job / error info.
|
||||
%endif
|
||||
|
||||
<%
|
||||
if trans.user:
|
||||
user_email = trans.user.email
|
||||
else:
|
||||
user_email = ''
|
||||
%>
|
||||
<h2>Report this error to the Galaxy Team</h2>
|
||||
<p>
|
||||
The Galaxy team regularly reviews errors that occur in the application.
|
||||
@@ -56,10 +61,10 @@
|
||||
<div class="toolFormTitle">Error Report</div>
|
||||
<div class="toolFormBody">
|
||||
<form name="report_error" action="${h.url_for( action='report_error')}" method="post" >
|
||||
<input type="hidden" name="id" value="${dataset.id}" />
|
||||
<input type="hidden" name="id" value="${hda.id}" />
|
||||
<div class="form-row">
|
||||
<label>Your email</label>
|
||||
<input type="text" name="email" size="40" />
|
||||
<input type="text" name="email" size="40" value="${user_email}" />
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<label>Message</label>
|
||||
|
||||
@@ -347,8 +347,9 @@ ${self.grid_table()}
|
||||
</td>
|
||||
</tr>
|
||||
%endif
|
||||
## Grid operations.
|
||||
%if grid.operations:
|
||||
<tr>
|
||||
## Grid operations.
|
||||
<td></td>
|
||||
<td colspan="100">
|
||||
For <span class="grid-selected-count"></span> selected ${items_plural}:
|
||||
@@ -359,6 +360,7 @@ ${self.grid_table()}
|
||||
%endfor
|
||||
</td>
|
||||
</tr>
|
||||
%endif
|
||||
</tfoot>
|
||||
</table>
|
||||
</form>
|
||||
|
||||
@@ -0,0 +1,698 @@
|
||||
<%!
|
||||
from galaxy.web.framework.helpers.grids import TextColumn
|
||||
from galaxy.model import History, HistoryDatasetAssociation, User, Role, Group
|
||||
import galaxy.util
|
||||
def inherit(context):
|
||||
if context.get('use_panels'):
|
||||
return '/base_panels.mako'
|
||||
else:
|
||||
return '/base.mako'
|
||||
%>
|
||||
<%inherit file="${inherit(context)}"/>
|
||||
|
||||
## Render the grid's basic elements. Each of these elements can be subclassed.
|
||||
%if message:
|
||||
<p>
|
||||
<div class="${message_type}message transient-message">${util.restore_text( message )}</div>
|
||||
<div style="clear: both"></div>
|
||||
</p>
|
||||
%endif
|
||||
|
||||
${self.render_grid_header()}
|
||||
${self.render_grid_table()}
|
||||
|
||||
## Function definitions.
|
||||
|
||||
<%def name="title()">${grid.title}</%def>
|
||||
|
||||
<%def name="javascripts()">
|
||||
${parent.javascripts()}
|
||||
${h.js("jquery.autocomplete", "autocomplete_tagging" )}
|
||||
<script type="text/javascript">
|
||||
## TODO: generalize and move into galaxy.base.js
|
||||
$(document).ready(function() {
|
||||
// Initialize grid elements.
|
||||
init_grid_elements();
|
||||
|
||||
// Operations that are not async (AJAX) compatible.
|
||||
var no_async_ops = new Object();
|
||||
%for operation in grid.operations:
|
||||
%if not operation.async_compatible:
|
||||
no_async_ops['${operation.label}'] = "True";
|
||||
%endif
|
||||
%endfor
|
||||
|
||||
// Initialize each operation button to do operation when clicked.
|
||||
$('input[name=operation]:submit').each(function() {
|
||||
$(this).click( function() {
|
||||
var this_value = $(this).attr("value");
|
||||
var no_async = ( no_async_ops[this_value] != undefined && no_async_ops[this_value] != null);
|
||||
do_operation(this_value, no_async);
|
||||
});
|
||||
});
|
||||
|
||||
// Initialize autocomplete for text inputs in search UI.
|
||||
var t = $("#input-tags-filter");
|
||||
if (t.length)
|
||||
{
|
||||
|
||||
var autocomplete_options =
|
||||
{ selectFirst: false, autoFill: false, highlight: false, mustMatch: false };
|
||||
|
||||
t.autocomplete("${h.url_for( controller='tag', action='tag_autocomplete_data', item_class='History' )}", autocomplete_options);
|
||||
}
|
||||
|
||||
var t2 = $("#input-name-filter");
|
||||
if (t2.length)
|
||||
{
|
||||
var autocomplete_options =
|
||||
{ selectFirst: false, autoFill: false, highlight: false, mustMatch: false };
|
||||
|
||||
t2.autocomplete("${h.url_for( controller='history', action='name_autocomplete_data' )}", autocomplete_options);
|
||||
}
|
||||
});
|
||||
## Can this be moved into base.mako?
|
||||
%if refresh_frames:
|
||||
%if 'masthead' in refresh_frames:
|
||||
## Refresh masthead == user changes (backward compatibility)
|
||||
if ( parent.user_changed ) {
|
||||
%if trans.user:
|
||||
parent.user_changed( "${trans.user.email}", ${int( app.config.is_admin_user( trans.user ) )} );
|
||||
%else:
|
||||
parent.user_changed( null, false );
|
||||
%endif
|
||||
}
|
||||
%endif
|
||||
%if 'history' in refresh_frames:
|
||||
if ( parent.frames && parent.frames.galaxy_history ) {
|
||||
parent.frames.galaxy_history.location.href="${h.url_for( controller='root', action='history')}";
|
||||
if ( parent.force_right_panel ) {
|
||||
parent.force_right_panel( 'show' );
|
||||
}
|
||||
}
|
||||
%endif
|
||||
%if 'tools' in refresh_frames:
|
||||
if ( parent.frames && parent.frames.galaxy_tools ) {
|
||||
parent.frames.galaxy_tools.location.href="${h.url_for( controller='root', action='tool_menu')}";
|
||||
if ( parent.force_left_panel ) {
|
||||
parent.force_left_panel( 'show' );
|
||||
}
|
||||
}
|
||||
%endif
|
||||
%endif
|
||||
|
||||
//
|
||||
// Code to handle grid operations: filtering, sorting, paging, and operations.
|
||||
//
|
||||
|
||||
// Initialize grid elements.
|
||||
function init_grid_elements()
|
||||
{
|
||||
$(".grid").each( function() {
|
||||
var grid = this;
|
||||
var checkboxes = $(this).find("input.grid-row-select-checkbox");
|
||||
var update = $(this).find( "span.grid-selected-count" );
|
||||
$(checkboxes).each( function() {
|
||||
$(this).change( function() {
|
||||
var n = $(checkboxes).filter("[checked]").size();
|
||||
update.text( n );
|
||||
});
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
// Filter values for categorical filters.
|
||||
var categorical_filters = new Object();
|
||||
%for column in grid.columns:
|
||||
%if column.filterable is not None and not isinstance( column, TextColumn ):
|
||||
var ${column.key}_filters =
|
||||
{
|
||||
%for i, filter in enumerate( column.get_accepted_filters() ):
|
||||
%if i > 0:
|
||||
,
|
||||
%endif
|
||||
${filter.label} : ${h.to_json_string( filter.args )}
|
||||
%endfor
|
||||
};
|
||||
categorical_filters['${column.key}'] = ${column.key}_filters;
|
||||
%endif
|
||||
%endfor
|
||||
|
||||
// Initialize URL args with filter arguments.
|
||||
var url_args = ${h.to_json_string( cur_filter_dict )};
|
||||
|
||||
// Place "f-" in front of all filter arguments.
|
||||
var arg;
|
||||
for (arg in url_args)
|
||||
{
|
||||
value = url_args[arg];
|
||||
delete url_args[arg];
|
||||
url_args["f-" + arg] = value;
|
||||
}
|
||||
|
||||
// Add sort argument to URL args.
|
||||
url_args['sort'] = "${encoded_sort_key}";
|
||||
|
||||
// Add async keyword to URL args.
|
||||
url_args['async'] = true;
|
||||
|
||||
// Add tag to grid filter.
|
||||
function add_tag_to_grid_filter(tag_name, tag_value)
|
||||
{
|
||||
// Put tag name and value together.
|
||||
var tag = tag_name + (tag_value != null && tag_value != "" ? ":" + tag_value : "");
|
||||
add_filter_condition("tags", tag, true);
|
||||
}
|
||||
|
||||
// Add a condition to the grid filter; this adds the condition and refreshes the grid.
|
||||
function add_filter_condition(name, value, append)
|
||||
{
|
||||
// Update URL arg with new condition.
|
||||
if (append)
|
||||
{
|
||||
// Update or append value.
|
||||
var cur_val = url_args["f-" + name];
|
||||
var new_val;
|
||||
if (cur_val == null || cur_val == undefined)
|
||||
{
|
||||
new_val = value;
|
||||
}
|
||||
else if (typeof(cur_val) == "string")
|
||||
{
|
||||
if (cur_val == "All")
|
||||
new_val = value;
|
||||
else
|
||||
{
|
||||
// Replace string with array.
|
||||
var values = new Array();
|
||||
values[0] = cur_val;
|
||||
values[1] = value;
|
||||
new_val = values;
|
||||
}
|
||||
}
|
||||
else {
|
||||
// Current value is an array.
|
||||
new_val = cur_val;
|
||||
new_val[new_val.length] = value;
|
||||
}
|
||||
url_args["f-" + name] = new_val;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Replace value.
|
||||
url_args["f-" + name] = value;
|
||||
}
|
||||
|
||||
// Add button that displays filter and provides a button to delete it.
|
||||
var t = $("<span>" + value +
|
||||
" <a href='#'><img src='${h.url_for('/static/images/delete_tag_icon_gray.png')}'/></a></span>");
|
||||
t.addClass('text-filter-val');
|
||||
t.click(function() {
|
||||
//
|
||||
// Remove filter condition.
|
||||
//
|
||||
|
||||
// TODO: remove element.
|
||||
//var tag_button = $(this).parent();
|
||||
$(this).remove();
|
||||
|
||||
// Remove condition from URL args.
|
||||
var cur_val = url_args["f-" + name];
|
||||
if (cur_val == null || cur_val == undefined)
|
||||
{
|
||||
// Unexpected. Throw error?
|
||||
}
|
||||
else if (typeof(cur_val) == "string")
|
||||
{
|
||||
if (cur_val == "All")
|
||||
{
|
||||
// Unexpected. Throw error?
|
||||
}
|
||||
else
|
||||
// Remove condition.
|
||||
delete url_args["f-" + name];
|
||||
}
|
||||
else {
|
||||
// Current value is an array.
|
||||
var conditions = cur_val;
|
||||
var index;
|
||||
for (index = 0; index < conditions.length; index++)
|
||||
if (conditions[index] == value)
|
||||
{
|
||||
conditions.splice(index, 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
update_grid();
|
||||
});
|
||||
|
||||
var container = $('#' + name + "-filtering-criteria");
|
||||
container.append(t);
|
||||
|
||||
update_grid();
|
||||
}
|
||||
|
||||
// Set sort condition for grid.
|
||||
function set_sort_condition(col_key)
|
||||
{
|
||||
// Set new sort condition. New sort is col_key if sorting new column; if reversing sort on
|
||||
// currently sorted column, sort is reversed.
|
||||
var cur_sort = url_args['sort'];
|
||||
var new_sort = col_key;
|
||||
if ( cur_sort.indexOf( col_key ) != -1)
|
||||
{
|
||||
// Reverse sort.
|
||||
if ( cur_sort.substring(0,1) != '-' )
|
||||
new_sort = '-' + col_key;
|
||||
else
|
||||
{
|
||||
// Sort reversed by using just col_key.
|
||||
}
|
||||
}
|
||||
|
||||
// Remove sort arrows elements.
|
||||
$('.sort-arrow').remove()
|
||||
|
||||
// Add sort arrow element to new sort column.
|
||||
var sort_arrow = "↑";
|
||||
if (new_sort.substring(0,1) != '-')
|
||||
sort_arrow = "↓";
|
||||
var t = $("<span>" + sort_arrow + "</span>").addClass('sort-arrow');
|
||||
var th = $("#" + col_key + '-header');
|
||||
th.append(t);
|
||||
|
||||
// Update grid.
|
||||
url_args['sort'] = new_sort;
|
||||
update_grid();
|
||||
}
|
||||
|
||||
// Set new value for categorical filter.
|
||||
function set_categorical_filter(this_obj, name, new_value)
|
||||
{
|
||||
// Update filter hyperlinks to reflect new filter value.
|
||||
var category_filter = categorical_filters[name];
|
||||
var cur_value = url_args["f-" + name];
|
||||
$("." + name + "-filter").each( function() {
|
||||
var text = $(this).text().trim();
|
||||
var filter = category_filter[text];
|
||||
var filter_value = filter[name];
|
||||
if (filter_value == new_value)
|
||||
{
|
||||
// Remove filter link since grid will be using this filter. It is assumed that
|
||||
// this element has a single child, a hyperlink/anchor with text.
|
||||
$(this).empty();
|
||||
$(this).append("<span style='font-style: italic'>" + text + "</span>");
|
||||
}
|
||||
else if (filter_value == cur_value)
|
||||
{
|
||||
// Add hyperlink for this filter since grid will no longer be using this filter. It is assumed that
|
||||
// this element has a single child, a hyperlink/anchor.
|
||||
$(this).empty();
|
||||
var t = $("<a href='#'>" + text + "</a>");
|
||||
t.click(function() {
|
||||
set_categorical_filter( $(this), name, filter_value );
|
||||
});
|
||||
$(this).append(t);
|
||||
}
|
||||
});
|
||||
|
||||
// Need to go back to page 1 if not showing all.
|
||||
var cur_page = url_args['page'];
|
||||
if (cur_page != null && cur_page != undefined && cur_page != 'all')
|
||||
url_args['page'] = 1;
|
||||
|
||||
// Update grid.
|
||||
url_args["f-" + name] = new_value;
|
||||
update_grid();
|
||||
}
|
||||
|
||||
var num_pages = ${num_pages};
|
||||
url_args['page'] = 1;
|
||||
// Set page to view.
|
||||
function set_page(new_page)
|
||||
{
|
||||
// Update page hyperlink to reflect new page.
|
||||
$(".page-link").each( function() {
|
||||
var id = $(this).attr('id');
|
||||
var page_num = parseInt( id.split("-")[2] ); // Id has form 'page-link-<page_num>
|
||||
var cur_page = url_args['page'];
|
||||
if (page_num == new_page)
|
||||
{
|
||||
// Remove link to page since grid will be on this page. It is assumed that
|
||||
// this element has a single child, a hyperlink/anchor with text.
|
||||
var text = $(this).children().text();
|
||||
$(this).empty();
|
||||
$(this).addClass("inactive-link");
|
||||
$(this).text(text);
|
||||
}
|
||||
else if (page_num == cur_page)
|
||||
{
|
||||
// Add hyperlink to this page since grid will no longer be on this page. It is assumed that
|
||||
// this element has a single child, a hyperlink/anchor.
|
||||
var text = $(this).text();
|
||||
$(this).empty();
|
||||
$(this).removeClass("inactive-link");
|
||||
var t = $("<a href='#'>" + text + "</a>");
|
||||
t.click(function() {
|
||||
set_page(page_num);
|
||||
});
|
||||
$(this).append(t);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
if (new_page == "all")
|
||||
{
|
||||
url_args['page'] = new_page;
|
||||
$('#page-links-row').hide('slow');
|
||||
}
|
||||
else
|
||||
{
|
||||
url_args['page'] = parseInt(new_page);
|
||||
}
|
||||
update_grid(true);
|
||||
}
|
||||
|
||||
// Perform a grid operation. TODO: this is not complete.
|
||||
function do_operation(operation, no_async)
|
||||
{
|
||||
// For some reason, $('input[name=id]:checked').val() does not return all ids for checked boxes.
|
||||
// The code below performs this function.
|
||||
var item_ids = new Array()
|
||||
$('input[name=id]:checked').each(function() {
|
||||
item_ids[item_ids.length] = $(this).val();
|
||||
});
|
||||
|
||||
// Update URL args.
|
||||
url_args['operation'] = operation;
|
||||
url_args['id'] = item_ids;
|
||||
|
||||
// If operation cannot be performed asynchronously, redirect to location. Otherwise do operation.
|
||||
if (no_async)
|
||||
{
|
||||
var arg_str = "";
|
||||
var arg;
|
||||
|
||||
for (arg in url_args)
|
||||
arg_str = arg_str + arg + "=" + url_args[arg] + "&";
|
||||
|
||||
self.location = encodeURI( "${h.url_for()}?" + arg_str );
|
||||
}
|
||||
else
|
||||
update_grid();
|
||||
|
||||
}
|
||||
|
||||
// Update grid.
|
||||
function update_grid(maintain_page_links)
|
||||
{
|
||||
$.ajax({
|
||||
url: "${h.url_for()}",
|
||||
data: url_args,
|
||||
error: function() { alert( "Grid refresh failed" ) },
|
||||
success: function(response_text) {
|
||||
// HACK: use a simple string to separate the two elements in the
|
||||
// response: (1) table body and (2) number of pages in table.
|
||||
var parsed_response_text = response_text.split("*****");
|
||||
|
||||
// Update grid body.
|
||||
var table_body = parsed_response_text[0];
|
||||
$('#grid-table-body').html(table_body);
|
||||
|
||||
// Process grid body.
|
||||
init_grid_elements();
|
||||
make_popup_menus();
|
||||
|
||||
// Update pages.
|
||||
var num_pages = parseInt( parsed_response_text[1] );
|
||||
|
||||
// Rebuild page links.
|
||||
if (!maintain_page_links)
|
||||
{
|
||||
var page_link_container = $('#page-link-container');
|
||||
page_link_container.children().remove();
|
||||
if (num_pages > 1)
|
||||
{
|
||||
// Show page link row.
|
||||
$('#page-links-row').show();
|
||||
|
||||
// First page is the current page.
|
||||
var t = $("<span>1</span>");
|
||||
t.addClass('page-link');
|
||||
t.addClass('inactive-link');
|
||||
t.attr('id', 'page-link-1');
|
||||
page_link_container.append(t);
|
||||
|
||||
// Subsequent pages are navigable.
|
||||
for (var i = 2; i <= num_pages; i++)
|
||||
{
|
||||
var span = $("<span></span>");
|
||||
span.addClass('page-link');
|
||||
span.attr('id', 'page-link-' + i);
|
||||
var t = $("<a href='#'>" + i + "</a>");
|
||||
var page_num = i
|
||||
t.click(function() {
|
||||
set_page(page_num);
|
||||
});
|
||||
span.append(t)
|
||||
page_link_container.append(span);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Hide page link row.
|
||||
$('#page-links-row').hide('slow');
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
</script>
|
||||
</%def>
|
||||
|
||||
<%def name="stylesheets()">
|
||||
${h.css( "base", "autocomplete_tagging" )}
|
||||
<style>
|
||||
## Not generic to all grids -- move to base?
|
||||
.count-box {
|
||||
min-width: 1.1em;
|
||||
padding: 5px;
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
text-align: center;
|
||||
display: inline-block;
|
||||
}
|
||||
.text-filter-val {
|
||||
border: solid 1px #AAAAAA;
|
||||
padding: 1px 3px 1px 3px;
|
||||
margin-right: 5px;
|
||||
-moz-border-radius: .5em;
|
||||
-webkit-border-radius: .5em;
|
||||
font-style: italic;
|
||||
}
|
||||
.page-link a, .inactive-link {
|
||||
padding: 0px 7px 0px 7px;
|
||||
}
|
||||
.inactive-link {
|
||||
font-style: italic;
|
||||
}
|
||||
</style>
|
||||
</%def>
|
||||
|
||||
<%namespace file="./grid_common_async.mako" import="*" />
|
||||
|
||||
## Print grid header.
|
||||
<%def name="render_grid_header()">
|
||||
<div class="grid-header">
|
||||
<h2>${grid.title}</h2>
|
||||
|
||||
%if grid.global_actions:
|
||||
<ul class="manage-table-actions">
|
||||
%for action in grid.global_actions:
|
||||
<li>
|
||||
<a class="action-button" href="${h.url_for( **action.url_args )}">${action.label}</a>
|
||||
</li>
|
||||
%endfor
|
||||
</ul>
|
||||
%endif
|
||||
|
||||
${render_grid_filters()}
|
||||
</div>
|
||||
</%def>
|
||||
|
||||
## Print grid.
|
||||
<%def name="render_grid_table()">
|
||||
<form action="${url()}" method="post" onsubmit="return false;">
|
||||
<table class="grid">
|
||||
<thead id="grid-table-header">
|
||||
<tr>
|
||||
<th></th>
|
||||
%for column in grid.columns:
|
||||
%if column.visible:
|
||||
<%
|
||||
href = ""
|
||||
extra = ""
|
||||
if column.sortable:
|
||||
if sort_key == column.key:
|
||||
if sort_order == "asc":
|
||||
href = url( sort=( "-" + column.key ) )
|
||||
extra = "↓"
|
||||
else:
|
||||
href = url( sort=( column.key ) )
|
||||
extra = "↑"
|
||||
else:
|
||||
href = url( sort=column.key )
|
||||
%>
|
||||
<th\
|
||||
id="${column.key}-header"
|
||||
%if column.ncells > 1:
|
||||
colspan="${column.ncells}"
|
||||
%endif
|
||||
>
|
||||
%if href:
|
||||
<a href="${href}" onclick="set_sort_condition('${column.key}');return false;">${column.label}</a>
|
||||
%else:
|
||||
${column.label}
|
||||
%endif
|
||||
<span class="sort-arrow">${extra}</span>
|
||||
</th>
|
||||
%endif
|
||||
%endfor
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="grid-table-body">
|
||||
${render_grid_table_body_contents()}
|
||||
</tbody>
|
||||
<tfoot id="grid-table-footer">
|
||||
${render_grid_table_footer_contents()}
|
||||
</tfoot>
|
||||
</table>
|
||||
</form>
|
||||
</%def>
|
||||
|
||||
<%def name="render_grid_table_body_contents()">
|
||||
%if query.count() == 0:
|
||||
## No results.
|
||||
<tr><td></td><td><em>No Items</em></td></tr>
|
||||
%endif
|
||||
%for i, item in enumerate( query ):
|
||||
<tr \
|
||||
%if current_item == item:
|
||||
class="current" \
|
||||
%endif
|
||||
>
|
||||
## Item selection column
|
||||
<td style="width: 1.5em;">
|
||||
<input type="checkbox" name="id" value=${trans.security.encode_id( item.id )} class="grid-row-select-checkbox" />
|
||||
</td>
|
||||
## Data columns
|
||||
%for column in grid.columns:
|
||||
%if column.visible:
|
||||
<%
|
||||
# Link
|
||||
link = column.get_link( trans, grid, item )
|
||||
if link:
|
||||
href = url( **link )
|
||||
else:
|
||||
href = None
|
||||
# Value (coerced to list so we can loop)
|
||||
value = column.get_value( trans, grid, item )
|
||||
if column.ncells == 1:
|
||||
value = [ value ]
|
||||
%>
|
||||
%for cellnum, v in enumerate( value ):
|
||||
<%
|
||||
# Handle non-ascii chars.
|
||||
if isinstance(v, str):
|
||||
v = unicode(v, 'utf-8')
|
||||
# Attach popup menu?
|
||||
if column.attach_popup and cellnum == 0:
|
||||
extra = '<a id="grid-%d-popup" class="arrow" style="display: none;"><span>▼</span></a>' % i
|
||||
else:
|
||||
extra = ""
|
||||
%>
|
||||
%if href:
|
||||
<td><div class="menubutton split" style="float: left;"><a class="label" href="${href}">${v}</a>${extra}</td>
|
||||
%else:
|
||||
<td >${v}${extra}</td>
|
||||
%endif
|
||||
%endfor
|
||||
%endif
|
||||
%endfor
|
||||
## Actions column
|
||||
<td>
|
||||
<div popupmenu="grid-${i}-popup">
|
||||
%for operation in grid.operations:
|
||||
%if operation.allowed( item ):
|
||||
<%
|
||||
target = ""
|
||||
if operation.target:
|
||||
target = "target='" + operation.target + "'"
|
||||
%>
|
||||
<a class="action-button" ${target} href="${ url( **operation.get_url_args( item ) ) }">${operation.label}</a>
|
||||
%endif
|
||||
%endfor
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
%endfor
|
||||
</%def>
|
||||
|
||||
<%def name="render_grid_table_footer_contents()">
|
||||
## Row for navigating among pages.
|
||||
<%
|
||||
# Mapping between item class and plural term for item.
|
||||
items_plural = "items"
|
||||
if grid.model_class == History:
|
||||
items_plural = "histories"
|
||||
elif grid.model_class == HistoryDatasetAssociation:
|
||||
items_plural = "datasets"
|
||||
elif grid.model_class == User:
|
||||
items_plural = "users"
|
||||
elif grid.model_class == Role:
|
||||
items_plural = "roles"
|
||||
elif grid.model_class == Group:
|
||||
items_plural = "groups"
|
||||
%>
|
||||
%if num_pages > 1:
|
||||
<tr id="page-links-row">
|
||||
<td></td>
|
||||
<td colspan="100">
|
||||
<span id='page-link-container'>
|
||||
## Page links.
|
||||
Page:
|
||||
%for page_index in range(1, num_pages + 1):
|
||||
%if page_index == cur_page_num:
|
||||
<span class='page-link inactive-link' id="page-link-${page_index}">${page_index}</span>
|
||||
%else:
|
||||
<% args = { 'page' : page_index } %>
|
||||
<span class='page-link' id="page-link-${page_index}"><a href="${url( args )}" onclick="set_page('${page_index}'); return false;">${page_index}</a></span>
|
||||
%endif
|
||||
%endfor
|
||||
</span>
|
||||
|
||||
## Show all link.
|
||||
<% args = { "page" : "all" } %>
|
||||
<span id='show-all-link'>| <a href="${url( args )}" onclick="set_page('all');return false;">Show all ${items_plural} on one page</a></span>
|
||||
</td>
|
||||
</tr>
|
||||
%endif
|
||||
## Grid operations.
|
||||
%if grid.operations:
|
||||
<tr>
|
||||
<td></td>
|
||||
<td colspan="100">
|
||||
For <span class="grid-selected-count"></span> selected ${items_plural}:
|
||||
%for operation in grid.operations:
|
||||
%if operation.allow_multiple:
|
||||
<input type="submit" name="operation" value="${operation.label}" class="action-button">
|
||||
%endif
|
||||
%endfor
|
||||
</td>
|
||||
</tr>
|
||||
%endif
|
||||
</%def>
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
<%namespace file="./grid_base_async.mako" import="*" />
|
||||
|
||||
${render_grid_table_body_contents()}
|
||||
*****
|
||||
${num_pages}
|
||||
@@ -0,0 +1,155 @@
|
||||
<%! from galaxy.web.framework.helpers.grids import TextColumn, GridColumnFilter %>
|
||||
|
||||
## Render an AJAX filter UI for a grid column. Filter is rendered as a table row.
|
||||
<%def name="render_ajax_grid_column_filter(column)">
|
||||
<tr>
|
||||
<%
|
||||
column_label = column.label
|
||||
if column.filterable == "advanced":
|
||||
column_label = column_label.lower()
|
||||
%>
|
||||
<td align="left" style="padding-left: 10px">${column_label}:</td>
|
||||
<td>
|
||||
%if isinstance(column, TextColumn):
|
||||
<form action="${url( dict() )}" id="form-filter-${column.key}"
|
||||
## Move this to doc.ready()
|
||||
##onsubmit="var text_input=$('#input-${column.key}-filter').val();$('#input-${column.key}-filter').val('');add_filter_condition('${column.key}',text_input,true);return false;"
|
||||
onsubmit="var text_input=$('#input-${column.key}-filter').val();$('#input-${column.key}-filter').val('');add_filter_condition('${column.key}',text_input,true);return false;"
|
||||
method="get" >
|
||||
## Carry forward filtering criteria with hidden inputs.
|
||||
%for temp_column in grid.columns:
|
||||
%if temp_column.key in cur_filter_dict:
|
||||
<% value = cur_filter_dict[ temp_column.key ] %>
|
||||
%if value != "All":
|
||||
<%
|
||||
if isinstance( temp_column, TextColumn ):
|
||||
value = h.to_json_string( value )
|
||||
%>
|
||||
<input type="hidden" id="${temp_column.key}" name="f-${temp_column.key}" value='${value}'/>
|
||||
%endif
|
||||
%endif
|
||||
%endfor
|
||||
|
||||
## Print current filtering criteria and links to delete.
|
||||
<span id="${column.key}-filtering-criteria">
|
||||
%if column.key in cur_filter_dict:
|
||||
<% column_filter = cur_filter_dict[column.key] %>
|
||||
%if isinstance( column_filter, basestring ):
|
||||
%if column_filter != "All":
|
||||
<span style="font-style: italic">${cur_filter_dict[column.key]}</span>
|
||||
<% filter_all = GridColumnFilter( "", { column.key : "All" } ) %>
|
||||
<a href="${url( filter_all.get_url_args() )}"><img src="${h.url_for('/static/images/delete_tag_icon_gray.png')}"/></a>
|
||||
|
|
||||
%endif
|
||||
%elif isinstance( column_filter, list ):
|
||||
%for i, filter in enumerate( column_filter ):
|
||||
%if i > 0:
|
||||
,
|
||||
%endif
|
||||
<span style="font-style: italic">${filter}</span>
|
||||
<%
|
||||
new_filter = list( column_filter )
|
||||
del new_filter[ i ]
|
||||
new_column_filter = GridColumnFilter( "", { column.key : h.to_json_string( new_filter ) } )
|
||||
%>
|
||||
<a href="${url( new_column_filter.get_url_args() )}"><img src="${h.url_for('/static/images/delete_tag_icon_gray.png')}"/></a>
|
||||
%endfor
|
||||
|
||||
%endif
|
||||
%endif
|
||||
</span>
|
||||
|
||||
## Print input field for column.
|
||||
<span><input id="input-${column.key}-filter" name="f-${column.key}" type="text" value="" size="15"/></span>
|
||||
</form>
|
||||
%else:
|
||||
<span id="${column.key}-filtering-criteria">
|
||||
%for i, filter in enumerate( column.get_accepted_filters() ):
|
||||
<%
|
||||
# HACK: we know that each filter will have only a single argument, so get that single argument.
|
||||
for key, arg in filter.args.items():
|
||||
filter_key = key
|
||||
filter_arg = arg
|
||||
%>
|
||||
%if i > 0:
|
||||
|
|
||||
%endif
|
||||
%if column.key in cur_filter_dict and column.key in filter.args and cur_filter_dict[column.key] == filter.args[column.key]:
|
||||
<span class="${column.key}-filter">${filter.label}</span>
|
||||
%else:
|
||||
<span class="${column.key}-filter">
|
||||
<a href="${url( filter.get_url_args() )}"
|
||||
onclick="set_categorical_filter($(this), '${column.key}','${filter_arg}'); return false;">${filter.label}</a>
|
||||
</span>
|
||||
%endif
|
||||
%endfor
|
||||
</span>
|
||||
%endif
|
||||
</td>
|
||||
</tr>
|
||||
</%def>
|
||||
|
||||
## Print grid search/filtering UI.
|
||||
<%def name="render_grid_filters()">
|
||||
## Standard search.
|
||||
<div>
|
||||
<table><tr>
|
||||
<td>
|
||||
<table>
|
||||
%for column in grid.columns:
|
||||
%if column.filterable == "standard":
|
||||
${render_ajax_grid_column_filter(column)}
|
||||
%endif
|
||||
%endfor
|
||||
</table>
|
||||
</td>
|
||||
<td>
|
||||
## Clear the standard search.
|
||||
##|
|
||||
##<% filter_all = GridColumnFilter( "", { column.key : "All" } ) %>
|
||||
##<a href="${url( filter_all.get_url_args() )}">Clear All</a>
|
||||
|
||||
## Only show advanced search if there are filterable columns.
|
||||
<%
|
||||
show_advanced_search = False
|
||||
for column in grid.columns:
|
||||
if column.filterable == "advanced":
|
||||
show_advanced_search = True
|
||||
break
|
||||
endif
|
||||
%>
|
||||
%if show_advanced_search:
|
||||
| <a href="" onclick="javascript:$('#more-search-options').slideToggle('fast');return false;">Advanced Search</a>
|
||||
%endif
|
||||
</td>
|
||||
</tr></table>
|
||||
</div>
|
||||
|
||||
## Advanced search.
|
||||
<div id="more-search-options" style="display: none; padding-top: 5px">
|
||||
<table style="border: 1px solid gray;">
|
||||
<tr><td style="text-align: left" colspan="100">
|
||||
Advanced Search |
|
||||
<a href=""# onclick="javascript:$('#more-search-options').slideToggle('fast');return false;">Close</a> |
|
||||
## Link to clear all filters.
|
||||
<%
|
||||
no_filter = GridColumnFilter("Clear All", default_filter_dict)
|
||||
%>
|
||||
<a href="${url( no_filter.get_url_args() )}">${no_filter.label}</a>
|
||||
</td></tr>
|
||||
%for column in grid.columns:
|
||||
%if column.filterable == "advanced":
|
||||
## Show div if current filter has value that is different from the default filter.
|
||||
%if column.key in cur_filter_dict and column.key in default_filter_dict and \
|
||||
cur_filter_dict[column.key] != default_filter_dict[column.key]:
|
||||
<script type="text/javascript">
|
||||
$('#more-search-options').css("display", "block");
|
||||
</script>
|
||||
%endif
|
||||
|
||||
${render_ajax_grid_column_filter(column)}
|
||||
%endif
|
||||
%endfor
|
||||
</table>
|
||||
</div>
|
||||
</%def>
|
||||
@@ -37,7 +37,7 @@
|
||||
<div class="secondary">
|
||||
## Body for history items, extra info and actions, data "peek"
|
||||
<% user, roles = trans.get_user_and_roles() %>
|
||||
%if not trans.app.security_agent.can_access_dataset( roles, data.dataset ):
|
||||
%if not trans.user_is_admin() and not trans.app.security_agent.can_access_dataset( roles, data.dataset ):
|
||||
<div>You do not have permission to view this dataset.</div>
|
||||
%elif data_state == "queued":
|
||||
<div>Job is waiting to run</div>
|
||||
|
||||
@@ -1,217 +1 @@
|
||||
<%inherit file="/base.mako"/>
|
||||
<%namespace file="/message.mako" import="render_msg" />
|
||||
|
||||
<%def name="title()">Browse Samples</%def>
|
||||
|
||||
%if message:
|
||||
<p>
|
||||
<div class="${message_type}message transient-message">${message}</div>
|
||||
<div style="clear: both"></div>
|
||||
</p>
|
||||
%endif
|
||||
|
||||
<%def name="javascripts()">
|
||||
${parent.javascripts()}
|
||||
<script type="text/javascript">
|
||||
## TODO: generalize and move into galaxy.base.js
|
||||
$(document).ready(function() {
|
||||
$(".grid").each( function() {
|
||||
var grid = this;
|
||||
var checkboxes = $(this).find("input.grid-row-select-checkbox");
|
||||
var update = $(this).find( "span.grid-selected-count" );
|
||||
$(checkboxes).each( function() {
|
||||
$(this).change( function() {
|
||||
var n = $(checkboxes).filter("[checked]").size();
|
||||
update.text( n );
|
||||
});
|
||||
})
|
||||
});
|
||||
});
|
||||
## Can this be moved into base.mako?
|
||||
%if refresh_frames:
|
||||
%if 'masthead' in refresh_frames:
|
||||
## Refresh masthead == user changes (backward compatibility)
|
||||
if ( parent.user_changed ) {
|
||||
%if trans.user:
|
||||
parent.user_changed( "${trans.user.email}", ${int( app.config.is_admin_user( trans.user ) )} );
|
||||
%else:
|
||||
parent.user_changed( null, false );
|
||||
%endif
|
||||
}
|
||||
%endif
|
||||
%if 'history' in refresh_frames:
|
||||
if ( parent.frames && parent.frames.galaxy_history ) {
|
||||
parent.frames.galaxy_history.location.href="${h.url_for( controller='root', action='history')}";
|
||||
if ( parent.force_right_panel ) {
|
||||
parent.force_right_panel( 'show' );
|
||||
}
|
||||
}
|
||||
%endif
|
||||
%if 'tools' in refresh_frames:
|
||||
if ( parent.frames && parent.frames.galaxy_tools ) {
|
||||
parent.frames.galaxy_tools.location.href="${h.url_for( controller='root', action='tool_menu')}";
|
||||
if ( parent.force_left_panel ) {
|
||||
parent.force_left_panel( 'show' );
|
||||
}
|
||||
}
|
||||
%endif
|
||||
%endif
|
||||
</script>
|
||||
</%def>
|
||||
|
||||
<%def name="stylesheets()">
|
||||
<link href="${h.url_for('/static/style/base.css')}" rel="stylesheet" type="text/css" />
|
||||
<style>
|
||||
## Not generic to all grids -- move to base?
|
||||
.count-box {
|
||||
min-width: 1.1em;
|
||||
padding: 5px;
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
text-align: center;
|
||||
display: inline-block;
|
||||
}
|
||||
</style>
|
||||
</%def>
|
||||
|
||||
<div class="grid-header">
|
||||
<h2>${grid.title}</h2>
|
||||
%if len(trans.user.requests):
|
||||
##<span class="title">Filter:</span>
|
||||
%for i, filter in enumerate( grid.standard_filters ):
|
||||
%if i > 0:
|
||||
<span>|</span>
|
||||
%endif
|
||||
%if grid.show_filter == filter.label:
|
||||
<span class="filter"><a href="${h.url_for( controller='requests', action='list', show_filter=filter.label )}"><b>${filter.label}</b></a></span>
|
||||
%else:
|
||||
<span class="filter"><a href="${h.url_for( controller='requests', action='list', show_filter=filter.label )}">${filter.label}</a></span>
|
||||
%endif
|
||||
%endfor
|
||||
%endif
|
||||
</div>
|
||||
|
||||
<ul class="manage-table-actions">
|
||||
<li>
|
||||
<a class="action-button" href="${h.url_for( controller='requests', action='new', select_request_type=True )}">
|
||||
<img src="${h.url_for('/static/images/silk/add.png')}" />
|
||||
<span>Create a new request</span></a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
%if not len(query.all()):
|
||||
There are no request(s).
|
||||
%else:
|
||||
<form name="history_actions" action="${url()}" method="post" >
|
||||
<table class="grid">
|
||||
<thead>
|
||||
<tr>
|
||||
##<th></th>
|
||||
%for column in grid.columns:
|
||||
%if column.visible:
|
||||
<%
|
||||
href = ""
|
||||
extra = ""
|
||||
if column.sortable:
|
||||
if sort_key == column.key:
|
||||
if sort_order == "asc":
|
||||
href = url( sort=( "-" + column.key ) )
|
||||
extra = "↓"
|
||||
else:
|
||||
href = url( sort=( column.key ) )
|
||||
extra = "↑"
|
||||
else:
|
||||
href = url( sort=column.key )
|
||||
%>
|
||||
<th\
|
||||
%if column.ncells > 1:
|
||||
colspan="${column.ncells}"
|
||||
%endif
|
||||
>
|
||||
%if href:
|
||||
<a href="${href}">${column.label}</a>
|
||||
%else:
|
||||
${column.label}
|
||||
%endif
|
||||
<span>${extra}</span>
|
||||
</th>
|
||||
%endif
|
||||
%endfor
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
%for i, item in enumerate( query ):
|
||||
<tr \
|
||||
%if current_item == item:
|
||||
class="current" \
|
||||
%endif
|
||||
>
|
||||
## Item selection column
|
||||
##<td style="width: 1.5em;">
|
||||
## <input type="checkbox" name="id" value=${trans.security.encode_id( item.id )} class="grid-row-select-checkbox" />
|
||||
##</td>
|
||||
## Data columns
|
||||
%for column in grid.columns:
|
||||
%if column.visible:
|
||||
<%
|
||||
# Link
|
||||
if column.link and column.link( item ):
|
||||
href = url( **column.link( item ) )
|
||||
else:
|
||||
href = None
|
||||
# Value (coerced to list so we can loop)
|
||||
value = column.get_value( trans, grid, item )
|
||||
if column.ncells == 1:
|
||||
value = [ value ]
|
||||
%>
|
||||
%for cellnum, v in enumerate( value ):
|
||||
<%
|
||||
# Attach popup menu?
|
||||
if column.attach_popup and cellnum == 0:
|
||||
extra = '<a id="grid-%d-popup" class="popup-arrow" style="display: none;">▼</a>' % i
|
||||
else:
|
||||
extra = ""
|
||||
%>
|
||||
%if href:
|
||||
<td><a href="${href}">${v}</a> ${extra}</td>
|
||||
%else:
|
||||
<td >${v}${extra}</td>
|
||||
%endif
|
||||
</td>
|
||||
%endfor
|
||||
%endif
|
||||
%endfor
|
||||
## Actions column
|
||||
<td>
|
||||
<div popupmenu="grid-${i}-popup">
|
||||
%for operation in grid.operations:
|
||||
%if operation.allowed( item ):
|
||||
%if operation.label == 'Submit':
|
||||
<a class="action-button" confirm="More samples cannot be added to this request once it is submitted. Click OK to submit." href="${url( operation=operation.label, id=item.id)}">${operation.label}</a>
|
||||
%else:
|
||||
<a class="action-button" href="${url( operation=operation.label, id=item.id )}">${operation.label}</a>
|
||||
%endif
|
||||
%endif
|
||||
%endfor
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
%endfor
|
||||
</tbody>
|
||||
<tfoot>
|
||||
## <tr>
|
||||
## <td></td>
|
||||
## <td colspan="100">
|
||||
## For <span class="grid-selected-count"></span> selected requests:
|
||||
## %for operation in grid.operations:
|
||||
## %if operation.allow_multiple:
|
||||
## <input type="submit" name="operation" value="${operation.label}" class="action-button">
|
||||
## %endif
|
||||
## %endfor
|
||||
## </td>
|
||||
## </tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
</form>
|
||||
%endif
|
||||
<%inherit file="/grid_base.mako"/>
|
||||
@@ -119,7 +119,7 @@
|
||||
<div class="form-row">
|
||||
<ul class="manage-table-actions">
|
||||
<li>
|
||||
<a class="action-button" href="${h.url_for( controller='requests', action='edit', show=True, request_id=request.id)}">
|
||||
<a class="action-button" href="${h.url_for( controller='requests', action='list', operation='Edit', id=trans.security.encode_id(request.id) )}">
|
||||
<span>Edit request details</span></a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
data_state = data.state
|
||||
user, roles = trans.get_user_and_roles()
|
||||
%>
|
||||
%if not trans.app.security_agent.can_access_dataset( roles, data.dataset ):
|
||||
%if not trans.user_is_admin() and not trans.app.security_agent.can_access_dataset( roles, data.dataset ):
|
||||
<div class="historyItemWrapper historyItem historyItem-${data_state} historyItem-noPermission" id="historyItem-${data.id}">
|
||||
%else:
|
||||
<div class="historyItemWrapper historyItem historyItem-${data_state}" id="historyItem-${data.id}">
|
||||
@@ -49,7 +49,7 @@
|
||||
## Body for history items, extra info and actions, data "peek"
|
||||
|
||||
<div id="info${data.id}" class="historyItemBody">
|
||||
%if not trans.app.security_agent.can_access_dataset( roles, data.dataset ):
|
||||
%if not trans.user_is_admin() and not trans.app.security_agent.can_access_dataset( roles, data.dataset ):
|
||||
<div>You do not have permission to view this dataset.</div>
|
||||
%elif data_state == "upload":
|
||||
<div>Dataset is uploading</div>
|
||||
|
||||
@@ -23,19 +23,6 @@
|
||||
else: ## isInstance( tag_name, unicode ):
|
||||
tag_names_and_values[tag_name] = tag_value
|
||||
%>
|
||||
//
|
||||
// Returns the number of keys (elements) in an array/dictionary.
|
||||
//
|
||||
var array_length = function(an_array)
|
||||
{
|
||||
if (an_array.length)
|
||||
return an_array.length;
|
||||
|
||||
var count = 0;
|
||||
for (element in an_array)
|
||||
count++;
|
||||
return count;
|
||||
};
|
||||
|
||||
//
|
||||
// Default function get text to display on the toggle link.
|
||||
|
||||
@@ -221,11 +221,17 @@ function checkUncheckAll( name, check )
|
||||
%if tool.help:
|
||||
<div class="toolHelp">
|
||||
<div class="toolHelpBody">
|
||||
%if tool.has_multiple_pages:
|
||||
${tool.help_by_page[tool_state.page]}
|
||||
%else:
|
||||
${tool.help}
|
||||
%endif
|
||||
<%
|
||||
if tool.has_multiple_pages:
|
||||
tool_help = tool.help_by_page[tool_state.page]
|
||||
else:
|
||||
tool_help = tool.help
|
||||
|
||||
# Convert to unicode to display non-ascii characters.
|
||||
if type( tool_help ) is not unicode:
|
||||
tool_help = unicode( tool_help, 'utf-8')
|
||||
%>
|
||||
${tool_help}
|
||||
</div>
|
||||
</div>
|
||||
%endif
|
||||
|
||||
+29
-14
@@ -10,6 +10,7 @@ from twill.other_packages._mechanize_dist import ClientForm
|
||||
pkg_resources.require( "elementtree" )
|
||||
from elementtree import ElementTree
|
||||
from galaxy.web import security
|
||||
from galaxy.web.framework.helpers import iff
|
||||
|
||||
buffer = StringIO.StringIO()
|
||||
|
||||
@@ -180,7 +181,7 @@ class TwillTestCase( unittest.TestCase ):
|
||||
num_deleted = len( id.split( ',' ) )
|
||||
self.home()
|
||||
self.visit_page( "history/list?operation=delete&id=%s" % ( id ) )
|
||||
check_str = 'Deleted %d histories' % num_deleted
|
||||
check_str = 'Deleted %d %s' % ( num_deleted, iff( num_deleted != 1, "histories","history") )
|
||||
self.check_page_for_string( check_str )
|
||||
self.home()
|
||||
def delete_current_history( self, check_str='' ):
|
||||
@@ -429,6 +430,12 @@ class TwillTestCase( unittest.TestCase ):
|
||||
if check_str:
|
||||
self.check_page_for_string( check_str )
|
||||
self.home()
|
||||
def view_history( self, history_id, check_str='' ):
|
||||
"""Displays a history for viewing"""
|
||||
self.visit_url( '%s/history/view?id=%s' % ( self.url, self.security.encode_id( history_id ) ) )
|
||||
if check_str:
|
||||
self.check_page_for_string( check_str )
|
||||
self.home()
|
||||
def edit_hda_attribute_info( self, hda_id, new_name='', new_info='', new_dbkey='', new_startcol='' ):
|
||||
"""Edit history_dataset_association attribute information"""
|
||||
self.home()
|
||||
@@ -1162,24 +1169,24 @@ class TwillTestCase( unittest.TestCase ):
|
||||
self.check_page_for_string( desc )
|
||||
self.check_page_for_string( formtype )
|
||||
self.home()
|
||||
def edit_form( self, form_id, form_name, new_form_name="Form One's Name (Renamed)", new_form_desc="This is Form One's description (Re-described)"):
|
||||
def edit_form( self, form_current_id, form_name, new_form_name="Form One's Name (Renamed)", new_form_desc="This is Form One's description (Re-described)"):
|
||||
"""
|
||||
Edit form details; name & description
|
||||
"""
|
||||
self.home()
|
||||
self.visit_url( "%s/forms/edit?form_id=%i&show_form=True" % (self.url, form_id) )
|
||||
self.visit_url( "%s/forms/manage?sort=create_time&f-name=All&f-desc=All&f-deleted=False&operation=Edit&id=%s" % ( self.url, self.security.encode_id(form_current_id) ) )
|
||||
self.check_page_for_string( 'Edit form definition "%s"' % form_name )
|
||||
tc.fv( "1", "name", new_form_name )
|
||||
tc.fv( "1", "description", new_form_desc )
|
||||
tc.submit( "save_changes_button" )
|
||||
self.check_page_for_string( "The form '%s' has been updated with the changes." % new_form_name )
|
||||
self.home()
|
||||
def form_add_field( self, form_id, form_name, form_desc, form_type, field_index, fields):
|
||||
def form_add_field( self, form_current_id, form_name, form_desc, form_type, field_index, fields):
|
||||
"""
|
||||
Add a new fields to the form definition
|
||||
"""
|
||||
self.home()
|
||||
self.visit_url( "%s/forms/edit?form_id=%i&show_form=True" % (self.url, form_id) )
|
||||
self.visit_url( "%s/forms/manage?sort=create_time&f-name=All&f-desc=All&f-deleted=False&operation=Edit&id=%s" % ( self.url, self.security.encode_id(form_current_id) ) )
|
||||
self.check_page_for_string( 'Edit form definition "%s"' % form_name)
|
||||
for i, field in enumerate(fields):
|
||||
index = i+field_index
|
||||
@@ -1191,8 +1198,8 @@ class TwillTestCase( unittest.TestCase ):
|
||||
if field['type'] == 'SelectField':
|
||||
options = ''
|
||||
for option_index, option in enumerate(field['selectlist']):
|
||||
url_str = "%s/forms/edit?description=%s&form_id=%i&form_type_selectbox=%s&addoption_%i=Add&name=%s&field_name_%i=%s&field_helptext_%i=%s&field_type_%i=%s" % \
|
||||
(self.url, form_desc.replace(" ", "+"), form_id, form_type.replace(" ", "+"),
|
||||
url_str = "%s/forms/manage?operation=Edit&description=%s&id=%s&form_type_selectbox=%s&addoption_%i=Add&name=%s&field_name_%i=%s&field_helptext_%i=%s&field_type_%i=%s" % \
|
||||
(self.url, form_desc.replace(" ", "+"), self.security.encode_id(form_current_id), form_type.replace(" ", "+"),
|
||||
index, form_name.replace(" ", "+"), index, field['name'].replace(" ", "+"),
|
||||
index, field['desc'].replace(" ", "+"), index, field['type'])
|
||||
self.visit_url( url_str + options )
|
||||
@@ -1207,7 +1214,7 @@ class TwillTestCase( unittest.TestCase ):
|
||||
Remove a field from the form definition
|
||||
"""
|
||||
self.home()
|
||||
self.visit_url( "%s/forms/edit?form_id=%i&show_form=True" % (self.url, form_id) )
|
||||
self.visit_url( "%s/forms/manage?operation=Edit&form_id=%i&show_form=True" % (self.url, form_id) )
|
||||
self.check_page_for_string( 'Edit form definition "%s"' % form_name)
|
||||
tc.submit( "remove_button" )
|
||||
tc.submit( "save_changes_button" )
|
||||
@@ -1215,18 +1222,26 @@ class TwillTestCase( unittest.TestCase ):
|
||||
self.check_page_for_string( check_str )
|
||||
self.home()
|
||||
# Requests stuff
|
||||
def check_request_grid(self, state, request_name, deleted=False):
|
||||
self.home()
|
||||
self.visit_url('%s/requests/list?sort=create_time&f-state=%s&f-deleted=%s' \
|
||||
% (self.url, state, str(deleted)))
|
||||
self.check_page_for_string( request_name )
|
||||
def check_request_admin_grid(self, state, request_name, deleted=False):
|
||||
self.home()
|
||||
self.visit_url('%s/requests_admin/list?sort=create_time&f-state=%s&f-deleted=%s' \
|
||||
% (self.url, state, str(deleted)))
|
||||
self.check_page_for_string( request_name )
|
||||
def create_request_type( self, name, desc, request_form_id, sample_form_id, states ):
|
||||
self.home()
|
||||
self.visit_url( "%s/requests_admin/request_type?create=True" % self.url )
|
||||
self.visit_url( "%s/requests_admin/create_request_type" % self.url )
|
||||
self.check_page_for_string( 'Create a new request type' )
|
||||
tc.fv( "1", "name", name )
|
||||
tc.fv( "1", "description", desc )
|
||||
tc.fv( "1", "desc", desc )
|
||||
tc.fv( "1", "request_form_id", request_form_id )
|
||||
tc.fv( "1", "sample_form_id", sample_form_id )
|
||||
tc.fv( "1", "num_states", str( len( states ) ) )
|
||||
tc.submit( "define_states_button" )
|
||||
self.check_page_for_string( "Create %i states for the '%s' request type" % ( len(states), name ))
|
||||
for index, state in enumerate(states):
|
||||
tc.submit( "add_state_button" )
|
||||
tc.fv("1", "state_name_%i" % index, state[0])
|
||||
tc.fv("1", "state_desc_%i" % index, state[1])
|
||||
tc.submit( "save_request_type" )
|
||||
@@ -1248,7 +1263,7 @@ class TwillTestCase( unittest.TestCase ):
|
||||
self.check_page_for_string( desc )
|
||||
def edit_request( self, request_id, name, new_name, new_desc, new_library_id, new_folder_id, new_fields):
|
||||
self.home()
|
||||
self.visit_url( "%s/requests/edit?request_id=%i&show=True" % (self.url, request_id) )
|
||||
self.visit_url( "%s/requests/list?operation=Edit&id=%s" % (self.url, self.security.encode_id(request_id) ) )
|
||||
self.check_page_for_string( 'Edit request "%s"' % name )
|
||||
tc.fv( "1", "name", new_name )
|
||||
tc.fv( "1", "desc", new_desc )
|
||||
|
||||
@@ -29,6 +29,7 @@ def get_latest_form(form_name):
|
||||
.filter( galaxy.model.FormDefinitionCurrent.table.c.deleted==False ) \
|
||||
.order_by( galaxy.model.FormDefinitionCurrent.table.c.create_time.desc() )
|
||||
for fdc in fdc_list:
|
||||
sa_session.refresh( fdc )
|
||||
sa_session.refresh( fdc.latest_form )
|
||||
if form_name == fdc.latest_form.name:
|
||||
return fdc.latest_form
|
||||
@@ -51,7 +52,7 @@ class TestFormsAndRequests( TwillTestCase ):
|
||||
# edit form & add few more fields
|
||||
new_name = "Request Form (Renamed)"
|
||||
new_desc = "This is Form One's Re-described"
|
||||
self.edit_form( form_one.id, form_one.name, new_form_name=new_name, new_form_desc=new_desc )
|
||||
self.edit_form( form_one.current.id, form_one.name, new_form_name=new_name, new_form_desc=new_desc )
|
||||
self.home()
|
||||
self.visit_page( 'forms/manage' )
|
||||
self.check_page_for_string( new_name )
|
||||
@@ -73,13 +74,13 @@ class TestFormsAndRequests( TwillTestCase ):
|
||||
type='TextField',
|
||||
required='required')]
|
||||
form_one = get_latest_form(form_one_name)
|
||||
self.form_add_field(form_one.id, form_one.name, form_one.desc, form_one.type, field_index=len(form_one.fields), fields=fields)
|
||||
form_one_latest = get_latest_form(form_one_name)
|
||||
self.form_add_field(form_one.current.id, form_one.name, form_one.desc, form_one.type, field_index=len(form_one.fields), fields=fields)
|
||||
form_one_latest = get_latest_form(form_one_name)
|
||||
assert len(form_one_latest.fields) == len(form_one.fields)+len(fields)
|
||||
def test_015_create_sample_form( self ):
|
||||
"""Testing creating another form (for samples)"""
|
||||
global form_two_name
|
||||
desc = "This is Form One's description"
|
||||
desc = "This is Form Two's description"
|
||||
formtype = 'Sequencing Sample Form'
|
||||
self.create_form( name=form_two_name, desc=desc, formtype=formtype )
|
||||
self.home()
|
||||
@@ -207,16 +208,12 @@ class TestFormsAndRequests( TwillTestCase ):
|
||||
request_one.desc+' (Re-described)', library_one.id, folder_one.id, fields)
|
||||
sa_session.refresh( request_one )
|
||||
# check if the request is showing in the 'unsubmitted' filter
|
||||
self.home()
|
||||
self.visit_url( '%s/requests/list?show_filter=Unsubmitted' % self.url )
|
||||
self.check_page_for_string( request_one.name )
|
||||
self.check_request_grid(state='Unsubmitted', request_name=request_one.name)
|
||||
# submit the request
|
||||
self.submit_request( request_one.id, request_one.name )
|
||||
sa_session.refresh( request_one )
|
||||
# check if the request is showing in the 'submitted' filter
|
||||
self.home()
|
||||
self.visit_url( '%s/requests/list?show_filter=Submitted' % self.url )
|
||||
self.check_page_for_string( request_one.name )
|
||||
self.check_request_grid(state='Submitted', request_name=request_one.name)
|
||||
# check if the request's state is now set to 'submitted'
|
||||
assert request_one.state is not request_one.states.SUBMITTED, "The state of the request '%s' should be set to '%s'" \
|
||||
% ( request_one.name, request_one.states.SUBMITTED )
|
||||
@@ -225,9 +222,7 @@ class TestFormsAndRequests( TwillTestCase ):
|
||||
# goto admin manage requests page
|
||||
self.logout()
|
||||
self.login( email='test@bx.psu.edu' )
|
||||
self.home()
|
||||
self.visit_page( 'requests_admin/list' )
|
||||
self.check_page_for_string( request_one.name )
|
||||
self.check_request_admin_grid(state='Submitted', request_name=request_one.name)
|
||||
self.visit_url( "%s/requests_admin/list?sort=-create_time&operation=show_request&id=%s" \
|
||||
% ( self.url, self.security.encode_id( request_one.id ) ))
|
||||
self.check_page_for_string( 'Sequencing Request "%s"' % request_one.name )
|
||||
@@ -240,9 +235,10 @@ class TestFormsAndRequests( TwillTestCase ):
|
||||
self.change_sample_state( sample.name, sample.id, request_type.states[2].id, request_type.states[2].name )
|
||||
self.home()
|
||||
sa_session.refresh( request_one )
|
||||
self.logout()
|
||||
self.login( email='test1@bx.psu.edu' )
|
||||
# check if the request's state is now set to 'complete'
|
||||
self.visit_url('%s/requests_admin/list?show_filter=Complete' % self.url)
|
||||
self.check_page_for_string( request_one.name )
|
||||
self.check_request_grid(state='Complete', request_name=request_one.name)
|
||||
assert request_one.state is not request_one.states.COMPLETE, "The state of the request '%s' should be set to '%s'" \
|
||||
% ( request_one.name, request_one.states.COMPLETE )
|
||||
def test_040_admin_create_request_on_behalf_of_regular_user( self ):
|
||||
@@ -262,9 +258,7 @@ class TestFormsAndRequests( TwillTestCase ):
|
||||
galaxy.model.Request.table.c.deleted==False ) ) \
|
||||
.first()
|
||||
# check if the request is showing in the 'unsubmitted' filter
|
||||
self.home()
|
||||
self.visit_url( '%s/requests_admin/list?show_filter=Unsubmitted' % self.url )
|
||||
self.check_page_for_string( request_two.name )
|
||||
self.check_request_admin_grid(state='Unsubmitted', request_name=request_two.name)
|
||||
# check if the request's state is now set to 'unsubmitted'
|
||||
assert request_two.state is not request_two.states.UNSUBMITTED, "The state of the request '%s' should be set to '%s'" \
|
||||
% ( request_two.name, request_two.states.UNSUBMITTED )
|
||||
@@ -277,17 +271,13 @@ class TestFormsAndRequests( TwillTestCase ):
|
||||
self.submit_request_as_admin( request_two.id, request_two.name )
|
||||
sa_session.refresh( request_two )
|
||||
# check if the request is showing in the 'submitted' filter
|
||||
self.home()
|
||||
self.visit_url( '%s/requests_admin/list?show_filter=Submitted' % self.url )
|
||||
self.check_page_for_string( request_two.name )
|
||||
self.check_request_admin_grid(state='Submitted', request_name=request_two.name)
|
||||
# check if the request's state is now set to 'submitted'
|
||||
assert request_two.state is not request_two.states.SUBMITTED, "The state of the request '%s' should be set to '%s'" \
|
||||
% ( request_two.name, request_two.states.SUBMITTED )
|
||||
# check if both the requests is showing in the 'All' filter
|
||||
self.home()
|
||||
self.visit_url( '%s/requests_admin/list?show_filter=All' % self.url )
|
||||
self.check_page_for_string( request_one.name )
|
||||
self.check_page_for_string( request_two.name )
|
||||
self.check_request_admin_grid(state='All', request_name=request_one.name)
|
||||
self.check_request_admin_grid(state='All', request_name=request_two.name)
|
||||
def test_045_reject_request( self ):
|
||||
'''Testing rejecting a request'''
|
||||
self.logout()
|
||||
@@ -295,9 +285,7 @@ class TestFormsAndRequests( TwillTestCase ):
|
||||
self.reject_request( request_two.id, request_two.name )
|
||||
sa_session.refresh( request_two )
|
||||
# check if the request is showing in the 'unsubmitted' filter
|
||||
self.home()
|
||||
self.visit_url( '%s/requests_admin/list?show_filter=Unsubmitted' % self.url )
|
||||
self.check_page_for_string( request_two.name )
|
||||
self.check_request_admin_grid(state='Unsubmitted', request_name=request_two.name)
|
||||
# check if the request's state is now set to 'submitted'
|
||||
assert request_two.state is not request_two.states.UNSUBMITTED, "The state of the request '%s' should be set to '%s'" \
|
||||
% ( request_two.name, request_two.states.UNSUBMITTED )
|
||||
|
||||
+515
-105
@@ -4,128 +4,538 @@ from galaxy.model.mapping import context as sa_session
|
||||
from base.twilltestcase import TwillTestCase
|
||||
|
||||
class UploadData( TwillTestCase ):
|
||||
def test_000_upload_files_from_disk( self ):
|
||||
"""Test uploading data files from disk"""
|
||||
def test_0005_upload_file( self ):
|
||||
"""Test uploading 1.bed, NOT setting the file format"""
|
||||
self.logout()
|
||||
self.login( email='test@bx.psu.edu' )
|
||||
global admin_user
|
||||
admin_user = sa_session.query( galaxy.model.User ) \
|
||||
.filter( galaxy.model.User.table.c.email=='test@bx.psu.edu' ) \
|
||||
.one()
|
||||
history1 = sa_session.query( galaxy.model.History ) \
|
||||
.filter( and_( galaxy.model.History.table.c.deleted==False,
|
||||
galaxy.model.History.table.c.user_id==admin_user.id ) ) \
|
||||
.order_by( desc( galaxy.model.History.table.c.create_time ) ) \
|
||||
.first()
|
||||
history = sa_session.query( galaxy.model.History ) \
|
||||
.filter( and_( galaxy.model.History.table.c.deleted==False,
|
||||
galaxy.model.History.table.c.user_id==admin_user.id ) ) \
|
||||
.order_by( desc( galaxy.model.History.table.c.create_time ) ) \
|
||||
.first()
|
||||
self.upload_file( '1.bed' )
|
||||
hda1 = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert hda1 is not None, "Problem retrieving hda1 from database"
|
||||
self.verify_dataset_correctness( '1.bed', hid=str( hda1.hid ) )
|
||||
self.upload_file( '2.bed', dbkey='hg17' )
|
||||
hda2 = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert hda2 is not None, "Problem retrieving hda2 from database"
|
||||
self.verify_dataset_correctness( '2.bed', hid=str( hda2.hid ) )
|
||||
self.upload_file( '3.bed', dbkey='hg17', ftype='bed' )
|
||||
hda3 = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert hda3 is not None, "Problem retrieving hda3 from database"
|
||||
self.verify_dataset_correctness( '3.bed', hid=str( hda3.hid ) )
|
||||
hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert hda is not None, "Problem retrieving hda from database"
|
||||
self.verify_dataset_correctness( '1.bed', hid=str( hda.hid ) )
|
||||
self.check_history_for_string( "<th>1.Chrom</th><th>2.Start</th><th>3.End</th>" )
|
||||
self.delete_history( id=self.security.encode_id( history.id ) )
|
||||
def test_0010_upload_file( self ):
|
||||
"""Test uploading 4.bed.gz, manually setting the file format"""
|
||||
self.check_history_for_string( 'Your history is empty' )
|
||||
history = sa_session.query( galaxy.model.History ) \
|
||||
.filter( and_( galaxy.model.History.table.c.deleted==False,
|
||||
galaxy.model.History.table.c.user_id==admin_user.id ) ) \
|
||||
.order_by( desc( galaxy.model.History.table.c.create_time ) ) \
|
||||
.first()
|
||||
self.upload_file( '4.bed.gz', dbkey='hg17', ftype='bed' )
|
||||
hda4 = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert hda4 is not None, "Problem retrieving hda4 from database"
|
||||
self.verify_dataset_correctness( '4.bed', hid=str( hda4.hid ) )
|
||||
hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert hda is not None, "Problem retrieving hda from database"
|
||||
self.verify_dataset_correctness( '4.bed', hid=str( hda.hid ) )
|
||||
self.check_history_for_string( "<th>1.Chrom</th><th>2.Start</th><th>3.End</th>" )
|
||||
self.delete_history( id=self.security.encode_id( history.id ) )
|
||||
def test_0015_upload_file( self ):
|
||||
"""Test uploading 1.scf, manually setting the file format"""
|
||||
self.check_history_for_string( 'Your history is empty' )
|
||||
history = sa_session.query( galaxy.model.History ) \
|
||||
.filter( and_( galaxy.model.History.table.c.deleted==False,
|
||||
galaxy.model.History.table.c.user_id==admin_user.id ) ) \
|
||||
.order_by( desc( galaxy.model.History.table.c.create_time ) ) \
|
||||
.first()
|
||||
self.upload_file( '1.scf', ftype='scf' )
|
||||
hda5 = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert hda5 is not None, "Problem retrieving hda5 from database"
|
||||
self.verify_dataset_correctness( '1.scf', hid=str( hda5.hid ) )
|
||||
hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert hda is not None, "Problem retrieving hda from database"
|
||||
self.verify_dataset_correctness( '1.scf', hid=str( hda.hid ) )
|
||||
self.check_history_for_string( "Binary scf sequence file</pre>" )
|
||||
self.delete_history( id=self.security.encode_id( history.id ) )
|
||||
def test_0020_upload_file( self ):
|
||||
"""Test uploading 1.scf, NOT setting the file format"""
|
||||
self.check_history_for_string( 'Your history is empty' )
|
||||
history = sa_session.query( galaxy.model.History ) \
|
||||
.filter( and_( galaxy.model.History.table.c.deleted==False,
|
||||
galaxy.model.History.table.c.user_id==admin_user.id ) ) \
|
||||
.order_by( desc( galaxy.model.History.table.c.create_time ) ) \
|
||||
.first()
|
||||
self.upload_file( '1.scf' )
|
||||
hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert hda is not None, "Problem retrieving hda from database"
|
||||
self.check_history_for_string( "File Format' to 'Scf' when uploading scf files" )
|
||||
self.delete_history( id=self.security.encode_id( history.id ) )
|
||||
def test_0025_upload_file( self ):
|
||||
"""Test uploading 1.scf.zip, manually setting the file format"""
|
||||
self.check_history_for_string( 'Your history is empty' )
|
||||
history = sa_session.query( galaxy.model.History ) \
|
||||
.filter( and_( galaxy.model.History.table.c.deleted==False,
|
||||
galaxy.model.History.table.c.user_id==admin_user.id ) ) \
|
||||
.order_by( desc( galaxy.model.History.table.c.create_time ) ) \
|
||||
.first()
|
||||
self.upload_file( '1.scf.zip', ftype='binseq.zip' )
|
||||
hda6 = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert hda6 is not None, "Problem retrieving hda6 from database"
|
||||
self.verify_dataset_correctness( '1.scf.zip', hid=str( hda6.hid ) )
|
||||
self.delete_history( id=self.security.encode_id( history1.id ) )
|
||||
def test_005_url_paste( self ):
|
||||
hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert hda is not None, "Problem retrieving hda from database"
|
||||
self.verify_dataset_correctness( '1.scf.zip', hid=str( hda.hid ) )
|
||||
self.check_history_for_string( "Archive of 1 binary sequence files</pre>" )
|
||||
self.delete_history( id=self.security.encode_id( history.id ) )
|
||||
def test_0030_upload_file( self ):
|
||||
"""Test uploading 1.scf.zip, NOT setting the file format"""
|
||||
self.check_history_for_string( 'Your history is empty' )
|
||||
history = sa_session.query( galaxy.model.History ) \
|
||||
.filter( and_( galaxy.model.History.table.c.deleted==False,
|
||||
galaxy.model.History.table.c.user_id==admin_user.id ) ) \
|
||||
.order_by( desc( galaxy.model.History.table.c.create_time ) ) \
|
||||
.first()
|
||||
self.upload_file( '1.scf.zip' )
|
||||
hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert hda is not None, "Problem retrieving hda from database"
|
||||
self.check_history_for_string( "'File Format' for archive consisting of binary files - use 'Binseq.zip'" )
|
||||
self.delete_history( id=self.security.encode_id( history.id ) )
|
||||
def test_0035_upload_file( self ):
|
||||
"""Test uploading 1.sam NOT setting the file format"""
|
||||
self.check_history_for_string( 'Your history is empty' )
|
||||
history = sa_session.query( galaxy.model.History ) \
|
||||
.filter( and_( galaxy.model.History.table.c.deleted==False,
|
||||
galaxy.model.History.table.c.user_id==admin_user.id ) ) \
|
||||
.order_by( desc( galaxy.model.History.table.c.create_time ) ) \
|
||||
.first()
|
||||
self.upload_file( '1.sam' )
|
||||
hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert hda is not None, "Problem retrieving hda from database"
|
||||
self.verify_dataset_correctness( '1.sam', hid=str( hda.hid ) )
|
||||
self.check_history_for_string( "<th>1.QNAME</th><th>2.FLAG</th><th>3.RNAME</th><th>4.POS</th>" )
|
||||
self.delete_history( id=self.security.encode_id( history.id ) )
|
||||
def test_0040_upload_file( self ):
|
||||
"""Test uploading 1.sff, NOT setting the file format"""
|
||||
self.check_history_for_string( 'Your history is empty' )
|
||||
history = sa_session.query( galaxy.model.History ) \
|
||||
.filter( and_( galaxy.model.History.table.c.deleted==False,
|
||||
galaxy.model.History.table.c.user_id==admin_user.id ) ) \
|
||||
.order_by( desc( galaxy.model.History.table.c.create_time ) ) \
|
||||
.first()
|
||||
self.upload_file( '1.sff' )
|
||||
hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert hda is not None, "Problem retrieving hda from database"
|
||||
self.verify_dataset_correctness( '1.sff', hid=str( hda.hid ) )
|
||||
self.check_history_for_string( 'format: <span class="sff">sff' )
|
||||
self.delete_history( id=self.security.encode_id( history.id ) )
|
||||
def test_0045_upload_file( self ):
|
||||
"""Test uploading 454Score.pdf, NOT setting the file format"""
|
||||
self.check_history_for_string( 'Your history is empty' )
|
||||
history = sa_session.query( galaxy.model.History ) \
|
||||
.filter( and_( galaxy.model.History.table.c.deleted==False,
|
||||
galaxy.model.History.table.c.user_id==admin_user.id ) ) \
|
||||
.order_by( desc( galaxy.model.History.table.c.create_time ) ) \
|
||||
.first()
|
||||
self.upload_file( '454Score.pdf' )
|
||||
hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert hda is not None, "Problem retrieving hda from database"
|
||||
self.check_history_for_string( "The uploaded file contains inappropriate content" )
|
||||
self.delete_history( id=self.security.encode_id( history.id ) )
|
||||
def test_0050_upload_file( self ):
|
||||
"""Test uploading 454Score.png, NOT setting the file format"""
|
||||
self.check_history_for_string( 'Your history is empty' )
|
||||
history = sa_session.query( galaxy.model.History ) \
|
||||
.filter( and_( galaxy.model.History.table.c.deleted==False,
|
||||
galaxy.model.History.table.c.user_id==admin_user.id ) ) \
|
||||
.order_by( desc( galaxy.model.History.table.c.create_time ) ) \
|
||||
.first()
|
||||
self.upload_file( '454Score.png' )
|
||||
hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert hda is not None, "Problem retrieving hda from database"
|
||||
self.check_history_for_string( "The uploaded file contains inappropriate content" )
|
||||
def test_0055_upload_file( self ):
|
||||
"""Test uploading lped composite datatype file, manually setting the file format"""
|
||||
# Logged in as admin_user
|
||||
self.check_history_for_string( 'Your history is empty' )
|
||||
history = sa_session.query( galaxy.model.History ) \
|
||||
.filter( and_( galaxy.model.History.table.c.deleted==False,
|
||||
galaxy.model.History.table.c.user_id==admin_user.id ) ) \
|
||||
.order_by( desc( galaxy.model.History.table.c.create_time ) ) \
|
||||
.first()
|
||||
# lped data types include a ped_file and a map_file ( which is binary )
|
||||
self.upload_composite_datatype_file( 'lped', ped_file='tinywga.ped', map_file='tinywga.map', base_name='rgenetics' )
|
||||
# Get the latest hid for testing
|
||||
hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert hda is not None, "Problem retrieving hda from database"
|
||||
# We'll test against the resulting ped file and map file for correctness
|
||||
self.verify_composite_datatype_file_content( 'rgenetics.ped', str( hda.id ) )
|
||||
self.verify_composite_datatype_file_content( 'rgenetics.map', str( hda.id ) )
|
||||
self.check_history_for_string( "Uploaded Composite Dataset (lped)" )
|
||||
self.delete_history( id=self.security.encode_id( history.id ) )
|
||||
def test_0060_upload_file( self ):
|
||||
"""Test uploading pbed composite datatype file, manually setting the file format"""
|
||||
# Logged in as admin_user
|
||||
self.check_history_for_string( 'Your history is empty' )
|
||||
history = sa_session.query( galaxy.model.History ) \
|
||||
.filter( and_( galaxy.model.History.table.c.deleted==False,
|
||||
galaxy.model.History.table.c.user_id==admin_user.id ) ) \
|
||||
.order_by( desc( galaxy.model.History.table.c.create_time ) ) \
|
||||
.first()
|
||||
# pbed data types include a bim_file, a bed_file and a fam_file
|
||||
self.upload_composite_datatype_file( 'pbed', bim_file='tinywga.bim', bed_file='tinywga.bed', fam_file='tinywga.fam', base_name='rgenetics' )
|
||||
# Get the latest hid for testing
|
||||
hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert hda is not None, "Problem retrieving hda from database"
|
||||
# We'll test against the resulting ped file and map file for correctness
|
||||
self.verify_composite_datatype_file_content( 'rgenetics.bim', str( hda.id ) )
|
||||
self.verify_composite_datatype_file_content( 'rgenetics.bed', str( hda.id ) )
|
||||
self.verify_composite_datatype_file_content( 'rgenetics.fam', str( hda.id ) )
|
||||
self.check_history_for_string( "Uploaded Composite Dataset (pbed)" )
|
||||
self.delete_history( id=self.security.encode_id( history.id ) )
|
||||
def test_0065_upload_file( self ):
|
||||
"""Test uploading asian_chars_1.txt, NOT setting the file format"""
|
||||
# Logged in as admin_user
|
||||
self.check_history_for_string( 'Your history is empty' )
|
||||
history = sa_session.query( galaxy.model.History ) \
|
||||
.filter( and_( galaxy.model.History.table.c.deleted==False,
|
||||
galaxy.model.History.table.c.user_id==admin_user.id ) ) \
|
||||
.order_by( desc( galaxy.model.History.table.c.create_time ) ) \
|
||||
.first()
|
||||
self.upload_file( 'asian_chars_1.txt' )
|
||||
hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert hda is not None, "Problem retrieving hda from database"
|
||||
self.verify_dataset_correctness( 'asian_chars_1.txt', hid=str( hda.hid ) )
|
||||
self.check_history_for_string( 'uploaded multi-byte char file' )
|
||||
self.delete_history( id=self.security.encode_id( history.id ) )
|
||||
def test_0070_upload_file( self ):
|
||||
"""Test uploading 2gen.fastq, NOT setting the file format"""
|
||||
# Logged in as admin_user
|
||||
self.check_history_for_string( 'Your history is empty' )
|
||||
history = sa_session.query( galaxy.model.History ) \
|
||||
.filter( and_( galaxy.model.History.table.c.deleted==False,
|
||||
galaxy.model.History.table.c.user_id==admin_user.id ) ) \
|
||||
.order_by( desc( galaxy.model.History.table.c.create_time ) ) \
|
||||
.first()
|
||||
self.upload_file( '2gen.fastq' )
|
||||
hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert hda is not None, "Problem retrieving hda from database"
|
||||
self.verify_dataset_correctness( '2gen.fastq', hid=str( hda.hid ) )
|
||||
self.check_history_for_string( '2gen.fastq format: <span class="fastq">fastq</span>, database: \? Info: uploaded fastq file' )
|
||||
self.delete_history( id=self.security.encode_id( history.id ) )
|
||||
def test_0075_upload_file( self ):
|
||||
"""Test uploading 1.wig, NOT setting the file format"""
|
||||
# Logged in as admin_user
|
||||
self.check_history_for_string( 'Your history is empty' )
|
||||
history = sa_session.query( galaxy.model.History ) \
|
||||
.filter( and_( galaxy.model.History.table.c.deleted==False,
|
||||
galaxy.model.History.table.c.user_id==admin_user.id ) ) \
|
||||
.order_by( desc( galaxy.model.History.table.c.create_time ) ) \
|
||||
.first()
|
||||
self.upload_file( '1.wig' )
|
||||
hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert hda is not None, "Problem retrieving hda from database"
|
||||
self.verify_dataset_correctness( '1.wig', hid=str( hda.hid ) )
|
||||
self.check_history_for_string( '1.wig format: <span class="wig">wig</span>, database: \? Info: uploaded file' )
|
||||
self.check_metadata_for_string( 'value="1.wig" value="\?"' )
|
||||
self.check_metadata_for_string( 'Change data type selected value="wig" selected="yes"' )
|
||||
self.delete_history( id=self.security.encode_id( history.id ) )
|
||||
def test_0080_upload_file( self ):
|
||||
"""Test uploading 1.tabular, NOT setting the file format"""
|
||||
# Logged in as admin_user
|
||||
self.check_history_for_string( 'Your history is empty' )
|
||||
history = sa_session.query( galaxy.model.History ) \
|
||||
.filter( and_( galaxy.model.History.table.c.deleted==False,
|
||||
galaxy.model.History.table.c.user_id==admin_user.id ) ) \
|
||||
.order_by( desc( galaxy.model.History.table.c.create_time ) ) \
|
||||
.first()
|
||||
self.upload_file( '1.tabular' )
|
||||
hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert hda is not None, "Problem retrieving hda from database"
|
||||
self.verify_dataset_correctness( '1.tabular', hid=str( hda.hid ) )
|
||||
self.check_history_for_string( '1.tabular format: <span class="tabular">tabular</span>, database: \? Info: uploaded file' )
|
||||
self.check_metadata_for_string( 'value="1.tabular" value="\?"' )
|
||||
self.check_metadata_for_string( 'Change data type selected value="tabular" selected="yes"' )
|
||||
self.delete_history( id=self.security.encode_id( history.id ) )
|
||||
def test_0085_upload_file( self ):
|
||||
"""Test uploading qualscores.qualsolid, NOT setting the file format"""
|
||||
# Logged in as admin_user
|
||||
self.check_history_for_string( 'Your history is empty' )
|
||||
history = sa_session.query( galaxy.model.History ) \
|
||||
.filter( and_( galaxy.model.History.table.c.deleted==False,
|
||||
galaxy.model.History.table.c.user_id==admin_user.id ) ) \
|
||||
.order_by( desc( galaxy.model.History.table.c.create_time ) ) \
|
||||
.first()
|
||||
self.upload_file( 'qualscores.qualsolid' )
|
||||
hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert hda is not None, "Problem retrieving hda from database"
|
||||
self.verify_dataset_correctness( 'qualscores.qualsolid', hid=str( hda.hid ) )
|
||||
self.check_history_for_string( '2.5 Kb, format: <span class="qualsolid">qualsolid</span>, database: \? Info: uploaded file' )
|
||||
self.check_metadata_for_string( 'Change data type value="qualsolid" selected="yes">qualsolid' )
|
||||
self.delete_history( id=self.security.encode_id( history.id ) )
|
||||
def test_0090_upload_file( self ):
|
||||
"""Test uploading qualscores.qual454, NOT setting the file format"""
|
||||
# Logged in as admin_user
|
||||
self.check_history_for_string( 'Your history is empty' )
|
||||
history = sa_session.query( galaxy.model.History ) \
|
||||
.filter( and_( galaxy.model.History.table.c.deleted==False,
|
||||
galaxy.model.History.table.c.user_id==admin_user.id ) ) \
|
||||
.order_by( desc( galaxy.model.History.table.c.create_time ) ) \
|
||||
.first()
|
||||
self.upload_file( 'qualscores.qual454' )
|
||||
hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert hda is not None, "Problem retrieving hda from database"
|
||||
self.verify_dataset_correctness( 'qualscores.qual454', hid=str( hda.hid ) )
|
||||
self.check_history_for_string( '5.6 Kb, format: <span class="qual454">qual454</span>, database: \?' )
|
||||
self.check_metadata_for_string( 'Change data type value="qual454" selected="yes">qual454' )
|
||||
self.delete_history( id=self.security.encode_id( history.id ) )
|
||||
def test_0095_upload_file( self ):
|
||||
"""Test uploading 3.maf, NOT setting the file format"""
|
||||
# Logged in as admin_user
|
||||
self.check_history_for_string( 'Your history is empty' )
|
||||
history = sa_session.query( galaxy.model.History ) \
|
||||
.filter( and_( galaxy.model.History.table.c.deleted==False,
|
||||
galaxy.model.History.table.c.user_id==admin_user.id ) ) \
|
||||
.order_by( desc( galaxy.model.History.table.c.create_time ) ) \
|
||||
.first()
|
||||
self.upload_file( '3.maf' )
|
||||
hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert hda is not None, "Problem retrieving hda from database"
|
||||
self.verify_dataset_correctness( '3.maf', hid=str( hda.hid ) )
|
||||
self.check_history_for_string( '3.maf format: <span class="maf">maf</span>, database: \? Info: uploaded file' )
|
||||
self.check_metadata_for_string( 'value="3.maf" value="\?"' )
|
||||
self.check_metadata_for_string( 'Convert to new format <option value="interval">Convert MAF to Genomic Intervals <option value="fasta">Convert MAF to Fasta' )
|
||||
self.check_metadata_for_string( 'Change data type selected value="maf" selected="yes"' )
|
||||
self.delete_history( id=self.security.encode_id( history.id ) )
|
||||
def test_0100_upload_file( self ):
|
||||
"""Test uploading 1.lav, NOT setting the file format"""
|
||||
# Logged in as admin_user
|
||||
self.check_history_for_string( 'Your history is empty' )
|
||||
history = sa_session.query( galaxy.model.History ) \
|
||||
.filter( and_( galaxy.model.History.table.c.deleted==False,
|
||||
galaxy.model.History.table.c.user_id==admin_user.id ) ) \
|
||||
.order_by( desc( galaxy.model.History.table.c.create_time ) ) \
|
||||
.first()
|
||||
self.upload_file( '1.lav' )
|
||||
hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert hda is not None, "Problem retrieving hda from database"
|
||||
self.verify_dataset_correctness( '1.lav', hid=str( hda.hid ) )
|
||||
self.check_history_for_string( '1.lav format: <span class="lav">lav</span>, database: \? Info: uploaded file' )
|
||||
self.check_metadata_for_string( 'value="1.lav" value="\?"' )
|
||||
self.check_metadata_for_string( 'Change data type selected value="lav" selected="yes"' )
|
||||
self.delete_history( id=self.security.encode_id( history.id ) )
|
||||
def test_0105_upload_file( self ):
|
||||
"""Test uploading 1.interval, NOT setting the file format"""
|
||||
# Logged in as admin_user
|
||||
self.check_history_for_string( 'Your history is empty' )
|
||||
history = sa_session.query( galaxy.model.History ) \
|
||||
.filter( and_( galaxy.model.History.table.c.deleted==False,
|
||||
galaxy.model.History.table.c.user_id==admin_user.id ) ) \
|
||||
.order_by( desc( galaxy.model.History.table.c.create_time ) ) \
|
||||
.first()
|
||||
self.upload_file( '1.interval' )
|
||||
hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert hda is not None, "Problem retrieving hda from database"
|
||||
self.verify_dataset_correctness( '1.interval', hid=str( hda.hid ) )
|
||||
self.check_history_for_string( '1.interval format: <span class="interval">interval</span>, database: \? Info: uploaded file' )
|
||||
self.check_metadata_for_string( 'value="1.interval" value="\?"' )
|
||||
self.check_metadata_for_string( 'Chrom column: <option value="1" selected> Start column: <option value="2" selected>' )
|
||||
self.check_metadata_for_string( 'End column: <option value="3" selected> Strand column <option value="6" selected>' )
|
||||
self.check_metadata_for_string( 'Convert to new format <option value="bed">Convert Genomic Intervals To BED' )
|
||||
self.check_metadata_for_string( 'Change data type selected value="interval" selected="yes"' )
|
||||
self.delete_history( id=self.security.encode_id( history.id ) )
|
||||
def test_0110_upload_file( self ):
|
||||
"""Test uploading 5.gff3, NOT setting the file format"""
|
||||
# Logged in as admin_user
|
||||
self.check_history_for_string( 'Your history is empty' )
|
||||
history = sa_session.query( galaxy.model.History ) \
|
||||
.filter( and_( galaxy.model.History.table.c.deleted==False,
|
||||
galaxy.model.History.table.c.user_id==admin_user.id ) ) \
|
||||
.order_by( desc( galaxy.model.History.table.c.create_time ) ) \
|
||||
.first()
|
||||
self.upload_file( '5.gff3' )
|
||||
hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert hda is not None, "Problem retrieving hda from database"
|
||||
self.verify_dataset_correctness( '5.gff3', hid=str( hda.hid ) )
|
||||
self.check_history_for_string( '5.gff3 format: <span class="gff3">gff3</span>, database: \? Info: uploaded file' )
|
||||
self.check_metadata_for_string( 'value="5.gff3" value="\?"' )
|
||||
self.check_metadata_for_string( 'Convert to new format <option value="bed">Convert GFF to BED' )
|
||||
self.check_metadata_for_string( 'Change data type selected value="gff3" selected="yes"' )
|
||||
self.delete_history( id=self.security.encode_id( history.id ) )
|
||||
def test_0115_upload_file( self ):
|
||||
"""Test uploading html_file.txt, NOT setting the file format"""
|
||||
# Logged in as admin_user
|
||||
self.check_history_for_string( 'Your history is empty' )
|
||||
history = sa_session.query( galaxy.model.History ) \
|
||||
.filter( and_( galaxy.model.History.table.c.deleted==False,
|
||||
galaxy.model.History.table.c.user_id==admin_user.id ) ) \
|
||||
.order_by( desc( galaxy.model.History.table.c.create_time ) ) \
|
||||
.first()
|
||||
self.upload_file( 'html_file.txt' )
|
||||
hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert hda is not None, "Problem retrieving hda from database"
|
||||
self.check_history_for_string( 'The uploaded file contains inappropriate content' )
|
||||
self.delete_history( id=self.security.encode_id( history.id ) )
|
||||
def test_0120_upload_file( self ):
|
||||
"""Test uploading 5.gff, NOT setting the file format"""
|
||||
# Logged in as admin_user
|
||||
self.check_history_for_string( 'Your history is empty' )
|
||||
history = sa_session.query( galaxy.model.History ) \
|
||||
.filter( and_( galaxy.model.History.table.c.deleted==False,
|
||||
galaxy.model.History.table.c.user_id==admin_user.id ) ) \
|
||||
.order_by( desc( galaxy.model.History.table.c.create_time ) ) \
|
||||
.first()
|
||||
self.upload_file( '5.gff' )
|
||||
hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert hda is not None, "Problem retrieving hda from database"
|
||||
self.verify_dataset_correctness( '5.gff', hid=str( hda.hid ) )
|
||||
self.check_history_for_string( '5.gff format: <span class="gff">gff</span>, database: \? Info: uploaded file' )
|
||||
self.check_metadata_for_string( 'value="5.gff" value="\?"' )
|
||||
self.check_metadata_for_string( 'Convert to new format <option value="bed">Convert GFF to BED' )
|
||||
self.check_metadata_for_string( 'Change data type selected value="gff" selected="yes"' )
|
||||
self.delete_history( id=self.security.encode_id( history.id ) )
|
||||
def test_0125_upload_file( self ):
|
||||
"""Test uploading 1.fasta, NOT setting the file format"""
|
||||
# Logged in as admin_user
|
||||
self.check_history_for_string( 'Your history is empty' )
|
||||
history = sa_session.query( galaxy.model.History ) \
|
||||
.filter( and_( galaxy.model.History.table.c.deleted==False,
|
||||
galaxy.model.History.table.c.user_id==admin_user.id ) ) \
|
||||
.order_by( desc( galaxy.model.History.table.c.create_time ) ) \
|
||||
.first()
|
||||
self.upload_file( '1.fasta' )
|
||||
hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert hda is not None, "Problem retrieving hda from database"
|
||||
self.verify_dataset_correctness( '1.fasta', hid=str( hda.hid ) )
|
||||
self.check_history_for_string( '1.fasta format: <span class="fasta">fasta</span>, database: \? Info: uploaded file' )
|
||||
self.check_metadata_for_string( 'value="1.fasta" value="\?" Change data type selected value="fasta" selected="yes"' )
|
||||
self.delete_history( id=self.security.encode_id( history.id ) )
|
||||
def test_0130_upload_file( self ):
|
||||
"""Test uploading 1.customtrack, NOT setting the file format"""
|
||||
# Logged in as admin_user
|
||||
self.check_history_for_string( 'Your history is empty' )
|
||||
history = sa_session.query( galaxy.model.History ) \
|
||||
.filter( and_( galaxy.model.History.table.c.deleted==False,
|
||||
galaxy.model.History.table.c.user_id==admin_user.id ) ) \
|
||||
.order_by( desc( galaxy.model.History.table.c.create_time ) ) \
|
||||
.first()
|
||||
self.upload_file( '1.customtrack' )
|
||||
hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert hda is not None, "Problem retrieving hda from database"
|
||||
self.verify_dataset_correctness( '1.customtrack', hid=str( hda.hid ) )
|
||||
self.check_history_for_string( '1.customtrack format: <span class="customtrack">customtrack</span>, database: \? Info: uploaded file' )
|
||||
self.check_metadata_for_string( 'value="1.customtrack" value="\?" Change data type selected value="customtrack" selected="yes"' )
|
||||
self.delete_history( id=self.security.encode_id( history.id ) )
|
||||
def test_0135_upload_file( self ):
|
||||
"""Test uploading shrimp_cs_test1.csfasta, NOT setting the file format"""
|
||||
# Logged in as admin_user
|
||||
self.check_history_for_string( 'Your history is empty' )
|
||||
history = sa_session.query( galaxy.model.History ) \
|
||||
.filter( and_( galaxy.model.History.table.c.deleted==False,
|
||||
galaxy.model.History.table.c.user_id==admin_user.id ) ) \
|
||||
.order_by( desc( galaxy.model.History.table.c.create_time ) ) \
|
||||
.first()
|
||||
self.upload_file( 'shrimp_cs_test1.csfasta' )
|
||||
hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert hda is not None, "Problem retrieving hda from database"
|
||||
self.verify_dataset_correctness( 'shrimp_cs_test1.csfasta', hid=str( hda.hid ) )
|
||||
self.check_history_for_string( '162.6 Kb, format: <span class="csfasta">csfasta</span>, <td>>2_14_26_F3,-1282216.0</td>' )
|
||||
self.check_metadata_for_string( 'value="shrimp_cs_test1.csfasta" value="\?" Change data type value="csfasta" selected="yes"' )
|
||||
self.delete_history( id=self.security.encode_id( history.id ) )
|
||||
def test_0140_upload_file( self ):
|
||||
"""Test uploading megablast_xml_parser_test1.gz, NOT setting the file format"""
|
||||
# Logged in as admin_user
|
||||
self.check_history_for_string( 'Your history is empty' )
|
||||
history = sa_session.query( galaxy.model.History ) \
|
||||
.filter( and_( galaxy.model.History.table.c.deleted==False,
|
||||
galaxy.model.History.table.c.user_id==admin_user.id ) ) \
|
||||
.order_by( desc( galaxy.model.History.table.c.create_time ) ) \
|
||||
.first()
|
||||
self.upload_file( 'megablast_xml_parser_test1.gz' )
|
||||
hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert hda is not None, "Problem retrieving hda from database"
|
||||
self.check_history_for_string( 'NCBI Blast XML data format: <span class="blastxml">blastxml</span>' )
|
||||
self.delete_history( id=self.security.encode_id( history.id ) )
|
||||
def test_0145_upload_file( self ):
|
||||
"""Test uploading 1.axt, NOT setting the file format"""
|
||||
# Logged in as admin_user
|
||||
self.check_history_for_string( 'Your history is empty' )
|
||||
history = sa_session.query( galaxy.model.History ) \
|
||||
.filter( and_( galaxy.model.History.table.c.deleted==False,
|
||||
galaxy.model.History.table.c.user_id==admin_user.id ) ) \
|
||||
.order_by( desc( galaxy.model.History.table.c.create_time ) ) \
|
||||
.first()
|
||||
self.upload_file( '1.axt' )
|
||||
hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert hda is not None, "Problem retrieving hda from database"
|
||||
self.verify_dataset_correctness( '1.axt', hid=str( hda.hid ) )
|
||||
self.check_history_for_string( '1.axt format: <span class="axt">axt</span>, database: \? Info: uploaded file' )
|
||||
self.check_metadata_for_string( 'value="1.axt" value="\?" Change data type selected value="axt" selected="yes"' )
|
||||
self.delete_history( id=self.security.encode_id( history.id ) )
|
||||
def test_0150_url_paste( self ):
|
||||
"""Test url paste behavior"""
|
||||
# Logged in as admin_user
|
||||
# Deleting the current history should have created a new history
|
||||
self.check_history_for_string( 'Your history is empty' )
|
||||
history2 = sa_session.query( galaxy.model.History ) \
|
||||
.filter( and_( galaxy.model.History.table.c.deleted==False,
|
||||
galaxy.model.History.table.c.user_id==admin_user.id ) ) \
|
||||
.order_by( desc( galaxy.model.History.table.c.create_time ) ) \
|
||||
.first()
|
||||
history = sa_session.query( galaxy.model.History ) \
|
||||
.filter( and_( galaxy.model.History.table.c.deleted==False,
|
||||
galaxy.model.History.table.c.user_id==admin_user.id ) ) \
|
||||
.order_by( desc( galaxy.model.History.table.c.create_time ) ) \
|
||||
.first()
|
||||
self.upload_url_paste( 'hello world' )
|
||||
self.check_history_for_string( 'Pasted Entry' )
|
||||
self.check_history_for_string( 'hello world' )
|
||||
self.upload_url_paste( u'hello world' )
|
||||
self.check_history_for_string( 'Pasted Entry' )
|
||||
self.check_history_for_string( 'hello world' )
|
||||
self.delete_history( id=self.security.encode_id( history2.id ) )
|
||||
def test_010_upload_lped_composite_datatype_files( self ):
|
||||
"""Test uploading lped composite datatype files"""
|
||||
# Logged in as admin_user
|
||||
self.check_history_for_string( 'Your history is empty' )
|
||||
history3 = sa_session.query( galaxy.model.History ) \
|
||||
.filter( and_( galaxy.model.History.table.c.deleted==False,
|
||||
galaxy.model.History.table.c.user_id==admin_user.id ) ) \
|
||||
.order_by( desc( galaxy.model.History.table.c.create_time ) ) \
|
||||
.first()
|
||||
# lped data types include a ped_file and a map_file ( which is binary )
|
||||
self.upload_composite_datatype_file( 'lped', ped_file='tinywga.ped', map_file='tinywga.map', base_name='rgenetics' )
|
||||
# Get the latest hid for testing
|
||||
hda1 = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert hda1 is not None, "Problem retrieving hda1 from database"
|
||||
# We'll test against the resulting ped file and map file for correctness
|
||||
self.verify_composite_datatype_file_content( 'rgenetics.ped', str( hda1.id ) )
|
||||
self.verify_composite_datatype_file_content( 'rgenetics.map', str( hda1.id ) )
|
||||
self.delete_history( id=self.security.encode_id( history3.id ) )
|
||||
def test_015_upload_pbed_composite_datatype_files( self ):
|
||||
"""Test uploading pbed composite datatype files"""
|
||||
# Logged in as admin_user
|
||||
self.check_history_for_string( 'Your history is empty' )
|
||||
history4 = sa_session.query( galaxy.model.History ) \
|
||||
.filter( and_( galaxy.model.History.table.c.deleted==False,
|
||||
galaxy.model.History.table.c.user_id==admin_user.id ) ) \
|
||||
.order_by( desc( galaxy.model.History.table.c.create_time ) ) \
|
||||
.first()
|
||||
# pbed data types include a bim_file, a bed_file and a fam_file
|
||||
self.upload_composite_datatype_file( 'pbed', bim_file='tinywga.bim', bed_file='tinywga.bed', fam_file='tinywga.fam', base_name='rgenetics' )
|
||||
# Get the latest hid for testing
|
||||
hda1 = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert hda1 is not None, "Problem retrieving hda1 from database"
|
||||
# We'll test against the resulting ped file and map file for correctness
|
||||
self.verify_composite_datatype_file_content( 'rgenetics.bim', str( hda1.id ) )
|
||||
self.verify_composite_datatype_file_content( 'rgenetics.bed', str( hda1.id ) )
|
||||
self.verify_composite_datatype_file_content( 'rgenetics.fam', str( hda1.id ) )
|
||||
self.delete_history( id=self.security.encode_id( history4.id ) )
|
||||
def test_020_upload_multibyte_character_file( self ):
|
||||
"""Test uploading multi-byte character file"""
|
||||
# Logged in as admin_user
|
||||
self.check_history_for_string( 'Your history is empty' )
|
||||
history5 = sa_session.query( galaxy.model.History ) \
|
||||
.filter( and_( galaxy.model.History.table.c.deleted==False,
|
||||
galaxy.model.History.table.c.user_id==admin_user.id ) ) \
|
||||
.order_by( desc( galaxy.model.History.table.c.create_time ) ) \
|
||||
.first()
|
||||
self.upload_file( 'asian_chars_1.txt' )
|
||||
hda1 = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert hda1 is not None, "Problem retrieving hda1 from database"
|
||||
self.verify_dataset_correctness( 'asian_chars_1.txt', hid=str( hda1.hid ) )
|
||||
self.check_history_for_string( 'uploaded multi-byte char file' )
|
||||
self.delete_history( id=self.security.encode_id( history5.id ) )
|
||||
self.delete_history( id=self.security.encode_id( history.id ) )
|
||||
def test_9999_clean_up( self ):
|
||||
self.logout()
|
||||
@@ -603,6 +603,12 @@ class TestHistory( TwillTestCase ):
|
||||
except:
|
||||
pass
|
||||
self.check_history_for_string( 'You do not have permission to view this dataset' )
|
||||
# Admin users can view all datasets ( using the history/view feature ), so make sure 2.bed is accessible to the admin
|
||||
self.logout()
|
||||
self.login( email=admin_user.email )
|
||||
self.view_history( str( hda_2_bed.history_id ), check_str='<td>NM_005997_cds_0_0_chr1_147962193_r</td>' )
|
||||
self.logout()
|
||||
self.login( email=regular_user3.email )
|
||||
# Delete the clone so the next test will be valid
|
||||
self.delete_history( id=self.security.encode_id( history5_clone4.id ) )
|
||||
def test_065_sharing_private_history_by_choosing_to_not_share( self ):
|
||||
|
||||
@@ -1,262 +0,0 @@
|
||||
import galaxy.model
|
||||
from galaxy.model.orm import *
|
||||
from galaxy.model.mapping import context as sa_session
|
||||
from base.twilltestcase import TwillTestCase
|
||||
|
||||
class SniffingAndMetaDataSettings( TwillTestCase ):
|
||||
def test_000_axt_datatype( self ):
|
||||
"""Testing correctly sniffing axt data type upon upload"""
|
||||
self.logout()
|
||||
self.login( email='test@bx.psu.edu' )
|
||||
global admin_user
|
||||
admin_user = sa_session.query( galaxy.model.User ).filter( galaxy.model.User.table.c.email=='test@bx.psu.edu' ).one()
|
||||
self.new_history( name='history1' )
|
||||
global history1
|
||||
history1 = sa_session.query( galaxy.model.History ) \
|
||||
.filter( and_( galaxy.model.History.table.c.deleted==False,
|
||||
galaxy.model.History.table.c.user_id==admin_user.id ) ) \
|
||||
.order_by( desc( galaxy.model.History.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert history1 is not None, "Problem retrieving history1 from database"
|
||||
self.upload_file( '1.axt' )
|
||||
self.verify_dataset_correctness( '1.axt' )
|
||||
self.check_history_for_string( '1.axt format: <span class="axt">axt</span>, database: \? Info: uploaded file' )
|
||||
self.check_metadata_for_string( 'value="1.axt" value="\?" Change data type selected value="axt" selected="yes"' )
|
||||
latest_hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert latest_hda is not None, "Problem retrieving axt hda from the database"
|
||||
if not latest_hda.name == '1.axt' and not latest_hda.extension == 'axt':
|
||||
raise AssertionError, "axt data type was not correctly sniffed."
|
||||
def test_005_bed_datatype( self ):
|
||||
"""Testing correctly sniffing bed data type upon upload"""
|
||||
self.upload_file( '1.bed' )
|
||||
self.verify_dataset_correctness( '1.bed' )
|
||||
self.check_history_for_string( '1.bed format: <span class="bed">bed</span>, database: \? Info: uploaded file')
|
||||
self.check_metadata_for_string( 'value="1.bed" value="\?"' )
|
||||
self.check_metadata_for_string( 'Chrom column: <option value="1" selected> Start column: <option value="2" selected>' )
|
||||
self.check_metadata_for_string( 'End column: <option value="3" selected> Strand column <option value="6" selected>' )
|
||||
self.check_metadata_for_string( 'Convert to new format value="bed">Convert Genomic Intervals To BED <option value="gff">Convert BED to GFF' )
|
||||
self.check_metadata_for_string( 'Change data type selected value="bed" selected="yes"' )
|
||||
latest_hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert latest_hda is not None, "Problem retrieving bed hda from the database"
|
||||
if not latest_hda.name == '1.bed' and not latest_hda.extension == 'bed':
|
||||
raise AssertionError, "bed data type was not correctly sniffed."
|
||||
def test_010_blastxml_datatype( self ):
|
||||
"""Testing correctly sniffing blastxml data type upon upload"""
|
||||
self.upload_file( 'megablast_xml_parser_test1.gz' )
|
||||
self.check_history_for_string( 'NCBI Blast XML data format: <span class="blastxml">blastxml</span>' )
|
||||
latest_hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert latest_hda is not None, "Problem retrieving blastxml hda from the database"
|
||||
if not latest_hda.name == 'megablast_xml_parser_test1' and not latest_hda.extension == 'blastxml':
|
||||
raise AssertionError, "blastxml data type was not correctly sniffed."
|
||||
def test_015_csfasta_datatype( self ):
|
||||
"""Testing correctly sniffing csfasta data type upon upload"""
|
||||
self.upload_file( 'shrimp_cs_test1.csfasta' )
|
||||
self.verify_dataset_correctness( 'shrimp_cs_test1.csfasta' )
|
||||
self.check_history_for_string( '162.6 Kb, format: <span class="csfasta">csfasta</span>, <td>>2_14_26_F3,-1282216.0</td>' )
|
||||
self.check_metadata_for_string( 'value="shrimp_cs_test1.csfasta" value="\?" Change data type value="csfasta" selected="yes"' )
|
||||
latest_hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert latest_hda is not None, "Problem retrieving csfasta hda from the database"
|
||||
if not latest_hda.name == 'shrimp_cs_test1.csfasta' and not latest_hda.extension == 'csfasta':
|
||||
raise AssertionError, "csfasta data type was not correctly sniffed."
|
||||
def test_020_customtrack_datatype( self ):
|
||||
"""Testing correctly sniffing customtrack data type upon upload"""
|
||||
self.upload_file( '1.customtrack' )
|
||||
self.verify_dataset_correctness( '1.customtrack' )
|
||||
self.check_history_for_string( '1.customtrack format: <span class="customtrack">customtrack</span>, database: \? Info: uploaded file' )
|
||||
self.check_metadata_for_string( 'value="1.customtrack" value="\?" Change data type selected value="customtrack" selected="yes"' )
|
||||
latest_hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert latest_hda is not None, "Problem retrieving customtrack hda from the database"
|
||||
if not latest_hda.name == '1.customtrack' and not latest_hda.extension == 'customtrack':
|
||||
raise AssertionError, "customtrack data type was not correctly sniffed."
|
||||
def test_025_fasta_datatype( self ):
|
||||
"""Testing correctly sniffing fasta data type upon upload"""
|
||||
self.upload_file( '1.fasta' )
|
||||
self.verify_dataset_correctness( '1.fasta' )
|
||||
self.check_history_for_string( '1.fasta format: <span class="fasta">fasta</span>, database: \? Info: uploaded file' )
|
||||
self.check_metadata_for_string( 'value="1.fasta" value="\?" Change data type selected value="fasta" selected="yes"' )
|
||||
latest_hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert latest_hda is not None, "Problem retrieving fasta hda from the database"
|
||||
if not latest_hda.name == '1.fasta' and not latest_hda.extension == 'fasta':
|
||||
raise AssertionError, "fasta data type was not correctly sniffed."
|
||||
def test_035_gff_datatype( self ):
|
||||
"""Testing correctly sniffing gff data type upon upload"""
|
||||
self.upload_file( '5.gff' )
|
||||
self.verify_dataset_correctness( '5.gff' )
|
||||
self.check_history_for_string( '5.gff format: <span class="gff">gff</span>, database: \? Info: uploaded file' )
|
||||
self.check_metadata_for_string( 'value="5.gff" value="\?"' )
|
||||
self.check_metadata_for_string( 'Convert to new format <option value="bed">Convert GFF to BED' )
|
||||
self.check_metadata_for_string( 'Change data type selected value="gff" selected="yes"' )
|
||||
latest_hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert latest_hda is not None, "Problem retrieving gff hda from the database"
|
||||
if not latest_hda.name == '5.gff' and not latest_hda.extension == 'gff':
|
||||
raise AssertionError, "gff data type was not correctly sniffed."
|
||||
def test_040_gff3_datatype( self ):
|
||||
"""Testing correctly sniffing gff3 data type upon upload"""
|
||||
self.upload_file( '5.gff3' )
|
||||
self.verify_dataset_correctness( '5.gff3' )
|
||||
self.check_history_for_string( '5.gff3 format: <span class="gff3">gff3</span>, database: \? Info: uploaded file' )
|
||||
self.check_metadata_for_string( 'value="5.gff3" value="\?"' )
|
||||
self.check_metadata_for_string( 'Convert to new format <option value="bed">Convert GFF to BED' )
|
||||
self.check_metadata_for_string( 'Change data type selected value="gff3" selected="yes"' )
|
||||
latest_hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert latest_hda is not None, "Problem retrieving gff3 hda from the database"
|
||||
if not latest_hda.name == '5.gff3' and not latest_hda.extension == 'gff3':
|
||||
raise AssertionError, "gff3 data type was not correctly sniffed."
|
||||
# TODO: the following test generates a data.hid == None, breaking this and all following tests
|
||||
# I am not currently able to track down why, and uploading inappropriate files outside of the
|
||||
# functional test framework seems to generate valid hids, so this needs to be tracked down and fixed
|
||||
# ASAP, un-commenting this test.
|
||||
#def test_045_html_datatype( self ):
|
||||
#"""Testing correctly sniffing html data type upon upload"""
|
||||
#self.upload_file( 'html_file.txt' )
|
||||
#self.check_history_for_string( 'An error occurred running this job: No data: you attempted to upload an inappropriate file.' )
|
||||
#latest_hda = galaxy.model.HistoryDatasetAssociation.query() \
|
||||
# .order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ).first()
|
||||
#assert latest_hda is not None, "Problem retrieving html hda from the database"
|
||||
#if not latest_hda.name == 'html_file.txt' and not latest_hda.extension == 'data':
|
||||
# raise AssertionError, "html data type was not correctly sniffed."
|
||||
def test_050_interval_datatype( self ):
|
||||
"""Testing correctly sniffing interval data type upon upload"""
|
||||
self.upload_file( '1.interval' )
|
||||
self.verify_dataset_correctness( '1.interval' )
|
||||
self.check_history_for_string( '1.interval format: <span class="interval">interval</span>, database: \? Info: uploaded file' )
|
||||
self.check_metadata_for_string( 'value="1.interval" value="\?"' )
|
||||
self.check_metadata_for_string( 'Chrom column: <option value="1" selected> Start column: <option value="2" selected>' )
|
||||
self.check_metadata_for_string( 'End column: <option value="3" selected> Strand column <option value="6" selected>' )
|
||||
self.check_metadata_for_string( 'Convert to new format <option value="bed">Convert Genomic Intervals To BED' )
|
||||
self.check_metadata_for_string( 'Change data type selected value="interval" selected="yes"' )
|
||||
latest_hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert latest_hda is not None, "Problem retrieving interval hda from the database"
|
||||
if not latest_hda.name == '1.interval' and not latest_hda.extension == 'interval':
|
||||
raise AssertionError, "interval data type was not correctly sniffed."
|
||||
def test_055_lav_datatype( self ):
|
||||
"""Testing correctly sniffing lav data type upon upload"""
|
||||
self.upload_file( '1.lav' )
|
||||
self.verify_dataset_correctness( '1.lav' )
|
||||
self.check_history_for_string( '1.lav format: <span class="lav">lav</span>, database: \? Info: uploaded file' )
|
||||
self.check_metadata_for_string( 'value="1.lav" value="\?"' )
|
||||
self.check_metadata_for_string( 'Change data type selected value="lav" selected="yes"' )
|
||||
latest_hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert latest_hda is not None, "Problem retrieving lav hda from the database"
|
||||
if not latest_hda.name == '1.lav' and not latest_hda.extension == 'lav':
|
||||
raise AssertionError, "lav data type was not correctly sniffed."
|
||||
def test_060_maf_datatype( self ):
|
||||
"""Testing correctly sniffing maf data type upon upload"""
|
||||
self.upload_file( '3.maf' )
|
||||
self.verify_dataset_correctness( '3.maf' )
|
||||
self.check_history_for_string( '3.maf format: <span class="maf">maf</span>, database: \? Info: uploaded file' )
|
||||
self.check_metadata_for_string( 'value="3.maf" value="\?"' )
|
||||
self.check_metadata_for_string( 'Convert to new format <option value="interval">Convert MAF to Genomic Intervals <option value="fasta">Convert MAF to Fasta' )
|
||||
self.check_metadata_for_string( 'Change data type selected value="maf" selected="yes"' )
|
||||
latest_hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert latest_hda is not None, "Problem retrieving maf hda from the database"
|
||||
if not latest_hda.name == '3.maf' and not latest_hda.extension == 'maf':
|
||||
raise AssertionError, "maf data type was not correctly sniffed."
|
||||
def test_065_qual454_datatype( self ):
|
||||
"""Testing correctly sniffing qual454 data type upon upload"""
|
||||
self.upload_file( 'qualscores.qual454' )
|
||||
self.verify_dataset_correctness( 'qualscores.qual454' )
|
||||
self.check_history_for_string( '5.6 Kb, format: <span class="qual454">qual454</span>, database: \?' )
|
||||
self.check_metadata_for_string( 'Change data type value="qual454" selected="yes">qual454' )
|
||||
latest_hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert latest_hda is not None, "Problem retrieving qual454 hda from the database"
|
||||
if not latest_hda.name == 'qualscores.qual454' and not latest_hda.extension == 'qual454':
|
||||
raise AssertionError, "qual454 data type was not correctly sniffed."
|
||||
def test_070_qualsolid_datatype( self ):
|
||||
"""Testing correctly sniffing qualsolid data type upon upload"""
|
||||
self.upload_file( 'qualscores.qualsolid' )
|
||||
self.verify_dataset_correctness('qualscores.qualsolid' )
|
||||
self.check_history_for_string('2.5 Kb, format: <span class="qualsolid">qualsolid</span>, database: \? Info: uploaded file' )
|
||||
self.check_metadata_for_string( 'Change data type value="qualsolid" selected="yes">qualsolid' )
|
||||
latest_hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert latest_hda is not None, "Problem retrieving qualsolid hda from the database"
|
||||
if not latest_hda.name == 'qualscores.qualsolid' and not latest_hda.extension == 'qualsolid':
|
||||
raise AssertionError, "qualsolid data type was not correctly sniffed."
|
||||
def test_075_tabular_datatype( self ):
|
||||
"""Testing correctly sniffing tabular data type upon upload"""
|
||||
self.upload_file( '1.tabular' )
|
||||
self.verify_dataset_correctness( '1.tabular' )
|
||||
self.check_history_for_string( '1.tabular format: <span class="tabular">tabular</span>, database: \? Info: uploaded file' )
|
||||
self.check_metadata_for_string( 'value="1.tabular" value="\?"' )
|
||||
self.check_metadata_for_string( 'Change data type selected value="tabular" selected="yes"' )
|
||||
latest_hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert latest_hda is not None, "Problem retrieving tabular hda from the database"
|
||||
if not latest_hda.name == '1.tabular' and not latest_hda.extension == 'tabular':
|
||||
raise AssertionError, "tabular data type was not correctly sniffed."
|
||||
def test_080_wig_datatype( self ):
|
||||
"""Testing correctly sniffing wig data type upon upload"""
|
||||
self.upload_file( '1.wig' )
|
||||
self.verify_dataset_correctness( '1.wig' )
|
||||
self.check_history_for_string( '1.wig format: <span class="wig">wig</span>, database: \? Info: uploaded file' )
|
||||
self.check_metadata_for_string( 'value="1.wig" value="\?"' )
|
||||
self.check_metadata_for_string( 'Change data type selected value="wig" selected="yes"' )
|
||||
latest_hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert latest_hda is not None, "Problem retrieving wig hda from the database"
|
||||
if not latest_hda.name == '1.wig' and not latest_hda.extension == 'wig':
|
||||
raise AssertionError, "wig data type was not correctly sniffed."
|
||||
def test_090_sam_datatype( self ):
|
||||
"""Testing correctly sniffing sam format upon upload"""
|
||||
self.upload_file( '1.sam' )
|
||||
self.verify_dataset_correctness( '1.sam' )
|
||||
self.check_history_for_string( '1.sam format: <span class="sam">sam</span>, database: \? Info: uploaded sam file' )
|
||||
latest_hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert latest_hda is not None, "Problem retrieving sam hda from the database"
|
||||
if not latest_hda.name == '1.sam' and not latest_hda.extension == 'sam':
|
||||
raise AssertionError, "sam data type was not correctly sniffed."
|
||||
def test_095_fastq_datatype( self ):
|
||||
"""Testing correctly sniffing fastq ( generic ) data type upon upload"""
|
||||
self.upload_file( '2gen.fastq' )
|
||||
self.verify_dataset_correctness( '2gen.fastq' )
|
||||
self.check_history_for_string( '2gen.fastq format: <span class="fastq">fastq</span>, database: \? Info: uploaded fastq file' )
|
||||
latest_hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert latest_hda is not None, "Problem retrieving fastq hda from the database"
|
||||
if not latest_hda.name == '2gen.fastq' and not latest_hda.extension == 'fastq':
|
||||
raise AssertionError, "fastq data type was not correctly sniffed."
|
||||
def test_0100_sff_datatype( self ):
|
||||
"""Testing correctly sniffing sff format upon upload"""
|
||||
self.upload_file( '1.sff' )
|
||||
self.verify_dataset_correctness( '1.sff' )
|
||||
self.check_history_for_string( 'format: <span class="sff">sff' )
|
||||
latest_hda = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
|
||||
.order_by( desc( galaxy.model.HistoryDatasetAssociation.table.c.create_time ) ) \
|
||||
.first()
|
||||
assert latest_hda is not None, "Problem retrieving sff hda from the database"
|
||||
if not latest_hda.name == '1.sff' and not latest_hda.extension == 'sff':
|
||||
raise AssertionError, "sff data type was not correctly sniffed."
|
||||
def test_9999_clean_up( self ):
|
||||
self.delete_history( id=self.security.encode_id( history1.id ) )
|
||||
self.logout()
|
||||
@@ -14,6 +14,7 @@ def get_latest_form(form_name):
|
||||
.filter( galaxy.model.FormDefinitionCurrent.table.c.deleted==False ) \
|
||||
.order_by( galaxy.model.FormDefinitionCurrent.table.c.create_time.desc() )
|
||||
for fdc in fdc_list:
|
||||
sa_session.refresh( fdc )
|
||||
sa_session.refresh( fdc.latest_form )
|
||||
if form_name == fdc.latest_form.name:
|
||||
return fdc.latest_form
|
||||
@@ -49,7 +50,7 @@ class TestUserInfo( TwillTestCase ):
|
||||
type='CheckboxField',
|
||||
required='optional')]
|
||||
form_one = get_latest_form(form_one_name)
|
||||
self.form_add_field(form_one.id, form_one.name, form_one.desc, form_one.type, field_index=len(form_one.fields), fields=fields)
|
||||
self.form_add_field(form_one.current.id, form_one.name, form_one.desc, form_one.type, field_index=len(form_one.fields), fields=fields)
|
||||
form_one_latest = get_latest_form(form_one_name)
|
||||
assert len(form_one_latest.fields) == len(form_one.fields)+len(fields)
|
||||
# create the second form
|
||||
@@ -75,7 +76,7 @@ class TestUserInfo( TwillTestCase ):
|
||||
type='CheckboxField',
|
||||
required='optional')]
|
||||
form_two = get_latest_form(form_two_name)
|
||||
self.form_add_field(form_two.id, form_two.name, form_two.desc, form_two.type, field_index=len(form_one.fields), fields=fields)
|
||||
self.form_add_field(form_two.current.id, form_two.name, form_two.desc, form_two.type, field_index=len(form_one.fields), fields=fields)
|
||||
form_two_latest = get_latest_form(form_two_name)
|
||||
assert len(form_two_latest.fields) == len(form_two.fields)+len(fields)
|
||||
def test_005_user_reqistration_multiple_user_info_forms( self ):
|
||||
@@ -103,7 +104,7 @@ class TestUserInfo( TwillTestCase ):
|
||||
sa_session.add( form_two_latest.current )
|
||||
sa_session.flush()
|
||||
self.home()
|
||||
self.visit_page('forms/manage?show_filter=Deleted')
|
||||
self.visit_page('forms/manage?sort=create_time&f-deleted=True')
|
||||
self.check_page_for_string(form_two_latest.name)
|
||||
self.logout()
|
||||
# user a new user with 'Student' user info form
|
||||
@@ -157,7 +158,7 @@ class TestUserInfo( TwillTestCase ):
|
||||
sa_session.add( form_one_latest.current )
|
||||
sa_session.flush()
|
||||
self.home()
|
||||
self.visit_page('forms/manage?show_filter=Deleted')
|
||||
self.visit_page('forms/manage?sort=create_time&f-deleted=True')
|
||||
self.check_page_for_string(form_one_latest.name)
|
||||
self.logout()
|
||||
|
||||
|
||||
+23
-22
@@ -9,6 +9,7 @@ from galaxy import eggs
|
||||
# need to import model before sniff to resolve a circular import dependency
|
||||
import galaxy.model
|
||||
from galaxy.datatypes import sniff
|
||||
from galaxy.datatypes.binary import sniffable_binary_formats, unsniffable_binary_formats
|
||||
from galaxy import util
|
||||
from galaxy.util.json import *
|
||||
|
||||
@@ -200,25 +201,29 @@ def add_file( dataset, json_file, output_path ):
|
||||
ext = dataset.file_type
|
||||
if not data_type:
|
||||
if check_binary( dataset.path ):
|
||||
if dataset.is_binary is not None:
|
||||
data_type = 'binary'
|
||||
ext = dataset.file_type
|
||||
else:
|
||||
parts = dataset.name.split( "." )
|
||||
if len( parts ) > 1:
|
||||
ext = parts[1].strip().lower()
|
||||
if not( ext == 'ab1' or ext == 'scf' ):
|
||||
file_err( 'The uploaded file contains inappropriate content', dataset, json_file )
|
||||
data_type = 'binary'
|
||||
binary_ok = False
|
||||
parts = dataset.name.split( "." )
|
||||
if len( parts ) > 1:
|
||||
ext = parts[1].strip().lower()
|
||||
if ext in unsniffable_binary_formats and dataset.file_type == ext:
|
||||
binary_ok = True
|
||||
elif ext in unsniffable_binary_formats and dataset.file_type != ext:
|
||||
err_msg = "You must manually set the 'File Format' to '%s' when uploading %s files." % ( ext.capitalize(), ext )
|
||||
file_err( err_msg, dataset, json_file )
|
||||
return
|
||||
if not binary_ok and ext in sniffable_binary_formats:
|
||||
# Sniff the file to confirm it's data type
|
||||
tmp_ext = sniff.guess_ext( dataset.path )
|
||||
if tmp_ext == ext:
|
||||
binary_ok = True
|
||||
else:
|
||||
err_msg = "The content of the file does not match its type (%s)." % ext.capitalize()
|
||||
file_err( err_msg, dataset, json_file )
|
||||
return
|
||||
if ext == 'ab1' and dataset.file_type != 'ab1':
|
||||
file_err( "You must manually set the 'File Format' to 'Ab1' when uploading ab1 files.", dataset, json_file )
|
||||
return
|
||||
elif ext == 'scf' and dataset.file_type != 'scf':
|
||||
file_err( "You must manually set the 'File Format' to 'Scf' when uploading scf files.", dataset, json_file )
|
||||
return
|
||||
else:
|
||||
ext = 'binary'
|
||||
data_type = 'binary'
|
||||
if not binary_ok:
|
||||
file_err( 'The uploaded file contains inappropriate content', dataset, json_file )
|
||||
return
|
||||
if not data_type:
|
||||
# We must have a text file
|
||||
if check_html( dataset.path ):
|
||||
@@ -234,10 +239,6 @@ def add_file( dataset, json_file, output_path ):
|
||||
else:
|
||||
ext = dataset.file_type
|
||||
data_type = ext
|
||||
elif data_type == 'binary' and ext == 'auto':
|
||||
# currently we are only sniffing sff binary files
|
||||
ext = sniff.guess_ext( dataset.path )
|
||||
data_type = ext
|
||||
# Save job info for the framework
|
||||
if ext == 'auto' and dataset.ext:
|
||||
ext = dataset.ext
|
||||
|
||||
@@ -181,6 +181,12 @@ A binary sequence file in 'scf' format with a '.scf' file extension. You must m
|
||||
|
||||
-----
|
||||
|
||||
**Sff**
|
||||
|
||||
A binary file in 'Standard Flowgram Format' with a '.sff' file extension.
|
||||
|
||||
-----
|
||||
|
||||
**Tabular (tab delimited)**
|
||||
|
||||
Any data in tab delimited format (tabular)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<tool id="Extract genomic DNA 1" name="Extract Genomic DNA" version="2.2.0">
|
||||
<tool id="Extract genomic DNA 1" name="Extract Genomic DNA" version="2.2.1">
|
||||
<description>using coordinates from assembled/unassembled genomes</description>
|
||||
<command interpreter="python">extract_genomic_dna.py $input $out_file1 -1 ${input.metadata.chromCol},${input.metadata.startCol},${input.metadata.endCol},${input.metadata.strandCol} -d $dbkey -o $out_format -g ${GALAXY_DATA_INDEX_DIR}</command>
|
||||
<inputs>
|
||||
@@ -12,7 +12,7 @@
|
||||
</param>
|
||||
</inputs>
|
||||
<outputs>
|
||||
<data format="fasta" name="out_file1">
|
||||
<data format="fasta" name="out_file1" metadata_source="input">
|
||||
<change_format>
|
||||
<when input="out_format" value="interval" format="interval" />
|
||||
</change_format>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<tool id="liftOver1" name="Convert genome coordinates" version="1.0.1">
|
||||
<tool id="liftOver1" name="Convert genome coordinates" version="1.0.2">
|
||||
<description> between assemblies and genomes</description>
|
||||
<command interpreter="python">liftOver_wrapper.py $input "$out_file1" "$out_file2" $dbkey $to_dbkey $minMatch</command>
|
||||
<inputs>
|
||||
|
||||
Reference in New Issue
Block a user