Example #1
0
    def test_sync_pull_contacts(self, mock_get_contacts):
        # RapidPro returning no changes
        mock_get_contacts.return_value = [
            TembaContact.create(uuid='C-001', name="Ann", urns=['tel:1234'], groups=['G-001'],
                                fields=dict(chat_name="ann"), language='eng', modified_on=timezone.now()),
            TembaContact.create(uuid='C-002', name="Bob", urns=['tel:2345'], groups=['G-001'],
                                fields=dict(chat_name="bob"), language='eng', modified_on=timezone.now()),
            TembaContact.create(uuid='C-003', name="Cat", urns=['tel:3456'], groups=['G-002'],
                                fields=dict(chat_name="cat"), language='eng', modified_on=timezone.now()),
            TembaContact.create(uuid='C-004', name="Dan", urns=['twitter:danny'], groups=['G-002'],
                                fields=dict(chat_name="dan"), language='eng', modified_on=timezone.now()),
            TembaContact.create(uuid='C-005', name="Eve", urns=['twitter:evee'], groups=['G-003'],
                                fields=dict(chat_name="eve"), language='eng', modified_on=timezone.now())
        ]

        created, updated, deleted, failed = sync_pull_contacts(self.unicef, Contact)
        self.assertFalse(created or updated or deleted or failed)

        # RapidPro returning 1 new, 1 modified, 1 deleted and 2 unsyncable contact
        mock_get_contacts.return_value = [
            TembaContact.create(uuid='C-001', name="Annie", urns=['tel:5678'], groups=['G-002'],
                                fields=dict(chat_name="annie"), language='eng', modified_on=timezone.now()),
            TembaContact.create(uuid='C-003', name="Cat", urns=['tel:3456'], groups=['G-002'],
                                fields=dict(chat_name="cat"), language='eng', modified_on=timezone.now()),
            TembaContact.create(uuid='C-004', name="Dan", urns=['twitter:danny'], groups=['G-002'],
                                fields=dict(chat_name="dan"), language='eng', modified_on=timezone.now()),
            TembaContact.create(uuid='C-005', name="Eve", urns=['twitter:evee'], groups=['G-003'],
                                fields=dict(chat_name="eve"), language='eng', modified_on=timezone.now()),
            TembaContact.create(uuid='C-007', name="Jim", urns=['twitter:jimbo'], groups=['G-003'],
                                fields=dict(chat_name="jim"), language='eng', modified_on=timezone.now()),
            TembaContact.create(uuid='C-009', name="Xen", urns=['twitter:xen'], groups=[],  # no room group
                                fields=dict(chat_name="xen"), language='eng', modified_on=timezone.now()),
            TembaContact.create(uuid='C-010', name="Yan", urns=[], groups=['G-003'],  # no URN
                                fields=dict(chat_name="yan"), language='eng', modified_on=timezone.now())
        ]

        created, updated, deleted, failed = sync_pull_contacts(self.unicef, Contact)
        self.assertEqual(sorted(created), ['C-007'])
        self.assertEqual(sorted(updated), ['C-001'])
        self.assertEqual(sorted(deleted), ['C-002'])
        self.assertEqual(sorted(failed), ['C-009', 'C-010'])

        # check created contact
        jim = Contact.objects.get(uuid='C-007')
        self.assertEqual(jim.full_name, "Jim")
        self.assertEqual(jim.chat_name, "jim")
        self.assertEqual(jim.urn, 'twitter:jimbo')
        self.assertEqual(jim.room, self.room3)

        # check modified contact
        ann = Contact.objects.get(uuid='C-001')
        self.assertEqual(ann.full_name, "Annie")
        self.assertEqual(ann.chat_name, "annie")
        self.assertEqual(ann.urn, 'tel:5678')
        self.assertEqual(ann.room, self.room2)

        # check deleted contact
        bob = Contact.objects.get(uuid='C-002')
        self.assertFalse(bob.is_active)
