Hi Hackers! Since we are preparing to add greenplum support, we made a new template loader to automatically pick the available sql template file that corresponds to the postgres version number.
Our next patch will be to remove duplicated sql template files since many of the files are identical between versions. Cheers, George & Tira
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
-- Sent via pgadmin-hackers mailing list (pgadmin-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgadmin-hackers