From 9e546f7d97781b7990e8d17db16d421f5abcbdd5 Mon Sep 17 00:00:00 2001 From: Ruben Vorderman Date: Mon, 17 Jan 2022 16:02:01 +0100 Subject: [PATCH 1/2] Catch exceptions when job.user is None prevents the following error: galaxy.web.framework.decorators ERROR 2022-01-17 14:52:09,619 [p:18,w:1,m:0] [uWSGIWorker1Core1] Uncaught exception in exposed API method: Traceback (most recent call last): File "lib/galaxy/web/framework/decorators.py", line 282, in decorator rval = func(self, trans, *args, **kwargs) File "lib/galaxy/webapps/galaxy/api/jobs.py", line 113, in index j['user_email'] = job.user.email AttributeError: 'NoneType' object has no attribute 'email' --- lib/galaxy/webapps/galaxy/api/jobs.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/galaxy/webapps/galaxy/api/jobs.py b/lib/galaxy/webapps/galaxy/api/jobs.py index a63f2efcdae..789b23846a7 100644 --- a/lib/galaxy/webapps/galaxy/api/jobs.py +++ b/lib/galaxy/webapps/galaxy/api/jobs.py @@ -210,7 +210,10 @@ class JobController(BaseGalaxyAPIController, UsesVisualizationMixin): if view == 'admin_job_list': j['decoded_job_id'] = job.id if user_details: - j['user_email'] = job.user.email + try: + j['user_email'] = job.user.email + except AttributeError: # when job.user is None + j['user_email'] = None out.append(j) return out From faddbeeca917748539060022177ad3f54861d3d8 Mon Sep 17 00:00:00 2001 From: mvdbeek Date: Tue, 18 Jan 2022 14:20:50 +0100 Subject: [PATCH 2/2] Use job.get_user_email systematically --- lib/galaxy/jobs/__init__.py | 9 +++------ lib/galaxy/jobs/actions/post.py | 2 +- lib/galaxy/managers/jobs.py | 6 +----- lib/galaxy/model/__init__.py | 9 +++++++++ lib/galaxy/webapps/galaxy/api/jobs.py | 5 +---- lib/galaxy/webapps/reports/controllers/jobs.py | 7 ++----- templates/webapps/reports/job_info.mako | 4 ++-- 7 files changed, 19 insertions(+), 23 deletions(-) diff --git a/lib/galaxy/jobs/__init__.py b/lib/galaxy/jobs/__init__.py index ca641f24dd8..82614ed7b42 100644 --- a/lib/galaxy/jobs/__init__.py +++ b/lib/galaxy/jobs/__init__.py @@ -2221,12 +2221,9 @@ class JobWrapper(HasResourceParameters): @property def user(self): job = self.get_job() - if job.user is not None: - return job.user.email - elif job.galaxy_session is not None and job.galaxy_session.user is not None: - return job.galaxy_session.user.email - elif job.history is not None and job.history.user is not None: - return job.history.user.email + user_email = job.get_user_email() + if user_email: + return user_email elif job.galaxy_session is not None: return f"anonymous@{job.galaxy_session.remote_addr.split()[-1]}" else: diff --git a/lib/galaxy/jobs/actions/post.py b/lib/galaxy/jobs/actions/post.py index 1f9deb2620a..9ad759aaba7 100644 --- a/lib/galaxy/jobs/actions/post.py +++ b/lib/galaxy/jobs/actions/post.py @@ -54,7 +54,7 @@ class EmailAction(DefaultJobAction): else: host = socket.getfqdn() frm = f'galaxy-no-reply@{host}' - to = job.user.email + to = job.get_user_email() subject = f"Galaxy job completion notification from history '{job.history.name}'" outdata = ',\n'.join(ds.dataset.display_name() for ds in job.output_datasets) body = f"Your Galaxy job generating dataset(s):\n\n{outdata}\n\nis complete as of {datetime.datetime.now().strftime('%I:%M')}. Click the link below to access your data: \n{link}" diff --git a/lib/galaxy/managers/jobs.py b/lib/galaxy/managers/jobs.py index 85be165788b..c8528e4a79c 100644 --- a/lib/galaxy/managers/jobs.py +++ b/lib/galaxy/managers/jobs.py @@ -411,11 +411,7 @@ def view_show_job(trans, job, full: bool) -> typing.Dict: )) if is_admin: - if job.user: - job_dict['user_email'] = job.user.email - else: - job_dict['user_email'] = None - + job_dict['user_email'] = job.get_user_email() job_dict['job_metrics'] = summarize_job_metrics(trans, job) return job_dict diff --git a/lib/galaxy/model/__init__.py b/lib/galaxy/model/__init__.py index d179ecaadc6..328bb841a55 100644 --- a/lib/galaxy/model/__init__.py +++ b/lib/galaxy/model/__init__.py @@ -1125,6 +1125,15 @@ class Job(Base, JobLike, UsesCreateAndUpdateTime, Dictifiable, RepresentById): def set_tool_id(self, tool_id): self.tool_id = tool_id + def get_user_email(self): + if self.user is not None: + return self.user.email + elif self.galaxy_session is not None and self.galaxy_session.user is not None: + return self.galaxy_session.user.email + elif self.history is not None and self.history.user is not None: + return self.history.user.email + return None + def set_tool_version(self, tool_version): self.tool_version = tool_version diff --git a/lib/galaxy/webapps/galaxy/api/jobs.py b/lib/galaxy/webapps/galaxy/api/jobs.py index 789b23846a7..b70837c8012 100644 --- a/lib/galaxy/webapps/galaxy/api/jobs.py +++ b/lib/galaxy/webapps/galaxy/api/jobs.py @@ -210,10 +210,7 @@ class JobController(BaseGalaxyAPIController, UsesVisualizationMixin): if view == 'admin_job_list': j['decoded_job_id'] = job.id if user_details: - try: - j['user_email'] = job.user.email - except AttributeError: # when job.user is None - j['user_email'] = None + j['user_email'] = job.get_user_email() out.append(j) return out diff --git a/lib/galaxy/webapps/reports/controllers/jobs.py b/lib/galaxy/webapps/reports/controllers/jobs.py index d5cc9d3e117..e9dbe74dea5 100644 --- a/lib/galaxy/webapps/reports/controllers/jobs.py +++ b/lib/galaxy/webapps/reports/controllers/jobs.py @@ -143,7 +143,7 @@ class SpecifiedDateListGrid(grids.Grid): def get_value(self, trans, grid, job): if job.user: - return escape(job.user.email) + return escape(job.get_user_email()) return 'anonymous' class EmailColumn(grids.GridColumn): @@ -279,10 +279,7 @@ class Jobs(BaseUIController, ReportQueryBuilder): # that submitted the job. job_id = kwd.get('id', None) job = get_job(trans, job_id) - if job.user: - kwd['email'] = job.user.email - else: - kwd['email'] = None # For anonymous users + kwd['email'] = job.get_user_email() return trans.response.send_redirect(web.url_for(controller='jobs', action='user_per_month', **kwd)) diff --git a/templates/webapps/reports/job_info.mako b/templates/webapps/reports/job_info.mako index 9b844e9d90e..41f016175b4 100644 --- a/templates/webapps/reports/job_info.mako +++ b/templates/webapps/reports/job_info.mako @@ -37,8 +37,8 @@ ${job.tool_id} - %if job.user and job.user.email: - ${job.user.email} + %if job.get_user_email(): + ${job.get_user_email()} %else: anonymous %endif