예제 #1
0
    def setUp(self):
        super(CommTrackTest, self).setUp()
        # might as well clean house before doing anything
        delete_all_xforms()
        delete_all_cases()
        delete_all_sync_logs()

        StockReport.objects.all().delete()
        StockTransaction.objects.all().delete()

        self.backend, self.backend_mapping = setup_default_sms_test_backend()

        self.domain = bootstrap_domain(TEST_DOMAIN)
        bootstrap_location_types(self.domain.name)
        bootstrap_products(self.domain.name)
        self.ct_settings = CommtrackConfig.for_domain(self.domain.name)
        self.ct_settings.consumption_config = ConsumptionConfig(
            min_transactions=0,
            min_window=0,
            optimal_window=60,
            min_periods=0,
        )
        # todo: remove?
        if self.requisitions_enabled:
            self.ct_settings.requisition_config = get_default_requisition_config(
            )

        self.ct_settings.save()

        self.domain = Domain.get(self.domain._id)

        self.loc = make_loc('loc1')
        self.sp = self.loc.linked_supply_point()
        self.users = [
            bootstrap_user(self, **user_def)
            for user_def in self.user_definitions
        ]

        # everyone should be in a group.
        self.group = Group(domain=TEST_DOMAIN,
                           name='commtrack-folks',
                           users=[u._id for u in self.users],
                           case_sharing=True)
        self.group._id = self.sp.owner_id
        self.group.save()
        self.products = sorted(Product.by_domain(self.domain.name),
                               key=lambda p: p._id)
        self.assertEqual(3, len(self.products))
예제 #2
0
    def setUpClass(cls):
        super(SchedulingRecipientTest, cls).setUpClass()

        cls.domain_obj = create_domain(cls.domain)

        cls.location_types = setup_location_types(cls.domain, ['country', 'state', 'city'])
        cls.state_location = make_loc('ma', domain=cls.domain, type='state')
        cls.city_location = make_loc('boston', domain=cls.domain, type='city', parent=cls.state_location)

        cls.mobile_user = CommCareUser.create(cls.domain, 'mobile', 'abc')
        cls.mobile_user.set_location(cls.city_location)

        cls.web_user = WebUser.create(cls.domain, 'web', 'abc')

        cls.group = Group(domain=cls.domain, users=[cls.mobile_user.get_id])
        cls.group.save()
예제 #3
0
 def testUserAddedToGroup(self):
     # 4. If the case has an owner that is a group, and the user is not in the group,
     #    add the user to the group and the leave the owner untouched.
     group = Group(
         domain=self.domain,
         name='reconciliation test group',
         users=[self.other_user._id],
         case_sharing=True,
     )
     group.save()
     case = self._make_case(self.other_user._id, group._id)
     self.assertEqual(group._id, case.owner_id)
     reconcile_ownership(case, self.user)
     case = CommCareCase.get(case._id)
     self.assertEqual(group._id, case.owner_id)
     group = Group.get(group._id)
     self.assertTrue(self.user._id in group.users)
    def test_groups_to_user_reindexer(self):
        initialize_index_and_mapping(self.es, USER_INDEX_INFO)
        user_id = uuid.uuid4().hex
        domain = 'test-groups-to-user-reindex'
        _create_es_user(self.es, user_id, domain)

        # create and save a group
        group = Group(domain=domain, name='g1', users=[user_id])
        group.save()

        call_command('ptop_reindexer_v2', **{
            'index': 'groups-to-user',
            'noinput': True
        })
        self.es.indices.refresh(USER_INDEX)
        _assert_es_user_and_groups(self, self.es, user_id, [group._id],
                                   [group.name])
예제 #5
0
    def setUpClass(cls):
        super(TemplatingTestCase, cls).setUpClass()

        cls.domain = 'templating-test'
        cls.domain_obj = Domain(name=cls.domain)
        cls.domain_obj.save()

        cls.mobile_user = CommCareUser.create(
            cls.domain,
            'mobile1@templating-test',
            '12345',
            None,
            None,
            first_name='Mobile',
            last_name='User'
        )
        cls.mobile_user.add_phone_number('999123')
        cls.mobile_user.save()

        cls.web_user = WebUser.create(
            cls.domain,
            'web1@templating-test',
            '12345',
            created_by=None,
            created_via=None,
            first_name='Web',
            last_name='User'
        )
        cls.web_user.add_phone_number('999456')
        cls.web_user.save()

        cls.group = Group(domain=cls.domain, name='Test Group')
        cls.group.save()

        cls.location_type = LocationType.objects.create(
            domain=cls.domain,
            name='top-level',
            code='top-level'
        )

        cls.location = SQLLocation.objects.create(
            domain=cls.domain,
            name='Test Location',
            site_code='loc1234',
            location_type=cls.location_type
        )
