コード例 #1
0
    def test_save(self):
        """
        Dhis2OrgUnit.save should save a FixtureDataItem
        """
        # with fixture_type_context(), \
        #         patch('corehq.apps.fixtures.models.FixtureDataItem') as data_item_patch, \
        #         patch('couchdbkit.schema.base.DocumentBase.save') as save_patch:
        #     data_item_mock = Mock()
        #     data_item_mock.save.return_value = None
        #     data_item_mock.get_id = '123'
        #     data_item_patch.return_value = data_item_mock
        #
        #     org_unit = Dhis2OrgUnit(id='QXOOG2Foong', name='Somerset West', parent_id=None)
        #     id_ = org_unit.save()
        #
        #     data_item_patch.assert_called()
        #     data_item_mock.save.assert_called()  # Which one gets called. Why?
        #     save_patch.assert_called()
        #     self.assertEqual(id_, '123')
        #     self.assertEqual(org_unit._fixture_id, '123')

        # TODO: Figure out why mocks above don't work.
        # In the meantime ...
        with fixture_type_context():
            Dhis2OrgUnit.objects = FixtureManager(Dhis2OrgUnit, DOMAIN,
                                                  ORG_UNIT_FIXTURES)
            org_unit = Dhis2OrgUnit(id='QXOOG2Foong',
                                    name='Somerset West',
                                    parent_id=None)
            id_ = org_unit.save()
            self.assertIsNotNone(id_)
            self.assertIsNotNone(org_unit._fixture_id)
コード例 #2
0
ファイル: tasks.py プロジェクト: ekush/commcare-hq
def get_user_by_org_unit(domain, org_unit_id, top_org_unit_name):
    """
    Look up user ID by a DHIS2 organisation unit ID
    """
    result = (
        UserES().domain(domain).mobile_users()
        # .term('user_data.dhis_org_id', org_unit_id)
        .run())
    # cf. http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-dynamic-mapping.html
    # If/when we upgrade elasticsearch, we can filter on dynamic mappings and
    # uncomment the ".term" line above. Until then, check it ourselves ...
    for doc in result.hits:
        if doc['user_data'].get('dhis_org_id') == org_unit_id:
            return CommCareUser.wrap(doc)
    # No user is assigned to this organisation unit (i.e. region or facility).
    # Try its parent org unit.
    Dhis2OrgUnit.objects = FixtureManager(Dhis2OrgUnit, domain,
                                          ORG_UNIT_FIXTURES)
    org_units = {ou.id: ou for ou in Dhis2OrgUnit.objects.all()}
    if (org_unit_id in org_units
            and org_units[org_unit_id].name != top_org_unit_name
            and org_units[org_unit_id].parent_id):
        return get_user_by_org_unit(domain, org_units[org_unit_id].parent_id,
                                    top_org_unit_name)
    # We don't know that org unit ID, or we're at the top for this project, or we're at the top of DHIS2
    return None
コード例 #3
0
ファイル: tasks.py プロジェクト: jmaina/commcare-hq
def sync_org_units():
    """
    Synchronize DHIS2 Organization Units with local data.

    This data is used to fulfill the first requirement of
    `DHIS2 Integration`_: Allow mobile users in CommCareHQ to be
    associated with a particular DHIS2 Organisation Unit, so that when
    they create cases their new cases can be associated with that area
    or facility.


    .. _DHIS2 Integration: https://www.dropbox.com/s/8djk1vh797t6cmt/WV Sri Lanka Detailed Requirements.docx

    """
    # Loop through all enabled domains
    for domain in Domain.get_all():
        settings = Dhis2Settings.for_domain(domain.name)
        if settings is None or not settings.is_enabled():
            continue

        dhis2_api = Dhis2Api(settings.dhis2.host, settings.dhis2.username, settings.dhis2.password,
                             settings.dhis2.top_org_unit_name)
        # Is it a bad idea to read all org units into dictionaries and sync them ...
        their_org_units = {ou['id']: ou for ou in dhis2_api.gen_org_units_with_parents()}
        # ... or should we rather just drop all ours and import all theirs every time?
        org_unit_objects = FixtureManager(Dhis2OrgUnit, domain, ORG_UNIT_FIXTURES)
        our_org_units = {ou.id: ou for ou in org_unit_objects.all()}
        # Add new org units
        for id_, ou in their_org_units.iteritems():
            if id_ not in our_org_units:
                org_unit = Dhis2OrgUnit(id=id_, name=ou['name'], parent_id=ou['parent_id'])
                org_unit.save()
        # Delete former org units
        for id_, ou in our_org_units.iteritems():
            if id_ not in their_org_units:
                ou.delete()
