Пример #1
0
    def test_archie_modified_on(self):
        case_id = uuid.uuid4().hex
        now = datetime.utcnow().replace(microsecond=0)
        earlier = now - timedelta(hours=1)
        way_earlier = now - timedelta(days=1)
        # make sure we timestamp everything so they have the right order
        create_block = CaseBlock(case_id,
                                 create=True,
                                 date_modified=way_earlier)
        post_case_blocks([create_block.as_xml()],
                         form_extras={'received_on': way_earlier})
        update_block = CaseBlock(case_id,
                                 update={'foo': 'bar'},
                                 date_modified=earlier)
        post_case_blocks([update_block.as_xml()],
                         form_extras={'received_on': earlier})

        case = CommCareCase.objects.get_case(case_id, 'test-domain')
        self.assertEqual(earlier, case.modified_on)

        second_form = XFormInstance.objects.get_form(case.xform_ids[-1],
                                                     'test-domain')
        second_form.archive()
        case = CommCareCase.objects.get_case(case_id, 'test-domain')
        self.assertEqual(way_earlier, case.modified_on)
Пример #2
0
    def test_archie_modified_on(self):
        case_id = uuid.uuid4().hex
        now = datetime.utcnow().replace(microsecond=0)
        earlier = now - timedelta(hours=1)
        way_earlier = now - timedelta(days=1)
        # make sure we timestamp everything so they have the right order
        create_block = CaseBlock(case_id,
                                 create=True,
                                 date_modified=way_earlier)
        post_case_blocks([create_block.as_xml()],
                         form_extras={'received_on': way_earlier})
        update_block = CaseBlock(case_id,
                                 update={'foo': 'bar'},
                                 date_modified=earlier)
        post_case_blocks([update_block.as_xml()],
                         form_extras={'received_on': earlier})

        case_accessors = CaseAccessors(REBUILD_TEST_DOMAIN)
        case = case_accessors.get_case(case_id)
        self.assertEqual(earlier, case.modified_on)

        second_form = FormAccessors(REBUILD_TEST_DOMAIN).get_form(
            case.xform_ids[-1])
        second_form.archive()
        case = case_accessors.get_case(case_id)
        self.assertEqual(way_earlier, case.modified_on)
Пример #3
0
def create_case_from_dhis2(dhis2_child, domain, user):
    """
    Create a new case using the data pulled from DHIS2

    :param dhis2_child: TRACKED_ENTITY (i.e. "Child") from DHIS2
    :param domain: (str) The name of the domain
    :param user: (Document) The owner of the new case
    :return: New case ID
    """
    case_id = uuid.uuid4().hex
    update = {
        k: dhis2_child[v]
        for k, v in NUTRITION_ASSESSMENT_PROGRAM_FIELDS.iteritems()
    }
    update['dhis_org_id'] = dhis2_child['Org unit']
    # Do the inverse of push_case() to 'Gender' / 'child_gender'
    if 'child_gender' in update:
        if update['child_gender'] == 'Undefined':
            del update['child_gender']
        else:
            update['child_gender'] = update['child_gender'].lower()
    caseblock = CaseBlock(create=True,
                          case_id=case_id,
                          owner_id=user.userID,
                          user_id=user.userID,
                          version=V2,
                          case_type=CASE_TYPE,
                          case_name=update[CASE_NAME] if CASE_NAME else '',
                          external_id=dhis2_child['Instance'],
                          update=update)
    casexml = ElementTree.tostring(caseblock.as_xml())
    submit_case_blocks(casexml, domain)
    return case_id
Пример #4
0
def submit_mapping_case_block(user, index):
    mapping = user.get_location_map_case()

    if mapping:
        caseblock = CaseBlock(
            create=False,
            case_id=mapping._id,
            version=V2,
            index=index
        )
    else:
        caseblock = CaseBlock(
            create=True,
            case_type=const.USER_LOCATION_OWNER_MAP_TYPE,
            case_id=location_map_case_id(user),
            version=V2,
            owner_id=user._id,
            index=index,
            case_name=const.USER_LOCATION_OWNER_MAP_TYPE.replace('-', ' '),
            user_id=const.COMMTRACK_USERNAME,
        )

    submit_case_blocks(
        ElementTree.tostring(
            caseblock.as_xml(format_datetime=json_format_datetime)
        ),
        user.domain,
    )
Пример #5
0
    def test_case_block_index_supports_relationship(self):
        """
        CaseBlock index should allow the relationship to be set
        """
        case_block = CaseBlock(
            case_id='abcdef',
            case_type='at_risk',
            date_modified='2015-07-24',
            date_opened='2015-07-24',
            index={
                'host': IndexAttrs(case_type='newborn', case_id='123456', relationship='extension')
            },
        )

        self.assertEqual(
            ElementTree.tostring(case_block.as_xml()).decode('utf-8'),
            re.sub(r'(\n| {2,})', '', """
            <case case_id="abcdef" date_modified="2015-07-24" xmlns="http://commcarehq.org/case/transaction/v2">
                <update>
                    <case_type>at_risk</case_type>
                    <date_opened>2015-07-24</date_opened>
                </update>
                <index>
                    <host case_type="newborn" relationship="extension">123456</host>
                </index>
            </case>
            """)
        )
Пример #6
0
def submit_mapping_case_block(user, index):
    mapping = user.get_location_map_case()

    if mapping:
        caseblock = CaseBlock(
            create=False,
            case_id=mapping.case_id,
            index=index
        )
    else:
        caseblock = CaseBlock(
            create=True,
            case_type=const.USER_LOCATION_OWNER_MAP_TYPE,
            case_id=location_map_case_id(user),
            owner_id=user._id,
            index=index,
            case_name=const.USER_LOCATION_OWNER_MAP_TYPE.replace('-', ' '),
            user_id=const.COMMTRACK_USERNAME,
        )

    submit_case_blocks(
        ElementTree.tostring(caseblock.as_xml()),
        user.domain,
        device_id=__name__ + ".submit_mapping_case_block"
    )