예제 #6
0
    def test_update(self):

        user = CommCareUser.create(domain=self.domain.name,
                                   username="******",
                                   password="******",
                                   created_by=None,
                                   created_via=None)
        group = Group({"name": "test"})
        group.save()

        self.addCleanup(user.delete, deleted_by=None)
        self.addCleanup(group.delete)

        user_json = {
            "first_name": "test",
            "last_name": "last",
            "email": "*****@*****.**",
            "language": "pol",
            "phone_numbers": ["+50253311399", "50253314588"],
            "groups": [group._id],
            "user_data": {
                PROFILE_SLUG: self.profile.id,
                "chw_id": "13/43/DFA"
            }
        }

        backend_id = user._id
        response = self._assert_auth_post_resource(
            self.single_endpoint(backend_id),
            json.dumps(user_json),
            content_type='application/json',
            method='PUT')
        self.assertEqual(response.status_code, 200, response.content)
        self.assertEqual(1, len(CommCareUser.by_domain(self.domain.name)))
        modified = CommCareUser.get(backend_id)
        self.assertEqual(modified.username, "test")
        self.assertEqual(modified.first_name, "test")
        self.assertEqual(modified.last_name, "last")
        self.assertEqual(modified.email, "*****@*****.**")
        self.assertEqual(modified.language, "pol")
        self.assertEqual(modified.get_group_ids()[0], group._id)
        self.assertEqual(modified.metadata["chw_id"], "13/43/DFA")
        self.assertEqual(modified.metadata[PROFILE_SLUG], self.profile.id)
        self.assertEqual(modified.metadata["imaginary"], "yes")
        self.assertEqual(modified.default_phone_number, "50253311399")
예제 #7
0
    def test_owned_by_group(self):
        ids = []
        for i in range(5):
            user = CommCareUser.create(self.domain, 'owned-group-test-user-%s' % i, 'password', None, None)
            user.save()
            self.addCleanup(user.delete, deleted_by=None)
            ids.append(user._id)

        group = Group(domain=self.domain, name='owned-group-test-group', users=ids)
        group.save()
        self.addCleanup(group.delete)
        owners = get_owning_users(group._id)
        self.assertEqual(5, len(owners))
        ids_back = []
        for o in owners:
            self.assertTrue(isinstance(o, CommCareUser))
            ids_back.append(o._id)
        self.assertEqual(set(ids), set(ids_back))
예제 #8
0
    def test_remove_user(self):
        group1 = Group(
            domain=DOMAIN,
            name='group1',
            users=[self.active_user._id, self.inactive_user._id, self.deleted_user._id]
        )
        group1.save()

        self.assertTrue(group1.remove_user(self.active_user._id))
        group1.save()

        group1 = Group.get(group1._id)
        self.assertIn(self.active_user._id, group1.removed_users)
        self.assertNotIn(self.active_user._id, group1.users)

        group1.add_user(self.active_user._id)
        group1 = Group.get(group1._id)
        self.assertNotIn(self.active_user._id, group1.removed_users)
        self.assertIn(self.active_user._id, group1.users)
예제 #9
0
    def setUp(self):
        super(CommTrackSyncTest, self).setUp()
        self.group = Group(domain=util.TEST_DOMAIN, name='commtrack-folks',
                           users=[self.user._id], case_sharing=True)
        self.group._id = self.sp.owner_id
        self.group.save()

        self.restore_user = self.user.to_ota_restore_user()
        self.sp_block = CaseBlock(
            case_id=self.sp.case_id,
        ).as_xml()

        # get initial restore token
        restore_config = RestoreConfig(
            project=self.domain,
            restore_user=self.restore_user,
            params=RestoreParams(version=V2),
        )
        self.sync_log_id = synclog_id_from_restore_payload(restore_config.get_payload().as_string())
