Projet

Général

Profil

0001-pwa-import-export-pwa-application-icon-44833.patch

Nicolas Roche, 30 juillet 2020 19:09

Télécharger (4,35 ko)

Voir les différences:

Subject: [PATCH] pwa: import/export pwa application-icon (#44833)

 combo/apps/pwa/models.py    | 15 ++++++++++++++-
 tests/test_import_export.py | 18 ++++++++++++++++++
 2 files changed, 32 insertions(+), 1 deletion(-)
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
-