mirror of
https://github.com/pretix/pretix.git
synced 2026-08-13 11:17:01 +00:00
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
|
||||
# <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_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()
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user