예제 #10
0
    def test_create(self):

        group = Group({"name": "test"})
        group.save()
        self.addCleanup(group.delete)

        self.assertEqual(0, len(CommCareUser.by_domain(self.domain.name)))

        user_json = {
            "username": "******",
            "password": "******",
            "first_name": "John",
            "last_name": "Doe",
            "email": "*****@*****.**",
            "language": "en",
            "phone_numbers": [
                "+50253311399",
                "50253314588"
            ],
            "groups": [
                group._id
            ],
            "user_data": {
                "chw_id": "13/43/DFA"
            }
        }
        response = self._assert_auth_post_resource(self.list_endpoint,
                                    json.dumps(user_json),
                                    content_type='application/json')
        self.assertEqual(response.status_code, 201)
        [user_back] = CommCareUser.by_domain(self.domain.name)
        self.addCleanup(user_back.delete, deleted_by=None)
        self.addCleanup(lambda: send_to_elasticsearch('users', user_back.to_json(), delete=True))

        self.assertEqual(user_back.username, "jdoe")
        self.assertEqual(user_back.first_name, "John")
        self.assertEqual(user_back.last_name, "Doe")
        self.assertEqual(user_back.email, "*****@*****.**")
        self.assertEqual(user_back.language, "en")
        self.assertEqual(user_back.get_group_ids()[0], group._id)
        self.assertEqual(user_back.user_data["chw_id"], "13/43/DFA")
        self.assertEqual(user_back.default_phone_number, "50253311399")
예제 #11
0
    def testGetUsers(self):
        domain = 'group-test'
        active_user = CommCareUser.create(domain=domain,
                                          username='******',
                                          password='******')
        inactive_user = CommCareUser.create(domain=domain,
                                            username='******',
                                            password='******')
        inactive_user.is_active = False
        inactive_user.save()
        deleted_user = CommCareUser.create(domain=domain,
                                           username='******',
                                           password='******')
        deleted_user.retire()

        group = Group(
            domain=domain,
            name='group',
            users=[active_user._id, inactive_user._id, deleted_user._id])
        group.save()

        def _check_active_users(userlist):
            self.assertEqual(len(userlist), 1)
            self.assertEqual(active_user._id, userlist[0])

        # try all the flavors of this
        _check_active_users([u._id for u in group.get_users()])
        _check_active_users(group.get_user_ids())
        _check_active_users([u._id for u in group.get_static_users()])
        _check_active_users(group.get_static_user_ids())

        def _check_all_users(userlist):
            self.assertEqual(len(userlist), 2)
            self.assertTrue(active_user._id in userlist)
            self.assertTrue(inactive_user._id in userlist)
            self.assertFalse(deleted_user._id in userlist)

        _check_all_users([u._id for u in group.get_users(is_active=False)])
        _check_all_users(group.get_user_ids(is_active=False))
        _check_all_users(
            [u._id for u in group.get_static_users(is_active=False)])
        _check_all_users(group.get_static_user_ids(is_active=False))
예제 #12
0
def add_group(request, domain):
    group_name = request.POST['group_name']
    if not group_name:
        messages.error(
            request,
            _("We could not create the group; "
              "please give it a name first"))
        return HttpResponseRedirect(request.META['HTTP_REFERER'])
    group = Group.by_name(domain, group_name)
    if group:
        messages.warning(
            request,
            _("A group with this name already exists: instead of making "
              "a new one, we've brought you to the existing one."))
    else:
        group = Group(name=group_name, domain=domain)
        group.save()

    return HttpResponseRedirect(
        reverse("group_members", args=(domain, group.get_id)))