Пример #7
0
def submit_mapping_case_block(user, index):
    mapping = user.get_location_map_case()

    if mapping:
        caseblock = CaseBlock(
            create=False,
            case_id=mapping._id,
            version=V2,
            index=index
        )
    else:
        caseblock = CaseBlock(
            create=True,
            case_type=USER_LOCATION_OWNER_MAP_TYPE,
            case_id=location_map_case_id(user),
            version=V2,
            owner_id=user._id,
            index=index
        )

    submit_case_blocks(
        ElementTree.tostring(caseblock.as_xml()),
        user.domain,
        user.username,
        user._id
    )
Пример #8
0
    def test_case_block_index_omit_child(self):
        """
        CaseBlock index relationship omit relationship attribute if set to "child"
        """
        case_block = CaseBlock(
            case_id='123456',
            case_type='newborn',
            date_modified='2015-07-24',
            index={
                'parent': IndexAttrs(case_type='mother', case_id='789abc', relationship='child')
            },
        )

        self.assertEqual(
            ElementTree.tostring(case_block.as_xml()),
            re.sub(r'(\n| {2,})', '', """
            <case case_id="123456" date_modified="2015-07-24" xmlns="http://commcarehq.org/case/transaction/v2">
                <update>
                    <case_type>newborn</case_type>
                </update>
                <index>
                    <parent case_type="mother">789abc</parent>
                </index>
            </case>
            """)
        )
Пример #9
0
    def testBadIndexReferenceDomain(self):
        case_in_other_domain = self.MOTHER_CASE_ID
        parent_domain = 'parent'
        child_domain = 'child'

        post_case_blocks([
            CaseBlock(create=True,
                      case_id=case_in_other_domain,
                      user_id=USER_ID,
                      version=V2).as_xml()
        ],
                         form_extras={'domain': parent_domain})

        block = CaseBlock(create=True,
                          case_id='child-case-id',
                          user_id=USER_ID,
                          version=V2,
                          index={'bad': ('bad-case', case_in_other_domain)})

        xform, _ = post_case_blocks([block.as_xml()],
                                    form_extras={'domain': child_domain})

        self.assertIsInstance(xform, XFormError)
        self.assertEqual(xform.doc_type, 'XFormError')
        self.assertIn('IllegalCaseId', xform.problem)
        self.assertIn('Bad case id', xform.problem)
Пример #10
0
    def test_case_block_index_default_relationship(self):
        """
        CaseBlock index relationship should default to "child"
        """
        case_block = CaseBlock(
            case_id='123456',
            case_type='newborn',
            date_modified='2015-07-24',
            date_opened='2015-07-24',
            index={
                'parent': ChildIndexAttrs(case_type='mother', case_id='789abc')
            },
        )

        self.assertEqual(
            ElementTree.tostring(case_block.as_xml()).decode('utf-8'),
            re.sub(
                r'(\n| {2,})', '', """
            <case case_id="123456" date_modified="2015-07-24" xmlns="http://commcarehq.org/case/transaction/v2">
                <update>
                    <case_type>newborn</case_type>
                    <date_opened>2015-07-24</date_opened>
                </update>
                <index>
                    <parent case_type="mother">789abc</parent>
                </index>
            </case>
            """))
Пример #11
0
def make_supply_point_product(supply_point_case, product_uuid, owner_id=None):
    domain = supply_point_case.domain
    id = uuid.uuid4().hex
    user_id = const.get_commtrack_user_id(domain)
    owner_id = owner_id or get_owner_id(supply_point_case) or user_id
    username = const.COMMTRACK_USERNAME
    product_name = Product.get(product_uuid).name
    caseblock = CaseBlock(
        case_id=id,
        create=True,
        version=V2,
        case_name=product_name,
        user_id=user_id,
        owner_id=owner_id,
        case_type=const.SUPPLY_POINT_PRODUCT_CASE_TYPE,
        update={
            "product": product_uuid
        },
        index={
            const.PARENT_CASE_REF: (const.SUPPLY_POINT_CASE_TYPE,
                                    supply_point_case._id),
        }
    )
    casexml = ElementTree.tostring(caseblock.as_xml())
    submit_case_blocks(casexml, domain, username, user_id,
                       xmlns=const.COMMTRACK_SUPPLY_POINT_PRODUCT_XMLNS)
    sppc = SupplyPointProductCase.get(id)
    sppc.bind_to_location(supply_point_case.location)
    sppc.save()
    return sppc
Пример #12
0
def reassign_household(domain,
                       household_case_id,
                       old_owner_id,
                       new_owner_id,
                       supervisor_id,
                       deprecation_time=None,
                       household_child_case_ids=None):
    from custom.icds.location_reassignment.tasks import process_ucr_changes
    if deprecation_time is None:
        deprecation_time = datetime.utcnow()
    if household_child_case_ids:
        case_ids = household_child_case_ids
    else:
        case_ids = get_household_child_case_ids_by_owner(
            domain, household_case_id, old_owner_id)
    case_ids.append(household_case_id)
    case_blocks = []
    for case_id in case_ids:
        updates = {
            'location_reassignment_last_owner_id': old_owner_id,
            'location_reassignment_datetime': deprecation_time
        }
        if supervisor_id:
            updates['location_reassignment_last_supervisor_id'] = supervisor_id
        case_block = CaseBlock(case_id,
                               update=updates,
                               owner_id=new_owner_id,
                               user_id=SYSTEM_USER_ID)
        case_block = ElementTree.tostring(case_block.as_xml()).decode('utf-8')
        case_blocks.append(case_block)
    if case_blocks:
        submit_case_blocks(case_blocks, domain, user_id=SYSTEM_USER_ID)
    process_ucr_changes.delay(domain, case_ids)
