From 6ce98de9319d34a045576cc41e26cd9ffde5fbab Mon Sep 17 00:00:00 2001 From: Kara Engelhardt Date: Thu, 13 Aug 2026 11:01:38 +0200 Subject: [PATCH] Fix widget not regenerating Adds support for use_vite variant to updateassets management command and unifies widget generation code --- .../management/commands/updateassets.py | 35 +------ src/pretix/presale/views/widget.py | 92 +++++++++++-------- 2 files changed, 58 insertions(+), 69 deletions(-) diff --git a/src/pretix/presale/management/commands/updateassets.py b/src/pretix/presale/management/commands/updateassets.py index b1743907ce..9b75047e8d 100644 --- a/src/pretix/presale/management/commands/updateassets.py +++ b/src/pretix/presale/management/commands/updateassets.py @@ -19,19 +19,9 @@ # You should have received a copy of the GNU Affero General Public License along with this program. If not, see # . # -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_scopes import scopes_disabled -from pretix.base.settings import GlobalSettingsObject -from pretix.presale.views.widget import ( - generate_widget_js, version_max, version_min, -) +from pretix.presale.views.widget import regenerate_all_widget_js class Command(BaseCommand): @@ -41,26 +31,5 @@ class Command(BaseCommand): parser.add_argument('--organizer', action='store', type=str) parser.add_argument('--event', action='store', type=str) - @scopes_disabled() def handle(self, *args, **options): - gs = GlobalSettingsObject() - 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) + regenerate_all_widget_js() diff --git a/src/pretix/presale/views/widget.py b/src/pretix/presale/views/widget.py index e0a28311b5..91d8c0fa4d 100644 --- a/src/pretix/presale/views/widget.py +++ b/src/pretix/presale/views/widget.py @@ -229,6 +229,60 @@ def generate_widget_js(version, lang, use_vite=False): 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 @condition(etag_func=widget_js_etag) def widget_js(request, version, lang, **kwargs): @@ -239,43 +293,9 @@ def widget_js(request, version, lang, **kwargs): version = version_min use_vite = _use_vite(request) - variant = 'vite' if use_vite else 'legacy' - cache_prefix = 'widget_js_data_v{}_{}_{}'.format(version, lang, variant) + data = get_widget_js(version, lang, use_vite) - cached_js = cache.get(cache_prefix) - 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 = HttpResponse(data, content_type='text/javascript') resp['Access-Control-Allow-Origin'] = '*' return resp