Skip to content

Commit

Permalink
Merge branch 'release_24.1' into dev
Browse files Browse the repository at this point in the history
nsoranzo committed Jul 8, 2024

Verified

This commit was signed with the committer’s verified signature.
nsoranzo Nicola Soranzo
2 parents 0beacf5 + 49f820d commit 3216bc0
Showing 12 changed files with 59 additions and 44 deletions.
42 changes: 22 additions & 20 deletions lib/galaxy/datatypes/data.py
Original file line number Diff line number Diff line change
@@ -484,16 +484,17 @@ def _serve_file_download(self, headers, data, trans, to_ext, file_size, **kwd):

def _serve_binary_file_contents_as_text(self, trans, data, headers, file_size, max_peek_size):
headers["content-type"] = "text/html"
return (
trans.fill_template_mako(
"/dataset/binary_file.mako",
data=data,
file_contents=open(data.get_file_name(), "rb").read(max_peek_size),
file_size=util.nice_size(file_size),
truncated=file_size > max_peek_size,
),
headers,
)
with open(data.get_file_name(), "rb") as fh:
return (
trans.fill_template_mako(
"/dataset/binary_file.mako",
data=data,
file_contents=fh.read(max_peek_size),
file_size=util.nice_size(file_size),
truncated=file_size > max_peek_size,
),
headers,
)