Пример #13
0
    def test_case_block_index_default_relationship(self):
        """
        CaseBlock index relationship should default to "child"
        """
        case_block = CaseBlock(
            case_id='123456',
            case_type='newborn',
            date_modified='2015-07-24',
            date_opened='2015-07-24',
            index={
                'parent': ChildIndexAttrs(case_type='mother', case_id='789abc')
            },
        )

        self.assertEqual(
            ElementTree.tostring(case_block.as_xml()).decode('utf-8'),
            re.sub(r'(\n| {2,})', '', """
            <case case_id="123456" date_modified="2015-07-24" xmlns="http://commcarehq.org/case/transaction/v2">
                <update>
                    <case_type>newborn</case_type>
                    <date_opened>2015-07-24</date_opened>
                </update>
                <index>
                    <parent case_type="mother">789abc</parent>
                </index>
            </case>
            """)
        )
Пример #14
0
def _post_util(create=False,
               case_id=None,
               user_id=None,
               owner_id=None,
               case_type=None,
               form_extras=None,
               close=False,
               date_modified=None,
               **kwargs):

    form_extras = form_extras or {}
    form_extras['domain'] = REBUILD_TEST_DOMAIN

    uid = lambda: uuid.uuid4().hex
    case_id = case_id or uid()
    block = CaseBlock(create=create,
                      case_id=case_id,
                      user_id=user_id or uid(),
                      owner_id=owner_id or uid(),
                      case_type=case_type or 'test',
                      date_modified=date_modified,
                      update=kwargs,
                      close=close)
    block = block.as_xml()
    post_case_blocks([block], form_extras)
    return case_id
Пример #15
0
def create_case_from_dhis2(dhis2_child, domain, user):
    """
    Create a new case using the data pulled from DHIS2

    :param dhis2_child: TRACKED_ENTITY (i.e. "Child") from DHIS2
    :param domain: (str) The name of the domain
    :param user: (Document) The owner of the new case
    :return: New case ID
    """
    case_id = uuid.uuid4().hex
    update = {k: dhis2_child[v] for k, v in NUTRITION_ASSESSMENT_PROGRAM_FIELDS.iteritems()}
    update['dhis_org_id'] = dhis2_child['Org unit']
    # Do the inverse of push_case() to 'Gender' / 'child_gender'
    if 'child_gender' in update:
        if update['child_gender'] == 'Undefined':
            del update['child_gender']
        else:
            update['child_gender'] = update['child_gender'].lower()
    caseblock = CaseBlock(
        create=True,
        case_id=case_id,
        owner_id=user.userID,
        user_id=user.userID,
        case_type=CASE_TYPE,
        case_name=update[CASE_NAME] if CASE_NAME else '',
        external_id=dhis2_child['Instance'],
        update=update
    )
    casexml = ElementTree.tostring(caseblock.as_xml())
    submit_case_blocks(casexml, domain)
    return case_id
Пример #16
0
    def test_case_block_index_supports_relationship(self):
        """
        CaseBlock index should allow the relationship to be set
        """
        case_block = CaseBlock(
            case_id='abcdef',
            case_type='at_risk',
            date_modified='2015-07-24',
            date_opened='2015-07-24',
            index={
                'host':
                IndexAttrs(case_type='newborn',
                           case_id='123456',
                           relationship='extension')
            },
        )

        self.assertEqual(
            ElementTree.tostring(case_block.as_xml()).decode('utf-8'),
            re.sub(
                r'(\n| {2,})', '', """
            <case case_id="abcdef" date_modified="2015-07-24" xmlns="http://commcarehq.org/case/transaction/v2">
                <update>
                    <case_type>at_risk</case_type>
                    <date_opened>2015-07-24</date_opened>
                </update>
                <index>
                    <host case_type="newborn" relationship="extension">123456</host>
                </index>
            </case>
            """))
Пример #17
0
    def create_case(cls,
                    case_type,
                    parent_case_id=None,
                    parent_case_type=None,
                    parent_identifier=None,
                    parent_relationship=None,
                    update=None,
                    case_name=None,
                    owner_id=None):

        kwargs = {}
        if parent_case_id:
            kwargs['index'] = {
                parent_identifier:
                (parent_case_type, parent_case_id, parent_relationship)
            }

        if case_name:
            kwargs['case_name'] = case_name

        if owner_id:
            kwargs['owner_id'] = owner_id

        caseblock = CaseBlock(uuid.uuid4().hex,
                              case_type=case_type,
                              create=True,
                              update=update,
                              **kwargs)
        case = submit_case_blocks(ElementTree.tostring(caseblock.as_xml()),
                                  cls.domain)[1][0]
        cls.created_case_ids.append(case.case_id)
        return case
Пример #18
0
    def test_reprocess_xform_error(self):
        case_id = uuid.uuid4().hex
        parent_case_id = uuid.uuid4().hex
        case = CaseBlock(
            create=True,
            case_id=case_id,
            user_id='user1',
            owner_id='user1',
            case_type='demo',
            case_name='child',
            index={'parent': ('parent_type', parent_case_id)}
        )

        post_case_blocks([case.as_xml()], domain=self.domain)

        form_accessors = FormAccessors(self.domain)
        error_forms = form_accessors.get_forms_by_type('XFormError', 10)
        self.assertEqual(1, len(error_forms))

        form = error_forms[0]
        reprocess_xform_error(form)
        error_forms = form_accessors.get_forms_by_type('XFormError', 10)
        self.assertEqual(1, len(error_forms))

        case = CaseBlock(
            create=True,
            case_id=parent_case_id,
            user_id='user1',
            owner_id='user1',
            case_type='parent_type',
            case_name='parent',
        )

        post_case_blocks([case.as_xml()], domain=self.domain)

        reprocess_xform_error(form_accessors.get_form(form.form_id))

        form = form_accessors.get_form(form.form_id)
        # self.assertTrue(form.initial_processing_complete)  Can't change this with SQL forms at the moment
        self.assertTrue(form.is_normal)
        self.assertIsNone(form.problem)

        case = CaseAccessors(self.domain).get_case(case_id)
        self.assertEqual(1, len(case.indices))
        self.assertEqual(case.indices[0].referenced_id, parent_case_id)
        self._validate_case(case)
