pwa: import/export pwa application-icon (#44833)

This commit is contained in:
Nicolas Roche 2020-07-30 19:06:58 +02:00
parent 24ee60d321
commit 95cb806044
2 changed files with 38 additions and 1 deletions

View File

@ -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):

View File

@ -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')