Ejemplo n.º 1
0
    def test_kwargs_from_temba(self):
        modified_date = timezone.now()
        temba_contact = TembaContact.create(
            uuid='C-007',
            name="Jan",
            urns=['tel:123'],
            groups=['G-001', 'G-007'],
            fields={
                'gender': 'M',
            },
            language='eng',
            modified_on=modified_date,
        )

        kwargs = models.Contact.kwargs_from_temba(self.unicef, temba_contact)
        self.assertDictEqual(kwargs, {
            'uuid': 'C-007',
            'org': self.unicef,
            'name': "Jan",
            'urn': 'tel:123',
            'region': self.region1,
            'group': self.group3,
            'language': 'eng',
            'temba_modified_on': modified_date,
            '_data_field_values': {
                'gender': 'M',
            },
        })

        # try creating contact from them
        models.Contact.objects.create(**kwargs)
Ejemplo n.º 2
0
Archivo: tests.py Proyecto: caktus/dash
    def test_temba_merge_contacts(self):
        contact1 = TembaContact.create(uuid="000-001", name="Bob",
                                       urns=['tel:123', 'email:[email protected]'],
                                       fields=dict(chat_name="bob", age=23),
                                       groups=['000-001', '000-002', '000-010'])
        contact2 = TembaContact.create(uuid="000-001", name="Bobby",
                                       urns=['tel:234', 'twitter:bob'],
                                       fields=dict(chat_name="bobz", state='IN'),
                                       groups=['000-003', '000-009', '000-011'])

        merged = temba_merge_contacts(contact1, contact2, mutex_group_sets=(
            ('000-001', '000-002', '000-003'),
            ('000-008', '000-009'),
            ('000-098', '000-099'),
        ))
        self.assertEqual(merged.uuid, '000-001')
        self.assertEqual(merged.name, "Bob")
        self.assertEqual(sorted(merged.urns), ['email:[email protected]', 'tel:123', 'twitter:bob'])
        self.assertEqual(merged.fields, dict(chat_name="bob", age=23, state='IN'))
        self.assertEqual(sorted(merged.groups), ['000-001', '000-009', '000-010', '000-011'])
Ejemplo n.º 3
0
    def test_get_or_fetch(self, mock_get_contact):
        mock_get_contact.return_value = TembaContact.create(
            uuid='C-007', name="Mo Polls",
            urns=['tel:078123'], groups=['G-001', 'G-005'],
            fields={},
            language='eng', modified_on=timezone.now())
        # get locally
        contact = models.Contact.get_or_fetch(self.unicef, 'C-001')
        self.assertEqual(contact.name, "Ann")

        # fetch remotely
        contact = models.Contact.get_or_fetch(self.unicef, 'C-009')
        self.assertEqual(contact.name, "Mo Polls")