Пример #19
0
 def testBadIndexReference(self):
     block = CaseBlock(create=True, case_id=self.CASE_ID, user_id=USER_ID, version=V2,
                       index={'bad': ('bad-case', 'not-an-existing-id')})
     try:
         post_case_blocks([block.as_xml()])
         self.fail("Submitting against a bad case in an index should fail!")
     except IllegalCaseId:
         pass
Пример #20
0
def create_case_blocks(case_ids):
    case_blocks = []
    for case_id in case_ids:
        case_block = CaseBlock(case_id,
                               update={PHONE_NUMBER_PROPERTY: ''},
                               user_id=SYSTEM_USER_ID)
        case_block = ElementTree.tostring(case_block.as_xml()).decode('utf-8')
        case_blocks.append(case_block)
    return case_blocks
Пример #21
0
 def _create_case_blocks(updates, case_property):
     case_blocks = []
     for case_id, new_value in updates.items():
         case_block = CaseBlock(case_id,
                                update={case_property: new_value},
                                user_id=SYSTEM_USER_ID)
         case_block = ElementTree.tostring(case_block.as_xml()).decode('utf-8')
         case_blocks.append(case_block)
     return case_blocks
Пример #22
0
    def testArchiveModifiedOn(self):
        case_id = uuid.uuid4().hex
        now = datetime.utcnow().replace(microsecond=0)
        earlier = now - timedelta(hours=1)
        way_earlier = now - timedelta(days=1)
        # make sure we timestamp everything so they have the right order
        create_block = CaseBlock(case_id, create=True, date_modified=way_earlier)
        FormProcessorInterface.post_case_blocks([create_block.as_xml()], form_extras={'received_on': way_earlier})
        update_block = CaseBlock(case_id, update={'foo': 'bar'}, date_modified=earlier)
        FormProcessorInterface.post_case_blocks([update_block.as_xml()], form_extras={'received_on': earlier})

        case = CommCareCase.get(case_id)
        self.assertEqual(earlier, case.modified_on)

        second_form = XFormInstance.get(case.xform_ids[-1])
        second_form.archive()
        case = CommCareCase.get(case_id)
        self.assertEqual(way_earlier, case.modified_on)
Пример #23
0
    def test_globally_unique_case_id(self):
        case_id = uuid.uuid4().hex
        case = CaseBlock(
            create=True,
            case_id=case_id,
            user_id='user1',
            owner_id='user1',
            case_type='demo',
            case_name='create_case'
        )

        with override_settings(TESTS_SHOULD_USE_SQL_BACKEND=False):
            post_case_blocks([case.as_xml()], domain='domain1')

        with override_settings(TESTS_SHOULD_USE_SQL_BACKEND=True):
            xform, cases = post_case_blocks([case.as_xml()], domain='domain2')
            self.assertEqual(0, len(cases))
            self.assertTrue(xform.is_error)
            self.assertIn('IllegalCaseId', xform.problem)
 def _create_case(cls, parent_id):
     case_id = uuid.uuid4().hex
     caseblock = CaseBlock(case_id=case_id,
                           case_type=cls.case_type,
                           date_opened=cls.case_date_opened,
                           case_name=cls.case_name,
                           update=cls._get_case_property_values(),
                           index={'parent': (cls.case_type, parent_id)})
     post_case_blocks([caseblock.as_xml()], domain=cls.domain)
     return case_id
Пример #25
0
def reassign_cases(domain, case_ids, new_owner_id):
    case_blocks = []
    for case_id in case_ids:
        case_block = CaseBlock(case_id,
                               owner_id=new_owner_id,
                               user_id=SYSTEM_USER_ID)
        case_block = ElementTree.tostring(case_block.as_xml()).decode('utf-8')
        case_blocks.append(case_block)
    if case_blocks:
        submit_case_blocks(case_blocks, domain, user_id=SYSTEM_USER_ID)
Пример #26
0
 def create_case_blocks(self, updates):
     case_blocks = []
     for case_id, mother_name in updates.items():
         case_block = CaseBlock(case_id,
                                update={MOTHER_NAME_PROPERTY: mother_name},
                                user_id=SYSTEM_USER_ID)
         case_block = ElementTree.tostring(
             case_block.as_xml()).decode('utf-8')
         case_blocks.append(case_block)
     return case_blocks
Пример #27
0
        def to_xml(to_update):
            caseblock = CaseBlock(
                create=False,
                case_id=to_update.case.case_id,
                user_id=MOTECH_ID,
                owner_id=to_update.new_owner_id or CaseBlock.undefined,
                case_type=to_update.new_type or CaseBlock.undefined,
            )

            return ElementTree.tostring(caseblock.as_xml())
Пример #28
0
 def _create_case_blocks(updates):
     case_blocks = []
     for case_id, case_updates in updates.items():
         case_block = CaseBlock(case_id,
                                update=case_updates,
                                user_id=SYSTEM_USER_ID)
         case_block = ElementTree.tostring(
             case_block.as_xml()).decode('utf-8')
         case_blocks.append(case_block)
     return case_blocks
