def __init__(self, report, case): try: self.user = CommCareUser.get_by_user_id(case["user_id"]) if self.user is None: self.user = CommCareUser.get_by_user_id(case["opened_by"]) except CouchUser.AccountTypeError: # if we have web users submitting forms (e.g. via cloudcare) just don't bother # with the rest of this data. self.user = None if self.user: setattr(self, "_village", get_property(self.user.user_data, "village")) setattr(self, "_asha_name", self.user.full_name if get_property(self.user.user_data, "role").upper() == "ASHA" else get_property(self.user.user_data, "partner_name")) if get_property(self.user.user_data, "role").upper() == "ASHA": setattr(self, "_asha_number", self.user.default_phone_number if self.user.default_phone_number else EMPTY_FIELD) else: setattr(self, "_asha_number", get_property(self.user.user_data, "partner_phone")) setattr(self, "_awc_code_name", "%s, %s" % (get_property(self.user.user_data, "awc-code"), get_property(self.user.user_data, "village"))) setattr(self, "_aww_name", self.user.full_name if get_property(self.user.user_data, "role").upper() == "AWW" else get_property(self.user.user_data, "partner_name")) if get_property(self.user.user_data, "role").upper() == "AWW": setattr(self, "_aww_number", self.user.phone_numbers[0] if len(self.user.phone_numbers) > 0 else EMPTY_FIELD) else: setattr(self, "_aww_number", get_property(self.user.user_data, "partner_phone")) super(MCHDisplay, self).__init__(report, case)
def get_all_users_by_domain(domain=None, group=None, user_ids=None, user_filter=None, simplified=False, CommCareUser=None, include_inactive=False): """ WHEN THERE ARE A LOT OF USERS, THIS IS AN EXPENSIVE OPERATION. Returns a list of CommCare Users based on domain, group, and user filter (demo_user, admin, registered, unknown) """ user_ids = user_ids if user_ids and user_ids[0] else None if not CommCareUser: from corehq.apps.users.models import CommCareUser if group: # get all the users only in this group and don't bother filtering. if not isinstance(group, Group): group = Group.get(group) users = group.get_users(is_active=(not include_inactive), only_commcare=True) elif user_ids is not None: try: users = [CommCareUser.get_by_user_id(id) for id in user_ids] except Exception: users = [] if users and users[0] is None: raise Http404() else: if not user_filter: user_filter = HQUserType.all() users = [] submitted_user_ids = get_all_user_ids_submitted(domain) registered_user_ids = dict([(user.user_id, user) for user in CommCareUser.by_domain(domain)]) if include_inactive: registered_user_ids.update(dict([(u.user_id, u) for u in CommCareUser.by_domain(domain, is_active=False)])) for user_id in submitted_user_ids: if user_id in registered_user_ids and user_filter[HQUserType.REGISTERED].show: user = registered_user_ids[user_id] users.append(user) elif not user_id in registered_user_ids and \ (user_filter[HQUserType.ADMIN].show or user_filter[HQUserType.DEMO_USER].show or user_filter[HQUserType.UNKNOWN].show): username = get_username_from_forms(domain, user_id).lower() temp_user = TempCommCareUser(domain, username, user_id) if user_filter[temp_user.filter_flag].show: users.append(temp_user) if user_filter[HQUserType.UNKNOWN].show: users.append(TempCommCareUser(domain, '*', None)) if user_filter[HQUserType.REGISTERED].show: # now add all the registered users who never submitted anything for user_id in registered_user_ids: if not user_id in submitted_user_ids: user = CommCareUser.get_by_user_id(user_id) users.append(user) if simplified: return [_report_user_dict(user) for user in users] return users
def get_all_users_by_domain(domain, **kwargs): """ WHEN THERE ARE A LOT OF USERS, THIS IS AN EXPENSIVE OPERATION. Returns a list of CommCare Users based on domain, group, and user filter (demo_user, admin, registered, unknown) """ group = kwargs.get('group') individual = kwargs.get('individual') user_filter = kwargs.get('user_filter') simplified = kwargs.get('simplified', False) if group: # get all the users only in this group and don't bother filtering. if not isinstance(group, Group): group = Group.get(group) users = group.get_users(only_commcare=True) elif individual: try: users = [CommCareUser.get_by_user_id(individual)] except Exception: users = [] if users and users[0] is None: raise Http404() else: if not user_filter: user_filter = HQUserType.use_defaults() users = [] submitted_user_ids = get_all_userids_submitted(domain) registered_user_ids = [user.user_id for user in CommCareUser.by_domain(domain)] for user_id in submitted_user_ids: if user_id in registered_user_ids and user_filter[HQUserType.REGISTERED].show: user = CommCareUser.get_by_user_id(user_id) users.append(user) elif not user_id in registered_user_ids and \ (user_filter[HQUserType.ADMIN].show or user_filter[HQUserType.DEMO_USER].show or user_filter[HQUserType.UNKNOWN].show): username = get_username_from_forms(domain, user_id) temp_user = TempCommCareUser(domain, username, user_id) if user_filter[temp_user.filter_flag].show: users.append(temp_user) if user_filter[HQUserType.UNKNOWN].show: users.append(TempCommCareUser(domain, '', None)) if user_filter[HQUserType.REGISTERED].show: # now add all the registered users who never submitted anything for user_id in registered_user_ids: if not user_id in submitted_user_ids: user = CommCareUser.get_by_user_id(user_id) users.append(user) if simplified: return [_report_user_dict(user) for user in users] return users
def case_details(request, domain, case_id): timezone = util.get_timezone(request.couch_user.user_id, domain) try: case = CommCareCase.get(case_id) except ResourceNotFound: case = None if case == None or case.doc_type != "CommCareCase" or case.domain != domain: messages.info(request, "Sorry, we couldn't find that case. If you think this is a mistake plase report an issue.") return HttpResponseRedirect(inspect.CaseListReport.get_url(domain=domain)) report_name = 'Details for Case "%s"' % case.name form_lookups = dict((form.get_id, "%s: %s" % (form.received_on.date(), xmlns_to_name(domain, form.xmlns, get_app_id(form)))) \ for form in case.get_forms()) try: owner_name = CommCareUser.get_by_user_id(case.owner_id, domain).raw_username except Exception: try: owning_group = Group.get(case.owner_id) owner_name = owning_group.display_name if owning_group.domain == domain else '' except Exception: owner_name = None try: username = CommCareUser.get_by_user_id(case.user_id, domain).raw_username except Exception: username = None return render(request, "reports/reportdata/case_details.html", { "domain": domain, "case_id": case_id, "username": username, "owner_name": owner_name, "form_lookups": form_lookups, "slug":inspect.CaseListReport.slug, "report": dict( name=report_name, slug=inspect.CaseListReport.slug, is_async=False, ), "layout_flush_content": True, "timezone": timezone })
def toggle_demo_mode(request, domain, user_id): user = CommCareUser.get_by_user_id(user_id, domain) demo_mode = request.POST.get('demo_mode', 'no') demo_mode = True if demo_mode == 'yes' else False edit_user_url = reverse(EditCommCareUserView.urlname, args=[domain, user_id]) # handle bad POST param if user.is_demo_user == demo_mode: warning = _("User is already in Demo mode!") if user.is_demo_user else _("User is not in Demo mode!") messages.warning(request, warning) return HttpResponseRedirect(edit_user_url) if demo_mode: download = DownloadBase() res = turn_on_demo_mode_task.delay(user.get_id, domain) download.set_task(res) return HttpResponseRedirect( reverse( DemoRestoreStatusView.urlname, args=[domain, download.download_id, user_id] ) ) else: from corehq.apps.app_manager.views.utils import unset_practice_mode_configured_apps, \ get_practice_mode_configured_apps # if the user is being used as practice user on any apps, check/ask for confirmation apps = get_practice_mode_configured_apps(domain) confirm_turn_off = True if (request.POST.get('confirm_turn_off', 'no')) == 'yes' else False if apps and not confirm_turn_off: return HttpResponseRedirect(reverse(ConfirmTurnOffDemoModeView.urlname, args=[domain, user_id])) turn_off_demo_mode(user) unset_practice_mode_configured_apps(domain, user.get_id) messages.success(request, _("Successfully turned off demo mode!")) return HttpResponseRedirect(edit_user_url)
def test_mobile_workers_are_deactivated(self): active_statuses = [(u.username, u.is_active) for u in self.users] self.assertListEqual(active_statuses, [ ('active1', True), ('active2', True), ('active3', True), ('active4', True), ('active5', True), ('active6', True), ('inactive', False), ('inactive2', False), ]) for domain in self.emw_settings.account.get_domains(): self.emw_settings.deactivate_mobile_workers_by_inactivity(domain) refreshed_users = [ CommCareUser.get_by_user_id(u.get_id) for u in self.users ] new_active_statuses = [(u.username, u.is_active) for u in refreshed_users] self.assertListEqual(new_active_statuses, [ ('active1', True), ('active2', False), ('active3', True), ('active4', True), ('active5', False), ('active6', False), ('inactive', False), ('inactive2', False), ])
def change_password(request, domain, login_id, template="users/partial/reset_password.html"): # copied from auth's password_change commcare_user = CommCareUser.get_by_user_id(login_id, domain) json_dump = {} if not commcare_user: raise Http404() django_user = commcare_user.get_django_user() if request.method == "POST": form = SetUserPasswordForm(request.project, login_id, user=django_user, data=request.POST) if form.is_valid(): form.save() json_dump['status'] = 'OK' form = SetUserPasswordForm(request.project, login_id, user='') else: form = SetUserPasswordForm(request.project, login_id, user=django_user) context = _users_context(request, domain) context.update({ 'reset_password_form': form, }) json_dump['formHTML'] = render_to_string(template, context) return HttpResponse(json.dumps(json_dump))
def get_fixtures(request, domain, user_id, fixture_id=None): try: user = CommCareUser.get_by_user_id(user_id) except CouchUser.AccountTypeError: err = ("You can't use case sharing or fixtures as a %s. " "Login as a mobile worker and try again." ) % settings.WEB_USER_TERM, return HttpResponse(err, status=412, content_type="text/plain") if not user: raise Http404 assert user.is_member_of(domain) casexml_user = user.to_casexml_user() if not fixture_id: ret = ElementTree.Element("fixtures") for fixture in generator.get_fixtures(casexml_user, version=V2): ret.append(fixture) return HttpResponse(ElementTree.tostring(ret), content_type="text/xml") else: for fixture in generator.get_fixtures(casexml_user, version=V2): if fixture.attrib.get("id") == fixture_id: assert len(fixture.getchildren()) == 1 return HttpResponse(ElementTree.tostring( fixture.getchildren()[0]), content_type="text/xml") raise Http404
def _sync_location_user(self): if not self.location.location_id: return if self.location.location_type.has_user and not self.location.user_id: # make sure there's a location user res = list(UserES() .domain(self.domain) .show_inactive() .term('user_location_id', self.location.location_id) .values_list('_id', flat=True)) user_id = res[0] if res else None if user_id: user = CommCareUser.get(user_id) else: user = make_location_user(self.location) user.is_active = True user.user_location_id = self.location.location_id user.set_location(self.location, commit=False) user.save() self.location.user_id = user._id self.location.save() elif self.location.user_id and not self.location.location_type.has_user: # archive the location user user = CommCareUser.get_by_user_id(self.location.user_id, self.domain) if user: user.is_active = False user.save() self.location.user_id = '' self.location.save()
def get_cases(request, domain): request_params = request.GET if request.couch_user.is_commcare_user(): user_id = request.couch_user.get_id else: user_id = request_params.get("user_id", "") if not user_id and not request.couch_user.is_web_user(): return HttpResponseBadRequest("Must specify user_id!") ids_only = string_to_boolean(request_params.get("ids_only", "false")) case_id = request_params.get("case_id", "") footprint = string_to_boolean(request_params.get("footprint", "false")) accessor = CaseAccessors(domain) if toggles.HSPH_HACK.enabled(domain): hsph_case_id = request_params.get('hsph_hack', None) if hsph_case_id != 'None' and hsph_case_id and user_id: case = accessor.get_case(hsph_case_id) usercase_id = CommCareUser.get_by_user_id( user_id).get_usercase_id() usercase = accessor.get_case(usercase_id) if usercase_id else None return json_response( map( lambda case: CaseAPIResult(domain=domain, id=case['_id'], couch_doc=case, id_only=ids_only), filter(None, [case, case.parent, usercase])))
def get_recipient_details(self, sms): details = { 'type': None, 'name': None, 'location_id': None, } if sms.couch_recipient: if sms.couch_recipient in self.recipient_details: return self.recipient_details[sms.couch_recipient] recipient = sms.recipient if is_commcarecase(recipient): details['name'] = recipient.name details['type'] = 'case: %s' % recipient.type if recipient.type == 'commcare-user': user = CommCareUser.get_by_user_id(recipient.owner_id) if user: details['location_id'] = user.location_id else: details['location_id'] = recipient.owner_id elif isinstance(recipient, CommCareUser): details['name'] = recipient.username details['type'] = 'mobile worker' details['location_id'] = recipient.location_id self.recipient_details[sms.couch_recipient] = details return details
def get_dict_to_report(domain, case_id, report_slug): try: case = CommCareCase.get(case_id) except ResourceNotFound: case = None baby_case = [c for c in case.get_subcases().all() if c.type == 'baby'] if baby_case: forms = case.get_forms() + baby_case[0].get_forms() else: forms = case.get_forms() try: user = CommCareUser.get_by_user_id(case.user_id, domain) except Exception: user = None sections = get_questions_with_answers(forms, domain, report_slug) return { "domain": domain, "case_id": case_id, "report": dict( name=case_inline_display(case), slug=report_slug, is_async=False, ), "user": user, "case": case, "sections": sections }
def explode_cases(request, domain, template="hqcase/explode_cases.html"): if request.method == 'POST': user_id = request.POST['user_id'] user = CommCareUser.get_by_user_id(user_id, domain) factor = request.POST.get('factor', '2') try: factor = int(factor) except ValueError: messages.error(request, 'factor must be an int; was: %s' % factor) else: keys = [[domain, owner_id, False] for owner_id in user.get_owner_ids()] for case in CommCareCase.view('hqcase/by_owner', keys=keys, include_docs=True, reduce=False ): # we'll be screwing with this guy, so make him unsaveable case.save = None for i in range(factor - 1): case._id = uuid.uuid4().hex case_block = get_case_xml(case, (const.CASE_ACTION_CREATE, const.CASE_ACTION_UPDATE), version='2.0') submit_case_blocks(case_block, domain) messages.success(request, "All of %s's cases were exploded by a factor of %d" % (user.raw_username, factor)) return render(request, template, { 'domain': domain, 'users': CommCareUser.by_domain(domain), })
def user_domain_transfer(request, domain, prescription, template="users/domain_transfer.html"): target_domain = prescription.params["target_domain"] if not request.couch_user.is_domain_admin(target_domain): return HttpResponseForbidden() if request.method == "POST": user_ids = request.POST.getlist("user_id") app_id = request.POST["app_id"] errors = [] for user_id in user_ids: user = CommCareUser.get_by_user_id(user_id, domain) try: user.transfer_to_domain(target_domain, app_id) except Exception as e: errors.append((user_id, user, e)) else: messages.success(request, "Successfully transferred {user.username}".format(user=user)) if errors: messages.error(request, "Failed to transfer the following users") for user_id, user, e in errors: if user: messages.error(request, "{user.username} ({user.user_id}): {e}".format(user=user, e=e)) else: messages.error(request, "CommCareUser {user_id} not found".format(user_id=user_id)) return HttpResponseRedirect(reverse("commcare_users", args=[target_domain])) else: from corehq.apps.app_manager.models import VersionedDoc # apps from the *target* domain apps = VersionedDoc.view("app_manager/applications_brief", startkey=[target_domain], endkey=[target_domain, {}]) # users from the *originating* domain users = list(CommCareUser.by_domain(domain)) users.extend(CommCareUser.by_domain(domain, is_active=False)) context = _users_context(request, domain) context.update({"apps": apps, "commcare_users": users, "target_domain": target_domain}) return render(request, template, context)
def delete_commcare_user(request, domain, user_id): user = CommCareUser.get_by_user_id(user_id, domain) if not _can_edit_workers_location(request.couch_user, user): raise PermissionDenied() user.retire() messages.success(request, "User %s has been deleted. All their submissions and cases will be permanently deleted in the next few minutes" % user.username) return HttpResponseRedirect(reverse(MobileWorkerListView.urlname, args=[domain]))
def toggle_demo_mode(request, domain, user_id): user = CommCareUser.get_by_user_id(user_id, domain) demo_mode = request.POST.get('demo_mode', 'no') demo_mode = True if demo_mode == 'yes' else False edit_user_url = reverse(EditCommCareUserView.urlname, args=[domain, user_id]) # handle bad POST param if user.is_demo_user == demo_mode: warning = _("User is already in Demo mode!") if user.is_demo_user else _("User is not in Demo mode!") messages.warning(request, warning) return HttpResponseRedirect(edit_user_url) if demo_mode: download = DownloadBase() res = turn_on_demo_mode_task.delay(user, domain) download.set_task(res) return HttpResponseRedirect( reverse( DemoRestoreStatusView.urlname, args=[domain, download.download_id, user_id] ) ) else: turn_off_demo_mode(user) messages.success(request, _("Successfully turned off demo mode!")) return HttpResponseRedirect(edit_user_url)
def case_sharing_groups(self): try: user = CommCareUser.get_by_user_id(self.individual) user = user if user.username_in_report else None return user.get_case_sharing_groups() except Exception: return []
def get_fixtures(request, domain, user_id, fixture_id=None): try: user = CommCareUser.get_by_user_id(user_id) except CouchUser.AccountTypeError: err = ("You can't use case sharing or fixtures as a %s. " "Login as a mobile worker and try again.") % settings.WEB_USER_TERM, return HttpResponse(err, status=412, content_type="text/plain") if not user: raise Http404 assert user.is_member_of(domain) restore_user = user.to_ota_restore_user() if not fixture_id: ret = ElementTree.Element("fixtures") for fixture in generator.get_fixtures(restore_user, version=V2): ret.append(fixture) return HttpResponse(ElementTree.tostring(ret), content_type="text/xml") else: fixture = generator.get_fixture_by_id(fixture_id, restore_user, version=V2) if not fixture: raise Http404 assert len(fixture.getchildren()) == 1, 'fixture {} expected 1 child but found {}'.format( fixture_id, len(fixture.getchildren()) ) return HttpResponse(ElementTree.tostring(fixture.getchildren()[0]), content_type="text/xml")
def get_dict_to_report(domain, case_id, report_slug): try: case = CommCareCase.get(case_id) except ResourceNotFound: case = None baby_case = [c for c in case.get_subcases().all() if c.type == 'baby'] if baby_case: mother_forms = [form for form in case.get_forms() if form.xmlns == MOTHER_POSTPARTUM_VISIT_FORM_XMLNS] baby_forms = [form for form in baby_case[0].get_forms() if form.xmlns == BABY_POSTPARTUM_VISIT_FORM_XMLNS] forms = mother_forms + baby_forms else: forms = [form for form in case.get_forms() if form.xmlns == MOTHER_POSTPARTUM_VISIT_FORM_XMLNS] try: user = CommCareUser.get_by_user_id(case.user_id, domain) except Exception: user = None sections = get_questions_with_answers(forms, domain, report_slug) return { "domain": domain, "case_id": case_id, "report": dict( name=case_inline_display(case), slug=report_slug, is_async=False, ), "user": user, "case": case, "sections": sections }
def users_by_mobile_workers(self): from corehq.apps.reports.util import _report_user_dict user_dict = {} for mw in self.mobile_worker_ids: user_dict[mw] = _report_user_dict(CommCareUser.get_by_user_id(mw)) return user_dict
def explode_cases(request, domain, template="hqcase/explode_cases.html"): if request.method == 'POST': user_id = request.POST['user_id'] user = CommCareUser.get_by_user_id(user_id, domain) factor = request.POST.get('factor', '2') try: factor = int(factor) except ValueError: messages.error(request, 'factor must be an int; was: %s' % factor) else: keys = [[domain, owner_id, False] for owner_id in user.get_owner_ids()] for case in CommCareCase.view('hqcase/by_owner', keys=keys, include_docs=True, reduce=False ): for i in range(factor - 1): new_case_id = uuid.uuid4().hex case_block, attachments = make_creating_casexml(case, new_case_id) submit_case_blocks(case_block, domain, attachments=attachments) messages.success(request, "All of %s's cases were exploded by a factor of %d" % (user.raw_username, factor)) return render(request, template, { 'domain': domain, 'users': CommCareUser.by_domain(domain), })
def case_details(request, domain, case_id): timezone = util.get_timezone(request.couch_user.user_id, domain) try: case = CommCareCase.get(case_id) except ResourceNotFound: case = None if case is None or case.doc_type != "CommCareCase" or case.domain != domain: messages.info(request, "Sorry, we couldn't find that case. If you think this is a mistake please report an issue.") return HttpResponseRedirect(inspect.CaseListReport.get_url(domain=domain)) try: owner_name = CommCareUser.get_by_user_id(case.owner_id, domain).raw_username except Exception: try: owning_group = Group.get(case.owner_id) owner_name = owning_group.display_name if owning_group.domain == domain else '' except Exception: owner_name = None try: username = CommCareUser.get_by_user_id(case.user_id, domain).raw_username except Exception: username = None return render(request, "reports/reportdata/case_details.html", { "domain": domain, "case_id": case_id, "case": case, "username": username, "owner_name": owner_name, "slug": inspect.CaseListReport.slug, "report": dict( name=case_inline_display(case), slug=inspect.CaseListReport.slug, is_async=False, ), "layout_flush_content": True, "timezone": timezone, "case_display_options": { "display": request.project.get_case_display(case), "timezone": timezone, "get_case_url": lambda case_id: reverse( case_details, args=[domain, case_id]) }, })
def delete_commcare_user(request, domain, user_id): user = CommCareUser.get_by_user_id(user_id, domain) user.retire() messages.success( request, "User %s has been deleted. All their submissions and cases will be permanently deleted in the next few minutes" % user.username) return HttpResponseRedirect(reverse('commcare_users', args=[domain]))
def editable_user(self): try: user = CommCareUser.get_by_user_id(self.editable_user_id, self.domain) except (ResourceNotFound, CouchUser.AccountTypeError, KeyError): raise Http404() if not user or not _can_edit_workers_location(self.couch_user, user): raise Http404() return user
def obj_get(self, request, **kwargs): domain = kwargs['domain'] pk = kwargs['pk'] try: user = CommCareUser.get_by_user_id(pk, domain) except KeyError: user = None return user
def case_details(request, domain, case_id): timezone = util.get_timezone(request.couch_user, domain) try: case = _get_case_or_404(domain, case_id) except Http404: messages.info( request, "Sorry, we couldn't find that case. If you think this is a mistake please report an issue." ) return HttpResponseRedirect(CaseListReport.get_url(domain=domain)) try: owner_name = CommCareUser.get_by_user_id(case.owner_id, domain).raw_username except Exception: try: owning_group = Group.get(case.owner_id) owner_name = owning_group.display_name if owning_group.domain == domain else "" except Exception: owner_name = None try: username = CommCareUser.get_by_user_id(case.user_id, domain).raw_username except Exception: username = None return render( request, "reports/reportdata/case_details.html", { "domain": domain, "case_id": case_id, "case": case, "username": username, "owner_name": owner_name, "slug": CaseListReport.slug, "report": dict(name=case_inline_display(case), slug=CaseListReport.slug, is_async=False), "layout_flush_content": True, "timezone": timezone, "case_display_options": { "display": request.project.get_case_display(case), "timezone": timezone, "get_case_url": lambda case_id: reverse(case_details, args=[domain, case_id]), }, "show_case_rebuild": toggles.CASE_REBUILD.enabled(request.user.username), }, )
def delete_commcare_user(request, domain, user_id): user = CommCareUser.get_by_user_id(user_id, domain) user.retire() messages.success( request, "User %s and all their submissions have been permanently deleted" % user.username) return HttpResponseRedirect(reverse('commcare_users', args=[domain]))
def editable_user(self): try: user = CommCareUser.get_by_user_id(self.editable_user_id, self.domain) if user.is_deleted(): self.template_name = "users/deleted_account.html" return user except (ResourceNotFound, CouchUser.AccountTypeError, KeyError): raise Http404()
def _get_groups(self, user_id, context): domain = context.root_doc['domain'] user = CommCareUser.get_by_user_id(user_id, domain) if not user: return [] groups = self._get_groups_from_user(user) return [g.to_json() for g in groups]
def _submitted_by_demo_user(form_meta, domain): from corehq.apps.users.util import DEMO_USER_ID user_id = form_meta.get('userID') if user_id and user_id != DEMO_USER_ID: user = CommCareUser.get_by_user_id(user_id, domain) if user and user.is_demo_user: return True return False
def restore_commcare_user(request, domain, user_id): user = CommCareUser.get_by_user_id(user_id, domain) success, message = user.unretire() if success: messages.success(request, "User %s and all their submissions have been restored" % user.username) else: messages.error(request, message) return HttpResponseRedirect(reverse(EditCommCareUserView.urlname, args=[domain, user_id]))
def editable_user(self): try: user = CommCareUser.get_by_user_id(self.editable_user_id, self.domain) if not user or user.is_deleted(): raise Http404() return user except (ResourceNotFound, CouchUser.AccountTypeError, KeyError): raise Http404()
def tearDown(self): ensure_index_deleted(XFORM_INDEX_INFO.index) user = CommCareUser.get_by_user_id(self.user._id, self.domain) user.reporting_metadata.last_submissions = [] user.save() PillowError.objects.all().delete() UserReportingMetadataStaging.objects.all().delete() super().tearDown()
def restore_commcare_user(request, domain, user_id): user = CommCareUser.get_by_user_id(user_id, domain) user.unretire() messages.success( request, "User %s and all their submissions have been restored" % user.username) return HttpResponseRedirect( reverse(EditCommCareUserView.urlname, args=[domain, user_id]))
def get_custom_value(self, column_name, test_case): if column_name == "Commcare UUID": return test_case.case_id elif column_name == "Date of Episode Creation": return self.get_episode(test_case).opened_on elif column_name == "Criteria for Testing": return (test_case.get_case_property('rft_drtb_diagnosis') or test_case.get_case_property('rft_drtb_diagnosis_ext_dst') or test_case.get_case_property('rft_drtb_follow_up') or test_case.get_case_property('rft_dstb_diagnosis') or test_case.get_case_property('rft_dstb_followup')) elif column_name == "Test requested form submitted by - ID": return test_case.opened_by elif column_name == "Test Requested Form submitted By - User Name": user_id = None try: user_id = test_case.opened_by return CommCareUser.get_by_user_id(user_id, DOMAIN).username except Exception as e: return Exception( "Could not get username. case opened by %s, %s" % (user_id, e)) elif column_name == "Test Requested Form Submission Date": return test_case.opened_on elif column_name == "Test Resulted Form Submitted by (Name)": if test_case.get_case_property('result_recorded') == 'yes': user_id = self.case_property_change_info( test_case, "result_recorded", "yes").transaction.user_id return CommCareUser.get_by_user_id(user_id, DOMAIN).username else: return '' elif column_name == "Test Resulted Form Submitted by (ID)": if test_case.get_case_property('result_recorded') == 'yes': return self.case_property_change_info( test_case, "result_recorded", "yes").transaction.user_id else: return '' elif column_name == "Test Resulted Form Submission Date": if test_case.get_case_property('result_recorded') == 'yes': return self.case_property_change_info(test_case, "result_recorded", "yes").modified_on else: return '' return Exception("unknown custom column %s" % column_name)
def user(self): if self.handler.recipient == RECIPIENT_USER: try: return CommCareUser.get_by_user_id(self.user_id) except Exception: self.retire() return None else: return None
def test_facility_in_charge(self): with open(os.path.join(self.datapath, 'sample_locations.json')) as f: location = Location(json.loads(f.read())[1]) ewsghana_location = self.api_object.location_sync(location) in_charges = FacilityInCharge.objects.filter(location=ewsghana_location.sql_location) self.assertEqual(in_charges.count(), 1) user = CommCareUser.get_by_user_id(in_charges[0].user_id) self.assertIsNotNone(user)
def get_data_grouping_id(self, row): if not self.selected_province() or not self.selected_cbo(): grouping_id = row.pop(0) else: # if it's a user we need to get the username user = CommCareUser.get_by_user_id(row.pop(0)) grouping_id = user.username return grouping_id
def delete_commcare_user(request, domain, user_id): user = CommCareUser.get_by_user_id(user_id, domain) user.retire() messages.success( request, "User %s has been deleted. All their submissions and cases will be permanently deleted in the next few minutes" % user.username, ) return HttpResponseRedirect(reverse("commcare_users", args=[domain]))
def page_context(self): from corehq.apps.app_manager.views.utils import get_practice_mode_configured_apps user_id = self.kwargs.pop('couch_user_id') user = CommCareUser.get_by_user_id(user_id, self.domain) practice_apps = get_practice_mode_configured_apps(self.domain, user_id) return { 'commcare_user': user, 'practice_apps': practice_apps, }
def editable_user(self): try: user = CommCareUser.get_by_user_id(self.editable_user_id, self.domain) if not user: raise Http404() return user except (ResourceNotFound, CouchUser.AccountTypeError, KeyError): raise Http404()
def test_user_is_not_deactivated_and_no_logs(self): bulk_auto_deactivate_commcare_users([self.inactive_user.user_id], self.domain) refreshed_user = CommCareUser.get_by_user_id(self.inactive_user.get_id) self.assertFalse( refreshed_user.is_active ) self.assertFalse( UserHistory.objects.filter(user_id=self.inactive_user.user_id).exists() )
def _get_agency_id(episode_case): agency_id = episode_case.get_case_property( 'bets_notifying_provider_user_id') if not agency_id: raise NikshayLocationNotFound( "Episode {} does not have an agency".format( episode_case.case_id)) agency_user = CommCareUser.get_by_user_id(agency_id) return agency_user.raw_username
def archive_commcare_user(request, domain, user_id, is_active=False): user = CommCareUser.get_by_user_id(user_id, domain) user.is_active = is_active user.save() return HttpResponse(json.dumps(dict( success=True, message="User '%s' has successfully been %s." % (user.raw_username, "Un-Archived" if user.is_active else "Archived") )))
def test_facility_in_charge(self): with open(os.path.join(self.datapath, 'sample_locations.json')) as f: location = Location(json.loads(f.read())[1]) ewsghana_location = self.api_object.location_sync(location) in_charges = FacilityInCharge.objects.filter( location=ewsghana_location.sql_location) self.assertEqual(in_charges.count(), 1) user = CommCareUser.get_by_user_id(in_charges[0].user_id) self.assertIsNotNone(user)
def _sync_location_user(self): if not self.location.location_id: return if self.location.user_id: # archive the location user user = CommCareUser.get_by_user_id(self.location.user_id, self.domain) if user: user.is_active = False user.save() self.location.user_id = '' self.location.save()
def set_commcare_user_group(request, domain): user_id = request.GET.get('user', '') user = CommCareUser.get_by_user_id(user_id) group_name = request.GET.get('group', '') group = Group.by_name(domain, group_name) if not user.is_commcare_user() or user.domain != domain or not group: return HttpResponseForbidden() for group in user.get_case_sharing_groups(): group.remove_user(user) group.add_user(user) return HttpResponseRedirect(reverse('commcare_users', args=[domain]))
def test_app_metadata_tracker_non_batch(self): form, metadata = self._create_form_and_sync_to_es() user = CommCareUser.get_by_user_id(self.user._id, self.domain) self.assertEqual(len(user.reporting_metadata.last_submissions), 1) last_submission = user.reporting_metadata.last_submissions[0] self.assertEqual( last_submission.submission_date, string_to_utc_datetime(self.metadata.received_on), ) self.assertEqual(last_submission.app_id, self.metadata.app_id)
def delete_commcare_user(request, domain, user_id): user = CommCareUser.get_by_user_id(user_id, domain) if not _can_edit_workers_location(request.couch_user, user): raise PermissionDenied() user.retire() messages.success( request, "User %s has been deleted. All their submissions and cases will be permanently deleted in the next few minutes" % user.username) return HttpResponseRedirect( reverse(MobileWorkerListView.urlname, args=[domain]))
def _submitted_by_demo_user(form_json, domain): from corehq.apps.users.util import DEMO_USER_ID try: user_id = form_json['meta']['userID'] except (KeyError, ValueError): pass else: if user_id and user_id != DEMO_USER_ID: user = CommCareUser.get_by_user_id(user_id, domain) if user and user.is_demo_user: return True return False
def case_sharing_groups(self): try: user = CommCareUser.get_by_user_id(self.individual) user = user if user.username_in_report else None return user.get_case_sharing_groups() except Exception: try: group = Group.get(self.individual) assert(group.doc_type == 'Group') return [group] except Exception: return []
def delete_commcare_user(request, domain, user_id): user = CommCareUser.get_by_user_id(user_id, domain) if not _can_edit_workers_location(request.couch_user, user): raise PermissionDenied() if (user.user_location_id and SQLLocation.objects.get_or_None(location_id=user.user_location_id, user_id=user._id)): messages.error(request, _("This is a location user. You must delete the " "corresponding location before you can delete this user.")) return HttpResponseRedirect(reverse(EditCommCareUserView.urlname, args=[domain, user_id])) user.retire() messages.success(request, "User %s has been deleted. All their submissions and cases will be permanently deleted in the next few minutes" % user.username) return HttpResponseRedirect(reverse(MobileWorkerListView.urlname, args=[domain]))
def get_custom_value(self, column_name, referral): if column_name == "Date of Creation of Referral Case": return referral.opened_on elif column_name == "Created by Username": user_id = None try: user_id = referral.opened_by return CommCareUser.get_by_user_id(user_id, DOMAIN).username except Exception as e: return Exception("Could not get username. case opened by %s, %s" % (user_id, e)) elif column_name == "Created by User ID": return referral.opened_by return Exception("unknown custom column %s" % column_name)
def user_domain_transfer(request, domain, prescription, template="users/domain_transfer.html"): target_domain = prescription.params['target_domain'] if not request.couch_user.is_domain_admin(target_domain): return HttpResponseForbidden() if request.method == "POST": user_ids = request.POST.getlist('user_id') app_id = request.POST['app_id'] errors = [] for user_id in user_ids: user = CommCareUser.get_by_user_id(user_id, domain) try: user.transfer_to_domain(target_domain, app_id) except Exception as e: errors.append((user_id, user, e)) else: messages.success( request, "Successfully transferred {user.username}".format( user=user)) if errors: messages.error(request, "Failed to transfer the following users") for user_id, user, e in errors: if user: messages.error( request, "{user.username} ({user.user_id}): {e}".format( user=user, e=e)) else: messages.error( request, "CommCareUser {user_id} not found".format( user_id=user_id)) return HttpResponseRedirect( reverse('commcare_users', args=[target_domain])) else: from corehq.apps.app_manager.models import VersionedDoc # apps from the *target* domain apps = VersionedDoc.view('app_manager/applications_brief', startkey=[target_domain], endkey=[target_domain, {}]) # users from the *originating* domain users = list(CommCareUser.by_domain(domain)) users.extend(CommCareUser.by_domain(domain, is_active=False)) context = _users_context(request, domain) context.update({ 'apps': apps, 'commcare_users': users, 'target_domain': target_domain }) return render(request, template, context)