0001-pwa-import-export-pwa-application-icon-44833.patch
combo/apps/pwa/models.py | ||
---|---|---|
76 | 76 |
return cls.objects.first() or cls() |
77 | 77 | |
78 | 78 |
@classmethod |
79 | 79 |
def export_for_json(cls): |
80 | 80 |
obj = cls.singleton() |
81 | 81 |
if not obj.id: |
82 | 82 |
return {} |
83 | 83 |
serialized_settings = json.loads(serializers.serialize('json', [obj])) |
84 |
return serialized_settings[0].get('fields') |
|
84 |
result = serialized_settings[0].get('fields') |
|
85 |
result['icon:base64'] = force_text(base64.encodebytes(obj.application_icon.read())) |
|
86 |
return result |
|
85 | 87 | |
86 | 88 |
@classmethod |
87 | 89 |
def load_serialized_settings(cls, json_settings): |
88 | 90 |
if not json_settings: |
89 | 91 |
return |
90 | 92 | |
91 | 93 |
obj = cls.singleton() |
94 |
decoded_icon = None |
|
95 |
if json_settings.get('icon:base64'): |
|
96 |
decoded_icon = base64.decodebytes(force_bytes(json_settings['icon:base64'])) |
|
97 |
del json_settings['icon:base64'] |
|
92 | 98 |
for attr in json_settings: |
93 | 99 |
setattr(obj, attr, json_settings[attr]) |
94 | 100 |
obj.save() |
101 |
if decoded_icon: |
|
102 |
if not default_storage.exists(obj.application_icon.name) or obj.application_icon.read() != decoded_icon: |
|
103 |
# save new file |
|
104 |
path = obj.application_icon.name |
|
105 |
if path.startswith('pwa/'): |
|
106 |
path = path[len('pwa/'):] |
|
107 |
obj.application_icon.save(path, ContentFile(decoded_icon)) |
|
95 | 108 | |
96 | 109 |
@classmethod |
97 | 110 |
def get_default_application_name(cls): |
98 | 111 |
return settings.TEMPLATE_VARS.get('global_title') or 'Compte Citoyen' |
99 | 112 | |
100 | 113 |
def get_application_name(self): |
101 | 114 |
return self.application_name or self.get_default_application_name() |
102 | 115 |
tests/test_import_export.py | ||
---|---|---|
255 | 255 |
import_site(data={}, if_empty=True) |
256 | 256 |
assert Asset.objects.count() == 2 |
257 | 257 | |
258 | 258 |
def test_import_export_pwa_settings(app): |
259 | 259 |
output = get_output_of_command('export_site') |
260 | 260 |
pwa_settings = PwaSettings.singleton() |
261 | 261 |
pwa_settings.offline_text = 'Hello world' |
262 | 262 |
pwa_settings.offline_retry_button = False |
263 |
pwa_settings.application_icon = File(BytesIO(b'te\30st'), 'test.png') |
|
263 | 264 |
pwa_settings.save() |
264 | 265 |
output = get_output_of_command('export_site') |
265 | 266 |
import_site(data={}, clean=True) |
266 | 267 |
assert PwaSettings.objects.all().count() == 0 |
267 | 268 | |
268 | 269 |
import_site(data=json.loads(output)) |
269 | 270 |
assert PwaSettings.singleton().offline_retry_button is False |
270 | 271 |
assert PwaSettings.singleton().offline_text == 'Hello world' |
272 |
# check identical file was not touched |
|
273 |
assert os.path.basename(PwaSettings.objects.get().application_icon.file.name) == 'test.png' |
|
274 |
assert PwaSettings.objects.get().application_icon.read() == b'te\30st' |
|
275 | ||
276 |
# check with a change in icon file content |
|
277 |
data = json.loads(output) |
|
278 |
data['pwa']['settings']['icon:base64'] = force_text(base64.encodebytes(b'TEST')) |
|
279 |
import_site(data=data) |
|
280 |
assert PwaSettings.objects.get().application_icon.read() == b'TEST' |
|
281 | ||
282 |
# check with a change in icon file name |
|
283 |
data = json.loads(output) |
|
284 |
data['pwa']['settings']['icon:base64'] = force_text(base64.encodebytes(b'TEST2')) |
|
285 |
data['pwa']['settings']['application_icon'] = 'pwa/test2.png' |
|
286 |
import_site(data=data) |
|
287 |
assert os.path.basename(PwaSettings.objects.get().application_icon.file.name) == 'test2.png' |
|
288 |
assert PwaSettings.objects.get().application_icon.read() == b'TEST2' |
|
271 | 289 | |
272 | 290 |
def test_import_export_pwa_navigation(app, some_data): |
273 | 291 |
page = Page.objects.get(slug='one') |
274 | 292 |
entry1 = PwaNavigationEntry(label='a', url='/', order=0) |
275 | 293 |
entry2 = PwaNavigationEntry(link_page=page, order=1, icon=File(BytesIO(b'te\30st'), 'test.png')) |
276 | 294 |
entry1.save() |
277 | 295 |
entry2.save() |
278 | 296 |
output = get_output_of_command('export_site') |
279 |
- |