示例#1
0
    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)
示例#2
0
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
示例#3
0
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
示例#4
0
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
    })
示例#5
0
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)
示例#6
0
    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),
        ])
示例#7
0
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))
示例#8
0
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
示例#9
0
 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()
示例#10
0
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])))
示例#11
0
    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
示例#12
0
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
    }
示例#13
0
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),
    })
示例#14
0
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)
示例#15
0
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]))
示例#16
0
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)
示例#17
0
 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 []
示例#18
0
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")
示例#19
0
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
    }
示例#20
0
    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
示例#21
0
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),
    })
示例#22
0
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])
        },
    })
示例#23
0
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]))
示例#24
0
 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
示例#25
0
 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
示例#26
0
 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
示例#27
0
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),
        },
    )
示例#28
0
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]))
示例#29
0
 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()
示例#30
0
    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]
示例#31
0
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
示例#32
0
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]))
示例#33
0
 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()
示例#34
0
 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()
示例#35
0
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]))
示例#36
0
    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 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)
示例#38
0
 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
示例#39
0
    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)
示例#40
0
    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
示例#41
0
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]))
示例#42
0
 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()
示例#43
0
 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,
     }
示例#44
0
 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()
示例#45
0
    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
示例#46
0
 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()
     )
示例#47
0
 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
示例#48
0
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")
    )))
示例#49
0
    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)
示例#50
0
 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()
示例#51
0
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]))
示例#52
0
    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)
示例#53
0
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]))
示例#54
0
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
示例#55
0
 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 []
示例#56
0
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]))
示例#57
0
 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)
示例#58
0
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)