pwa: import/export pwa application-icon (#44833)
This commit is contained in:
parent
24ee60d321
commit
95cb806044
|
@ -81,7 +81,10 @@ class PwaSettings(models.Model):
|
|||
if not obj.id:
|
||||
return {}
|
||||
serialized_settings = json.loads(serializers.serialize('json', [obj]))
|
||||
return serialized_settings[0].get('fields')
|
||||
result = serialized_settings[0].get('fields')
|
||||
if obj.application_icon:
|
||||
result['icon:base64'] = force_text(base64.encodebytes(obj.application_icon.read()))
|
||||
return result
|
||||
|
||||
@classmethod
|
||||
def load_serialized_settings(cls, json_settings):
|
||||
|
@ -89,9 +92,20 @@ class PwaSettings(models.Model):
|
|||
return
|
||||
|
||||
obj = cls.singleton()
|
||||
decoded_icon = None
|
||||
if json_settings.get('icon:base64'):
|
||||
decoded_icon = base64.decodebytes(force_bytes(json_settings['icon:base64']))
|
||||
del json_settings['icon:base64']
|
||||
for attr in json_settings:
|
||||
setattr(obj, attr, json_settings[attr])
|
||||
obj.save()
|
||||
if decoded_icon:
|
||||
if not default_storage.exists(obj.application_icon.name) or obj.application_icon.read() != decoded_icon:
|
||||
# save new file
|
||||
path = obj.application_icon.name
|
||||
if path.startswith('pwa/'):
|
||||
path = path[len('pwa/'):]
|
||||
obj.application_icon.save(path, ContentFile(decoded_icon))
|
||||
|
||||
@classmethod
|
||||
def get_default_application_name(cls):
|
||||
|
|
|
@ -261,6 +261,12 @@ def test_import_export_pwa_settings(app):
|
|||
pwa_settings.offline_text = 'Hello world'
|
||||
pwa_settings.offline_retry_button = False
|
||||
pwa_settings.save()
|
||||
|
||||
# check exort with no application icon
|
||||
output = get_output_of_command('export_site')
|
||||
|
||||
pwa_settings.application_icon = File(BytesIO(b'te\30st'), 'test.png')
|
||||
pwa_settings.save()
|
||||
output = get_output_of_command('export_site')
|
||||
import_site(data={}, clean=True)
|
||||
assert PwaSettings.objects.all().count() == 0
|
||||
|
@ -268,6 +274,23 @@ def test_import_export_pwa_settings(app):
|
|||
import_site(data=json.loads(output))
|
||||
assert PwaSettings.singleton().offline_retry_button is False
|
||||
assert PwaSettings.singleton().offline_text == 'Hello world'
|
||||
# check identical file was not touched
|
||||
assert os.path.basename(PwaSettings.objects.get().application_icon.file.name) == 'test.png'
|
||||
assert PwaSettings.objects.get().application_icon.read() == b'te\30st'
|
||||
|
||||
# check with a change in icon file content
|
||||
data = json.loads(output)
|
||||
data['pwa']['settings']['icon:base64'] = force_text(base64.encodebytes(b'TEST'))
|
||||
import_site(data=data)
|
||||
assert PwaSettings.objects.get().application_icon.read() == b'TEST'
|
||||
|
||||
# check with a change in icon file name
|
||||
data = json.loads(output)
|
||||
data['pwa']['settings']['icon:base64'] = force_text(base64.encodebytes(b'TEST2'))
|
||||
data['pwa']['settings']['application_icon'] = 'pwa/test2.png'
|
||||
import_site(data=data)
|
||||
assert os.path.basename(PwaSettings.objects.get().application_icon.file.name) == 'test2.png'
|
||||
assert PwaSettings.objects.get().application_icon.read() == b'TEST2'
|
||||
|
||||
def test_import_export_pwa_navigation(app, some_data):
|
||||
page = Page.objects.get(slug='one')
|
||||
|
|
Loading…
Reference in New Issue