From 99eb6e3f356f78fdf7e898e8ee01f0562831dee6 Mon Sep 17 00:00:00 2001 From: Paul Marillonnet Date: Tue, 3 Jan 2023 11:05:39 +0100 Subject: [PATCH] manage Publik's phone-related settings through dedicated form (#72760) --- hobo/environment/models.py | 1 + hobo/multitenant/settings_loaders.py | 5 +++++ hobo/settings.py | 11 ++++++++++ hobo/sms/forms.py | 23 +++++++++++++++++++- hobo/sms/views.py | 2 +- tests/test_settings_loaders.py | 32 +++++++++++++++++++++++++++- 6 files changed, 71 insertions(+), 3 deletions(-) diff --git a/hobo/environment/models.py b/hobo/environment/models.py index d41cc4d..8d49385 100644 --- a/hobo/environment/models.py +++ b/hobo/environment/models.py @@ -52,6 +52,7 @@ AUTO_VARIABLES = ( 'meta_keywords', 'sms_url', 'sms_sender', + 'local_country_code', ) diff --git a/hobo/multitenant/settings_loaders.py b/hobo/multitenant/settings_loaders.py index 92ed878..a292acf 100644 --- a/hobo/multitenant/settings_loaders.py +++ b/hobo/multitenant/settings_loaders.py @@ -203,6 +203,11 @@ class TemplateVars(FileBaseSettingsLoader): tenant_settings.USER_PROFILE_CONFIG = hobo_json.get('profile') tenant_settings.SMS_URL = variables.get('sms_url', '') tenant_settings.SMS_SENDER = variables.get('sms_sender', '') + # propagate phone country codes list + tenant_settings.PHONE_COUNTRY_CODES = variables.get( + 'phone_country_codes', getattr(settings, 'PHONE_COUNTRY_CODES', {}) + ) + tenant_settings.LOCAL_COUNTRY_CODE = variables.get('local_country_code', '') class SettingsVars(SettingsDictUpdateMixin, FileBaseSettingsLoader): diff --git a/hobo/settings.py b/hobo/settings.py index ebf9576..806eba3 100644 --- a/hobo/settings.py +++ b/hobo/settings.py @@ -244,6 +244,17 @@ HOBO_SERVICES_DISABLED = [ # List of service to show in the create service menu, it overrides HOBO_SERVICES_DISABLED. HOBO_SERVICES_ENABLED = [] +# Phone prefixes by country for phone number as authentication identifier +PHONE_COUNTRY_CODES = { + '32': {'region': 'BE', 'region_desc': _('Belgium')}, + '33': {'region': 'FR', 'region_desc': _('Metropolitan France')}, + '262': {'region': 'RE', 'region_desc': _('Réunion')}, + '508': {'region': 'PM', 'region_desc': _('Saint Pierre and Miquelon')}, + '590': {'region': 'GP', 'region_desc': _('Guadeloupe')}, + '594': {'region': 'GF', 'region_desc': _('French Guiana')}, + '596': {'region': 'MQ', 'region_desc': _('Martinique')}, +} + local_settings_file = os.environ.get( 'HOBO_SETTINGS_FILE', os.path.join(os.path.dirname(__file__), 'local_settings.py') ) diff --git a/hobo/sms/forms.py b/hobo/sms/forms.py index d5b8185..e24489c 100644 --- a/hobo/sms/forms.py +++ b/hobo/sms/forms.py @@ -14,6 +14,7 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . from django import forms +from django.conf import settings from django.core.exceptions import ValidationError from django.core.validators import RegexValidator from django.utils.translation import gettext_lazy as _ @@ -22,7 +23,11 @@ from hobo.utils import TemplateError, get_templated_url class SMSForm(forms.Form): - sms_url = forms.CharField(label=_('SMS URL'), help_text=_('URL that can receive POST data to send SMS.')) + sms_url = forms.CharField( + label=_('SMS URL'), + help_text=_('URL that can receive POST data to send SMS.'), + required=False, + ) sms_sender = forms.CharField( label=_('Sender'), max_length=11, @@ -32,7 +37,23 @@ class SMSForm(forms.Form): help_text=_( 'Sender name or phone number. It must neither exceed 11 characters nor contain special characters.' ), + required=False, ) + local_country_code = forms.ChoiceField( + label=_('Local country code'), + help_text=_( + 'Local country code, used to identify local mobile phone numbers and ' + 'as international prefix while sending SMS messages.' + ), + required=False, + ) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + country_code_choices = [ + (key, f"+{key} ({value['region_desc']})") for key, value in settings.PHONE_COUNTRY_CODES.items() + ] + self.fields['local_country_code'].choices = [('', '')] + country_code_choices def clean_sms_url(self): value = self.cleaned_data['sms_url'] diff --git a/hobo/sms/views.py b/hobo/sms/views.py index dd057c1..96693a6 100644 --- a/hobo/sms/views.py +++ b/hobo/sms/views.py @@ -25,7 +25,7 @@ from .forms import SMSForm class HomeView(VariablesFormMixin, TemplateView): template_name = 'hobo/sms_home.html' - variables = ['sms_url', 'sms_sender'] + variables = ['sms_url', 'sms_sender', 'local_country_code'] form_class = SMSForm success_message = _('SMS settings have been updated. It will take a few seconds to be effective.') diff --git a/tests/test_settings_loaders.py b/tests/test_settings_loaders.py index 1793b42..5225032 100644 --- a/tests/test_settings_loaders.py +++ b/tests/test_settings_loaders.py @@ -4,6 +4,7 @@ import urllib.parse import pytest from django.conf import UserSettingsHolder +from django.test import override_settings from hobo.deploy.utils import get_hobo_json from hobo.environment.models import Authentic, Combo, Variable @@ -162,10 +163,39 @@ def test_sms_update_settings_from_path(tmpdir): tenant_settings = UserSettingsHolder({}) loader = TemplateVars() - variables = {'sms_url': 'https://example.com/send/', 'sms_sender': 'Sender'} + variables = { + 'sms_url': 'https://example.com/send/', + 'sms_sender': 'Sender', + 'local_country_code': '262', + 'phone_country_codes': { + '262': {'region': 'RE', 'region_desc': 'Réunion'}, + '666': {'region': 'WLD', 'region_desc': 'Wonderland'}, + }, + } env = {'services': [], 'variables': variables} path = os.path.join(str(tmpdir), 'hobo.json') json.dump(env, open(path, 'w')) loader.update_settings_from_path(tenant_settings, path) assert tenant_settings.SMS_URL == 'https://example.com/send/' assert tenant_settings.SMS_SENDER == 'Sender' + assert tenant_settings.LOCAL_COUNTRY_CODE == '262' + assert tenant_settings.PHONE_COUNTRY_CODES == { + '262': {'region': 'RE', 'region_desc': 'Réunion'}, + '666': {'region': 'WLD', 'region_desc': 'Wonderland'}, + } + + variables.pop('phone_country_codes') + PHONE_COUNTRY_CODES = { + '32': {'region': 'BE', 'region_desc': 'Belgium'}, + '777': {'region': 'WLD', 'region_desc': 'Wonderland'}, + } + + with override_settings(PHONE_COUNTRY_CODES=PHONE_COUNTRY_CODES): + env = {'services': [], 'variables': variables} + path = os.path.join(str(tmpdir), 'hobo.json') + json.dump(env, open(path, 'w')) + loader.update_settings_from_path(tenant_settings, path) + assert tenant_settings.PHONE_COUNTRY_CODES == { + '32': {'region': 'BE', 'region_desc': 'Belgium'}, + '777': {'region': 'WLD', 'region_desc': 'Wonderland'}, + }