Ejemplo n.º 4
0
Archivo: tests.py Proyecto: caktus/dash
    def test_temba_compare_contacts(self):
        # no differences
        first = TembaContact.create(
            uuid='000-001', name="Ann", urns=['tel:1234'], groups=['000-001'],
            fields=dict(chat_name="ann"), language='eng', modified_on=timezone.now())
        second = TembaContact.create(
            uuid='000-001', name="Ann", urns=['tel:1234'], groups=['000-001'],
            fields=dict(chat_name="ann"), language='eng', modified_on=timezone.now())
        self.assertIsNone(temba_compare_contacts(first, second))
        self.assertIsNone(temba_compare_contacts(second, first))

        # different name
        second = TembaContact.create(
            uuid='000-001', name="Annie", urns=['tel:1234'], groups=['000-001'],
            fields=dict(chat_name="ann"), language='eng', modified_on=timezone.now())
        self.assertEqual(temba_compare_contacts(first, second), 'name')

        # different URNs
        second = TembaContact.create(
            uuid='000-001', name="Ann", urns=['tel:1234', 'twitter:ann'], groups=['000-001'],
            fields=dict(chat_name="ann"), language='eng', modified_on=timezone.now())
        self.assertEqual(temba_compare_contacts(first, second), 'urns')

        # different group
        second = TembaContact.create(
            uuid='000-001', name="Ann", urns=['tel:1234'], groups=['000-002'],
            fields=dict(chat_name="ann"), language='eng', modified_on=timezone.now())
        self.assertEqual(temba_compare_contacts(first, second), 'groups')
        self.assertEqual(temba_compare_contacts(first, second, groups=('000-001', '000-002')),
                         'groups')
        self.assertIsNone(temba_compare_contacts(first, second, groups=()))
        self.assertIsNone(temba_compare_contacts(first, second, groups=('000-003', '000-004')))

        # different field
        second = TembaContact.create(
            uuid='000-001', name="Ann", urns=['tel:1234'], groups=['000-001'],
            fields=dict(chat_name="annie"), language='eng', modified_on=timezone.now())
        self.assertEqual(temba_compare_contacts(first, second), 'fields')
        self.assertEqual(temba_compare_contacts(first, second, fields=('chat_name', 'gender')),
                         'fields')
        self.assertIsNone(temba_compare_contacts(first, second, fields=()))
        self.assertIsNone(temba_compare_contacts(first, second, fields=('age', 'gender')))

        # additional field
        second = TembaContact.create(
            uuid='000-001', name="Ann", urns=['tel:1234'], groups=['000-001'],
            fields=dict(chat_name="ann", age=18), language='eng', modified_on=timezone.now())
        self.assertEqual(temba_compare_contacts(first, second), 'fields')
        self.assertIsNone(temba_compare_contacts(first, second, fields=()))
        self.assertIsNone(temba_compare_contacts(first, second, fields=('chat_name',)))
Ejemplo n.º 5
0
    def as_temba(self):
        """Return a Temba object representing this Contact."""
        groups = [self.region.uuid]
        if self.group_id:
            groups.append(self.group.uuid)

        fields = {f.field.key: f.get_value() for f in self.contactfield_set.all()}

        temba_contact = TembaContact()
        temba_contact.name = self.name
        temba_contact.urns = [self.urn]
        temba_contact.fields = fields
        temba_contact.groups = groups
        temba_contact.language = self.language
        temba_contact.uuid = self.uuid

        return temba_contact
Ejemplo n.º 6
0
def temba_merge_contacts(first, second, mutex_group_sets):
    """
    Merges two Temba contacts, with priority given to the first contact
    """
    if first.uuid != second.uuid:  # pragma: no cover
        raise ValueError("Can't merge contacts with different UUIDs")

    # URNs are merged by scheme
    first_urns_by_scheme = {u[0]: u[1] for u in [urn.split(':', 1) for urn in first.urns]}
    urns_by_scheme = {u[0]: u[1] for u in [urn.split(':', 1) for urn in second.urns]}
    urns_by_scheme.update(first_urns_by_scheme)
    merged_urns = ['%s:%s' % (scheme, path) for scheme, path in six.iteritems(urns_by_scheme)]

    # fields are simple key based merge
    merged_fields = second.fields.copy()
    merged_fields.update(first.fields)

    # first merge mutually exclusive group sets
    first_groups = list(first.groups)
    second_groups = list(second.groups)
    merged_mutex_groups = []
    for group_set in mutex_group_sets:
        from_first = intersection(first_groups, group_set)
        if from_first:
            merged_mutex_groups.append(from_first[0])
        else:
            from_second = intersection(second_groups, group_set)
            if from_second:
                merged_mutex_groups.append(from_second[0])

        for group in group_set:
            if group in first_groups:
                first_groups.remove(group)
            if group in second_groups:
                second_groups.remove(group)

    # then merge the remaining groups
    merged_groups = merged_mutex_groups + union(first_groups, second_groups)

    return TembaContact.create(uuid=first.uuid, name=first.name,
                               urns=merged_urns, fields=merged_fields, groups=merged_groups)
