diff --git a/web/pgadmin/__init__.py b/web/pgadmin/__init__.py index 89a46ad8..86a02e61 100644 --- a/web/pgadmin/__init__.py +++ b/web/pgadmin/__init__.py @@ -21,7 +21,10 @@ from flask_login import user_logged_in from flask_security import Security, SQLAlchemyUserDatastore from flask_mail import Mail from flask_security.utils import login_user +from werkzeug.datastructures import ImmutableDict + from pgadmin.utils import PgAdminModule, driver +from pgadmin.utils.versioned_template_loader import VersionedTemplateLoader from pgadmin.utils.session import create_session_interface from werkzeug.local import LocalProxy from werkzeug.utils import find_modules @@ -40,7 +43,16 @@ if sys.version_info[0] >= 3: elif os.name == 'nt': import _winreg as winreg + class PgAdmin(Flask): + def __init__(self, *args, **kwargs): + # Set the template loader to a postgres-version-aware loader + self.jinja_options = ImmutableDict( + extensions=['jinja2.ext.autoescape', 'jinja2.ext.with_'], + loader=VersionedTemplateLoader(self) + ) + super(PgAdmin, self).__init__(*args, **kwargs) + def find_submodules(self, basemodule): for module_name in find_modules(basemodule, True): if module_name in self.config['MODULE_BLACKLIST']: diff --git a/web/pgadmin/browser/server_groups/servers/__init__.py b/web/pgadmin/browser/server_groups/servers/__init__.py index e87b09cb..4e752d80 100644 --- a/web/pgadmin/browser/server_groups/servers/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/__init__.py @@ -656,16 +656,6 @@ class ServerNode(PGChildNodeView): def modified_sql(self, gid, sid): return make_json_response(data='') - def get_template_directory(self, version): - """ This function will check and return template directory - based on postgres verion""" - if version >= 90600: - return '9.6_plus' - elif version >= 90200: - return '9.2_plus' - else: - return '9.1_plus' - def statistics(self, gid, sid): manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(sid) conn = manager.connection() @@ -673,11 +663,7 @@ class ServerNode(PGChildNodeView): if conn.connected(): status, res = conn.execute_dict( render_template( - "/".join([ - 'servers/sql', - self.get_template_directory(manager.version), - 'stats.sql' - ]), + "/servers/sql/#{0}#/stats.sql".format(manager.version), conn=conn, _=gettext ) ) @@ -1051,11 +1037,8 @@ class ServerNode(PGChildNodeView): # Hash new password before saving it. password = pqencryptpassword(data['newPassword'], manager.user) - SQL = render_template("/".join([ - 'servers/sql', - self.get_template_directory(manager.version), - 'change_password.sql' - ]), + SQL = render_template( + "/servers/sql/#{0}#/change_password.sql".format(manager.version), conn=conn, _=gettext, user=manager.user, encrypted_password=password) diff --git a/web/pgadmin/browser/server_groups/servers/databases/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/__init__.py index 53f5b412..0328fcbd 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/__init__.py @@ -137,14 +137,8 @@ class DatabaseView(PGChildNodeView): else: self.conn = self.manager.connection() - ver = self.manager.version - # we will set template path for sql scripts - if ver >= 90300: - self.template_path = 'databases/sql/9.3_plus' - elif ver >= 90200: - self.template_path = 'databases/sql/9.2_plus' - else: - self.template_path = 'databases/sql/9.1_plus' + # set template path for sql scripts + self.template_path = 'databases/sql/#{0}#'.format(self.manager.version) return f(self, *args, **kwargs) diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/__init__.py index b9e60369..80f59a95 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/__init__.py @@ -212,10 +212,7 @@ class ForeignDataWrapperView(PGChildNodeView): self.conn = self.manager.connection(did=kwargs['did']) # Set the template path for the SQL scripts - if self.manager.version >= 90300: - self.template_path = 'foreign_data_wrappers/sql/9.3_plus' - else: - self.template_path = 'foreign_data_wrappers/sql/9.1_plus' + self.template_path = 'foreign_data_wrappers/sql/#{0}#'.format(self.manager.version) return f(*args, **kwargs) diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/__init__.py index 42f6e312..1f2836c6 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/__init__.py @@ -205,10 +205,7 @@ class ForeignServerView(PGChildNodeView): self.manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(kwargs['sid']) self.conn = self.manager.connection(did=kwargs['did']) # Set the template path for the SQL scripts - if self.manager.version >= 90300: - self.template_path = 'foreign_servers/sql/9.3_plus' - else: - self.template_path = 'foreign_servers/sql/9.1_plus' + self.template_path = "foreign_servers/sql/#{0}#".format(self.manager.version) return f(*args, **kwargs) diff --git a/web/pgadmin/browser/server_groups/servers/databases/languages/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/languages/__init__.py index 2fb79668..68cb974e 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/languages/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/languages/__init__.py @@ -230,10 +230,7 @@ class LanguageView(PGChildNodeView): self.manager = self.driver.connection_manager(kwargs['sid']) self.conn = self.manager.connection(did=kwargs['did']) # Set the template path for the SQL scripts - if self.manager.version >= 90300: - self.template_path = 'languages/sql/9.3_plus' - else: - self.template_path = 'languages/sql/9.1_plus' + self.template_path = "languages/sql/#{0}#".format(self.manager.version) return f(*args, **kwargs) diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/__init__.py index 869f2e9a..ade1f4b7 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/__init__.py @@ -238,18 +238,14 @@ class SchemaView(PGChildNodeView): """ Returns the template path for PPAS servers. """ - if ver >= 90200: - return 'ppas/9.2_plus' - return 'ppas/9.1_plus' + return 'ppas/#{0#}'.format(ver) @staticmethod def pg_template_path(ver): """ Returns the template path for PostgreSQL servers. """ - if ver >= 90200: - return 'pg/9.2_plus' - return 'pg/9.1_plus' + return 'pg/#{0}#'.format(ver) def format_request_acls(self, data, modified=False, specific=None): acls = {} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/__init__.py index 98a00715..3f7c94f1 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/__init__.py @@ -263,10 +263,7 @@ class DomainView(PGChildNodeView, DataTypeReader): self.qtIdent = driver.qtIdent # we will set template path for sql scripts - if self.manager.version >= 90200: - self.template_path = 'domains/sql/9.2_plus' - else: - self.template_path = 'domains/sql/9.1_plus' + self.template_path = 'domains/sql/#{0}#'.format(self.manager.version) return f(*args, **kwargs) diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/domain_constraints/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/domain_constraints/__init__.py index f643299a..c187cccc 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/domain_constraints/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/domain_constraints/__init__.py @@ -257,10 +257,7 @@ class DomainConstraintView(PGChildNodeView): self.qtIdent = driver.qtIdent # Set the template path for the SQL scripts - if self.manager.version >= 90200: - self.template_path = 'domain_constraints/sql/9.2_plus' - else: - self.template_path = 'domain_constraints/sql/9.1_plus' + self.template_path = 'domain_constraints/sql/#{0}#'.format(self.manager.version) return f(*args, **kwargs) return wrap diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py index 488c8525..eb82216e 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/foreign_tables/__init__.py @@ -339,16 +339,9 @@ class ForeignTableView(PGChildNodeView, DataTypeReader): self.conn = self.manager.connection(did=kwargs['did']) self.qtIdent = driver.qtIdent - ver = self.manager.version # Set template path for sql scripts depending # on the server version. - - if ver >= 90500: - self.template_path = 'foreign_tables/sql/9.5_plus' - elif ver >= 90200: - self.template_path = 'foreign_tables/sql/9.2_plus' - else: - self.template_path = 'foreign_tables/sql/9.1_plus' + self.template_path = 'foreign_tables/sql/#{0}#'.format(self.manager.version) return f(*args, **kwargs) return wrap diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py index 33fd40d5..b6a3a027 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py @@ -327,8 +327,6 @@ class FunctionView(PGChildNodeView, DataTypeReader): self.qtIdent = driver.qtIdent self.qtLiteral = driver.qtLiteral - ver = self.manager.version - # Set the template path for the SQL scripts self.template_path = "/".join([ self.node_type @@ -337,10 +335,8 @@ class FunctionView(PGChildNodeView, DataTypeReader): self.template_path, self.manager.server_type, 'sql', - '9.5_plus' if ver >= 90500 else - '9.2_plus' if ver >= 90200 else - '9.1_plus' - ]) + '#{0}#' + ]).format(self.manager.version) return f(*args, **kwargs) diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/__init__.py index 2af8584d..da90fed2 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/__init__.py @@ -145,9 +145,7 @@ class PackageView(PGChildNodeView): "Connection to the server has been lost!" ) ) - self.template_path = 'package/ppas/9.2_plus' - if self.manager.version < 90200: - self.template_path = 'package/ppas/9.1_plus' + self.template_path = 'package/ppas/#{0}#'.format(self.manager.version) SQL = render_template( "/".join([self.template_path, 'get_schema.sql']), diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py index af4043b4..099a7b88 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/packages/edbfuncs/__init__.py @@ -206,17 +206,11 @@ class EdbFuncView(PGChildNodeView, DataTypeReader): # Set template path for sql scripts depending # on the server version. - ver = self.manager.version - - # Set template path for sql scripts depending - # on the server version. - self.sql_template_path = "/".join([ self.node_type, self.manager.server_type, - '9.2_plus' if ver >= 90200 else - '9.1_plus' - ]) + '#{0}#' + ]).format(self.manager.version) return f(*args, **kwargs) diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/__init__.py index e7575994..cdfdaf41 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/__init__.py @@ -200,9 +200,7 @@ class SynonymView(PGChildNodeView): ) # we will set template path for sql scripts - self.template_path = 'synonym/sql/' - self.template_path += '9.5_plus' if self.manager.version >= 90500 \ - else '9.1_plus' + self.template_path = 'synonym/sql/#{0}#'.format(self.manager.version) return f(*args, **kwargs) diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py index f501d3d0..9292989a 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/__init__.py @@ -284,24 +284,12 @@ class TableView(PGChildNodeView, DataTypeReader, VacuumSettings): ver = self.manager.version # Set the template path for the SQL scripts - if ver >= 90500: - self.template_path = 'table/sql/9.5_plus' - else: - self.template_path = 'table/sql/9.1_plus' + self.template_path = 'table/sql/#{0}#'.format(ver) # Template for Column ,check constraint and exclusion constraint node - if ver >= 90600: - self.column_template_path = 'column/sql/9.2_plus' - self.check_constraint_template_path = 'check_constraint/sql/9.2_plus' - self.exclusion_constraint_template_path = 'exclusion_constraint/sql/9.6_plus' - elif ver >= 90200: - self.column_template_path = 'column/sql/9.2_plus' - self.check_constraint_template_path = 'check_constraint/sql/9.2_plus' - self.exclusion_constraint_template_path = 'exclusion_constraint/sql/9.2_plus' - else: - self.column_template_path = 'column/sql/9.1_plus' - self.check_constraint_template_path = 'check_constraint/sql/9.1_plus' - self.exclusion_constraint_template_path = 'exclusion_constraint/sql/9.1_plus' + self.column_template_path = 'column/sql/#{0}#'.format(ver) + self.check_constraint_template_path = 'check_constraint/sql/#{0}#'.format(ver) + self.exclusion_constraint_template_path = 'exclusion_constraint/sql/#{0}#'.format(ver) # Template for PK & Unique constraint node self.index_constraint_template_path = 'index_constraint/sql' @@ -310,10 +298,10 @@ class TableView(PGChildNodeView, DataTypeReader, VacuumSettings): self.foreign_key_template_path = 'foreign_key/sql' # Template for index node - self.index_template_path = 'index/sql/9.1_plus' + self.index_template_path = 'index/sql/#{0}#'.format(ver) # Template for trigger node - self.trigger_template_path = 'trigger/sql/9.1_plus' + self.trigger_template_path = 'trigger/sql/#{0}#'.format(ver) # Template for rules node self.rules_template_path = 'rules/sql' diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/column/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/column/__init__.py index d05d3334..8d72d154 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/column/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/column/__init__.py @@ -202,10 +202,8 @@ class ColumnsView(PGChildNodeView, DataTypeReader): self.qtTypeIdent = driver.qtTypeIdent # Set the template path for the SQL scripts - if self.manager.version >= 90200: - self.template_path = 'column/sql/9.2_plus' - else: - self.template_path = 'column/sql/9.1_plus' + self.template_path = 'column/sql/#{0}#'.format(self.manager.version) + # Allowed ACL for column 'Select/Update/Insert/References' self.acl = ['a', 'r', 'w', 'x'] diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/__init__.py index b9954ace..caf8ddce 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/__init__.py @@ -208,12 +208,8 @@ class CheckConstraintView(PGChildNodeView): self.conn = self.manager.connection(did=kwargs['did']) self.qtIdent = driver.qtIdent - ver = self.manager.version # Set the template path for the SQL scripts - if ver >= 90200: - self.template_path = 'check_constraint/sql/9.2_plus' - elif ver >= 90100: - self.template_path = 'check_constraint/sql/9.1_plus' + self.template_path = 'check_constraint/sql/#{0}#'.format(self.manager.version) SQL = render_template("/".join([self.template_path, 'get_parent.sql']), @@ -281,12 +277,8 @@ class CheckConstraintView(PGChildNodeView): self.conn = self.manager.connection(did=did) self.qtIdent = driver.qtIdent - ver = self.manager.version # Set the template path for the SQL scripts - if ver >= 90200: - self.template_path = 'check_constraint/sql/9.2_plus' - elif ver >= 90100: - self.template_path = 'check_constraint/sql/9.1_plus' + self.template_path = 'check_constraint/sql/#{0}#'.format(self.manager.version) SQL = render_template("/".join([self.template_path, 'get_parent.sql']), @@ -402,12 +394,8 @@ class CheckConstraintView(PGChildNodeView): self.conn = self.manager.connection(did=did) self.qtIdent = driver.qtIdent - ver = self.manager.version # Set the template path for the SQL scripts - if ver >= 90200: - self.template_path = 'check_constraint/sql/9.2_plus' - elif ver >= 90100: - self.template_path = 'check_constraint/sql/9.1_plus' + self.template_path = 'check_constraint/sql/#{0}#'.format(self.manager.version) SQL = render_template("/".join([self.template_path, 'get_parent.sql']), diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/__init__.py index fe7d9349..06e90221 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/exclusion_constraint/__init__.py @@ -225,13 +225,7 @@ class ExclusionConstraintView(PGChildNodeView): ) self.conn = self.manager.connection(did=kwargs['did']) - ver = self.manager.version - if ver >= 90600: - self.template_path = 'exclusion_constraint/sql/9.6_plus' - elif ver >= 90200: - self.template_path = 'exclusion_constraint/sql/9.2_plus' - elif ver >= 90100: - self.template_path = 'exclusion_constraint/sql/9.1_plus' + self.template_path = 'exclusion_constraint/sql/#{0}#'.format(self.manager.version) # We need parent's name eg table name and schema name SQL = render_template("/".join([self.template_path, @@ -364,11 +358,7 @@ class ExclusionConstraintView(PGChildNodeView): ) self.conn = self.manager.connection(did=did) - ver = self.manager.version - if ver >= 90200: - self.template_path = 'exclusion_constraint/sql/9.2_plus' - elif ver >= 90100: - self.template_path = 'exclusion_constraint/sql/9.1_plus' + self.template_path = 'exclusion_constraint/sql/#{0}#'.format(self.manager.version) # We need parent's name eg table name and schema name SQL = render_template("/".join([self.template_path, @@ -483,11 +473,7 @@ class ExclusionConstraintView(PGChildNodeView): ) self.conn = self.manager.connection(did=did) - ver = self.manager.version - if ver >= 90200: - self.template_path = 'exclusion_constraint/sql/9.2_plus' - elif ver >= 90100: - self.template_path = 'exclusion_constraint/sql/9.1_plus' + self.template_path = 'exclusion_constraint/sql/#{0}#'.format(self.manager.version) # We need parent's name eg table name and schema name SQL = render_template("/".join([self.template_path, diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/utils.py index 0b1adebf..2490d707 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/utils.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/utils.py @@ -86,14 +86,11 @@ class DataTypeReader: """ res = [] try: - sql_template_path = '' - if conn.manager.version >= 90100: - sql_template_path = 'datatype/sql/9.1_plus' - - SQL = render_template("/".join([sql_template_path, - 'get_types.sql']), - condition=condition, - add_serials=add_serials) + + SQL = render_template( + '/datatype/sql/#{0}#/get_types.sql'.format(conn.manager.version), + condition=condition, + add_serials=add_serials) status, rset = conn.execute_2darray(SQL) if not status: return status, rset diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py index 76d57c8c..c60269cf 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/views/__init__.py @@ -183,11 +183,7 @@ def check_precondition(f): self.pg_template_path(self.manager.version) ) - ver = self.manager.version - if ver >= 90200: - self.column_template_path = 'column/sql/9.2_plus' - else: - self.column_template_path = 'column/sql/9.1_plus' + self.column_template_path = 'column/sql/#{0}#'.format(self.manager.version) return f(*args, **kwargs) diff --git a/web/pgadmin/browser/server_groups/servers/tablespaces/__init__.py b/web/pgadmin/browser/server_groups/servers/tablespaces/__init__.py index 35d390dd..30489d10 100644 --- a/web/pgadmin/browser/server_groups/servers/tablespaces/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/tablespaces/__init__.py @@ -118,11 +118,7 @@ class TablespaceView(PGChildNodeView): ) ) - ver = self.manager.version - if ver >= 90200: - self.template_path = 'tablespaces/sql/9.2_plus' - else: - self.template_path = 'tablespaces/sql/9.1_plus' + self.template_path = 'tablespaces/sql/#{0}#'.format(self.manager.version) current_app.logger.debug( "Using the template path: %s", self.template_path ) diff --git a/web/pgadmin/browser/utils.py b/web/pgadmin/browser/utils.py index 6697a215..39e1181c 100644 --- a/web/pgadmin/browser/utils.py +++ b/web/pgadmin/browser/utils.py @@ -396,9 +396,7 @@ class PGChildNodeView(NodeView): Returns: Dictionary of dependents for the selected node. """ # Set the sql_path - sql_path = '' - if conn.manager.version >= 90100: - sql_path = 'depends/sql/9.1_plus' + sql_path = 'depends/sql/#{0}#'.format(conn.manager.version) if where is None: where_clause = "WHERE dep.refobjid={0}::oid".format(object_id) diff --git a/web/pgadmin/dashboard/__init__.py b/web/pgadmin/dashboard/__init__.py index a7914a04..0a0796ac 100644 --- a/web/pgadmin/dashboard/__init__.py +++ b/web/pgadmin/dashboard/__init__.py @@ -165,10 +165,7 @@ def check_precondition(f): g.server_type = g.manager.server_type g.version = g.manager.version - if g.version < 90600: - g.template_path = 'dashboard/sql/9.1_plus' - else: - g.template_path = 'dashboard/sql/9.6_plus' + g.template_path = 'dashboard/sql/#{0}#'.format(g.version) return f(*args, **kwargs) diff --git a/web/pgadmin/tools/debugger/__init__.py b/web/pgadmin/tools/debugger/__init__.py index 9653cb9b..9848b10a 100644 --- a/web/pgadmin/tools/debugger/__init__.py +++ b/web/pgadmin/tools/debugger/__init__.py @@ -140,7 +140,6 @@ def init_function(node_type, sid, did, scid, fid, trid=None): conn = manager.connection(did=did) # Get the server version, server type and user information - ver = manager.version server_type = manager.server_type user = manager.user_info diff --git a/web/pgadmin/tools/sqleditor/command.py b/web/pgadmin/tools/sqleditor/command.py index b6aa7f5c..ecacedac 100644 --- a/web/pgadmin/tools/sqleditor/command.py +++ b/web/pgadmin/tools/sqleditor/command.py @@ -159,10 +159,8 @@ class SQLFilter(object): manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(self.sid) conn = manager.connection(did=self.did) - ver = manager.version # we will set template path for sql scripts - if ver >= 90100: - self.sql_path = 'sqleditor/sql/9.1_plus' + self.sql_path = 'sqleditor/sql/#{0}#'.format(manager.version) if conn.connected(): # Fetch the Namespace Name and object Name diff --git a/web/pgadmin/utils/sqlautocomplete/autocomplete.py b/web/pgadmin/utils/sqlautocomplete/autocomplete.py index 9375b036..5c525aad 100644 --- a/web/pgadmin/utils/sqlautocomplete/autocomplete.py +++ b/web/pgadmin/utils/sqlautocomplete/autocomplete.py @@ -88,10 +88,8 @@ class SQLAutoComplete(object): manager = get_driver(PG_DEFAULT_DRIVER).connection_manager(self.sid) - ver = manager.version # we will set template path for sql scripts - if ver >= 90100: - self.sql_path = 'sqlautocomplete/sql/9.1_plus' + self.sql_path = 'sqlautocomplete/sql/#{0}#'.format(manager.version) self.search_path = [] # Fetch the search path diff --git a/web/pgadmin/utils/tests/__init__.py b/web/pgadmin/utils/tests/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/web/pgadmin/utils/tests/templates/some_feature/sql/9.1_plus/some_action.sql b/web/pgadmin/utils/tests/templates/some_feature/sql/9.1_plus/some_action.sql new file mode 100644 index 00000000..350b1440 --- /dev/null +++ b/web/pgadmin/utils/tests/templates/some_feature/sql/9.1_plus/some_action.sql @@ -0,0 +1,2 @@ +Some SQL +some more stuff on a new line diff --git a/web/pgadmin/utils/tests/templates/some_feature/sql/9.2_plus/some_action.sql b/web/pgadmin/utils/tests/templates/some_feature/sql/9.2_plus/some_action.sql new file mode 100644 index 00000000..4abffcee --- /dev/null +++ b/web/pgadmin/utils/tests/templates/some_feature/sql/9.2_plus/some_action.sql @@ -0,0 +1 @@ +Some 9.2 SQL \ No newline at end of file diff --git a/web/pgadmin/utils/tests/test_versioned_template_loader.py b/web/pgadmin/utils/tests/test_versioned_template_loader.py new file mode 100644 index 00000000..14c7cd28 --- /dev/null +++ b/web/pgadmin/utils/tests/test_versioned_template_loader.py @@ -0,0 +1,47 @@ +import os + +from flask import Flask +from jinja2 import FileSystemLoader + +from pgadmin import VersionedTemplateLoader +from pgadmin.utils.route import BaseTestGenerator + + +class TestVersionedTemplateLoader(BaseTestGenerator): + def setUp(self): + self.loader = VersionedTemplateLoader(FakeApp()) + + def runTest(self): + self.test_get_source_returns_a_template() + self.test_get_source_when_the_version_is_9_1_returns_9_1_template() + self.test_get_source_when_the_version_is_9_3_and_there_are_templates_for_9_2_and_9_1_returns_9_2_template() + + def test_get_source_returns_a_template(self): + expected_content = "Some SQL" \ + "\nsome more stuff on a new line\n" + + content, filename, up_to_dateness = self.loader.get_source(None, "some_feature/sql/9.1_plus/some_action.sql") + + self.assertEqual(expected_content, content) + self.assertIn("some_feature/sql/9.1_plus/some_action.sql", filename) + + def test_get_source_when_the_version_is_9_1_returns_9_1_template(self): + expected_content = "Some SQL" \ + "\nsome more stuff on a new line\n" + + content, filename, up_to_dateness = self.loader.get_source(None, "some_feature/sql/#90100#/some_action.sql") + + self.assertEqual(expected_content, content) + self.assertIn("some_feature/sql/9.1_plus/some_action.sql", filename) + + def test_get_source_when_the_version_is_9_3_and_there_are_templates_for_9_2_and_9_1_returns_9_2_template(self): + content, filename, up_to_dateness = self.loader.get_source(None, "some_feature/sql/#90300#/some_action.sql") + + self.assertEqual("Some 9.2 SQL", content) + self.assertIn("some_feature/sql/9.2_plus/some_action.sql", filename) + + +class FakeApp(Flask): + def __init__(self): + super(FakeApp, self).__init__("") + self.jinja_loader = FileSystemLoader(os.path.dirname(os.path.realpath(__file__)) + "/templates") diff --git a/web/pgadmin/utils/versioned_template_loader.py b/web/pgadmin/utils/versioned_template_loader.py new file mode 100644 index 00000000..7e1ec290 --- /dev/null +++ b/web/pgadmin/utils/versioned_template_loader.py @@ -0,0 +1,31 @@ +from flask.templating import DispatchingJinjaLoader +from jinja2 import TemplateNotFound + + +class VersionedTemplateLoader(DispatchingJinjaLoader): + def get_source(self, environment, template): + template_path_parts = template.split("#", 2) + + server_versions = ( + {'name': "9.6_plus", 'number': 90600}, + {'name': "9.5_plus", 'number': 90500}, + {'name': "9.4_plus", 'number': 90400}, + {'name': "9.3_plus", 'number': 90300}, + {'name': "9.2_plus", 'number': 90200}, + {'name': "9.1_plus", 'number': 90100} + ) + + if len(template_path_parts) == 1: + return super(VersionedTemplateLoader, self).get_source(environment, template) + else: + for server_version in server_versions: + path_start, specified_version_number, file_name = template_path_parts + + if server_version['number'] > int(specified_version_number): + continue + + template_path = path_start + '/' + server_version['name'] + '/' + file_name + try: + return super(VersionedTemplateLoader, self).get_source(environment, template_path) + except TemplateNotFound: + continue diff --git a/web/regression/utils/__init__.py b/web/regression/utils/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/web/setup.py b/web/setup.py index 2677c989..b4dd771b 100755 --- a/web/setup.py +++ b/web/setup.py @@ -30,6 +30,7 @@ import config # Get the config database schema version. We store this in pgadmin.model # as it turns out that putting it in the config files isn't a great idea from pgadmin.model import SCHEMA_VERSION +from pgadmin.utils.versioned_template_loader import VersionedTemplateLoader config.SETTINGS_SCHEMA_VERSION = SCHEMA_VERSION