예제 #13
0
    def setUpClass(cls):

        with trap_extra_setup(ConnectionError,
                              msg="cannot connect to elasicsearch"):
            es = get_es_new()
            cls.tearDownClass()
            initialize_index_and_mapping(es, CASE_INDEX_INFO)
            initialize_index_and_mapping(es, GROUP_INDEX_INFO)
            initialize_index_and_mapping(es, XFORM_INDEX_INFO)

        case = new_case(closed=True)
        send_to_elasticsearch('cases', case.to_json())

        case = new_case(closed=False)
        send_to_elasticsearch('cases', case.to_json())

        case = new_case(closed=True, owner_id="foo")
        send_to_elasticsearch('cases', case.to_json())

        case = new_case(closed=False, owner_id="bar")
        send_to_elasticsearch('cases', case.to_json())

        group = Group(_id=uuid.uuid4().hex, users=["foo", "bar"])
        cls.group_id = group._id
        send_to_elasticsearch('groups', group.to_json())

        form = new_form(form={"meta": {"userID": None}})
        send_to_elasticsearch('forms', form.to_json())

        form = new_form(form={"meta": {"userID": ""}})
        send_to_elasticsearch('forms', form.to_json())

        form = new_form(form={"meta": {"deviceID": "abc"}})
        send_to_elasticsearch('forms', form.to_json())

        form = new_form(form={"meta": {"userID": uuid.uuid4().hex}})
        send_to_elasticsearch('forms', form.to_json())

        es.indices.refresh(CASE_INDEX_INFO.index)
        es.indices.refresh(XFORM_INDEX_INFO.index)
        es.indices.refresh(GROUP_INDEX_INFO.index)
예제 #14
0
    def test_create(self):
        self.client.login(username=self.username, password=self.password)

        group = Group({"name": "test"})
        group.save()

        self.assertEqual(0, len(CommCareUser.by_domain(self.domain.name)))

        user_json = {
            "username": "******",
            "password": "******",
            "first_name": "John",
            "last_name": "Doe",
            "email": "*****@*****.**",
            "language": "en",
            "phone_numbers": [
                "+50253311399",
                "50253314588"
            ],
            "groups": [
                group._id
            ],
            "user_data": {
                "chw_id": "13/43/DFA"
            }
        }
        response = self.client.post(self.list_endpoint,
                                    simplejson.dumps(user_json),
                                    content_type='application/json')
        self.assertEqual(response.status_code, 201)
        [user_back] = CommCareUser.by_domain(self.domain.name)
        self.assertEqual(user_back.username, "jdoe")
        self.assertEqual(user_back.first_name, "John")
        self.assertEqual(user_back.last_name, "Doe")
        self.assertEqual(user_back.email, "*****@*****.**")
        self.assertEqual(user_back.language, "en")
        self.assertEqual(user_back.get_group_ids()[0], group._id)
        self.assertEqual(user_back.user_data["chw_id"], "13/43/DFA")
        self.assertEqual(user_back.default_phone_number, "+50253311399")
        user_back.delete()
        group.delete()
예제 #15
0
    def test_update(self):
        self.client.login(username=self.username, password=self.password)

        user = CommCareUser.create(domain=self.domain.name, username="******", password="******")
        group = Group({"name": "test"})
        group.save()

        user_json = {
            "first_name": "test",
            "last_name": "last",
            "email": "*****@*****.**",
            "language": "pol",
            "phone_numbers": [
                "+50253311399",
                "50253314588"
            ],
            "groups": [
                group._id
            ],
            "user_data": {
                "chw_id": "13/43/DFA"
            }
        }

        backend_id = user._id
        response = self.client.put(self.single_endpoint(backend_id),
                                   simplejson.dumps(user_json),
                                   content_type='application/json')
        self.assertEqual(response.status_code, 202, response.content)
        self.assertEqual(1, len(CommCareUser.by_domain(self.domain.name)))
        modified = CommCareUser.get(backend_id)
        self.assertEqual(modified.username, "test")
        self.assertEqual(modified.first_name, "test")
        self.assertEqual(modified.last_name, "last")
        self.assertEqual(modified.email, "*****@*****.**")
        self.assertEqual(modified.language, "pol")
        self.assertEqual(modified.get_group_ids()[0], group._id)
        self.assertEqual(modified.user_data["chw_id"], "13/43/DFA")
        self.assertEqual(modified.default_phone_number, "+50253311399")
        modified.delete()
        group.delete()
예제 #16
0
    def test_pillow(self):
        user_id = uuid.uuid4().hex
        domain = 'dbtest-group-user'
        _create_es_user(self.es_client, user_id, domain)
        _assert_es_user_and_groups(self, self.es_client, user_id, None, None)

        # create and save a group
        group = Group(domain=domain, name='g1', users=[user_id])
        group.save()

        # send to kafka
        since = get_topic_offset(topics.GROUP)
        producer.send_change(topics.GROUP, _group_to_change_meta(group.to_json()))

        # process using pillow
        pillow = get_group_pillow()
        pillow.process_changes(since=since, forever=False)

        # confirm updated in elasticsearch
        self.es_client.indices.refresh(USER_INDEX)
        _assert_es_user_and_groups(self, self.es_client, user_id, [group._id], [group.name])
        return user_id, group
