aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--qc_app/templates/rqtl2/upload-rqtl2-bundle-step-01.html6
-rw-r--r--qc_app/templates/rqtl2/upload-rqtl2-bundle-step-02.html3
-rw-r--r--qc_app/upload/rqtl2.py10
-rw-r--r--r_qtl/errors.py6
-rw-r--r--r_qtl/r_qtl2.py22
-rw-r--r--r_qtl/r_qtl2_qc.py9
6 files changed, 26 insertions, 30 deletions
diff --git a/qc_app/templates/rqtl2/upload-rqtl2-bundle-step-01.html b/qc_app/templates/rqtl2/upload-rqtl2-bundle-step-01.html
index 6491e6b..64fcdcd 100644
--- a/qc_app/templates/rqtl2/upload-rqtl2-bundle-step-01.html
+++ b/qc_app/templates/rqtl2/upload-rqtl2-bundle-step-01.html
@@ -1,5 +1,5 @@
{%extends "base.html"%}
-{%from "flash_messages.html" import flash_messages%}
+{%from "flash_messages.html" import flash_all_messages%}
{%block title%}Upload R/qtl2 Bundle{%endblock%}
@@ -16,12 +16,12 @@
<input type="hidden" name="population_id"
value="{{population.InbredSetId}}" />
- {{flash_messages("error-rqtl2")}}
+ {{flash_all_messages()}}
<fieldset>
<legend>file upload</legend>
<label for="file:rqtl2-bundle">R/qtl2 bundle</label>
- <input type="file" id="file:rqtl2-bundle" name="rqtl2_bundle"
+ <input type="file" id="file:rqtl2-bundle" name="rqtl2_bundle_file"
accept="application/zip, .zip"
required="required" />
<span class="form-input-help"><p>Provide a valid R/qtl2 zip file here. In
diff --git a/qc_app/templates/rqtl2/upload-rqtl2-bundle-step-02.html b/qc_app/templates/rqtl2/upload-rqtl2-bundle-step-02.html
index 9269a3c..01721e9 100644
--- a/qc_app/templates/rqtl2/upload-rqtl2-bundle-step-02.html
+++ b/qc_app/templates/rqtl2/upload-rqtl2-bundle-step-02.html
@@ -1,5 +1,5 @@
{%extends "base.html"%}
-{%from "flash_messages.html" import flash_messages%}
+{%from "flash_messages.html" import flash_all_messages%}
{%block title%}Upload R/qtl2 Bundle{%endblock%}
@@ -20,6 +20,7 @@
population_id=population.InbredSetId)}}"
method="POST"
enctype="multipart/form-data">
+ {{flash_all_messages()}}
<input type="hidden" name="species_id" value="{{species.SpeciesId}}" />
<input type="hidden" name="population_id"
value="{{population.InbredSetId}}" />
diff --git a/qc_app/upload/rqtl2.py b/qc_app/upload/rqtl2.py
index eea49e1..2d032f8 100644
--- a/qc_app/upload/rqtl2.py
+++ b/qc_app/upload/rqtl2.py
@@ -18,6 +18,8 @@ from flask import (
current_app as app)
from r_qtl import r_qtl2
+from r_qtl import errors as rqe
+from r_qtl import r_qtl2_qc as rqc
from r_qtl.errors import InvalidFormat
from qc_app import jobs
@@ -157,11 +159,11 @@ def upload_rqtl2_bundle(species_id: int, population_id: int):
species=species,
population=population)
- if not bool(request.files.get("rqtl2_bundle")):
+ if not bool(request.files.get("rqtl2_bundle_file")):
raise __RequestError__("No R/qtl2 zip bundle provided.")
- the_file = save_file(
- request.files["rqtl2_bundle"], Path(app.config["UPLOAD_FOLDER"]))
+ the_file = save_file(request.files["rqtl2_bundle_file"],
+ Path(app.config["UPLOAD_FOLDER"]))
if not bool(the_file):
raise __RequestError__("Please provide a valid R/qtl2 zip bundle.")
@@ -170,7 +172,7 @@ def upload_rqtl2_bundle(species_id: int, population_id: int):
try:
with ZipFile(str(the_file), "r") as zfile:
- r_qtl2.validate_bundle(zfile)
+ rqc.validate_bundle(zfile)
return render_template(
"rqtl2/upload-rqtl2-bundle-step-02.html",
species=species,
diff --git a/r_qtl/errors.py b/r_qtl/errors.py
index 20c5ced..417eb58 100644
--- a/r_qtl/errors.py
+++ b/r_qtl/errors.py
@@ -5,3 +5,9 @@ class RQTLError(Exception):
class InvalidFormat(RQTLError):
"""Raised when the format of the file(s) is invalid."""
+
+class MissingFileError(InvalidFormat):
+ """
+ Raise when at least one file listed in the control file is missing from the
+ R/qtl2 bundle.
+ """
diff --git a/r_qtl/r_qtl2.py b/r_qtl/r_qtl2.py
index c2828d2..f8c08d9 100644
--- a/r_qtl/r_qtl2.py
+++ b/r_qtl/r_qtl2.py
@@ -288,28 +288,6 @@ def sex_information(zfile: ZipFile, cdata: dict) -> Iterator[dict]:
key: chain(value, partial(replace_sex_info, cdata=cdata))
for key, value in row.items() if key not in ci_fields}
-def validate_bundle(zfile: ZipFile):
- """Ensure the R/qtl2 bundle is valid."""
- cdata = control_data(zfile)
- def __member_exists_p__(zfile, member):
- if isinstance(member, str):
- zfile.getinfo(member)
- else:
- for inner in member:
- zfile.getinfo(inner)
-
- try:
- for member in (key for key in cdata.keys() if key in __FILE_TYPES__):
- __member_exists_p__(zfile, cdata[member])
-
- if "file" in cdata.get("sex", {}):
- __member_exists_p__(zfile, cdata["sex"]["file"])
-
- if "file" in cdata.get("cross_info", {}):
- __member_exists_p__(zfile, cdata["cross_info"]["file"])
- except KeyError as kerr:
- raise InvalidFormat(*kerr.args) from kerr
-
def genotype_data(zfile: ZipFile):
"""Convenience function to genotype data from R/qtl2 bundle."""
cdata = control_data(zfile)
diff --git a/r_qtl/r_qtl2_qc.py b/r_qtl/r_qtl2_qc.py
index f666f40..261d300 100644
--- a/r_qtl/r_qtl2_qc.py
+++ b/r_qtl/r_qtl2_qc.py
@@ -3,6 +3,7 @@ from zipfile import ZipFile
from functools import reduce
from typing import Union, Sequence
+from r_qtl import errors as rqe
from r_qtl import r_qtl2 as rqtl2
from r_qtl.r_qtl2 import __FILE_TYPES__
@@ -45,3 +46,11 @@ def missing_files(zfile: ZipFile) -> tuple[str]:
return tuple(filter(__missing_p__,
bundle_files_list(zfile, rqtl2.control_data(zfile))))
+
+def validate_bundle(zfile: ZipFile):
+ """Ensure the R/qtl2 bundle is valid."""
+ missing = missing_files(zfile)
+ if len(missing) > 0:
+ raise rqe.MissingFileError(
+ "The following files do not exist in the bundle: " +
+ ", ".join(missing))