diff --git a/combo/apps/pwa/manager_views.py b/combo/apps/pwa/manager_views.py index 9b0d1161..8ea68829 100644 --- a/combo/apps/pwa/manager_views.py +++ b/combo/apps/pwa/manager_views.py @@ -32,6 +32,16 @@ class ManagerHomeView(UpdateView): fields = '__all__' success_url = reverse_lazy('pwa-manager-homepage') + def get_initial(self): + initial = super(ManagerHomeView, self).get_initial() + initial['application_name'] = self.get_object().get_application_name() + return initial + + def form_valid(self, form): + if form.instance.application_name == PwaSettings.get_default_application_name(): + form.instance.application_name = '' + return super(ManagerHomeView, self).form_valid(form) + def get_object(self): return PwaSettings.singleton() diff --git a/combo/apps/pwa/migrations/0005_pwasettings_application_name.py b/combo/apps/pwa/migrations/0005_pwasettings_application_name.py new file mode 100644 index 00000000..db848619 --- /dev/null +++ b/combo/apps/pwa/migrations/0005_pwasettings_application_name.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.20 on 2019-04-16 14:08 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('pwa', '0004_pwasettings_application_icon'), + ] + + operations = [ + migrations.AddField( + model_name='pwasettings', + name='application_name', + field=models.CharField(blank=True, max_length=64, verbose_name='Application Name'), + ), + ] diff --git a/combo/apps/pwa/models.py b/combo/apps/pwa/models.py index 47070827..355291a1 100644 --- a/combo/apps/pwa/models.py +++ b/combo/apps/pwa/models.py @@ -36,6 +36,10 @@ from combo import utils class PwaSettings(models.Model): APPLICATION_ICON_SIZES = ['%sx%s' % (x, x) for x in (48, 96, 192, 256, 512)] + application_name = models.CharField( + verbose_name=_('Application Name'), + max_length=64, + blank=True) application_icon = models.FileField( verbose_name=_('Application Icon'), help_text=_(u'Should be a square of at least 512×512 pixels.'), @@ -71,6 +75,13 @@ class PwaSettings(models.Model): setattr(obj, attr, json_settings[attr]) obj.save() + @classmethod + def get_default_application_name(cls): + return settings.TEMPLATE_VARS.get('global_title') or 'Compte Citoyen' + + def get_application_name(self): + return self.application_name or self.get_default_application_name() + class PwaNavigationEntry(models.Model): label = models.CharField(verbose_name=_('Label'), max_length=150, blank=True) diff --git a/combo/apps/pwa/templates/combo/manifest.json b/combo/apps/pwa/templates/combo/manifest.json index bbb71d3d..c6aae0ca 100644 --- a/combo/apps/pwa/templates/combo/manifest.json +++ b/combo/apps/pwa/templates/combo/manifest.json @@ -1,6 +1,6 @@ {% load static thumbnail %}{ - "name": "{% firstof global_title "Compte Citoyen" %}", - "short_name": "{% firstof global_title "Compte Citoyen" %}", + "name": "{{ pwa_settings.get_application_name }}", + "short_name": "{{ pwa_settings.get_application_name }}", "start_url": "{% firstof pwa_start_url "/" %}", {% if theme_color %} "background_color": "{{ theme_color }}", diff --git a/combo/apps/pwa/templates/combo/pwa/manager_home.html b/combo/apps/pwa/templates/combo/pwa/manager_home.html index d9d2d1cb..507e1329 100644 --- a/combo/apps/pwa/templates/combo/pwa/manager_home.html +++ b/combo/apps/pwa/templates/combo/pwa/manager_home.html @@ -15,7 +15,7 @@ {% endthumbnail %} {% endif %} -
{% firstof global_title "Compte Citoyen" %}
+
{{ pwa_settings.get_application_name }}
diff --git a/tests/test_pwa.py b/tests/test_pwa.py index c3753773..88ebf6f0 100644 --- a/tests/test_pwa.py +++ b/tests/test_pwa.py @@ -147,6 +147,20 @@ def test_pwa_manager(app, admin_user): resp = resp.form.submit().follow() assert PwaSettings.singleton().application_icon.name == 'pwa/test.png' + # make sure another application name was not saved + assert not PwaSettings.singleton().application_name + resp = app.get('/manage/pwa/') + assert resp.form['application_name'].value == 'Compte Citoyen' + resp.form['application_name'] = 'Test' + resp = resp.form.submit().follow() + assert PwaSettings.singleton().application_name == 'Test' + + # make sure using the default application name switches back to + # global_title/compte citoyen. + resp.form['application_name'] = 'Compte Citoyen' + resp = resp.form.submit().follow() + assert not PwaSettings.singleton().application_name + def test_pwa_offline_page(app): PwaSettings.objects.all().delete() @@ -203,3 +217,12 @@ def test_pwa_application_icon(app, admin_user): # make sure largest icon is referenced in service worker resp2 = app.get('/service-worker.js', status=200) assert resp.json['icons'][-1]['src'].split('/')[-1] in resp.text + + +def test_pwa_application_name(app, admin_user): + app = login(app) + assert app.get('/manifest.json', status=200).json['name'] == 'Compte Citoyen' + pwa_settings = PwaSettings.singleton() + pwa_settings.application_name = 'My wonderful app' + pwa_settings.save() + assert app.get('/manifest.json', status=200).json['name'] == 'My wonderful app'