forked from CGM_Public/pretix_original
Fix widget not regenerating
Adds support for use_vite variant to updateassets management command and unifies widget generation code
This commit is contained in:
@@ -19,19 +19,9 @@
|
|||||||
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
|
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
|
||||||
# <https://www.gnu.org/licenses/>.
|
# <https://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
import hashlib
|
|
||||||
|
|
||||||
from django.conf import settings
|
|
||||||
from django.core.cache import cache
|
|
||||||
from django.core.files.base import ContentFile, File
|
|
||||||
from django.core.files.storage import default_storage
|
|
||||||
from django.core.management.base import BaseCommand
|
from django.core.management.base import BaseCommand
|
||||||
from django_scopes import scopes_disabled
|
|
||||||
|
|
||||||
from pretix.base.settings import GlobalSettingsObject
|
from pretix.presale.views.widget import regenerate_all_widget_js
|
||||||
from pretix.presale.views.widget import (
|
|
||||||
generate_widget_js, version_max, version_min,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class Command(BaseCommand):
|
class Command(BaseCommand):
|
||||||
@@ -41,26 +31,5 @@ class Command(BaseCommand):
|
|||||||
parser.add_argument('--organizer', action='store', type=str)
|
parser.add_argument('--organizer', action='store', type=str)
|
||||||
parser.add_argument('--event', action='store', type=str)
|
parser.add_argument('--event', action='store', type=str)
|
||||||
|
|
||||||
@scopes_disabled()
|
|
||||||
def handle(self, *args, **options):
|
def handle(self, *args, **options):
|
||||||
gs = GlobalSettingsObject()
|
regenerate_all_widget_js()
|
||||||
for lc, ll in settings.LANGUAGES:
|
|
||||||
for version in range(version_min, version_max + 1):
|
|
||||||
data = generate_widget_js(version, lc).encode()
|
|
||||||
checksum = hashlib.sha1(data).hexdigest()
|
|
||||||
settings_file_key = 'widget_file_v{}_{}'.format(version, lc)
|
|
||||||
settings_checksum_key = 'widget_checksum_v{}_{}'.format(version, lc)
|
|
||||||
fname = gs.settings.get(settings_file_key)
|
|
||||||
if not fname or gs.settings.get(settings_checksum_key, '') != checksum:
|
|
||||||
newname = default_storage.save(
|
|
||||||
'pub/widget/widget.v{}.{}.{}.js'.format(version, lc, checksum),
|
|
||||||
ContentFile(data)
|
|
||||||
)
|
|
||||||
gs.settings.set(settings_file_key, 'file://' + newname)
|
|
||||||
gs.settings.set(settings_checksum_key, checksum)
|
|
||||||
cache.delete('widget_js_data_v{}_{}'.format(version, lc))
|
|
||||||
if fname:
|
|
||||||
if isinstance(fname, File):
|
|
||||||
default_storage.delete(fname.name)
|
|
||||||
else:
|
|
||||||
default_storage.delete(fname)
|
|
||||||
|
|||||||
@@ -229,6 +229,60 @@ def generate_widget_js(version, lang, use_vite=False):
|
|||||||
return f"/* v{version} */\n" + code
|
return f"/* v{version} */\n" + code
|
||||||
|
|
||||||
|
|
||||||
|
def get_widget_js(version, lang, use_vite, force_regenerate=False):
|
||||||
|
variant = 'vite' if use_vite else 'legacy'
|
||||||
|
cache_prefix = 'widget_js_data_v{}_{}_{}'.format(version, lang, variant)
|
||||||
|
settings_key = 'widget_file_v{}_{}_{}'.format(version, lang, variant)
|
||||||
|
checksum_key = 'widget_checksum_v{}_{}_{}'.format(version, lang, variant)
|
||||||
|
gs = GlobalSettingsObject()
|
||||||
|
|
||||||
|
if not force_regenerate:
|
||||||
|
cached_js = cache.get(cache_prefix)
|
||||||
|
if cached_js and not settings.DEBUG:
|
||||||
|
return cached_js
|
||||||
|
|
||||||
|
fname = gs.settings.get(settings_key)
|
||||||
|
if fname and not settings.DEBUG:
|
||||||
|
if isinstance(fname, File):
|
||||||
|
fname = fname.name
|
||||||
|
try:
|
||||||
|
data = default_storage.open(fname).read()
|
||||||
|
cache.set(cache_prefix, data, 3600 * 4)
|
||||||
|
return data
|
||||||
|
except:
|
||||||
|
logger.exception('Failed to open widget.js')
|
||||||
|
else:
|
||||||
|
fname = gs.settings.get(settings_key)
|
||||||
|
|
||||||
|
data = generate_widget_js(version, lang, use_vite=use_vite).encode()
|
||||||
|
checksum = hashlib.sha1(data).hexdigest()
|
||||||
|
should_save = (
|
||||||
|
not fname
|
||||||
|
or gs.settings.get(checksum_key, '') != checksum
|
||||||
|
)
|
||||||
|
if should_save and not settings.DEBUG:
|
||||||
|
newname = default_storage.save(
|
||||||
|
'widget/widget.{}.{}.{}.{}.js'.format(version, lang, variant, checksum),
|
||||||
|
ContentFile(data)
|
||||||
|
)
|
||||||
|
gs.settings.set(settings_key, 'file://' + newname)
|
||||||
|
gs.settings.set(checksum_key, checksum)
|
||||||
|
cache.set(cache_prefix, data, 3600 * 4)
|
||||||
|
if fname:
|
||||||
|
if isinstance(fname, File):
|
||||||
|
default_storage.delete(fname.name)
|
||||||
|
else:
|
||||||
|
default_storage.delete(fname)
|
||||||
|
return data
|
||||||
|
|
||||||
|
|
||||||
|
def regenerate_all_widget_js():
|
||||||
|
for lc, ll in settings.LANGUAGES:
|
||||||
|
for version in range(version_min, version_max + 1):
|
||||||
|
for use_vite in [True, False]:
|
||||||
|
get_widget_js(version, lc, use_vite, force_regenerate=True)
|
||||||
|
|
||||||
|
|
||||||
@gzip_page
|
@gzip_page
|
||||||
@condition(etag_func=widget_js_etag)
|
@condition(etag_func=widget_js_etag)
|
||||||
def widget_js(request, version, lang, **kwargs):
|
def widget_js(request, version, lang, **kwargs):
|
||||||
@@ -239,43 +293,9 @@ def widget_js(request, version, lang, **kwargs):
|
|||||||
version = version_min
|
version = version_min
|
||||||
|
|
||||||
use_vite = _use_vite(request)
|
use_vite = _use_vite(request)
|
||||||
variant = 'vite' if use_vite else 'legacy'
|
data = get_widget_js(version, lang, use_vite)
|
||||||
cache_prefix = 'widget_js_data_v{}_{}_{}'.format(version, lang, variant)
|
|
||||||
|
|
||||||
cached_js = cache.get(cache_prefix)
|
resp = HttpResponse(data, content_type='text/javascript')
|
||||||
if cached_js and not settings.DEBUG:
|
|
||||||
resp = HttpResponse(cached_js, content_type='text/javascript')
|
|
||||||
resp['Access-Control-Allow-Origin'] = '*'
|
|
||||||
return resp
|
|
||||||
|
|
||||||
settings_key = 'widget_file_v{}_{}_{}'.format(version, lang, variant)
|
|
||||||
checksum_key = 'widget_checksum_v{}_{}_{}'.format(version, lang, variant)
|
|
||||||
|
|
||||||
gs = GlobalSettingsObject()
|
|
||||||
fname = gs.settings.get(settings_key)
|
|
||||||
resp = None
|
|
||||||
if fname and not settings.DEBUG:
|
|
||||||
if isinstance(fname, File):
|
|
||||||
fname = fname.name
|
|
||||||
try:
|
|
||||||
data = default_storage.open(fname).read()
|
|
||||||
resp = HttpResponse(data, content_type='text/javascript')
|
|
||||||
cache.set(cache_prefix, data, 3600 * 4)
|
|
||||||
except:
|
|
||||||
logger.exception('Failed to open widget.js')
|
|
||||||
|
|
||||||
if not resp:
|
|
||||||
data = generate_widget_js(version, lang, use_vite=use_vite).encode()
|
|
||||||
checksum = hashlib.sha1(data).hexdigest()
|
|
||||||
if not settings.DEBUG:
|
|
||||||
newname = default_storage.save(
|
|
||||||
'widget/widget.{}.{}.{}.{}.js'.format(version, lang, variant, checksum),
|
|
||||||
ContentFile(data)
|
|
||||||
)
|
|
||||||
gs.settings.set(settings_key, 'file://' + newname)
|
|
||||||
gs.settings.set(checksum_key, checksum)
|
|
||||||
cache.set(cache_prefix, data, 3600 * 4)
|
|
||||||
resp = HttpResponse(data, content_type='text/javascript')
|
|
||||||
resp['Access-Control-Allow-Origin'] = '*'
|
resp['Access-Control-Allow-Origin'] = '*'
|
||||||
return resp
|
return resp
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user