Example #2
0
def sync_org_contacts(org_id):
    """
    Syncs all contacts for the given org
    """
    from chatpro.orgs_ext import TaskType
    from chatpro.rooms.models import Room
    from .models import Contact

    org = Org.objects.get(pk=org_id)

    logger.info('Starting contact sync task for org #%d' % org.id)

    sync_fields = [org.get_chat_name_field()]
    sync_groups = [r.uuid for r in Room.get_all(org)]

    created, updated, deleted, failed = sync_pull_contacts(org, Contact, fields=sync_fields, groups=sync_groups)

    task_result = dict(time=datetime_to_ms(timezone.now()),
                       counts=dict(created=len(created),
                                   updated=len(updated),
                                   deleted=len(deleted),
                                   failed=len(failed)))
    org.set_task_result(TaskType.sync_contacts, task_result)

    logger.info("Finished contact sync for org #%d (%d created, %d updated, %d deleted, %d failed)"
                % (org.id, len(created), len(updated), len(deleted), len(failed)))
Example #3
0
def sync_org_contacts(org_id):
    """
    Syncs all contacts for the given org
    """
    from tracpro.groups.models import Region, Group
    from tracpro.orgs_ext.constants import TaskType
    from .models import Contact

    org = Org.objects.get(pk=org_id)

    logger.info('Starting contact sync task for org #%d' % org.id)

    sync_groups = [r.uuid for r in Region.get_all(org)] + [g.uuid for g in Group.get_all(org)]

    most_recent_contact = Contact.objects.by_org(org).active().exclude(temba_modified_on=None)
    most_recent_contact = most_recent_contact.order_by('-temba_modified_on').first()
    if most_recent_contact:
        last_time = most_recent_contact.temba_modified_on
    else:
        last_time = None

    created, updated, deleted, failed = sync_pull_contacts(
        org, Contact, fields=(), groups=sync_groups, last_time=last_time,
        delete_blocked=True)

    task_result = dict(time=datetime_to_ms(timezone.now()),
                       counts=dict(created=len(created),
                                   updated=len(updated),
                                   deleted=len(deleted),
                                   failed=len(failed)))
    org.set_task_result(TaskType.sync_contacts, task_result)

    logger.info("Finished contact sync for org #%d (%d created, "
                "%d updated, %d deleted, %d failed)" %
                (org.id, len(created), len(updated), len(deleted), len(failed)))
Example #4
0
def sync_org_contacts(org_id):
    """
    Syncs all contacts for the given org
    """
    from tracpro.groups.models import Region, Group
    from tracpro.orgs_ext import TaskType
    from .models import Contact

    org = Org.objects.get(pk=org_id)

    logger.info('Starting contact sync task for org #%d' % org.id)

    sync_groups = [r.uuid for r in Region.get_all(org)] + [g.uuid for g in Group.get_all(org)]

    created, updated, deleted, failed = sync_pull_contacts(org, Contact, fields=(), groups=sync_groups)

    task_result = dict(time=datetime_to_ms(timezone.now()),
                       counts=dict(created=len(created),
                                   updated=len(updated),
                                   deleted=len(deleted),
                                   failed=len(failed)))
    org.set_task_result(TaskType.sync_contacts, task_result)

    logger.info("Finished contact sync for org #%d (%d created, %d updated, %d deleted, %d failed)"
                % (org.id, len(created), len(updated), len(deleted), len(failed)))
Example #5
0
    def sync(self, org):
        recent_contacts = Contact.objects.by_org(org).active()
        recent_contacts = recent_contacts.exclude(temba_modified_on=None)
        recent_contacts = recent_contacts.order_by('-temba_modified_on')

        most_recent = recent_contacts.first()
        sync_regions = [r.uuid for r in Region.get_all(org)]
        sync_groups = [g.uuid for g in Group.get_all(org)]

        created, updated, deleted, failed = sync_pull_contacts(
            org=org, contact_class=Contact, fields=(), delete_blocked=True,
            groups=sync_regions + sync_groups,
            last_time=most_recent.temba_modified_on if most_recent else None)

        org.set_task_result(TaskType.sync_contacts, {
            'time': datetime_to_ms(timezone.now()),
            'counts': {
                'created': len(created),
                'updated': len(updated),
                'deleted': len(deleted),
                'failed': len(failed),
            },
        })
