def test_create_users_in_different_orgs(self): self.assertIsNone( Contact.objects.filter(org=self.nigeria, uuid="contact-uuid").first()) self.assertIsNone( Contact.objects.filter(org=self.uganda, uuid="contact-uuid").first()) created_contact_nigeria = Contact.get_or_create( self.nigeria, "contact-uuid") created_contact_uganda = Contact.get_or_create(self.uganda, "contact-uuid") self.assertNotEqual(created_contact_uganda.id, created_contact_nigeria.id) self.assertEqual(created_contact_uganda.uuid, created_contact_nigeria.uuid) Contact.objects.all().delete() created_contact_nigeria_1 = Contact.get_or_create( self.nigeria, "contact-uuid") created_contact_nigeria_2 = Contact.get_or_create( self.nigeria, "contact-uuid") self.assertEqual(created_contact_nigeria_1.id, created_contact_nigeria_2.id) self.assertEqual( Contact.objects.filter(org=self.nigeria, uuid="contact-uuid").count(), 1)
def test_kwargs_from_temba(self): temba_contact = TembaContact.create(uuid='C-006', name="Jan", urns=['tel:123'], groups=['G-001', 'G-007'], fields={'registration_date': None, 'state': None, 'lga': None, 'occupation': None, 'born': None, 'gender': None}, language='eng') kwargs = Contact.kwargs_from_temba(self.nigeria, temba_contact) self.assertEqual(kwargs, dict(uuid='C-006', org=self.nigeria, gender='', born=0, occupation='', registered_on=None, state='', district='', ward='')) # try creating contact from them Contact.objects.create(**kwargs) # Invalid boundaries become '' temba_contact = TembaContact.create(uuid='C-007', name="Jan", urns=['tel:123'], groups=['G-001', 'G-007'], fields={'registration_date': '2014-01-02T03:04:05.000000Z', 'state': 'Kigali', 'lga': 'Oyo', 'occupation': 'Student', 'born': '1990', 'gender': 'Male'}, language='eng') kwargs = Contact.kwargs_from_temba(self.nigeria, temba_contact) self.assertEqual(kwargs, dict(uuid='C-007', org=self.nigeria, gender='M', born=1990, occupation='Student', registered_on=json_date_to_datetime('2014-01-02T03:04:05.000'), state='', district='', ward='')) # try creating contact from them Contact.objects.create(**kwargs) temba_contact = TembaContact.create(uuid='C-008', name="Jan", urns=['tel:123'], groups=['G-001', 'G-007'], fields={'registration_date': '2014-01-02T03:04:05.000000Z', 'state':'Lagos', 'lga': 'Oyo', 'ward': 'Ikeja', 'occupation': 'Student', 'born': '1990', 'gender': 'Male'}, language='eng') kwargs = Contact.kwargs_from_temba(self.nigeria, temba_contact) self.assertEqual(kwargs, dict(uuid='C-008', org=self.nigeria, gender='M', born=1990, occupation='Student', registered_on=json_date_to_datetime('2014-01-02T03:04:05.000'), state='R-LAGOS', district='R-OYO', ward='R-IKEJA')) # try creating contact from them Contact.objects.create(**kwargs)
def test_get_or_create(self): self.assertIsNone(Contact.objects.filter(org=self.nigeria, uuid='contact-uuid').first()) created_contact = Contact.get_or_create(self.nigeria, 'contact-uuid') self.assertTrue(created_contact) self.assertIsNone(created_contact.born) created_contact.born = '2000' created_contact.save() existing_contact = Contact.get_or_create(self.nigeria, 'contact-uuid') self.assertEqual(created_contact.pk, existing_contact.pk) self.assertEqual(existing_contact.born, 2000)
def test_update_or_create_from_temba(self): temba_contact = TembaContact.create(uuid='C-006', name="Jan", urns=['tel:123'], groups=['G-001', 'G-007'], fields={'registration_date': None, 'state': None, 'lga': None, 'occupation': None, 'born': None, 'gender': None}, language='eng') contact = Contact.update_or_create_from_temba(self.nigeria, temba_contact) self.assertEqual(contact.uuid, 'C-006') updated_contact = Contact.update_or_create_from_temba(self.nigeria, temba_contact) self.assertEqual(contact.pk, updated_contact.pk)
def test_contact_ward_field(self): temba_contact = TembaContact.create(uuid='C-0011', name="Jan", urns=['tel:123'], groups=['G-001', 'G-007'], fields={'registration_date': '2014-01-02T03:04:05.000000Z', 'state':'Lagos', 'lga': '', 'ward': 'Ikeja', 'occupation': 'Student', 'born': '1990', 'gender': 'Male'}, language='eng') kwargs = Contact.kwargs_from_temba(self.nigeria, temba_contact) # invalid parent boundary (district) will yield empty ward self.assertEqual(kwargs, dict(uuid='C-0011', org=self.nigeria, gender='M', born=1990, occupation='Student', registered_on=json_date_to_datetime('2014-01-02T03:04:05.000'), state='R-LAGOS', district='', ward='')) self.assertEqual(ReportersCounter.get_counts(self.nigeria), dict()) Contact.objects.create(uuid='C-007', org=self.nigeria, gender='M', born=1990, occupation='Student', registered_on=json_date_to_datetime('2014-01-02T03:04:05.000'), state='R-LAGOS', district='R-OYO', ward='R-IKEJA') field_count = ReportersCounter.get_counts(self.nigeria) self.assertEqual(field_count['ward:R-IKEJA'], 1) Contact.objects.create(uuid='C-008', org=self.nigeria, gender='M', born=1980, occupation='Teacher', registered_on=json_date_to_datetime('2014-01-02T03:07:05.000'), state='R-LAGOS', district='R-OYO', ward='R-IKEJA') field_count = ReportersCounter.get_counts(self.nigeria) self.assertEqual(field_count['ward:R-IKEJA'], 2) Contact.objects.all().delete()
def test_get_or_create(self): self.assertIsNone( Contact.objects.filter(org=self.nigeria, uuid='contact-uuid').first()) created_contact = Contact.get_or_create(self.nigeria, 'contact-uuid') self.assertTrue(created_contact) self.assertIsNone(created_contact.born) created_contact.born = '2000' created_contact.save() existing_contact = Contact.get_or_create(self.nigeria, 'contact-uuid') self.assertEqual(created_contact.pk, existing_contact.pk) self.assertEqual(existing_contact.born, 2000)
def fetch_contacts_task(org_id=None, fetch_all=False): r = get_redis_connection() key = 'fetch_contacts' lock_timeout = 3600 if org_id: key = 'fetch_contacts:%d' % org_id lock_timeout = 300 if not r.get(key): with r.lock(key, timeout=lock_timeout): active_orgs = Org.objects.filter(is_active=True) if org_id: active_orgs = Org.objects.filter(pk=org_id) for org in active_orgs: start = time.time() last_fetched_key = Contact.CONTACT_LAST_FETCHED_CACHE_KEY % org.id after = cache.get(last_fetched_key, None) if after: after = json_date_to_datetime(after) if fetch_all: after = None try: if after is None: Boundary.fetch_boundaries(org) ContactField.fetch_contact_fields(org) Boundary.get_boundaries(org) ContactField.get_contact_fields(org) Contact.fetch_contacts(org, after=after) print "Task: fetch_contacts for %s took %ss" % (org.name, time.time() - start) except Exception as e: import traceback traceback.print_exc() logger.exception("Error fetching contacts: %s" % str(e))
def test_update_or_create_from_temba(self): temba_contact = TembaContact.create(uuid='C-006', name="Jan", urns=['tel:123'], groups=['G-001', 'G-007'], fields={ 'registration_date': None, 'state': None, 'lga': None, 'occupation': None, 'born': None, 'gender': None }, language='eng') contact = Contact.update_or_create_from_temba(self.nigeria, temba_contact) self.assertEqual(contact.uuid, 'C-006') updated_contact = Contact.update_or_create_from_temba( self.nigeria, temba_contact) self.assertEqual(contact.pk, updated_contact.pk)
def test_contact_ward_field(self): temba_contact = TembaContact.create(uuid='C-0011', name="Jan", urns=['tel:123'], groups=['G-001', 'G-007'], fields={ 'registration_date': '2014-01-02T03:04:05.000000Z', 'state': 'Lagos', 'lga': '', 'ward': 'Ikeja', 'occupation': 'Student', 'born': '1990', 'gender': 'Male' }, language='eng') kwargs = Contact.kwargs_from_temba(self.nigeria, temba_contact) # invalid parent boundary (district) will yield empty ward self.assertEqual( kwargs, dict( uuid='C-0011', org=self.nigeria, gender='M', born=1990, occupation='Student', registered_on=json_date_to_datetime('2014-01-02T03:04:05.000'), state='R-LAGOS', district='', ward='')) self.assertEqual(ReportersCounter.get_counts(self.nigeria), dict()) Contact.objects.create( uuid='C-007', org=self.nigeria, gender='M', born=1990, occupation='Student', registered_on=json_date_to_datetime('2014-01-02T03:04:05.000'), state='R-LAGOS', district='R-OYO', ward='R-IKEJA') field_count = ReportersCounter.get_counts(self.nigeria) self.assertEqual(field_count['ward:R-IKEJA'], 1) Contact.objects.create( uuid='C-008', org=self.nigeria, gender='M', born=1980, occupation='Teacher', registered_on=json_date_to_datetime('2014-01-02T03:07:05.000'), state='R-LAGOS', district='R-OYO', ward='R-IKEJA') field_count = ReportersCounter.get_counts(self.nigeria) self.assertEqual(field_count['ward:R-IKEJA'], 2) Contact.objects.all().delete()
def test_kwargs_from_temba(self): temba_contact = TembaContact.create(uuid='C-006', name="Jan", urns=['tel:123'], groups=['G-001', 'G-007'], fields={ 'registration_date': None, 'state': None, 'lga': None, 'occupation': None, 'born': None, 'gender': None }, language='eng') kwargs = Contact.kwargs_from_temba(self.nigeria, temba_contact) self.assertEqual( kwargs, dict(uuid='C-006', org=self.nigeria, gender='', born=0, occupation='', registered_on=None, state='', district='', ward='')) # try creating contact from them Contact.objects.create(**kwargs) # Invalid boundaries become '' temba_contact = TembaContact.create(uuid='C-007', name="Jan", urns=['tel:123'], groups=['G-001', 'G-007'], fields={ 'registration_date': '2014-01-02T03:04:05.000000Z', 'state': 'Kigali', 'lga': 'Oyo', 'occupation': 'Student', 'born': '1990', 'gender': 'Male' }, language='eng') kwargs = Contact.kwargs_from_temba(self.nigeria, temba_contact) self.assertEqual( kwargs, dict( uuid='C-007', org=self.nigeria, gender='M', born=1990, occupation='Student', registered_on=json_date_to_datetime('2014-01-02T03:04:05.000'), state='', district='', ward='')) # try creating contact from them Contact.objects.create(**kwargs) temba_contact = TembaContact.create(uuid='C-008', name="Jan", urns=['tel:123'], groups=['G-001', 'G-007'], fields={ 'registration_date': '2014-01-02T03:04:05.000000Z', 'state': 'Lagos', 'lga': 'Oyo', 'ward': 'Ikeja', 'occupation': 'Student', 'born': '1990', 'gender': 'Male' }, language='eng') kwargs = Contact.kwargs_from_temba(self.nigeria, temba_contact) self.assertEqual( kwargs, dict( uuid='C-008', org=self.nigeria, gender='M', born=1990, occupation='Student', registered_on=json_date_to_datetime('2014-01-02T03:04:05.000'), state='R-LAGOS', district='R-OYO', ward='R-IKEJA')) # try creating contact from them Contact.objects.create(**kwargs)
def test_recalculate_reporters_stats(self): self.assertEqual(ReportersCounter.get_counts(self.nigeria), dict()) Contact.objects.create( uuid="C-007", org=self.nigeria, gender="M", born=1990, occupation="Student", registered_on=json_date_to_datetime("2014-01-02T03:04:05.000"), state="R-LAGOS", district="R-OYO", ) expected = dict() expected["total-reporters"] = 1 expected["gender:m"] = 1 expected["occupation:student"] = 1 expected["born:1990"] = 1 expected["registered_on:2014-01-02"] = 1 expected["registered_gender:2014-01-01:m"] = 1 expected["registered_born:2014-01-01:1990"] = 1 expected["registered_state:2014-01-01:R-LAGOS"] = 1 expected["state:R-LAGOS"] = 1 expected["district:R-OYO"] = 1 self.assertEqual(ReportersCounter.get_counts(self.nigeria), expected) Contact.recalculate_reporters_stats(self.nigeria) self.assertEqual(ReportersCounter.get_counts(self.nigeria), expected) Contact.objects.create( uuid="C-008", org=self.nigeria, gender="M", born=1980, occupation="Teacher", registered_on=json_date_to_datetime("2014-01-02T03:07:05.000"), state="R-LAGOS", district="R-OYO", ) expected = dict() expected["total-reporters"] = 2 expected["gender:m"] = 2 expected["occupation:student"] = 1 expected["occupation:teacher"] = 1 expected["born:1990"] = 1 expected["born:1980"] = 1 expected["registered_on:2014-01-02"] = 2 expected["registered_gender:2014-01-01:m"] = 2 expected["registered_born:2014-01-01:1990"] = 1 expected["registered_born:2014-01-01:1980"] = 1 expected["registered_state:2014-01-01:R-LAGOS"] = 2 expected["state:R-LAGOS"] = 2 expected["district:R-OYO"] = 2 self.assertEqual(ReportersCounter.get_counts(self.nigeria), expected) Contact.recalculate_reporters_stats(self.nigeria) self.assertEqual(ReportersCounter.get_counts(self.nigeria), expected) Contact.objects.create( is_active=False, uuid="C-009", org=self.nigeria, gender="M", born=1980, occupation="Teacher", registered_on=json_date_to_datetime("2014-01-02T03:07:05.000"), state="R-LAGOS", district="R-OYO", ) self.assertEqual(ReportersCounter.get_counts(self.nigeria), expected) Contact.recalculate_reporters_stats(self.nigeria) self.assertEqual(ReportersCounter.get_counts(self.nigeria), expected)
def test_fetch_contacts(self): self.nigeria.set_config('reporter_group', 'Reporters') tz = pytz.timezone('UTC') with patch.object(timezone, 'now', return_value=tz.localize(datetime(2015, 9, 29, 10, 20, 30, 40))): with patch('dash.orgs.models.TembaClient1.get_groups') as mock_groups: group = TembaGroup.create(uuid="uuid-8", name='reporters', size=120) mock_groups.return_value = [group] with patch('dash.orgs.models.TembaClient1.get_contacts') as mock_contacts: mock_contacts.return_value = [ TembaContact.create(uuid='000-001', name="Ann", urns=['tel:1234'], groups=['000-002'], fields=dict(state="Lagos", lga="Oyo", gender='Female', born="1990"), language='eng', modified_on=datetime(2015, 9, 20, 10, 20, 30, 400000, pytz.utc))] seen_uuids = Contact.fetch_contacts(self.nigeria) self.assertEqual(seen_uuids, []) group = TembaGroup.create(uuid="000-002", name='reporters', size=120) mock_groups.return_value = [group] with patch('dash.orgs.models.TembaClient1.get_contacts') as mock_contacts: mock_contacts.return_value = [ TembaContact.create(uuid='000-001', name="Ann",urns=['tel:1234'], groups=['000-002'], fields=dict(state="Lagos", lga="Oyo",gender='Female', born="1990"), language='eng', modified_on=datetime(2015, 9, 20, 10, 20, 30, 400000, pytz.utc))] seen_uuids = Contact.fetch_contacts(self.nigeria) self.assertTrue('000-001' in seen_uuids) contact = Contact.objects.get() self.assertEqual(contact.uuid, '000-001') self.assertEqual(contact.org, self.nigeria) self.assertEqual(contact.state, 'R-LAGOS') self.assertEqual(contact.district, 'R-OYO') self.assertEqual(contact.gender, 'F') self.assertEqual(contact.born, 1990) Contact.fetch_contacts(self.nigeria, after=datetime(2014, 12, 01, 22, 34, 36, 123000, pytz.utc)) self.assertTrue('000-001' in seen_uuids) # delete the contacts Contact.objects.all().delete() group1 = TembaGroup.create(uuid="000-001", name='reporters too', size=10) group2 = TembaGroup.create(uuid="000-002", name='reporters', size=120) mock_groups.return_value = [group1, group2] with patch('dash.orgs.models.TembaClient1.get_contacts') as mock_contacts: mock_contacts.return_value = [ TembaContact.create(uuid='000-001', name="Ann",urns=['tel:1234'], groups=['000-002'], fields=dict(state="Lagos", lga="Oyo",gender='Female', born="1990"), language='eng', modified_on=datetime(2015, 9, 20, 10, 20, 30, 400000, pytz.utc))] seen_uuids = Contact.fetch_contacts(self.nigeria) self.assertTrue('000-001' in seen_uuids) contact = Contact.objects.get() self.assertEqual(contact.uuid, '000-001') self.assertEqual(contact.org, self.nigeria) self.assertEqual(contact.state, 'R-LAGOS') self.assertEqual(contact.district, 'R-OYO') self.assertEqual(contact.gender, 'F') self.assertEqual(contact.born, 1990) Contact.fetch_contacts(self.nigeria, after=datetime(2014, 12, 01, 22, 34, 36, 123000, pytz.utc)) self.assertTrue('000-001' in seen_uuids)
def rebuild_contacts_counts(): orgs = Org.objects.filter(is_active=True) for org in orgs: Contact.recalculate_reporters_stats(org)
def test_fetch_contacts(self): self.nigeria.set_config('reporter_group', 'Reporters') tz = pytz.timezone('UTC') with patch.object(timezone, 'now', return_value=tz.localize( datetime(2015, 9, 29, 10, 20, 30, 40))): with patch( 'dash.orgs.models.TembaClient1.get_groups') as mock_groups: group = TembaGroup.create(uuid="uuid-8", name='reporters', size=120) mock_groups.return_value = [group] with patch('dash.orgs.models.TembaClient1.get_contacts' ) as mock_contacts: mock_contacts.return_value = [ TembaContact.create(uuid='000-001', name="Ann", urns=['tel:1234'], groups=['000-002'], fields=dict(state="Lagos", lga="Oyo", gender='Female', born="1990"), language='eng', modified_on=datetime( 2015, 9, 20, 10, 20, 30, 400000, pytz.utc)) ] seen_uuids = Contact.fetch_contacts(self.nigeria) self.assertEqual(seen_uuids, []) group = TembaGroup.create(uuid="000-002", name='reporters', size=120) mock_groups.return_value = [group] with patch('dash.orgs.models.TembaClient1.get_contacts' ) as mock_contacts: mock_contacts.return_value = [ TembaContact.create(uuid='000-001', name="Ann", urns=['tel:1234'], groups=['000-002'], fields=dict(state="Lagos", lga="Oyo", gender='Female', born="1990"), language='eng', modified_on=datetime( 2015, 9, 20, 10, 20, 30, 400000, pytz.utc)) ] seen_uuids = Contact.fetch_contacts(self.nigeria) self.assertTrue('000-001' in seen_uuids) contact = Contact.objects.get() self.assertEqual(contact.uuid, '000-001') self.assertEqual(contact.org, self.nigeria) self.assertEqual(contact.state, 'R-LAGOS') self.assertEqual(contact.district, 'R-OYO') self.assertEqual(contact.gender, 'F') self.assertEqual(contact.born, 1990) Contact.fetch_contacts(self.nigeria, after=datetime( 2014, 12, 01, 22, 34, 36, 123000, pytz.utc)) self.assertTrue('000-001' in seen_uuids) # delete the contacts Contact.objects.all().delete() group1 = TembaGroup.create(uuid="000-001", name='reporters too', size=10) group2 = TembaGroup.create(uuid="000-002", name='reporters', size=120) mock_groups.return_value = [group1, group2] with patch('dash.orgs.models.TembaClient1.get_contacts' ) as mock_contacts: mock_contacts.return_value = [ TembaContact.create(uuid='000-001', name="Ann", urns=['tel:1234'], groups=['000-002'], fields=dict(state="Lagos", lga="Oyo", gender='Female', born="1990"), language='eng', modified_on=datetime( 2015, 9, 20, 10, 20, 30, 400000, pytz.utc)) ] seen_uuids = Contact.fetch_contacts(self.nigeria) self.assertTrue('000-001' in seen_uuids) contact = Contact.objects.get() self.assertEqual(contact.uuid, '000-001') self.assertEqual(contact.org, self.nigeria) self.assertEqual(contact.state, 'R-LAGOS') self.assertEqual(contact.district, 'R-OYO') self.assertEqual(contact.gender, 'F') self.assertEqual(contact.born, 1990) Contact.fetch_contacts(self.nigeria, after=datetime( 2014, 12, 01, 22, 34, 36, 123000, pytz.utc)) self.assertTrue('000-001' in seen_uuids)