From ef0d26c29459ef9bd168e249d4578f325e8403f2 Mon Sep 17 00:00:00 2001 From: Dave Page Date: Fri, 21 Oct 2016 16:00:23 +0100 Subject: [PATCH] Ensure steps and schedules can be created in empty jobs. Fixes #1878 --- .../servers/pgagent/schedules/__init__.py | 68 +++++++++++++------ .../templates/pga_schedule/js/pga_schedule.js | 2 +- .../servers/pgagent/steps/__init__.py | 29 ++++---- .../templates/macros/pga_schedule.macros | 2 +- .../pga_schedule/sql/pre3.4/create.sql | 8 --- 5 files changed, 66 insertions(+), 43 deletions(-) diff --git a/web/pgadmin/browser/server_groups/servers/pgagent/schedules/__init__.py b/web/pgadmin/browser/server_groups/servers/pgagent/schedules/__init__.py index 24ea1ba5d..4dd82e892 100644 --- a/web/pgadmin/browser/server_groups/servers/pgagent/schedules/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/pgagent/schedules/__init__.py @@ -219,8 +219,8 @@ class JobScheduleView(PGChildNodeView): res = [] sql = render_template( "/".join([self.template_path, 'nodes.sql']), - jscid = jscid, - jid = jid + jscid=jscid, + jid=jid ) status, result = self.conn.execute_2darray(sql) @@ -298,13 +298,22 @@ class JobScheduleView(PGChildNodeView): jid: Job ID """ data = {} - for k, v in request.args.items(): - try: - data[k] = json.loads( - v.decode('utf-8') if hasattr(v, 'decode') else v - ) - except ValueError: - data[k] = v + if request.args: + for k, v in request.args.items(): + try: + data[k] = json.loads( + v.decode('utf-8') if hasattr(v, 'decode') else v + ) + except ValueError: + data[k] = v + else: + data = json.loads(request.data.decode()) + # convert python list literal to postgres array literal. + data['jscminutes'] = data['jscminutes'].replace("[", "{").replace("]", "}") + data['jschours'] = data['jschours'].replace("[", "{").replace("]", "}") + data['jscweekdays'] = data['jscweekdays'].replace("[", "{").replace("]", "}") + data['jscmonthdays'] = data['jscmonthdays'].replace("[", "{").replace("]", "}") + data['jscmonths'] = data['jscmonths'].replace("[", "{").replace("]", "}") sql = render_template( "/".join([self.template_path, 'create.sql']), @@ -327,8 +336,8 @@ class JobScheduleView(PGChildNodeView): self.conn.execute_void('END') sql = render_template( "/".join([self.template_path, 'nodes.sql']), - jscid = res, - jid = jid + jscid=res, + jid=jid ) status, res = self.conn.execute_2darray(sql) @@ -357,17 +366,36 @@ class JobScheduleView(PGChildNodeView): jscid: JobSchedule ID """ data = {} - for k, v in request.args.items(): - try: - data[k] = json.loads( - v.decode('utf-8') if hasattr(v, 'decode') else v - ) - except ValueError: - data[k] = v + if request.args: + for k, v in request.args.items(): + try: + data[k] = json.loads( + v.decode('utf-8') if hasattr(v, 'decode') else v + ) + except ValueError: + data[k] = v + else: + data = json.loads(request.data.decode()) + # convert python list literal to postgres array literal. + if 'jscminutes' in data: + data['jscminutes'] = data['jscminutes'].replace("[", "{").replace("]", "}") + + if 'jschours' in data: + data['jschours'] = data['jschours'].replace("[", "{").replace("]", "}") + + if 'jscweekdays' in data: + data['jscweekdays'] = data['jscweekdays'].replace("[", "{").replace("]", "}") + + if 'jscmonthdays' in data: + data['jscmonthdays'] = data['jscmonthdays'].replace("[", "{").replace("]", "}") + + if 'jscmonths' in data: + data['jscmonths'] = data['jscmonths'].replace("[", "{").replace("]", "}") sql = render_template( "/".join([self.template_path, 'update.sql']), jid=jid, + jscid=jscid, data=data ) @@ -378,8 +406,8 @@ class JobScheduleView(PGChildNodeView): sql = render_template( "/".join([self.template_path, 'nodes.sql']), - jscid = jscid, - jid = jid + jscid=jscid, + jid=jid ) status, res = self.conn.execute_2darray(sql) diff --git a/web/pgadmin/browser/server_groups/servers/pgagent/schedules/templates/pga_schedule/js/pga_schedule.js b/web/pgadmin/browser/server_groups/servers/pgagent/schedules/templates/pga_schedule/js/pga_schedule.js index 497e9adc9..b95be1a45 100644 --- a/web/pgadmin/browser/server_groups/servers/pgagent/schedules/templates/pga_schedule/js/pga_schedule.js +++ b/web/pgadmin/browser/server_groups/servers/pgagent/schedules/templates/pga_schedule/js/pga_schedule.js @@ -184,7 +184,7 @@ function($, _, S, pgAdmin, moment, pgBrowser, Alertify, Backform) { parent_type: 'pga_job', type: 'pga_schedule', dialogHelp: '{{ url_for('help.static', filename='pgagent_jobs.html') }}', - hasSQL: false, + hasSQL: true, hasDepends: false, hasStatistics: false, canDrop: function(node) { diff --git a/web/pgadmin/browser/server_groups/servers/pgagent/steps/__init__.py b/web/pgadmin/browser/server_groups/servers/pgagent/steps/__init__.py index ccded7a52..4def6363c 100644 --- a/web/pgadmin/browser/server_groups/servers/pgagent/steps/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/pgagent/steps/__init__.py @@ -232,8 +232,8 @@ SELECT EXISTS( res = [] sql = render_template( "/".join([self.template_path, 'nodes.sql']), - jstid = jstid, - jid = jid + jstid=jstid, + jid=jid ) status, result = self.conn.execute_2darray(sql) @@ -315,13 +315,16 @@ SELECT EXISTS( jid: Job ID """ data = {} - for k, v in request.args.items(): - try: - data[k] = json.loads( - v.decode('utf-8') if hasattr(v, 'decode') else v - ) - except ValueError: - data[k] = v + if request.args: + for k, v in request.args.items(): + try: + data[k] = json.loads( + v.decode('utf-8') if hasattr(v, 'decode') else v + ) + except ValueError: + data[k] = v + else: + data = json.loads(request.data.decode()) sql = render_template( "/".join([self.template_path, 'create.sql']), @@ -337,8 +340,8 @@ SELECT EXISTS( sql = render_template( "/".join([self.template_path, 'nodes.sql']), - jstid = res, - jid = jid + jstid=res, + jid=jid ) status, res = self.conn.execute_2darray(sql) @@ -417,8 +420,8 @@ SELECT EXISTS( sql = render_template( "/".join([self.template_path, 'nodes.sql']), - jstid = jstid, - jid = jid + jstid=jstid, + jid=jid ) status, res = self.conn.execute_2darray(sql) diff --git a/web/pgadmin/browser/server_groups/servers/pgagent/templates/macros/pga_schedule.macros b/web/pgadmin/browser/server_groups/servers/pgagent/templates/macros/pga_schedule.macros index e8f129c71..e80492c24 100644 --- a/web/pgadmin/browser/server_groups/servers/pgagent/templates/macros/pga_schedule.macros +++ b/web/pgadmin/browser/server_groups/servers/pgagent/templates/macros/pga_schedule.macros @@ -23,7 +23,7 @@ INSERT INTO pgagent.pga_schedule( {{ data.jscmonthdays|qtLiteral }}::boolean[], -- Months {{ data.jscmonths|qtLiteral }}::boolean[] -) RETURNING jscid INTO scid;{% if 'jscexceptions' in data %} +) RETURNING jscid {% if not jid %}INTO scid;{% endif %}{% if 'jscexceptions' in data %} {% for exc in data.jscexceptions %} {{ EXCEPTIONS.INSERT(None, exc) }}{% endfor %}{% endif %} diff --git a/web/pgadmin/browser/server_groups/servers/pgagent/templates/pga_schedule/sql/pre3.4/create.sql b/web/pgadmin/browser/server_groups/servers/pgagent/templates/pga_schedule/sql/pre3.4/create.sql index e9f657fa3..6d635810d 100644 --- a/web/pgadmin/browser/server_groups/servers/pgagent/templates/pga_schedule/sql/pre3.4/create.sql +++ b/web/pgadmin/browser/server_groups/servers/pgagent/templates/pga_schedule/sql/pre3.4/create.sql @@ -1,10 +1,2 @@ {% import 'macros/pga_schedule.macros' as SCHEDULE %} -DO $$ -DECLARE - jscid integer; -BEGIN {{ SCHEDULE.INSERT(jid, data) }} -END -$$ LANGUAGE 'plpgsql';{% if fetch_id %} - -{{ SCHEDULE.FETCH_CURRENT() }}{% endif %}