Пример #29
0
    def test_date_opened_coercion(self):
        delete_all_users()
        self.project = Domain(name='some-domain')
        self.project.save()
        user = create_restore_user(self.project.name)
        case_id = uuid.uuid4().hex
        modified_on = datetime.utcnow()
        case = CaseBlock(
            create=True,
            case_id=case_id,
            user_id=user.user_id, owner_id=user.user_id, case_type='demo',
            case_name='create_case', date_modified=modified_on, date_opened=modified_on, update={
                'dynamic': '123'
            }
        )

        post_case_blocks([case.as_xml()], domain='some-domain')
        # update the date_opened to date type to check for value on restore
        case.date_opened = case.date_opened.date()
        check_user_has_case(self, user, case.as_xml())
Пример #30
0
def update_case_external_id(case, external_id):
    """
    Update the external_id of a case
    """
    caseblock = CaseBlock(
        create=False,
        case_id=case['_id'],
        external_id=external_id
    )
    casexml = ElementTree.tostring(caseblock.as_xml())
    submit_case_blocks(casexml, case['domain'])
Пример #31
0
        def to_xml(to_update):
            caseblock = CaseBlock(
                create=False,
                case_id=to_update.case.case_id,
                version=V2,
                user_id=MOTECH_ID,
                owner_id=to_update.new_owner_id or CaseBlock.undefined,
                case_type=to_update.new_type or CaseBlock.undefined,
            )

            return ElementTree.tostring(caseblock.as_xml())
Пример #32
0
 def testBadIndexReference(self):
     CASE_ID = 'test-bad-index-case'
     block = CaseBlock(create=True,
                       case_id=CASE_ID,
                       user_id=USER_ID,
                       version=V2,
                       index={'bad': ('bad-case', 'not-an-existing-id')})
     try:
         post_case_blocks([block.as_xml()])
         self.fail("Submitting against a bad case in an index should fail!")
     except IllegalCaseId:
         pass
Пример #33
0
 def _create_closed_case(cls):
     case_id = uuid.uuid4().hex
     caseblock = CaseBlock(
         case_id=case_id,
         case_type=cls.case_type,
         date_opened=cls.closed_case_date_opened,
         date_modified=cls.closed_case_date_closed,
         case_name=cls.case_name,
         close=True,
     )
     post_case_blocks([caseblock.as_xml()], domain=cls.domain)
     return case_id
Пример #34
0
 def _create_closed_case(cls):
     case_id = uuid.uuid4().hex
     caseblock = CaseBlock(
         case_id=case_id,
         case_type=cls.case_type,
         date_opened=cls.closed_case_date_opened,
         date_modified=cls.closed_case_date_closed,
         case_name=cls.case_name,
         close=True,
     )
     post_case_blocks([caseblock.as_xml()], domain=cls.domain)
     return case_id
Пример #35
0
def pull_child_entities(settings, dhis2_children):
    """
    Create new child cases for nutrition tracking in CommCare.

    Sets external_id on new child cases, and CCHQ Case ID on DHIS2
    tracked entity instances. (CCHQ Case ID is initially unset because the
    case is new and does not exist in CommCare.)

    :param settings: DHIS2 settings, incl. relevant domain
    :param dhis2_children: A list of dictionaries of Child tracked entities
                           from the DHIS2 API where CCHQ Case ID is unset

    This fulfills the third requirement of `DHIS2 Integration`_.


    .. _DHIS2 Integration: https://www.dropbox.com/s/8djk1vh797t6cmt/WV Sri Lanka Detailed Requirements.docx
    """
    dhis2_api = Dhis2Api(settings.dhis2.host, settings.dhis2.username, settings.dhis2.password,
                         settings.dhis2.top_org_unit_name)
    for dhis2_child in dhis2_children:
        # Add each child separately. Although this is slower, it avoids problems if a DHIS2 API call fails
        # ("Instance" is DHIS2's friendly name for "id")
        case = get_case_by_external_id(settings.domain, dhis2_child['Instance'])
        if case:
            case_id = case['case_id']
        else:
            user = get_user_by_org_unit(settings.domain, dhis2_child['Org unit'], settings.dhis2.top_org_unit_name)
            if not user:
                # No user is assigned to this organisation unit (i.e. region or facility). Now what?
                # TODO: Now what? Ascend to parent org unit?
                continue
            case_id = uuid.uuid4().hex
            caseblock = CaseBlock(
                create=True,
                case_id=case_id,
                owner_id=user.userID,
                user_id=user.userID,
                version=V2,
                case_type='child_gmp',  # TODO: Move to a constant / setting
                external_id=dhis2_child['Instance'],
                update={
                    'name': dhis2_child['Name'],
                    'height': dhis2_child['Height'],
                    'weight': dhis2_child['Weight'],
                    'age': dhis2_child['Age at time of visit'],
                    'bmi': dhis2_child['Body-mass index'],
                }
            )
            casexml = ElementTree.tostring(caseblock.as_xml())
            submit_case_blocks(casexml, settings.domain)
        dhis2_child['CCHQ Case ID'] = case_id
        dhis2_api.update_te_inst(dhis2_child)
Пример #36
0
    def testUserRestoreWithCase(self):
        restore_user = create_restore_user(domain=self.domain)
        expected_case_block = CaseBlock(
            create=True,
            case_id='my-case-id',
            user_id=restore_user.user_id,
            owner_id=restore_user.user_id,
            case_type='test-case-type',
            update={'external_id': 'someexternal'},
        )
        _, [case] = post_case_blocks([expected_case_block.as_xml()], {'domain': self.domain})

        assert_user_has_case(self, restore_user, case.case_id)
    def setUpClass(cls):
        super(TestFormProcessorCouch, cls).setUpClass()
        cls.case_id = uuid.uuid4().hex
        case = CaseBlock(
            create=True,
            case_id=cls.case_id,
            user_id='user1',
            owner_id='user1',
            case_type='demo',
            case_name='wrap?'
        )
        cls.domain = uuid.uuid4().hex

        cls.case = post_case_blocks([case.as_xml()], domain=cls.domain)[1][0]