コード例 #4
0
ファイル: tasks.py プロジェクト: jmaina/commcare-hq
def get_user_by_org_unit(domain, org_unit_id, top_org_unit_name):
    """
    Look up user ID by a DHIS2 organisation unit ID
    """
    result = (UserES()
              .domain(domain)
              .term('user_data.dhis_org_id', org_unit_id)
              .run())
    if result.total:
        # Don't just assign all cases to the first user. Spread them fairly.
        i = random.randrange(result.total)
        return CommCareUser.wrap(result.hits[i])
    # No user is assigned to this organisation unit (i.e. region or facility).
    # Try its parent org unit.
    org_unit_objects = FixtureManager(Dhis2OrgUnit, domain, ORG_UNIT_FIXTURES)
    org_units = {ou.id: ou for ou in org_unit_objects.all()}
    if (
        org_unit_id in org_units and
        org_units[org_unit_id]['name'] != top_org_unit_name and
        org_units[org_unit_id]['parent_id']
    ):
        return get_user_by_org_unit(domain, org_units[org_unit_id]['parent_id'], top_org_unit_name)
    # We don't know that org unit ID, or we're at the top for this project, or we're at the top of DHIS2
    return None
コード例 #5
0
    def test_delete_dhis2_org_unit_does_nothing(self):
        """
        Dhis2OrgUnit.delete should do nothing if it's not saved
        """
        with fixture_type_context(), \
                patch('corehq.apps.fixtures.models.FixtureDataItem.get') as mock_get:
            data_item_mock = Mock()
            mock_get.return_value = data_item_mock

            Dhis2OrgUnit.objects = FixtureManager(Dhis2OrgUnit, DOMAIN,
                                                  ORG_UNIT_FIXTURES)
            org_unit = Dhis2OrgUnit(id='QXOOG2Foong',
                                    name='Somerset West',
                                    parent_id=None)
            org_unit.delete()

            self.assertFalse(mock_get.called)
            self.assertFalse(data_item_mock.delete.called)
コード例 #6
0
ファイル: tasks.py プロジェクト: ekush/commcare-hq
def fetch_org_units():
    """
    Synchronize DHIS2 Organization Units with local data.

    This data is used to fulfill the first requirement of
    `DHIS2 Integration`_: Allow mobile users in CommCareHQ to be
    associated with a particular DHIS2 Organisation Unit, so that when
    they create cases their new cases can be associated with that area
    or facility.


    .. _DHIS2 Integration: https://www.dropbox.com/s/8djk1vh797t6cmt/WV Sri Lanka Detailed Requirements.docx

    """
    for settings in Dhis2Settings.all_enabled():
        logger.info('DHIS2: Fetching org units for domain "%s" with "%s"',
                    settings.domain, settings.dhis2['host'])
        dhis2_api = Dhis2Api(settings.dhis2['host'],
                             settings.dhis2['username'],
                             settings.dhis2['password'],
                             settings.dhis2['top_org_unit_name'])
        Dhis2OrgUnit.objects = FixtureManager(Dhis2OrgUnit, settings.domain,
                                              ORG_UNIT_FIXTURES)
        our_org_units = {ou.id: ou for ou in Dhis2OrgUnit.objects.all()}
        their_org_units = {}
        # Add new org units
        for ou in dhis2_api.gen_org_units():
            their_org_units[ou['id']] = ou
            if ou['id'] not in our_org_units:
                logger.info('DHIS2: Adding org unit "%s"', ou['name'])
                org_unit = Dhis2OrgUnit(
                    id=ou['id'],
                    name=ou['name'],
                    parent_id=dhis2_api.get_org_unit_parent_id(ou['id']))
                org_unit.save()
        # Delete former org units
        for id_, ou in our_org_units.iteritems():
            if id_ not in their_org_units:
                logger.info('DHIS2: Deleting org unit "%s"', ou.name)
                ou.delete()
コード例 #7
0
    def test_delete_dhis2_org_unit_deletes(self):
        """
        Dhis2OrgUnit.delete should delete if it's saved
        """
        with fixture_type_context(), \
                patch('corehq.apps.fixtures.models.FixtureDataItem') as data_item_patch, \
                patch('couchdbkit.schema.base.DocumentBase.get') as get_patch:
            data_item_mock = Mock()
            data_item_mock.get_id.return_value = '123'
            data_item_patch.return_value = data_item_mock
            doc_mock = Mock()
            get_patch.return_value = data_item_mock

            Dhis2OrgUnit.objects = FixtureManager(Dhis2OrgUnit, DOMAIN,
                                                  ORG_UNIT_FIXTURES)
            org_unit = Dhis2OrgUnit(id='QXOOG2Foong',
                                    name='Somerset West',
                                    parent_id=None)
            org_unit.save()
            org_unit.delete()

            doc_mock.get.assert_called()
            data_item_mock.delete.assert_called()