From 1012c58d8ad1fc65ed25f59a3072371a4fa99643 Mon Sep 17 00:00:00 2001 From: Valentin Deniaud Date: Tue, 10 Mar 2020 16:45:02 +0100 Subject: [PATCH 2/2] base: add maximum sms length option (#39654) --- ...09_choositsmsgateway_max_message_length.py | 20 +++++++++++++++ .../migrations/0008_auto_20200310_1539.py | 25 +++++++++++++++++++ .../migrations/0007_auto_20200310_1539.py | 25 +++++++++++++++++++ .../0008_ovhsmsgateway_max_message_length.py | 20 +++++++++++++++ .../0008_oxydsmsgateway_max_message_length.py | 20 +++++++++++++++ passerelle/base/models.py | 3 +++ tests/test_sms.py | 18 +++++++++++++ 7 files changed, 131 insertions(+) create mode 100644 passerelle/apps/choosit/migrations/0009_choositsmsgateway_max_message_length.py create mode 100644 passerelle/apps/mobyt/migrations/0008_auto_20200310_1539.py create mode 100644 passerelle/apps/orange/migrations/0007_auto_20200310_1539.py create mode 100644 passerelle/apps/ovh/migrations/0008_ovhsmsgateway_max_message_length.py create mode 100644 passerelle/apps/oxyd/migrations/0008_oxydsmsgateway_max_message_length.py diff --git a/passerelle/apps/choosit/migrations/0009_choositsmsgateway_max_message_length.py b/passerelle/apps/choosit/migrations/0009_choositsmsgateway_max_message_length.py new file mode 100644 index 00000000..56d41526 --- /dev/null +++ b/passerelle/apps/choosit/migrations/0009_choositsmsgateway_max_message_length.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.18 on 2020-03-10 14:39 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('choosit', '0008_auto_20181118_0807'), + ] + + operations = [ + migrations.AddField( + model_name='choositsmsgateway', + name='max_message_length', + field=models.IntegerField(default=160, verbose_name='Maximum message length'), + ), + ] diff --git a/passerelle/apps/mobyt/migrations/0008_auto_20200310_1539.py b/passerelle/apps/mobyt/migrations/0008_auto_20200310_1539.py new file mode 100644 index 00000000..92052fee --- /dev/null +++ b/passerelle/apps/mobyt/migrations/0008_auto_20200310_1539.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.18 on 2020-03-10 14:39 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('mobyt', '0007_auto_20181118_0807'), + ] + + operations = [ + migrations.AddField( + model_name='mobytsmsgateway', + name='max_message_length', + field=models.IntegerField(default=160, verbose_name='Maximum message length'), + ), + migrations.AlterField( + model_name='mobytsmsgateway', + name='quality', + field=models.CharField(choices=[('l', 'sms direct'), ('ll', 'sms low-cost'), ('n', 'sms top')], default='l', max_length=4, verbose_name='Message quality'), + ), + ] diff --git a/passerelle/apps/orange/migrations/0007_auto_20200310_1539.py b/passerelle/apps/orange/migrations/0007_auto_20200310_1539.py new file mode 100644 index 00000000..76fad4ab --- /dev/null +++ b/passerelle/apps/orange/migrations/0007_auto_20200310_1539.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.18 on 2020-03-10 14:39 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('orange', '0006_remove_orangesmsgateway_log_level'), + ] + + operations = [ + migrations.AddField( + model_name='orangesmsgateway', + name='max_message_length', + field=models.IntegerField(default=160, verbose_name='Maximum message length'), + ), + migrations.AlterField( + model_name='orangesmsgateway', + name='keystore', + field=models.FileField(blank=True, help_text='Certificate and private key in PEM format', null=True, upload_to='orange', verbose_name='Keystore'), + ), + ] diff --git a/passerelle/apps/ovh/migrations/0008_ovhsmsgateway_max_message_length.py b/passerelle/apps/ovh/migrations/0008_ovhsmsgateway_max_message_length.py new file mode 100644 index 00000000..fd188452 --- /dev/null +++ b/passerelle/apps/ovh/migrations/0008_ovhsmsgateway_max_message_length.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.18 on 2020-03-10 14:39 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ovh', '0007_auto_20181118_0807'), + ] + + operations = [ + migrations.AddField( + model_name='ovhsmsgateway', + name='max_message_length', + field=models.IntegerField(default=160, verbose_name='Maximum message length'), + ), + ] diff --git a/passerelle/apps/oxyd/migrations/0008_oxydsmsgateway_max_message_length.py b/passerelle/apps/oxyd/migrations/0008_oxydsmsgateway_max_message_length.py new file mode 100644 index 00000000..c2c6b2fb --- /dev/null +++ b/passerelle/apps/oxyd/migrations/0008_oxydsmsgateway_max_message_length.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.18 on 2020-03-10 14:39 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('oxyd', '0007_auto_20181118_0807'), + ] + + operations = [ + migrations.AddField( + model_name='oxydsmsgateway', + name='max_message_length', + field=models.IntegerField(default=160, verbose_name='Maximum message length'), + ), + ] diff --git a/passerelle/base/models.py b/passerelle/base/models.py index 02e46000..2ce19761 100644 --- a/passerelle/base/models.py +++ b/passerelle/base/models.py @@ -908,6 +908,8 @@ class SMSResource(BaseResource): _can_send_messages_description = _('Sending messages is limited to the following API users:') + max_message_length = models.IntegerField(_('Maximum message length'), default=160) + @classmethod def clean_numbers(cls, destinations, default_country_code='33', default_trunk_prefix='0'): # Yeah France first ! @@ -945,6 +947,7 @@ class SMSResource(BaseResource): 'to is not a list of strings' except (ValueError, AssertionError) as e: raise APIError('Payload error: %s' % e) + data['message'] = data['message'][:self.max_message_length] logging.info('sending message %r to %r with sending number %r', data['message'], data['to'], data['from']) if 'nostop' in request.GET: diff --git a/tests/test_sms.py b/tests/test_sms.py index 8386a18b..1b41c3b8 100644 --- a/tests/test_sms.py +++ b/tests/test_sms.py @@ -1,7 +1,9 @@ +import mock import pytest from django.contrib.contenttypes.models import ContentType +from passerelle.apps.ovh.models import OVHSMSGateway from passerelle.base.models import ApiUser, AccessRight, SMSResource from test_manager import login, admin_user @@ -70,3 +72,19 @@ def test_manage_views(admin_user, app, connector): resp = app.get(url) assert 'Endpoints' in resp.text assert 'accessright/add' in resp.text + + +@pytest.mark.parametrize('connector', [OVHSMSGateway], indirect=True) +def test_sms_max_message_length(app, connector): + path = '/%s/%s/send/' % (connector.get_connector_slug(), connector.slug) + + message_above_limit = 'a' * (connector.max_message_length + 1) + payload = { + 'message': message_above_limit, + 'from': '+33699999999', + 'to': ['+33688888888'], + } + with mock.patch.object(OVHSMSGateway, 'send_msg') as send_function: + send_function.return_value = {} + result = app.post_json(path, params=payload) + assert send_function.call_args[0][0] == 'a' * connector.max_message_length -- 2.20.1