예제 #17
0
    def setUp(self):
        super(CallCenterSupervisorGroupTest, self).setUp()
        self.domain = create_domain(self.domain_name)
        self.supervisor = CommCareUser.create(self.domain_name, 'supervisor@' + self.domain_name, '***')

        self.supervisor_group = Group(
            domain=self.domain_name,
            name='supervisor group',
            case_sharing=True,
            users=[self.supervisor.get_id]
        )
        self.supervisor_group.save()

        self.domain.call_center_config.enabled = True
        self.domain.call_center_config.case_owner_id = self.supervisor_group.get_id
        self.domain.call_center_config.case_type = 'cc_flw'
        self.domain.save()

        self.user = CommCareUser.create(self.domain_name, 'user@' + self.domain_name, '***')
        sync_call_center_user_case(self.user)

        load_data(self.domain_name, self.user.user_id)
예제 #18
0
    def setUpClass(cls):
        cls.domain = 'message-formatting-test'
        cls.domain_obj = Domain(name=cls.domain)
        cls.domain_obj.save()

        cls.mobile_user = CommCareUser.create(
            cls.domain,
            'mobile1@message-formatting-test',
            '12345',
            first_name='Mobile',
            last_name='User'
        )

        cls.web_user = WebUser.create(
            cls.domain,
            'web1@message-formatting-test',
            '12345',
            first_name='Web',
            last_name='User'
        )

        cls.group = Group(domain=cls.domain, name='Test Group')
        cls.group.save()

        cls.location_type = LocationType.objects.create(
            domain=cls.domain,
            name='top-level',
            code='top-level'
        )

        cls.location = SQLLocation.objects.create(
            domain=cls.domain,
            name='Test Location',
            site_code='loc1234',
            location_type=cls.location_type
        )

        cls.couch_location = cls.location.couch_location
    def test_kafka_group_pillow(self):
        domain = uuid.uuid4().hex
        user_id = uuid.uuid4().hex

        # make a group
        group = Group(domain=domain, name='g1', users=[user_id])
        group.save()

        # send to kafka
        since = get_topic_offset(topics.GROUP)
        change_meta = change_meta_from_doc(
            document=group.to_json(),
            data_source_type=data_sources.SOURCE_COUCH,
            data_source_name=Group.get_db().dbname,
        )
        producer.send_change(topics.GROUP, change_meta)

        # send to elasticsearch
        pillow = get_group_pillow()
        pillow.process_changes(since=since, forever=False)
        self.elasticsearch.indices.refresh(GROUP_INDEX_INFO.index)

        # verify there
        self._verify_group_in_es(group)
예제 #20
0
 def create(self, domain, name):
     group = Group(domain=domain, name=name)
     self.add_group(group)
     return group
예제 #21
0
 def make_group(cls, name, domain=None):
     domain = domain or cls.domain
     group = Group(name=name, domain=domain, case_sharing=True)
     GroupESFake.save_doc(group._doc)
     return group
예제 #22
0
 def test_group_reindexer(self):
     group = Group(domain=DOMAIN, name='g1')
     group.save()
     call_command('ptop_reindexer_v2', 'group', cleanup=True, noinput=True)
     self._assert_group_in_es(group)
예제 #23
0
 def _setup_group(cls):
     group = Group(name=cls.GROUP_NAME, domain=cls.DOMAIN_NAME)
     GroupESFake.save_doc(group._doc)
     cls.group = group
예제 #24
0
 def create_group(name, *users):
     group = Group(users=[user.user_id for user in users], name=name, domain=self.domain,
                   case_sharing=True)
     group.save()
     return group
