Esempio n. 1
0
    def test_location_replace(self):
        self.setup_locations()
        updated_user_spec = deepcopy(self.user_specs[0])

        # first assign to loc1
        updated_user_spec["location_code"] = [self.loc1.site_code]
        create_or_update_users_and_groups(
            self.domain.name,
            list([updated_user_spec]),
            list([]),
        )

        # reassign to loc2
        updated_user_spec["location_code"] = [self.loc2.site_code]
        updated_user_spec["user_id"] = self.user._id
        create_or_update_users_and_groups(
            self.domain.name,
            list([updated_user_spec]),
            list([]),
        )

        # user's location should now be loc2
        self.assertEqual(self.user.location_id, self.loc2._id)
        self.assertEqual(self.user.user_data.get('commcare_location_id'), self.loc2._id)
        self.assertListEqual(self.user.assigned_location_ids, [self.loc2._id])
Esempio n. 2
0
def bulk_upload_async(download_id, domain, user_specs, group_specs):
    results = create_or_update_users_and_groups(domain, user_specs,
                                                group_specs)
    temp_id = uuid.uuid4().hex
    expiry = 60 * 60
    cache.set(temp_id, results, expiry)
    cache.set(
        download_id,
        CachedDownload(temp_id, content_disposition="", mimetype="text/html"),
        expiry)
Esempio n. 3
0
def bulk_upload_async(domain, user_specs, group_specs):
    from corehq.apps.users.bulkupload import create_or_update_users_and_groups
    task = bulk_upload_async
    DownloadBase.set_progress(task, 0, 100)
    results = create_or_update_users_and_groups(
        domain,
        user_specs,
        group_specs,
        task=task,
    )
    DownloadBase.set_progress(task, 100, 100)
    return {'messages': results}
Esempio n. 4
0
    def test_location_unknown_site_code(self):
        self.setup_locations()
        updated_user_spec = deepcopy(self.user_specs[0])
        updated_user_spec["location_code"] = ['unknownsite']

        # location_code should be an array of multiple excel columns
        # with self.assertRaises(UserUploadError):
        result = create_or_update_users_and_groups(
            self.domain.name,
            list([updated_user_spec]),
            list([]),
        )
        self.assertEqual(len(result["rows"]), 1)
Esempio n. 5
0
    def test_bulk_upload_usercases(self):
        self.user.username = format_username('bushy_top', TEST_DOMAIN)
        self.user.save()
        user_upload = [{
            'username': self.user.raw_username,
            'user_id': self.user.user_id,
            'name': 'James McNulty',
            'language': None,
            'is_active': 'True',
            'phone-number': self.user.phone_number,
            'password': 123,
            'email': None
        }, {
            'username': '******',
            'user_id': '',
            'name': 'William Moreland',
            'language': None,
            'is_active': 'True',
            'phone-number': '23424123',
            'password': 123,
            'email': None
        }]
        results = create_or_update_users_and_groups(
            TEST_DOMAIN,
            list(user_upload),
            list([]),
        )
        self.assertEqual(results['errors'], [])

        accessor = CaseAccessors(TEST_DOMAIN)
        old_user_case = accessor.get_case_by_domain_hq_user_id(
            self.user._id, USERCASE_TYPE)
        self.assertEqual(old_user_case.owner_id, self.user.get_id)
        self.assertEqual(2, len(old_user_case.xform_ids))

        new_user = CommCareUser.get_by_username(
            format_username('the_bunk', TEST_DOMAIN))
        self.addCleanup(new_user.delete)
        new_user_case = accessor.get_case_by_domain_hq_user_id(
            new_user._id, USERCASE_TYPE)
        self.assertEqual(new_user_case.owner_id, new_user.get_id)
        self.assertEqual(1, len(new_user_case.xform_ids))
Esempio n. 6
0
    def post(self, request):
        """View's dispatch method automatically calls this"""
        redirect = request.POST.get('redirect')

        try:
            self.workbook = WorkbookJSONReader(request.file)
        except InvalidFileException:
            try:
                csv.DictReader(io.StringIO(request.file.read().decode('ascii'),
                                           newline=None))
                return HttpResponseBadRequest(
                    "CommCare HQ no longer supports CSV upload. "
                    "Please convert to Excel 2007 or higher (.xlsx) "
                    "and try again."
                )
            except UnicodeDecodeError:
                return HttpResponseBadRequest("Unrecognized format")
        except JSONReaderError as e:
            messages.error(request,
                           'Your upload was unsuccessful. %s' % e.message)
            return HttpResponseRedirect(redirect)

        try:
            self.user_specs = self.workbook.get_worksheet(title='users')
        except WorksheetNotFound:
            try:
                self.user_specs = self.workbook.get_worksheet()
            except WorksheetNotFound:
                return HttpResponseBadRequest("Workbook has no worksheets")

        try:
            self.group_specs = self.workbook.get_worksheet(title='groups')
        except WorksheetNotFound:
            self.group_specs = []

        try:
            check_headers(self.user_specs)
        except UserUploadError as e:
            return HttpResponseBadRequest(e)

        response = HttpResponse()
        response_rows = []
        async = request.REQUEST.get("async", False)
        if async:
            download_id = uuid.uuid4().hex
            bulk_upload_async.delay(download_id, self.domain,
                list(self.user_specs),
                list(self.group_specs))
            messages.success(request,
                'Your upload is in progress. You can check the progress <a href="%s">here</a>.' %\
                reverse('hq_soil_download', kwargs={'domain': self.domain, 'download_id': download_id}),
                extra_tags="html")
        else:
            ret = create_or_update_users_and_groups(self.domain, self.user_specs, self.group_specs)
            for error in ret["errors"]:
                messages.error(request, error)

            for row in ret["rows"]:
                response_rows.append(row)

        if redirect:
            if not async:
                messages.success(request,
                                 _('Your bulk user upload is complete!'))
            problem_rows = []
            for row in response_rows:
                if row['flag'] not in ('updated', 'created'):
                    problem_rows.append(row)
            if problem_rows:
                messages.error(
                    request,
                    _('However, we ran into problems with the following users:')
                )
                for row in problem_rows:
                    if row['flag'] == 'missing-data':
                        messages.error(request,
                                       _('A row with no username was skipped'))
                    else:
                        messages.error(request,
                                       '{username}: {flag}'.format(**row))
            return HttpResponseRedirect(redirect)
        else:
            return response