From 187ab0199f764c5973015a45c71ee066df695496 Mon Sep 17 00:00:00 2001 From: Josue Kouka Date: Thu, 26 Apr 2018 16:11:19 +0200 Subject: [PATCH] standardize phonenumber format (#23443) --- corbo/migrations/0011_auto_20180426_1334.py | 28 ++++++++++++++++++++++++++ corbo/models.py | 15 +++++++++++++- tests/test_api.py | 2 +- tests/test_data_migrations.py | 31 +++++++++++++++++++++++++++++ 4 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 corbo/migrations/0011_auto_20180426_1334.py create mode 100644 tests/test_data_migrations.py diff --git a/corbo/migrations/0011_auto_20180426_1334.py b/corbo/migrations/0011_auto_20180426_1334.py new file mode 100644 index 0000000..e652c94 --- /dev/null +++ b/corbo/migrations/0011_auto_20180426_1334.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +import re + +from django.db import migrations + + +def format_sms_identifiers(apps, schema_editor): + Subscription = apps.get_model('corbo', 'Subscription') + uri = 'sms:' + for subscription in Subscription.objects.all(): + if uri in subscription.identifier: + _, phonenumber = subscription.identifier.split(':') + phonenumber = re.sub('[-.\s]', '', phonenumber) + subscription.identifier = uri + phonenumber + subscription.save() + + +class Migration(migrations.Migration): + + dependencies = [ + ('corbo', '0010_broadcast_delivery_count'), + ] + + operations = [ + migrations.RunPython(format_sms_identifiers, format_sms_identifiers), + ] diff --git a/corbo/models.py b/corbo/models.py index 0a28f50..f5c5acb 100644 --- a/corbo/models.py +++ b/corbo/models.py @@ -1,5 +1,6 @@ import os import io +import re import hashlib from time import mktime from datetime import datetime @@ -11,6 +12,7 @@ from django.utils import timezone from django.conf import settings from django.db import models from django.core.files.storage import DefaultStorage +from django.core.exceptions import ValidationError from django.utils.translation import ugettext_lazy as _ from ckeditor.fields import RichTextField @@ -177,7 +179,6 @@ class Broadcast(models.Model): self.deliver_time = timezone.now() self.save() - class Meta: verbose_name = _('sent') ordering = ('-deliver_time',) @@ -198,3 +199,15 @@ class Subscription(models.Model): class Meta: unique_together = ('category', 'identifier', 'uuid') + + def clean(self): + if 'sms:' in self.identifier: + uri, phonenumber = self.identifier.split(':') + phonenumber = re.sub('[-.\s]', '', phonenumber) + if not re.search('^\+?\d{,20}$', phonenumber): + raise ValidationError({'identifier': _('Invalid phone number')}) + self.identifier = '%s:%s' % (uri, phonenumber) + + def save(self, *args, **kwargs): + self.clean() + return super(Subscription, self).save(*args, **kwargs) diff --git a/tests/test_api.py b/tests/test_api.py index b56db02..ca00518 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -70,7 +70,7 @@ def test_get_subscriptions(app, categories, announces, user): for identifier, name in channel_choices: for category in categories: - uri = '%s:%s' % (identifier, uuid) + uri = '%s:%s' % (identifier, '00339988776655') Subscription.objects.create(identifier=uri, uuid=uuid, category=category) resp = app.get(reverse('subscriptions'), params={'uuid': uuid}) assert len(resp.json['data']) == 2 diff --git a/tests/test_data_migrations.py b/tests/test_data_migrations.py new file mode 100644 index 0000000..41c3d18 --- /dev/null +++ b/tests/test_data_migrations.py @@ -0,0 +1,31 @@ +import uuid + +import pytest + +from django.db import connection +from django.db.migrations.executor import MigrationExecutor + +pytestmark = pytest.mark.django_db + + +def test_subscription_sms_identifier_format_migration(): + executor = MigrationExecutor(connection) + app = 'corbo' + migrate_from = [(app, '0009_auto_20170120_1533')] + migrate_to = [(app, '0011_auto_20180426_1334')] + executor.migrate(migrate_from) + executor.loader.build_graph() + old_apps = executor.loader.project_state(migrate_from).apps + Category = old_apps.get_model('corbo', 'Category') + Subscription = old_apps.get_model('corbo', 'Subscription') + category = Category.objects.create(name='Science', slug='science') + for identifier in ('sms:06 10 20 30 40', 'sms:+33 6 10 20 30 40', 'sms:0033610203040', 'mailto:john@doe.com'): + Subscription.objects.create(uuid=uuid.uuid4().hex, category=category, identifier=identifier) + executor.migrate(migrate_to) + executor.loader.build_graph() + apps = executor.loader.project_state(migrate_from).apps + Subscription = apps.get_model('corbo', 'Subscription') + assert Subscription.objects.count() == 4 + valid_sms_identifier = ['sms:0610203040', 'sms:+33610203040', 'sms:0033610203040'] + for subscription in Subscription.objects.filter(identifier__startswith='sms:'): + assert subscription.identifier in valid_sms_identifier -- 2.11.0