예제 #25
0
    def setUpClass(cls):
        super(SchedulingRecipientTest, cls).setUpClass()

        cls.domain_obj = create_domain(cls.domain)

        cls.location_types = setup_location_types(cls.domain,
                                                  ['country', 'state', 'city'])
        cls.country_location = make_loc('usa',
                                        domain=cls.domain,
                                        type='country')
        cls.state_location = make_loc('ma',
                                      domain=cls.domain,
                                      type='state',
                                      parent=cls.country_location)
        cls.city_location = make_loc('boston',
                                     domain=cls.domain,
                                     type='city',
                                     parent=cls.state_location)

        cls.mobile_user = CommCareUser.create(cls.domain, 'mobile', 'abc',
                                              None, None)
        cls.mobile_user.set_location(cls.city_location)

        cls.mobile_user2 = CommCareUser.create(cls.domain, 'mobile2', 'abc',
                                               None, None)
        cls.mobile_user2.set_location(cls.state_location)

        cls.mobile_user3 = CommCareUser.create(cls.domain, 'mobile3', 'abc',
                                               None, None)
        cls.mobile_user3.user_data['role'] = 'pharmacist'
        cls.mobile_user3.save()

        cls.mobile_user4 = CommCareUser.create(cls.domain, 'mobile4', 'abc',
                                               None, None)
        cls.mobile_user4.user_data['role'] = 'nurse'
        cls.mobile_user4.save()

        cls.mobile_user5 = CommCareUser.create(cls.domain, 'mobile5', 'abc',
                                               None, None)
        cls.mobile_user5.user_data['role'] = ['nurse', 'pharmacist']
        cls.mobile_user5.save()

        cls.web_user = WebUser.create(cls.domain, 'web', 'abc', None, None)

        cls.web_user2 = WebUser.create(cls.domain, 'web2', 'abc', None, None)
        cls.web_user2.user_data['role'] = 'nurse'
        cls.web_user2.save()

        cls.group = Group(domain=cls.domain, users=[cls.mobile_user.get_id])
        cls.group.save()

        cls.group2 = Group(domain=cls.domain,
                           users=[
                               cls.mobile_user.get_id,
                               cls.mobile_user3.get_id,
                               cls.mobile_user4.get_id,
                               cls.mobile_user5.get_id,
                           ])
        cls.group2.save()

        cls.case_group = CommCareCaseGroup(domain=cls.domain)
        cls.case_group.save()

        cls.process_pillow_changes = process_pillow_changes(
            'DefaultChangeFeedPillow')
        cls.process_pillow_changes.add_pillow(get_case_messaging_sync_pillow())
예제 #26
0
                return group
        return None

    owner = get_wrapped_owner(get_owner_id(case))
    if owner and owner._id == user._id:
        pass
    elif owner is None:
        # assign to user
        _assign_case(case, user._id, user)
    elif isinstance(owner, CommCareUser):
        needed_owners = [owner._id, user._id]
        matched = _get_matching_group(existing_groups.values(), needed_owners)
        if matched:
            _assign_case(case, matched._id, user)
        else:
            new_group = Group(
                domain=case.domain,
                name="{case} Owners (system)".format(case=case.name or case.type),
                users=[owner._id, user._id],
                case_sharing=True,
                reporting=False,
                metadata={
                    'hq-system': True,
                }
            )
            new_group.save()
            existing_groups[new_group._id] = new_group
            _assign_case(case, new_group._id, user)
    else:
        assert isinstance(owner, Group)
        if user._id not in owner.users:
            owner.users.append(user._id)
예제 #27
0
 def test_get_wrapped_group(self):
     group = Group(domain=self.domain, name='wrapped-group-test')
     group.save()
     self.addCleanup(group.delete)
     wrapped = get_wrapped_owner(group._id)
     self.assertTrue(isinstance(wrapped, Group))
예제 #28
0
 def test_assign_to_group(self):
     group = Group(users=[], name='case-assignment-group', domain=self.domain)
     group.save()
     self._make_tree()
     assign_case(self.primary.case_id, group._id, include_subcases=True, include_parent_cases=True)
     self._check_state(new_owner_id=group._id, expected_changed=self.all)
예제 #29
0
 def test_group_reindexer(self):
     group = Group(domain=DOMAIN, name='g1')
     group.save()
     reindex_and_clean('group')
     self._assert_group_in_es(group)
예제 #30
0
 def test_update_groups_succeeds(self):
     group = Group({"name": "test"})
     group.save()
     self.addCleanup(group.delete)
     update(self.user, 'groups', [group._id])
     self.assertEqual(self.user.get_group_ids()[0], group._id)