mirror of
https://github.com/pgadmin-org/pgadmin4.git
synced 2025-02-25 18:55:31 -06:00
Create a template loader for SQL templates.
This will automatically find the correct version of a template for the server version, and allows us to remove templates that were previously duplicated for different server versions. Patch by George & Tira at Pivotal. Review by me and Murtuza from EDB. Discussion: https://www.postgresql.org/message-id/flat/CAHowoHaU9_pkCt%2B1g8dpY3hsXXZmsJZiJH-3-_Hd%2BC1MxiGhtA%40mail.gmail.com#CAHowoHaU9_pkCt+1g8dpY3hsXXZmsJZiJH-3-_Hd+C1MxiGhtA@mail.gmail.com
This commit is contained in:
committed by
Dave Page
parent
42d3121369
commit
19be3529f8
@@ -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
|
||||
|
||||
0
web/pgadmin/utils/tests/__init__.py
Normal file
0
web/pgadmin/utils/tests/__init__.py
Normal file
@@ -0,0 +1,2 @@
|
||||
Some SQL
|
||||
some more stuff on a new line
|
||||
@@ -0,0 +1 @@
|
||||
Some 9.2 SQL
|
||||
47
web/pgadmin/utils/tests/test_versioned_template_loader.py
Normal file
47
web/pgadmin/utils/tests/test_versioned_template_loader.py
Normal file
@@ -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")
|
||||
31
web/pgadmin/utils/versioned_template_loader.py
Normal file
31
web/pgadmin/utils/versioned_template_loader.py
Normal file
@@ -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
|
||||
Reference in New Issue
Block a user