Пример #38
0
    def testUserRestoreWithCase(self):
        restore_user = create_restore_user(domain=self.domain)
        expected_case_block = CaseBlock(
            create=True,
            case_id='my-case-id',
            user_id=restore_user.user_id,
            owner_id=restore_user.user_id,
            case_type='test-case-type',
            update={'external_id': 'someexternal'},
        )
        _, [case] = post_case_blocks([expected_case_block.as_xml()],
                                     {'domain': self.domain})

        assert_user_has_case(self, restore_user, case.case_id)
Пример #39
0
def sync_user_cases(commcare_user):
    domain = commcare_user.project
    if not (domain and domain.call_center_config.enabled):
        return

    # language or phone_number can be null and will break
    # case submission
    fields = {
        'name': commcare_user.name or commcare_user.raw_username,
        'email': commcare_user.email,
        'language': commcare_user.language or '',
        'phone_number': commcare_user.phone_number or ''
    }
    # fields comes second to prevent custom user data overriding
    fields = dict(commcare_user.user_data, **fields)

    found = False
    try:
        case = get_case_by_domain_hq_user_id(domain.name, commcare_user._id, include_docs=True)
        found = bool(case)
    except MultipleResultsFound:
        return

    close = commcare_user.to_be_deleted() or not commcare_user.is_active

    owner_id = domain.call_center_config.case_owner_id
    if found:
        caseblock = CaseBlock(
            create=False,
            case_id=case._id,
            version=V2,
            owner_id=owner_id,
            case_type=domain.call_center_config.case_type,
            close=close,
            update=fields
        )
    else:
        fields['hq_user_id'] = commcare_user._id
        caseblock = CaseBlock(
            create=True,
            case_id=uuid.uuid4().hex,
            owner_id=owner_id,
            user_id=owner_id,
            version=V2,
            case_type=domain.call_center_config.case_type,
            update=fields
        )

    casexml = ElementTree.tostring(caseblock.as_xml())
    submit_case_blocks(casexml, domain.name)
Пример #40
0
 def _create_case(cls, parent_id):
     case_id = uuid.uuid4().hex
     caseblock = CaseBlock(
         case_id=case_id,
         case_type=cls.case_type,
         date_opened=cls.case_date_opened,
         case_name=cls.case_name,
         update=cls._get_case_property_values(),
         index={
             'parent': (cls.case_type, parent_id)
         }
     )
     post_case_blocks([caseblock.as_xml()], domain=cls.domain)
     return case_id
Пример #41
0
    def test_archie_modified_on(self):
        case_id = uuid.uuid4().hex
        now = datetime.utcnow().replace(microsecond=0)
        earlier = now - timedelta(hours=1)
        way_earlier = now - timedelta(days=1)
        # make sure we timestamp everything so they have the right order
        create_block = CaseBlock(case_id, create=True, date_modified=way_earlier)
        post_case_blocks(
            [create_block.as_xml()], form_extras={'received_on': way_earlier}
        )
        update_block = CaseBlock(case_id, update={'foo': 'bar'}, date_modified=earlier)
        post_case_blocks(
            [update_block.as_xml()], form_extras={'received_on': earlier}
        )

        case_accessors = CaseAccessors(REBUILD_TEST_DOMAIN)
        case = case_accessors.get_case(case_id)
        self.assertEqual(earlier, case.modified_on)

        second_form = FormAccessors(REBUILD_TEST_DOMAIN).get_form(case.xform_ids[-1])
        second_form.archive()
        case = case_accessors.get_case(case_id)
        self.assertEqual(way_earlier, case.modified_on)
Пример #42
0
    def testBadIndexReferenceDomain(self):
        case_in_other_domain = 'text-index-mother-case'
        parent_domain = 'parent'
        child_domain = 'child'

        post_case_blocks([
            CaseBlock(create=True, case_id=case_in_other_domain, user_id=USER_ID,
                      version=V2).as_xml()
        ], form_extras={'domain': parent_domain})

        block = CaseBlock(create=True, case_id='child-case-id', user_id=USER_ID, version=V2,
                          index={'bad': ('bad-case', case_in_other_domain)})

        with self.assertRaisesRegexp(IllegalCaseId, 'Bad case id'):
            post_case_blocks([block.as_xml()], form_extras={'domain': child_domain})
Пример #43
0
    def test_long_value_validation(self):
        case_id = uuid.uuid4().hex
        case = CaseBlock(
            create=True,
            case_id=case_id,
            user_id='user1',
            owner_id='user1',
            case_type='demo',
            case_name='this is a very long case name that exceeds the 255 char limit' * 5
        )

        xform, cases = post_case_blocks([case.as_xml()], domain=DOMAIN)
        self.assertEqual(0, len(cases))
        self.assertTrue(xform.is_error)
        self.assertIn('CaseValueError', xform.problem)
Пример #44
0
def update_supply_point_product_stock_level(spp, current_stock):
    caseblock = CaseBlock(
        case_id=spp._id,
        create=False,
        version=V2,
        user_id=spp.user_id,
        owner_id=spp.owner_id,
        case_type=const.SUPPLY_POINT_PRODUCT_CASE_TYPE,
        update={
            "current_stock": current_stock
        },
    )
    username = const.COMMTRACK_USERNAME
    casexml = ElementTree.tostring(caseblock.as_xml())
    submit_case_blocks(casexml, spp.domain, username, spp.user_id,
                       xmlns=const.COMMTRACK_SUPPLY_POINT_PRODUCT_XMLNS)
