Added version number for URL's to ensure that files are only cached on a per-version basis. Fixes #2136.

This commit is contained in:
Aditya Toshniwal
2018-08-06 15:21:10 +05:30
committed by Akshay Joshi
parent a17aa212f0
commit cb8a288f85
5 changed files with 112 additions and 0 deletions

View File

@@ -598,6 +598,40 @@ def create_app(app_name=None):
return response
##########################################################################
# Cache busting
##########################################################################
# Version number to be added to all static file url requests
# This is used by url_for function when generating urls
# This will solve caching issues when application is upgrading
# This is called - Cache Busting
@app.url_defaults
def add_internal_version(endpoint, values):
extensions = config.APP_VERSION_EXTN
# Add the internal version only if it is set
if config.APP_VERSION_PARAM is not None and \
config.APP_VERSION_PARAM != '':
# If there is a filename, add the version
if 'filename' in values \
and values['filename'].endswith(extensions):
values[config.APP_VERSION_PARAM] = config.APP_VERSION_INT
else:
# Sometimes there may be direct endpoint for some files
# There will be only one rule for such endpoints
urls = [url for url in app.url_map.iter_rules(endpoint)]
if len(urls) == 1 and urls[0].rule.endswith(extensions):
values[config.APP_VERSION_PARAM] = \
config.APP_VERSION_INT
# Strip away internal version param before sending further to app as it was
# required for cache busting only
@app.url_value_preprocessor
def strip_version_number(endpoint, values):
if (config.APP_VERSION_PARAM in values):
values.pop(config.APP_VERSION_PARAM)
##########################################################################
# Minify output
##########################################################################

View File

@@ -0,0 +1,65 @@
##########################################################################
#
# pgAdmin 4 - PostgreSQL Tools
#
# Copyright (C) 2013 - 2018, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################
from pgadmin.utils.route import BaseTestGenerator
from flask import url_for
import config
from pgadmin import create_app
class InternalVersionTestCase(BaseTestGenerator):
"""
"""
scenarios = [
('TestCase with INTERNAL_VERSION_PARAM none', dict(
app_version=30100,
version_param='',
version_extn=('.js',),
endpoint='static',
filename='js/generated/pgadmin_commons.js',
version_expected=False
)),
('TestCase with INTERNAL_VERSION_PARAM present', dict(
app_version=30100,
version_param='intver',
version_extn=('.js',),
endpoint='static',
filename='js/generated/pgadmin_commons.js',
version_expected=True
)),
('TestCase with INTERNAL_VERSION_EXTN different', dict(
app_version=30100,
version_param='intver',
version_extn=('.css',),
endpoint='static',
filename='js/generated/pgadmin_commons.js',
version_expected=False
)),
]
def setUp(self):
self.config_bak = config
def runTest(self):
config.APP_VERSION_INT = self.app_version
config.INTERNAL_VERSION_PARAM = self.version_param
config.INTERNAL_VERSION_EXTN = self.version_extn
version_string = "?{0}={1}".format(config.INTERNAL_VERSION_PARAM,
config.APP_VERSION_INT)
app = create_app()
with app.app_context(), app.test_request_context():
url = url_for(self.endpoint, filename=self.filename)
if self.version_expected:
self.assertTrue(url.endswith(version_string))
else:
self.assertFalse(url.endswith(version_string))
def tearDown(self):
config = self.config_bak

View File

@@ -34,6 +34,9 @@
<script type="text/javascript">
require.config({
baseUrl: '',
{% if config.APP_VERSION_PARAM is not none and config.APP_VERSION_PARAM != '' %}
urlArgs: '{{config.APP_VERSION_PARAM}}={{config.APP_VERSION_INT}}',
{% endif %}
waitSeconds: 0,
shim: {},
paths: {