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)
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)))
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)))
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)))
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), }, })
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)