Ejemplo n.º 7
0
    def test_create(self, mock_create_contact):
        mock_create_contact.return_value = TembaContact.create(
            uuid='C-007',
            name="Mo Polls",
            urns=['tel:078123'],
            groups=['G-001', 'G-005'],
            fields={},
            language='eng',
            modified_on=timezone.now(),
        )

        contact = factories.Contact(
            name="Mo Polls",
            org=self.unicef,
            created_by=self.user1,
            modified_by=self.user1,
            urn="tel:078123",
            region=self.region1,
            group=self.group1,
            language="eng",
        )

        self.assertEqual(contact.name, "Mo Polls")
        self.assertEqual(contact.urn, 'tel:078123')
        self.assertEqual(contact.region, self.region1)
        self.assertEqual(contact.language, 'eng')
        self.assertEqual(contact.created_by, self.user1)
        self.assertIsNotNone(contact.created_on)
        self.assertEqual(contact.modified_by, self.user1)
        self.assertIsNotNone(contact.modified_on)

        contact.push(ChangeType.created)

        # reload and check UUID was updated by push task
        contact.refresh_from_db()
        self.assertEqual(contact.uuid, 'C-007')

        self.assertEqual(mock_create_contact.call_count, 1)
Ejemplo n.º 8
0
    def test_create(self):
        url = reverse('contacts.contact_create')

        # log in as an org administrator
        self.login(self.admin)

        response = self.url_get('unicef', url)
        self.assertEqual(response.status_code, 200)

        # submit with no fields entered
        response = self.url_post('unicef', url, dict())
        self.assertEqual(response.status_code, 200)
        form = response.context['form']
        self.assertEqual(len(form.errors), 4, form.errors)
        self.assertFormError(response, 'form', 'name', 'This field is required.')
        self.assertFormError(response, 'form', 'urn', 'This field is required.')
        self.assertFormError(response, 'form', 'region', 'This field is required.')
        self.assertFormError(response, 'form', 'group', 'This field is required.')

        # submit again with all fields
        temba_contact = TembaContact()
        temba_contact.uuid = "uuid"
        self.mock_temba_client.create_contact.return_value = temba_contact
        response = self.url_post('unicef', url, {
            'name': "Mo Polls",
            'urn_0': "tel",
            'urn_1': "5678",
            'region': self.region1.pk,
            'group': self.group1.pk,
            'language': 'eng',
        })
        self.assertEqual(response.status_code, 302)
        self.assertEqual(self.mock_temba_client.create_contact.call_count, 1)

        # check new contact and profile
        contact = Contact.objects.get(urn='tel:5678')
        self.assertEqual(contact.name, "Mo Polls")
        self.assertEqual(contact.region, self.region1)
        self.assertEqual(contact.group, self.group1)
        self.assertEqual(contact.language, 'eng')

        # log in as a user
        self.login(self.user1)

        # try to create contact in region we don't have access to
        response = self.url_post('unicef', url, {
            'name': "Mo Polls II",
            'urn_0': "tel",
            'urn_1': "5678",
            'region': self.region3.pk,
            'group': self.group1.pk,
        })
        self.assertFormError(response, 'form', 'region',
                             "Select a valid choice. That choice is not one "
                             "of the available choices.")

        # try again but this time in a region we do have access to
        response = self.url_post('unicef', url, {
            'name': "Mo Polls II",
            'urn_0': "tel",
            'urn_1': "5678",
            'region': self.region1.pk,
            'group': self.group1.pk,
        })
        self.assertEqual(response.status_code, 302)

        # test ajax querying for languages
        response = self.url_get('unicef', '%s?initial=' % url)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(json.loads(response.content), dict(results=[]))
        response = self.url_get('unicef', '%s?initial=eng' % url)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(json.loads(response.content),
                         dict(results=[dict(id='eng', text='English')]))

        response = self.url_get('unicef', '%s?search=' % url)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(len(json.loads(response.content)['results']), 10)
        response = self.url_get('unicef', '%s?search=Kin' % url)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(json.loads(response.content),
                         dict(results=[dict(id='kin', text='Kinyarwanda')]))