Example #6
0
    def test_sync_pull_contacts(self, mock_get_contacts):
        # RapidPro returning no changes
        mock_get_contacts.return_value = [
            TembaContact.create(uuid='C-001',
                                name="Ann",
                                urns=['tel:1234'],
                                groups=['G-001'],
                                fields=dict(chat_name="ann"),
                                language='eng',
                                modified_on=timezone.now()),
            TembaContact.create(uuid='C-002',
                                name="Bob",
                                urns=['tel:2345'],
                                groups=['G-001'],
                                fields=dict(chat_name="bob"),
                                language='eng',
                                modified_on=timezone.now()),
            TembaContact.create(uuid='C-003',
                                name="Cat",
                                urns=['tel:3456'],
                                groups=['G-002'],
                                fields=dict(chat_name="cat"),
                                language='eng',
                                modified_on=timezone.now()),
            TembaContact.create(uuid='C-004',
                                name="Dan",
                                urns=['twitter:danny'],
                                groups=['G-002'],
                                fields=dict(chat_name="dan"),
                                language='eng',
                                modified_on=timezone.now()),
            TembaContact.create(uuid='C-005',
                                name="Eve",
                                urns=['twitter:evee'],
                                groups=['G-003'],
                                fields=dict(chat_name="eve"),
                                language='eng',
                                modified_on=timezone.now())
        ]

        created, updated, deleted, failed = sync_pull_contacts(
            self.unicef, Contact)
        self.assertFalse(created or updated or deleted or failed)

        # RapidPro returning 1 new, 1 modified, 1 deleted and 2 unsyncable contact
        mock_get_contacts.return_value = [
            TembaContact.create(uuid='C-001',
                                name="Annie",
                                urns=['tel:5678'],
                                groups=['G-002'],
                                fields=dict(chat_name="annie"),
                                language='eng',
                                modified_on=timezone.now()),
            TembaContact.create(uuid='C-003',
                                name="Cat",
                                urns=['tel:3456'],
                                groups=['G-002'],
                                fields=dict(chat_name="cat"),
                                language='eng',
                                modified_on=timezone.now()),
            TembaContact.create(uuid='C-004',
                                name="Dan",
                                urns=['twitter:danny'],
                                groups=['G-002'],
                                fields=dict(chat_name="dan"),
                                language='eng',
                                modified_on=timezone.now()),
            TembaContact.create(uuid='C-005',
                                name="Eve",
                                urns=['twitter:evee'],
                                groups=['G-003'],
                                fields=dict(chat_name="eve"),
                                language='eng',
                                modified_on=timezone.now()),
            TembaContact.create(uuid='C-007',
                                name="Jim",
                                urns=['twitter:jimbo'],
                                groups=['G-003'],
                                fields=dict(chat_name="jim"),
                                language='eng',
                                modified_on=timezone.now()),
            TembaContact.create(
                uuid='C-009',
                name="Xen",
                urns=['twitter:xen'],
                groups=[],  # no room group
                fields=dict(chat_name="xen"),
                language='eng',
                modified_on=timezone.now()),
            TembaContact.create(
                uuid='C-010',
                name="Yan",
                urns=[],
                groups=['G-003'],  # no URN
                fields=dict(chat_name="yan"),
                language='eng',
                modified_on=timezone.now())
        ]

        created, updated, deleted, failed = sync_pull_contacts(
            self.unicef, Contact)
        self.assertEqual(sorted(created), ['C-007'])
        self.assertEqual(sorted(updated), ['C-001'])
        self.assertEqual(sorted(deleted), ['C-002'])
        self.assertEqual(sorted(failed), ['C-009', 'C-010'])

        # check created contact
        jim = Contact.objects.get(uuid='C-007')
        self.assertEqual(jim.full_name, "Jim")
        self.assertEqual(jim.chat_name, "jim")
        self.assertEqual(jim.urn, 'twitter:jimbo')
        self.assertEqual(jim.room, self.room3)

        # check modified contact
        ann = Contact.objects.get(uuid='C-001')
        self.assertEqual(ann.full_name, "Annie")
        self.assertEqual(ann.chat_name, "annie")
        self.assertEqual(ann.urn, 'tel:5678')
        self.assertEqual(ann.room, self.room2)

        # check deleted contact
        bob = Contact.objects.get(uuid='C-002')
        self.assertFalse(bob.is_active)