Пример #45
0
    def test_dont_rebuild(self, rebuild_case):
        """ Don't rebuild cases that are owned by other users """

        case_id = uuid.uuid4().hex
        caseblock = CaseBlock(
            create=True,
            case_id=case_id,
            owner_id=self.commcare_user._id,
            user_id=self.commcare_user._id,
        )
        casexml = ElementTree.tostring(caseblock.as_xml(), encoding='utf-8').decode('utf-8')
        submit_case_blocks(casexml, self.domain, user_id=self.commcare_user._id)

        self.other_user.retire(self.domain, deleted_by=None)

        self.assertEqual(rebuild_case.call_count, 0)
Пример #46
0
    def test_dont_rebuild(self, rebuild_case):
        """ Don't rebuild cases that are owned by other users """

        case_id = uuid.uuid4().hex
        caseblock = CaseBlock(
            create=True,
            case_id=case_id,
            owner_id=self.commcare_user._id,
            user_id=self.commcare_user._id,
        )
        casexml = ElementTree.tostring(caseblock.as_xml())
        submit_case_blocks(casexml, self.domain, user_id=self.commcare_user._id)

        self.other_user.retire()

        self.assertEqual(rebuild_case.call_count, 0)
Пример #47
0
def _create_tech_issue_delegate_for_escalation(tech_issue, owner_id):
    case_id = uuid.uuid4().hex
    caseblock = CaseBlock(
        case_id,
        case_type='tech_issue_delegate',
        create=True,
        update={'change_in_level': '1'},
        user_id=SYSTEM_USER_ID,
        owner_id=owner_id,
        case_name=tech_issue.name,
        index={'parent': (tech_issue.type, tech_issue.case_id, 'child')},
    )
    return submit_case_blocks(
        ElementTree.tostring(caseblock.as_xml()),
        tech_issue.domain,
        user_id=SYSTEM_USER_ID,
        xmlns=AUTO_UPDATE_XMLNS,
    )
Пример #48
0
    def test_rebuild_cases_with_new_owner(self, rebuild_case):
        """
            If cases have a different owner to the person who submitted it
            rebuild it when the submitter is retired.
        """

        case_id = uuid.uuid4().hex
        caseblock = CaseBlock(
            create=True,
            case_id=case_id,
            owner_id=self.commcare_user._id,
            user_id=self.commcare_user._id,
        )
        casexml = ElementTree.tostring(caseblock.as_xml())
        submit_case_blocks(casexml, self.domain, user_id=self.other_user._id)

        self.other_user.retire()

        rebuild_case.assert_called_once_with(case_id)
Пример #49
0
    def test_rebuild_cases_with_new_owner(self, rebuild_case):
        """
            If cases have a different owner to the person who submitted it
            rebuild it when the submitter is retired.
        """

        case_id = uuid.uuid4().hex
        caseblock = CaseBlock(
            create=True,
            case_id=case_id,
            owner_id=self.commcare_user._id,
            user_id=self.commcare_user._id,
        )
        casexml = ElementTree.tostring(caseblock.as_xml())
        submit_case_blocks(casexml, self.domain, user_id=self.other_user._id)

        self.other_user.retire()

        rebuild_case.assert_called_once_with(case_id)
Пример #50
0
    def testBadIndexReferenceDomain(self):
        case_in_other_domain = self.MOTHER_CASE_ID
        parent_domain = 'parent'
        child_domain = 'child'

        post_case_blocks([
            CaseBlock(create=True, case_id=case_in_other_domain, user_id=self.user.user_id).as_xml()
        ], form_extras={'domain': parent_domain})

        block = CaseBlock(create=True, case_id='child-case-id', user_id=self.user.user_id,
                          index={'bad': ('bad-case', case_in_other_domain)})

        xform, _ = post_case_blocks([block.as_xml()],
                                    form_extras={'domain': child_domain})

        self.assertTrue(xform.is_error)
        self.assertEqual(xform.doc_type, 'XFormError')
        self.assertIn('IllegalCaseId', xform.problem)
        self.assertIn('Bad case id', xform.problem)
Пример #51
0
def _create_tech_issue_delegate_for_escalation(tech_issue, owner_id):
    case_id = uuid.uuid4().hex
    caseblock = CaseBlock(
        case_id,
        case_type='tech_issue_delegate',
        create=True,
        update={'change_in_level': '1'},
        user_id=SYSTEM_USER_ID,
        owner_id=owner_id,
        case_name=tech_issue.name,
        index={'parent': (tech_issue.type, tech_issue.case_id, 'child')},
    )
    return submit_case_blocks(
        ElementTree.tostring(caseblock.as_xml()).decode('utf-8'),
        tech_issue.domain,
        user_id=SYSTEM_USER_ID,
        xmlns=AUTO_UPDATE_XMLNS,
        device_id=__name__ + "._create_tech_issue_delegate_for_escalation",
    )
Пример #52
0
    def create_case(cls,
                    case_type,
                    parent_case_id=None,
                    parent_case_type=None,
                    parent_identifier=None,
                    parent_relationship=None):

        kwargs = {}
        if parent_case_id:
            kwargs['index'] = {
                parent_identifier:
                (parent_case_type, parent_case_id, parent_relationship)
            }

        caseblock = CaseBlock(uuid.uuid4().hex,
                              case_type=case_type,
                              create=True,
                              **kwargs)
        return submit_case_blocks(ElementTree.tostring(caseblock.as_xml()),
                                  cls.domain)[1][0]
Пример #53
0
 def to_xml(self):
     extras = {}
     if self.owner_id:
         extras['owner_id'] = self.owner_id
     if self.create:
         extras['case_name'] = self.product_stock_case.name
         extras['index'] = {
             const.PARENT_CASE_REF: (const.SUPPLY_POINT_PRODUCT_CASE_TYPE,
                                     self.product_stock_case._id),
         }
     caseblock = CaseBlock(case_id=self.id,
                           create=self.create,
                           version=V2,
                           user_id=self.user_id,
                           case_type=const.REQUISITION_CASE_TYPE,
                           update=copy(self.custom_fields),
                           close=self.close,
                           **extras)
     return ElementTree.tostring(
         caseblock.as_xml(format_datetime=json_format_datetime))
