From 56658a9f8e676bb287e8e191b9acca74a23fc4e1 Mon Sep 17 00:00:00 2001 From: Anthony Emengo Date: Thu, 3 May 2018 15:54:15 +0100 Subject: [PATCH] Fix the template loader to work reliably under Windows (fixing external tables under Greenplum). Fixes #3324 --- docs/en_US/release_notes_3_1.rst | 3 +- .../utils/versioned_template_loader.py | 91 ++++++++++++------- 2 files changed, 59 insertions(+), 35 deletions(-) diff --git a/docs/en_US/release_notes_3_1.rst b/docs/en_US/release_notes_3_1.rst index b9df49bce..527277aba 100644 --- a/docs/en_US/release_notes_3_1.rst +++ b/docs/en_US/release_notes_3_1.rst @@ -18,4 +18,5 @@ Bug fixes | `Bug #3257 `_ - Catch errors when trying to EXPLAIN an invalid query | `Bug #3290 `_ - Close button added to the alertify message box, which pops up in case of backend error | `Bug #3306 `_ - Fixed display SQL of table with index for GreenPlum database -| `Bug #3308 `_ - Fixed issue where icon for Partitioned tables was the same as Non Partitioned tables for GreenPlum database \ No newline at end of file +| `Bug #3308 `_ - Fixed issue where icon for Partitioned tables was the same as Non Partitioned tables for GreenPlum database +| `Bug #3324 `_ - Fix the template loader to work reliably under Windows (fixing external tables under Greenplum) \ No newline at end of file diff --git a/web/pgadmin/utils/versioned_template_loader.py b/web/pgadmin/utils/versioned_template_loader.py index 8e8259fe3..3481978b9 100644 --- a/web/pgadmin/utils/versioned_template_loader.py +++ b/web/pgadmin/utils/versioned_template_loader.py @@ -12,47 +12,23 @@ from jinja2 import TemplateNotFound class VersionedTemplateLoader(DispatchingJinjaLoader): def get_source(self, environment, template): - template_path_parts = template.split("#", 3) - - postgres_versions = ( - {'name': "10_plus", 'number': 100000}, - {'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}, - {'name': "9.0_plus", 'number': 90000}, - {'name': "default", 'number': 0} - ) - - gpdb_versions = ( - {'name': "gpdb_5.0_plus", 'number': 80323}, - {'name': "5_plus", 'number': 80323}, - {'name': "default", 'number': 0} - ) - - server_versions = postgres_versions - if len(template_path_parts) == 1: + specified_version_number, exists = parse_version(template) + if not exists: return super(VersionedTemplateLoader, self).get_source( environment, template ) - if len(template_path_parts) == 4: - path_start, server_type, specified_version_number, file_name = \ - template_path_parts - if server_type == 'gpdb': - server_versions = gpdb_versions - else: - path_start, specified_version_number, file_name = \ - template_path_parts + template_dir, file_name = parse_template(template) - for server_version in server_versions: - if server_version['number'] > int(specified_version_number): + for version_mapping in get_version_mapping(template): + if version_mapping['number'] > specified_version_number: continue - template_path = path_start + '/' + \ - server_version['name'] + '/' + file_name + template_path = '/'.join([ + template_dir, + version_mapping['name'], + file_name + ]) try: return super(VersionedTemplateLoader, self).get_source( @@ -61,3 +37,50 @@ class VersionedTemplateLoader(DispatchingJinjaLoader): except TemplateNotFound: continue raise TemplateNotFound(template) + + +def parse_version(template): + template_path_parts = template.split("#", 3) + if len(template_path_parts) == 1: + return "", False + + if len(template_path_parts) == 3: + _, version, _ = template_path_parts + return int(version), True + + if len(template_path_parts) == 4: + _, _, version, _ = template_path_parts + return int(version), True + + raise TemplateNotFound(template) + + +def parse_template(template): + template_path_parts = template.split("#", 3) + return template_path_parts[0].strip('\\').strip('/'), \ + template_path_parts[-1].strip('\\').strip('/') + + +def get_version_mapping(template): + template_path_parts = template.split("#", 3) + + server_type = None + if len(template_path_parts) == 4: + _, server_type, _, _ = template_path_parts + + if server_type == 'gpdb': + return ( + {'name': "gpdb_5.0_plus", 'number': 80323}, + {'name': "5_plus", 'number': 80323}, + {'name': "default", 'number': 0} + ) + + return ({'name': "10_plus", 'number': 100000}, + {'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}, + {'name': "9.0_plus", 'number': 90000}, + {'name': "default", 'number': 0})