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])
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)
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}
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)
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))
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