Пример #54
0
    def test_rebuild_cases_with_new_owner(self, rebuild_case):
        """
            If cases have a different owner to the person who submitted it
            rebuild it when the submitter is retired.
        """

        case_id = uuid.uuid4().hex
        caseblock = CaseBlock(
            create=True,
            case_id=case_id,
            owner_id=self.commcare_user._id,
            user_id=self.commcare_user._id,
        )
        casexml = ElementTree.tostring(caseblock.as_xml(), encoding='utf-8').decode('utf-8')
        submit_case_blocks(casexml, self.domain, user_id=self.other_user._id)

        self.other_user.retire(self.domain, deleted_by=None)

        detail = UserArchivedRebuild(user_id=self.other_user.user_id)
        rebuild_case.assert_called_once_with(self.domain, case_id, detail)
Пример #55
0
def _post_util(create=False, case_id=None, user_id=None, owner_id=None,
              case_type=None, form_extras=None, close=False, date_modified=None,
              **kwargs):

    form_extras = form_extras or {}
    form_extras['domain'] = REBUILD_TEST_DOMAIN

    uid = lambda: uuid.uuid4().hex
    case_id = case_id or uid()
    block = CaseBlock(create=create,
                      case_id=case_id,
                      user_id=user_id or uid(),
                      owner_id=owner_id or uid(),
                      case_type=case_type or 'test',
                      date_modified=date_modified,
                      update=kwargs,
                      close=close)
    block = block.as_xml()
    post_case_blocks([block], form_extras)
    return case_id
Пример #56
0
 def to_xml(self):
     extras = {}
     if self.owner_id:
         extras['owner_id'] = self.owner_id
     if self.create:
         extras['case_name'] = self.product_stock_case.name
         extras['index'] = {
             const.PARENT_CASE_REF: (const.SUPPLY_POINT_PRODUCT_CASE_TYPE,
                                     self.product_stock_case._id),
         }
     caseblock = CaseBlock(
         case_id=self.id,
         create=self.create,
         version=V2,
         user_id=self.user_id,
         case_type=const.REQUISITION_CASE_TYPE,
         update = copy(self.custom_fields),
         close=self.close,
         **extras
     )
     return ElementTree.tostring(caseblock.as_xml(format_datetime=json_format_datetime))
Пример #57
0
def reassign_household_case(domain, household_case_id, old_owner_id, new_owner_id, supervisor_id,
                            deprecation_time=None):
    if deprecation_time is None:
        deprecation_time = datetime.utcnow()
    case_ids = get_household_and_child_case_ids_by_owner(domain, household_case_id, old_owner_id)
    case_ids.add(household_case_id)
    case_blocks = []
    for case_id in case_ids:
        updates = {
            'location_reassignment_last_owner_id': old_owner_id,
            'location_reassignment_datetime': deprecation_time
        }
        if supervisor_id:
            updates['location_reassignment_last_supervisor_id'] = supervisor_id
        case_block = CaseBlock(case_id,
                               update=updates,
                               owner_id=new_owner_id,
                               user_id=SYSTEM_USER_ID)
        case_block = ElementTree.tostring(case_block.as_xml()).decode('utf-8')
        case_blocks.append(case_block)
    if case_blocks:
        submit_case_blocks(case_blocks, domain, user_id=SYSTEM_USER_ID)
Пример #58
0
    def testBadIndexReferenceDomain(self):
        case_in_other_domain = 'text-index-mother-case'
        parent_domain = 'parent'
        child_domain = 'child'

        post_case_blocks([
            CaseBlock(create=True,
                      case_id=case_in_other_domain,
                      user_id=USER_ID,
                      version=V2).as_xml()
        ],
                         form_extras={'domain': parent_domain})

        block = CaseBlock(create=True,
                          case_id='child-case-id',
                          user_id=USER_ID,
                          version=V2,
                          index={'bad': ('bad-case', case_in_other_domain)})

        with self.assertRaisesRegexp(IllegalCaseId, 'Bad case id'):
            post_case_blocks([block.as_xml()],
                             form_extras={'domain': child_domain})
Пример #59
0
def submit_mapping_case_block(user, index):
    mapping = user.get_location_map_case()

    if mapping:
        caseblock = CaseBlock(
            create=False,
            case_id=mapping._id,
            version=V2,
            index=index
        )
    else:
        caseblock = CaseBlock(
            create=True,
            case_type=const.USER_LOCATION_OWNER_MAP_TYPE,
            case_id=location_map_case_id(user),
            version=V2,
            owner_id=user._id,
            index=index
        )

    submit_case_blocks(
        ElementTree.tostring(caseblock.as_xml()),
        user.domain,
    )
Пример #60
0
 def test_default_relationship(self):
     parent_case_id = uuid.uuid4().hex
     post_case_blocks([
         CaseBlock(create=True,
                   case_id=parent_case_id,
                   user_id=self.user.user_id).as_xml()
     ],
                      domain=self.project.name)
     create_index = CaseBlock(
         create=True,
         case_id=self.CASE_ID,
         user_id=self.user.user_id,
         owner_id=self.user.user_id,
     )
     # set outside constructor to skip validation
     create_index.index = {
         'parent':
         IndexAttrs(case_type='parent',
                    case_id=parent_case_id,
                    relationship='')
     }
     form, cases = post_case_blocks([create_index.as_xml()],
                                    domain=self.project.name)
     self.assertEqual(cases[0].indices[0].relationship, 'child')