def _serve_file_contents(self, trans, data, headers, preview, file_size, max_peek_size):
from galaxy.datatypes import images
@@ -502,16 +503,17 @@ def _serve_file_contents(self, trans, data, headers, preview, file_size, max_pee
if not preview or isinstance(data.datatype, images.Image) or file_size < max_peek_size:
return self._yield_user_file_content(trans, data, data.get_file_name(), headers), headers

# preview large text file
headers["content-type"] = "text/html"
return (
trans.fill_template_mako(
"/dataset/large_file.mako",
truncated_data=open(data.get_file_name(), "rb").read(max_peek_size),
data=data,
),
headers,
)
with compression_utils.get_fileobj(data.get_file_name(), "rb") as fh:
# preview large text file
headers["content-type"] = "text/html"
return (
trans.fill_template_mako(
"/dataset/large_file.mako",
truncated_data=fh.read(max_peek_size),
data=data,
),
headers,
)

def display_data(
self,
17 changes: 9 additions & 8 deletions lib/galaxy/datatypes/tabular.py
Original file line number Diff line number Diff line change
@@ -197,14 +197,15 @@ def display_data(
return open(dataset.get_file_name(), mode="rb"), headers
else:
headers["content-type"] = "text/html"
return (
trans.fill_template_mako(
"/dataset/large_file.mako",
truncated_data=open(dataset.get_file_name()).read(max_peek_size),
data=dataset,
),
headers,
)
with compression_utils.get_fileobj(dataset.get_file_name(), "rb") as fh:
return (
trans.fill_template_mako(
"/dataset/large_file.mako",
truncated_data=fh.read(max_peek_size),
data=dataset,
),
headers,
)
else:
column_names = "null"
if dataset.metadata.column_names:
5 changes: 4 additions & 1 deletion lib/galaxy/managers/hdas.py
Original file line number Diff line number Diff line change
@@ -311,7 +311,10 @@ def text_data(self, hda, preview=True):

truncated = preview and os.stat(file_path).st_size > MAX_PEEK_SIZE
with get_fileobj(file_path) as fh:
hda_data = fh.read(MAX_PEEK_SIZE)
try:
hda_data = fh.read(MAX_PEEK_SIZE)
except UnicodeDecodeError:
raise exceptions.RequestParameterInvalidException("Cannot generate text preview for dataset.")
return truncated, hda_data

# .... annotatable
5 changes: 3 additions & 2 deletions lib/galaxy/managers/users.py
Original file line number Diff line number Diff line change
@@ -611,8 +611,9 @@ def send_reset_email(self, trans, payload, **kwd):
except Exception as e:
log.debug(body)
return f"Failed to submit email. Please contact the administrator: {util.unicodify(e)}"
else:
return "Failed to produce password reset token. User not found."
if not reset_user:
log.warning(f"Failed to produce password reset token. User with email '{email}' not found.")
return None

def get_reset_token(self, trans, email):
reset_user = get_user_by_email(trans.sa_session, email, self.app.model.User)
11 changes: 6 additions & 5 deletions lib/galaxy/tool_util/biotools/source.py
Original file line number Diff line number Diff line change
@@ -55,12 +55,13 @@ def __init__(self, cache=None):

def _raw_get_metadata(self, biotools_reference) -> Optional[str]:
api_url = f"https://bio.tools/api/tool/{biotools_reference}?format=json"
req = requests.get(api_url, timeout=DEFAULT_SOCKET_TIMEOUT)
req.encoding = req.apparent_encoding
if req.status_code == 404:
return None
else:
try:
req = requests.get(api_url, timeout=DEFAULT_SOCKET_TIMEOUT)
req.raise_for_status()
req.encoding = req.apparent_encoding
return req.text
except Exception:
return None

def get_biotools_metadata(self, biotools_reference: str) -> Optional[BiotoolsEntry]:
createfunc = functools.partial(self._raw_get_metadata, biotools_reference)
3 changes: 2 additions & 1 deletion lib/galaxy/tools/parameters/basic.py
Original file line number Diff line number Diff line change
@@ -2053,7 +2053,8 @@ def src_id_to_item(
item = sa_session.get(src_to_class[value["src"]], decoded_id)
except KeyError:
raise ValueError(f"Unknown input source {value['src']} passed to job submission API.")
assert item
if not item:
raise ValueError("Invalid input id passed to job submission API.")
item.extra_params = {k: v for k, v in value.items() if k not in ("src", "id")}
return item

9 changes: 7 additions & 2 deletions lib/galaxy/web/framework/middleware/statsd.py
Original file line number Diff line number Diff line change
@@ -28,8 +28,13 @@ def __call__(self, environ, start_response):
start_time = time.time()
req = self.application(environ, start_response)
dt = int((time.time() - start_time) * 1000)
page = environ.get("controller_action_key", None) or environ.get("PATH_INFO", "NOPATH").strip("/").replace(
"/", "."
page = (
environ.get("controller_action_key", None)
or environ.get("PATH_INFO", "NOPATH")
.strip("/")
.replace("/", ".")
.encode("ascii", errors="replace")
.decode()
)
self.galaxy_stasd_client.timing(page, dt)
try:
2 changes: 1 addition & 1 deletion lib/galaxy/webapps/galaxy/controllers/user.py
Original file line number Diff line number Diff line change
@@ -342,7 +342,7 @@ def reset_password(self, trans, payload=None, **kwd):
payload = payload or {}
if message := self.user_manager.send_reset_email(trans, payload):
return self.message_exception(trans, message)
return {"message": "Reset link has been sent to your email."}
return {"message": "If an account exists for this email address a confirmation email will be dispatched."}

def __get_redirect_url(self, redirect):
if not redirect or redirect == "None":
3 changes: 2 additions & 1 deletion lib/galaxy/workflow/modules.py
Original file line number Diff line number Diff line change
@@ -746,7 +746,8 @@ def get_all_outputs(self, data_only=False):
# This can happen when importing workflows with missing tools.
# We can't raise an exception here, as that would prevent loading
# the workflow.
log.error(
# This is also listed when opening such a workflow in the workflow editor.
log.warning(
f"Workflow output '{workflow_output['output_name']}' defined, but not listed among data outputs"
)
continue
2 changes: 1 addition & 1 deletion test/integration/objectstore/_purged_handling.py
Original file line number Diff line number Diff line change
@@ -9,7 +9,7 @@ def purge_while_job_running(dataset_populator: DatasetPopulator, extra_sleep=0):
response = dataset_populator.run_tool(
"all_output_types",
inputs={
"sleep_param": 5,
"sleep_param": 5 + extra_sleep,
},
history_id=history_id,
)
2 changes: 1 addition & 1 deletion test/integration/test_extended_metadata.py
Original file line number Diff line number Diff line change
@@ -100,7 +100,7 @@ def test_fetch_data_library(self):
def test_purge_while_job_running(self):
# pass extra_sleep, since templating the command line will fail if the output
# is deleted before remote_tool_eval runs.
purge_while_job_running(self.dataset_populator, extra_sleep=4)
purge_while_job_running(self.dataset_populator, extra_sleep=10)


class TestExtendedMetadataDeferredIntegration(integration_util.IntegrationTestCase):
2 changes: 1 addition & 1 deletion test/unit/app/managers/test_UserManager.py
Original file line number Diff line number Diff line change
@@ -240,7 +240,7 @@ def test_reset_email_user_deleted(self):
self.user_manager.delete(user)
assert user.deleted is True
message = self.user_manager.send_reset_email(self.trans, {"email": user_email})
assert message == "Failed to produce password reset token. User not found."
assert message is None

def test_get_user_by_identity(self):
# return None if username/email not found

0 comments on commit 3216bc0

Please sign in to comment.