mirror of
https://github.com/pgadmin-org/pgadmin4.git
synced 2025-02-25 18:55:31 -06:00
Fix dropping of pgAgent schedules through the Job properties. Fixes #3996
This commit is contained in:
@@ -28,6 +28,7 @@ Bug fixes
|
|||||||
*********
|
*********
|
||||||
|
|
||||||
| `Issue #3919 <https://redmine.postgresql.org/issues/3919>`_ - Allow keyboard navigation of all controls on subnode grids.
|
| `Issue #3919 <https://redmine.postgresql.org/issues/3919>`_ - Allow keyboard navigation of all controls on subnode grids.
|
||||||
|
| `Issue #3996 <https://redmine.postgresql.org/issues/3996>`_ - Fix dropping of pgAgent schedules through the Job properties.
|
||||||
| `Issue #4224 <https://redmine.postgresql.org/issues/4224>`_ - Prevent flickering of large tooltips on the Graphical EXPLAIN canvas.
|
| `Issue #4224 <https://redmine.postgresql.org/issues/4224>`_ - Prevent flickering of large tooltips on the Graphical EXPLAIN canvas.
|
||||||
| `Issue #4389 <https://redmine.postgresql.org/issues/4389>`_ - Fix an error that could be seen when editing column privileges.
|
| `Issue #4389 <https://redmine.postgresql.org/issues/4389>`_ - Fix an error that could be seen when editing column privileges.
|
||||||
| `Issue #4393 <https://redmine.postgresql.org/issues/4393>`_ - Ensure parameter values are quoted when needed when editing roles.
|
| `Issue #4393 <https://redmine.postgresql.org/issues/4393>`_ - Ensure parameter values are quoted when needed when editing roles.
|
||||||
|
|||||||
@@ -140,7 +140,7 @@ class JobScheduleView(PGChildNodeView):
|
|||||||
operations = dict({
|
operations = dict({
|
||||||
'obj': [
|
'obj': [
|
||||||
{'get': 'properties', 'put': 'update', 'delete': 'delete'},
|
{'get': 'properties', 'put': 'update', 'delete': 'delete'},
|
||||||
{'get': 'list', 'post': 'create'}
|
{'get': 'list', 'post': 'create', 'delete': 'delete'}
|
||||||
],
|
],
|
||||||
'nodes': [{'get': 'nodes'}, {'get': 'nodes'}],
|
'nodes': [{'get': 'nodes'}, {'get': 'nodes'}],
|
||||||
'msql': [{'get': 'msql'}, {'get': 'msql'}],
|
'msql': [{'get': 'msql'}, {'get': 'msql'}],
|
||||||
@@ -474,17 +474,25 @@ class JobScheduleView(PGChildNodeView):
|
|||||||
)
|
)
|
||||||
|
|
||||||
@check_precondition
|
@check_precondition
|
||||||
def delete(self, gid, sid, jid, jscid):
|
def delete(self, gid, sid, jid, jscid=None):
|
||||||
"""Delete the Job Schedule."""
|
"""Delete the Job Schedule."""
|
||||||
|
|
||||||
status, res = self.conn.execute_void(
|
if jscid is None:
|
||||||
render_template(
|
data = request.form if request.form else json.loads(
|
||||||
"/".join([self.template_path, 'delete.sql']),
|
request.data, encoding='utf-8'
|
||||||
jid=jid, jscid=jscid, conn=self.conn
|
|
||||||
)
|
)
|
||||||
)
|
else:
|
||||||
if not status:
|
data = {'ids': [jscid]}
|
||||||
return internal_server_error(errormsg=res)
|
|
||||||
|
for jscid in data['ids']:
|
||||||
|
status, res = self.conn.execute_void(
|
||||||
|
render_template(
|
||||||
|
"/".join([self.template_path, 'delete.sql']),
|
||||||
|
jid=jid, jscid=jscid, conn=self.conn
|
||||||
|
)
|
||||||
|
)
|
||||||
|
if not status:
|
||||||
|
return internal_server_error(errormsg=res)
|
||||||
|
|
||||||
return make_json_response(success=1)
|
return make_json_response(success=1)
|
||||||
|
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ define('pgadmin.node.pga_schedule', [
|
|||||||
type: 'coll-pga_schedule',
|
type: 'coll-pga_schedule',
|
||||||
columns: ['jscid', 'jscname', 'jscenabled'],
|
columns: ['jscid', 'jscname', 'jscenabled'],
|
||||||
hasStatistics: false,
|
hasStatistics: false,
|
||||||
|
canDropCascade: false,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -159,7 +159,7 @@ class JobStepView(PGChildNodeView):
|
|||||||
operations = dict({
|
operations = dict({
|
||||||
'obj': [
|
'obj': [
|
||||||
{'get': 'properties', 'put': 'update', 'delete': 'delete'},
|
{'get': 'properties', 'put': 'update', 'delete': 'delete'},
|
||||||
{'get': 'list', 'post': 'create'}
|
{'get': 'list', 'post': 'create', 'delete': 'delete'}
|
||||||
],
|
],
|
||||||
'nodes': [{'get': 'nodes'}, {'get': 'nodes'}],
|
'nodes': [{'get': 'nodes'}, {'get': 'nodes'}],
|
||||||
'msql': [{'get': 'msql'}, {'get': 'msql'}],
|
'msql': [{'get': 'msql'}, {'get': 'msql'}],
|
||||||
@@ -474,17 +474,25 @@ SELECT EXISTS(
|
|||||||
)
|
)
|
||||||
|
|
||||||
@check_precondition
|
@check_precondition
|
||||||
def delete(self, gid, sid, jid, jstid):
|
def delete(self, gid, sid, jid, jstid=None):
|
||||||
"""Delete the Job step."""
|
"""Delete the Job step."""
|
||||||
|
|
||||||
status, res = self.conn.execute_void(
|
if jstid is None:
|
||||||
render_template(
|
data = request.form if request.form else json.loads(
|
||||||
"/".join([self.template_path, 'delete.sql']),
|
request.data, encoding='utf-8'
|
||||||
jid=jid, jstid=jstid, conn=self.conn
|
|
||||||
)
|
)
|
||||||
)
|
else:
|
||||||
if not status:
|
data = {'ids': [jstid]}
|
||||||
return internal_server_error(errormsg=res)
|
|
||||||
|
for jstid in data['ids']:
|
||||||
|
status, res = self.conn.execute_void(
|
||||||
|
render_template(
|
||||||
|
"/".join([self.template_path, 'delete.sql']),
|
||||||
|
jid=jid, jstid=jstid, conn=self.conn
|
||||||
|
)
|
||||||
|
)
|
||||||
|
if not status:
|
||||||
|
return internal_server_error(errormsg=res)
|
||||||
|
|
||||||
return make_json_response(success=1)
|
return make_json_response(success=1)
|
||||||
|
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ define('pgadmin.node.pga_jobstep', [
|
|||||||
'jstonerror',
|
'jstonerror',
|
||||||
],
|
],
|
||||||
hasStatistics: false,
|
hasStatistics: false,
|
||||||
|
canDropCascade: false,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,47 @@
|
|||||||
|
##########################################################################
|
||||||
|
#
|
||||||
|
# pgAdmin 4 - PostgreSQL Tools
|
||||||
|
#
|
||||||
|
# Copyright (C) 2013 - 2019, The pgAdmin Development Team
|
||||||
|
# This software is released under the PostgreSQL Licence
|
||||||
|
#
|
||||||
|
##########################################################################
|
||||||
|
|
||||||
|
import uuid
|
||||||
|
import json
|
||||||
|
from pgadmin.utils.route import BaseTestGenerator
|
||||||
|
from regression.python_test_utils import test_utils as utils
|
||||||
|
from . import utils as pgagent_utils
|
||||||
|
|
||||||
|
|
||||||
|
class PgAgentDeleteMultipleTestCase(BaseTestGenerator):
|
||||||
|
"""This class will test the delete multiple pgAgent job API"""
|
||||||
|
scenarios = [
|
||||||
|
('Delete multiple pgAgent job', dict(url='/browser/pga_job/obj/'))
|
||||||
|
]
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
flag, msg = pgagent_utils.is_valid_server_to_run_pgagent(self)
|
||||||
|
if not flag:
|
||||||
|
self.skipTest(msg)
|
||||||
|
flag, msg = pgagent_utils.is_pgagent_installed_on_server(self)
|
||||||
|
if not flag:
|
||||||
|
self.skipTest(msg)
|
||||||
|
name1 = "test_job1_delete%s" % str(uuid.uuid4())[1:8]
|
||||||
|
self.job_id1 = pgagent_utils.create_pgagent_job(self, name1)
|
||||||
|
name2 = "test_job2_delete%s" % str(uuid.uuid4())[1:8]
|
||||||
|
self.job_id2 = pgagent_utils.create_pgagent_job(self, name2)
|
||||||
|
|
||||||
|
def runTest(self):
|
||||||
|
"""This function will deletes pgAgent job"""
|
||||||
|
response = self.tester.delete(
|
||||||
|
'{0}{1}/{2}/'.format(
|
||||||
|
self.url, str(utils.SERVER_GROUP), str(self.server_id)
|
||||||
|
),
|
||||||
|
data=json.dumps({'ids': [self.job_id1, self.job_id2]}),
|
||||||
|
content_type='html/json'
|
||||||
|
)
|
||||||
|
self.assertEquals(response.status_code, 200)
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
"""Clean up code"""
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
##########################################################################
|
||||||
|
#
|
||||||
|
# pgAdmin 4 - PostgreSQL Tools
|
||||||
|
#
|
||||||
|
# Copyright (C) 2013 - 2019, The pgAdmin Development Team
|
||||||
|
# This software is released under the PostgreSQL Licence
|
||||||
|
#
|
||||||
|
##########################################################################
|
||||||
|
|
||||||
|
import uuid
|
||||||
|
import json
|
||||||
|
from pgadmin.utils.route import BaseTestGenerator
|
||||||
|
from regression.python_test_utils import test_utils as utils
|
||||||
|
from . import utils as pgagent_utils
|
||||||
|
|
||||||
|
|
||||||
|
class PgAgentDeleteMultipleSchedulesTestCase(BaseTestGenerator):
|
||||||
|
"""This class will test the delete pgAgent job schedule API"""
|
||||||
|
scenarios = [
|
||||||
|
('Delete multiple pgAgent schedules',
|
||||||
|
dict(url='/browser/pga_schedule/obj/'))
|
||||||
|
]
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
flag, msg = pgagent_utils.is_valid_server_to_run_pgagent(self)
|
||||||
|
if not flag:
|
||||||
|
self.skipTest(msg)
|
||||||
|
flag, msg = pgagent_utils.is_pgagent_installed_on_server(self)
|
||||||
|
if not flag:
|
||||||
|
self.skipTest(msg)
|
||||||
|
name = "test_multi_sc_job_delete%s" % str(uuid.uuid4())[1:8]
|
||||||
|
self.job_id = pgagent_utils.create_pgagent_job(self, name)
|
||||||
|
sch1_name = "test_multi_schedule1_delete%s" % str(uuid.uuid4())[1:8]
|
||||||
|
self.schedule_id1 = pgagent_utils.create_pgagent_schedule(
|
||||||
|
self, sch1_name, self.job_id)
|
||||||
|
|
||||||
|
# Create one more schedule
|
||||||
|
sch2_name = "test_multi_schedule2_delete%s" % str(uuid.uuid4())[1:8]
|
||||||
|
self.schedule_id2 = pgagent_utils.create_pgagent_schedule(
|
||||||
|
self, sch2_name, self.job_id)
|
||||||
|
|
||||||
|
def runTest(self):
|
||||||
|
"""This function will deletes pgAgent job schedule"""
|
||||||
|
response = self.tester.delete(
|
||||||
|
'{0}{1}/{2}/{3}/'.format(
|
||||||
|
self.url, str(utils.SERVER_GROUP), str(self.server_id),
|
||||||
|
str(self.job_id)
|
||||||
|
),
|
||||||
|
data=json.dumps({'ids': [self.schedule_id1, self.schedule_id2]}),
|
||||||
|
content_type='html/json'
|
||||||
|
)
|
||||||
|
self.assertEquals(response.status_code, 200)
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
"""Clean up code"""
|
||||||
|
pgagent_utils.delete_pgagent_job(self)
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
##########################################################################
|
||||||
|
#
|
||||||
|
# pgAdmin 4 - PostgreSQL Tools
|
||||||
|
#
|
||||||
|
# Copyright (C) 2013 - 2019, The pgAdmin Development Team
|
||||||
|
# This software is released under the PostgreSQL Licence
|
||||||
|
#
|
||||||
|
##########################################################################
|
||||||
|
|
||||||
|
import uuid
|
||||||
|
import json
|
||||||
|
from pgadmin.utils.route import BaseTestGenerator
|
||||||
|
from regression.python_test_utils import test_utils as utils
|
||||||
|
from . import utils as pgagent_utils
|
||||||
|
|
||||||
|
|
||||||
|
class PgAgentDeleteMultipleStepsTestCase(BaseTestGenerator):
|
||||||
|
"""This class will test the delete pgAgent job steps API"""
|
||||||
|
scenarios = [
|
||||||
|
('Delete multiple pgAgent steps',
|
||||||
|
dict(url='/browser/pga_jobstep/obj/'))
|
||||||
|
]
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
flag, msg = pgagent_utils.is_valid_server_to_run_pgagent(self)
|
||||||
|
if not flag:
|
||||||
|
self.skipTest(msg)
|
||||||
|
flag, msg = pgagent_utils.is_pgagent_installed_on_server(self)
|
||||||
|
if not flag:
|
||||||
|
self.skipTest(msg)
|
||||||
|
name = "test_multiple_st_job_delete%s" % str(uuid.uuid4())[1:8]
|
||||||
|
self.job_id = pgagent_utils.create_pgagent_job(self, name)
|
||||||
|
step_name1 = "test_multiple_step1_delete%s" % str(uuid.uuid4())[1:8]
|
||||||
|
self.step_id1 = pgagent_utils.create_pgagent_step(
|
||||||
|
self, step_name1, self.job_id)
|
||||||
|
step_name2 = "test_multiple_step2_delete%s" % str(uuid.uuid4())[1:8]
|
||||||
|
self.step_id2 = pgagent_utils.create_pgagent_step(
|
||||||
|
self, step_name2, self.job_id)
|
||||||
|
|
||||||
|
def runTest(self):
|
||||||
|
"""This function will deletes pgAgent job schedule"""
|
||||||
|
response = self.tester.delete(
|
||||||
|
'{0}{1}/{2}/{3}/'.format(
|
||||||
|
self.url, str(utils.SERVER_GROUP), str(self.server_id),
|
||||||
|
str(self.job_id)
|
||||||
|
),
|
||||||
|
data=json.dumps({'ids': [self.step_id1, self.step_id2]}),
|
||||||
|
content_type='html/json'
|
||||||
|
)
|
||||||
|
self.assertEquals(response.status_code, 200)
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
"""Clean up code"""
|
||||||
|
pgagent_utils.delete_pgagent_job(self)
|
||||||
Reference in New Issue
Block a user