codekingpro/portable-devtools
114k
1##########################################################################2#3# pgAdmin 4 - PostgreSQL Tools4#5# Copyright (C) 2013 - 2024, The pgAdmin Development Team6# This software is released under the PostgreSQL Licence7#8##########################################################################9from flask.templating import DispatchingJinjaLoader10from jinja2 import TemplateNotFound11 12 13class VersionedTemplateLoader(DispatchingJinjaLoader):14 def get_source(self, environment, template):15 specified_version_number, exists = parse_version(template)16 if not exists:17 return super().get_source(18 environment, template19 )20 21 template_dir, file_name = parse_template(template)22 23 for version_mapping in get_version_mapping(template):24 if version_mapping['number'] > specified_version_number:25 continue26 27 template_path = '/'.join([28 template_dir,29 version_mapping['name'],30 file_name31 ])32 33 try:34 return super().get_source(35 environment, template_path36 )37 except TemplateNotFound:38 continue39 raise TemplateNotFound(template)40 41 42def parse_version(template):43 template_path_parts = template.split("#", 3)44 if len(template_path_parts) == 1:45 return "", False46 47 if len(template_path_parts) == 3:48 _, version, _ = template_path_parts49 return int(version), True50 51 if len(template_path_parts) == 4:52 _, _, version, _ = template_path_parts53 return int(version), True54 55 raise TemplateNotFound(template)56 57 58def parse_template(template):59 template_path_parts = template.split("#", 3)60 return template_path_parts[0].strip('\\').strip('/'), \61 template_path_parts[-1].strip('\\').strip('/')62 63 64def get_version_mapping(template):65 template_path_parts = template.split("#", 3)66 67 if len(template_path_parts) == 4:68 _, _, _, _ = template_path_parts69 70 return get_version_mapping_directories()71 72 73def get_version_mapping_directories():74 """75 This function will return all the version mapping directories76 :param server_type:77 :return:78 """79 return ({'name': "16_plus", 'number': 160000},80 {'name': "15_plus", 'number': 150000},81 {'name': "14_plus", 'number': 140000},82 {'name': "13_plus", 'number': 130000},83 {'name': "12_plus", 'number': 120000},84 {'name': "11_plus", 'number': 110000},85 {'name': "default", 'number': 0})86 