Exemplo n.º 1
0
def get_cloudcare_app(domain, app_name):
    apps = get_cloudcare_apps(domain)
    app = filter(lambda x: x['name'] == app_name, apps)
    if app:
        return look_up_app_json(domain, app[0]['_id'])
    else:
        raise ResourceNotFound(_("Not found application by name: %s") % app_name)
Exemplo n.º 2
0
 def page_context(self):
     if (not self.can_restrict_access_by_location
         and any(not role.permissions.access_all_locations
                 for role in self.user_roles)
     ):
         messages.warning(self.request, _(
             "This project has user roles that restrict data access by "
             "organization, but the software plan no longer supports that. "
             "Any users assigned to roles that are restricted in data access "
             "by organization can no longer access this project.  Please "
             "update the existing roles."))
     return {
         'user_roles': self.user_roles,
         'can_edit_roles': self.can_edit_roles,
         'default_role': UserRole.get_default(),
         'report_list': get_possible_reports(self.domain),
         'web_apps_list': get_cloudcare_apps(self.domain),
         'apps_list': get_brief_apps_in_domain(self.domain),
         'invitations': self.invitations,
         'requests': DomainRequest.by_domain(self.domain) if self.request.couch_user.is_domain_admin else [],
         'admins': WebUser.get_admins_by_domain(self.domain),
         'domain_object': self.domain_object,
         'uses_locations': self.domain_object.uses_locations,
         'can_restrict_access_by_location': self.can_restrict_access_by_location,
         'landing_page_choices': self.landing_page_choices,
         'show_integration': (
             toggles.OPENMRS_INTEGRATION.enabled(self.domain) or
             toggles.DHIS2_INTEGRATION.enabled(self.domain)
         ),
     }
Exemplo n.º 3
0
def get_cloudcare_app(domain, app_name):
    apps = get_cloudcare_apps(domain)
    app = [x for x in apps if x['name'] == app_name]
    if app:
        return look_up_app_json(domain, app[0]['_id'])
    else:
        raise ResourceNotFound(_("Not found application by name: %s") % app_name)
Exemplo n.º 4
0
def get_cloudcare_app(domain, app_name):
    apps = get_cloudcare_apps(domain)
    app = filter(lambda x: x['name'] == app_name, apps)
    if app:
        return look_up_app_json(domain, app[0]['_id'])
    else:
        raise ResourceNotFound(_("Not found application by name: %s") % app_name)
Exemplo n.º 5
0
def get_cloudcare_app(domain, app_name):
    apps = get_cloudcare_apps(domain)
    app = [x for x in apps if x['name'] == app_name]
    if app:
        return look_up_app_json(domain, app[0]['_id'])
    else:
        raise ResourceNotFound(_("Not found application by name: %s") % app_name)
Exemplo n.º 6
0
    def response_cloudcare(domain, new_plan_version):
        """
        CloudCare enabled apps will have cloudcare_enabled set to false on downgrade.
        """
        cloudcare_enabled_apps = get_cloudcare_apps(domain.name)
        if not cloudcare_enabled_apps:
            return None

        num_apps = len(cloudcare_enabled_apps)
        return _fmt_alert(
            ungettext(
                "You have %(num_apps)d application that will lose Web Apps "
                "access if you select this plan.",
                "You have %(num_apps)d applications that will lose Web Apps "
                "access if you select this plan.",
                num_apps
            ) % {
                'num_apps': num_apps,
            },
            [
                format_html(
                    '<a href="{}">{}</a>',
                    reverse('view_app', args=[domain.name, app['_id']]),
                    app['name']
                ) for app in cloudcare_enabled_apps
            ],
        )
Exemplo n.º 7
0
 def page_context(self):
     apps = get_cloudcare_apps(self.domain)
     access = ApplicationAccess.get_template_json(self.domain, apps)
     groups = Group.by_domain(self.domain)
     return {
         'apps': apps,
         'groups': groups,
         'access': access,
     }
Exemplo n.º 8
0
 def page_context(self):
     apps = get_cloudcare_apps(self.domain)
     access = ApplicationAccess.get_template_json(self.domain, apps)
     groups = Group.by_domain(self.domain)
     return {
         'apps': apps,
         'groups': groups,
         'access': access,
     }
Exemplo n.º 9
0
    def response_cloudcare(domain, new_plan_version):
        """
        CloudCare enabled apps will have cloudcare_enabled set to false on downgrade.
        """
        cloudcare_enabled_apps = get_cloudcare_apps(domain.name)
        if not cloudcare_enabled_apps:
            return None

        num_apps = len(cloudcare_enabled_apps)
        return _fmt_alert(
            ungettext(
                "You have %(num_apps)d application that will lose Web Apps "
                "access if you select this plan.",
                "You have %(num_apps)d applications that will lose Web Apps "
                "access if you select this plan.",
                num_apps
            ) % {
                'num_apps': num_apps,
            },
            [mark_safe('<a href="%(url)s">%(title)s</a>') % {
                'title': app['name'],
                'url': reverse('view_app', args=[domain.name, app['_id']])
            } for app in cloudcare_enabled_apps],
        )
Exemplo n.º 10
0
    def response_cloudcare(domain, new_plan_version):
        """
        CloudCare enabled apps will have cloudcare_enabled set to false on downgrade.
        """
        cloudcare_enabled_apps = get_cloudcare_apps(domain.name)
        if not cloudcare_enabled_apps:
            return None

        num_apps = len(cloudcare_enabled_apps)
        return _fmt_alert(
            ungettext(
                "You have %(num_apps)d application that will lose CloudCare "
                "access if you select this plan.",
                "You have %(num_apps)d applications that will lose CloudCare "
                "access if you select this plan.", num_apps) % {
                    'num_apps': num_apps,
                },
            [
                mark_safe('<a href="%(url)s">%(title)s</a>') % {
                    'title': app['name'],
                    'url': reverse('view_app', args=[domain.name, app['_id']])
                } for app in cloudcare_enabled_apps
            ],
        )
Exemplo n.º 11
0
    def get(self, request, domain, urlPath):
        try:
            preview = string_to_boolean(request.GET.get("preview", "false"))
        except ValueError:
            # this is typically only set at all if it's intended to be true so this
            # is a reasonable default for "something went wrong"
            preview = True

        app_access = ApplicationAccess.get_by_domain(domain)
        accessor = CaseAccessors(domain)

        if not preview:
            apps = get_cloudcare_apps(domain)
            if request.project.use_cloudcare_releases:

                if (toggles.CLOUDCARE_LATEST_BUILD.enabled(domain)
                        or toggles.CLOUDCARE_LATEST_BUILD.enabled(
                            request.couch_user.username)):
                    get_cloudcare_app = get_latest_build_doc
                else:
                    get_cloudcare_app = get_latest_released_app_doc

                apps = map(
                    lambda app: get_cloudcare_app(domain, app['_id']),
                    apps,
                )
                apps = filter(None, apps)
                apps = map(wrap_app, apps)

                # convert to json
                apps = [get_app_json(app) for app in apps]
            else:
                # legacy functionality - use the latest build regardless of stars
                apps = [
                    get_latest_build_doc(domain, app['_id']) for app in apps
                ]
                apps = [
                    get_app_json(ApplicationBase.wrap(app)) for app in apps
                    if app
                ]

        else:
            # big TODO: write a new apps view for Formplayer, can likely cut most out now
            if toggles.USE_FORMPLAYER_FRONTEND.enabled(domain):
                apps = get_cloudcare_apps(domain)
            else:
                apps = get_brief_apps_in_domain(domain)
            apps = [
                get_app_json(app) for app in apps if app and
                (isinstance(app, RemoteApp) or app.application_version == V2)
            ]
            meta = get_meta(request)
            track_clicked_preview_on_hubspot(request.couch_user,
                                             request.COOKIES, meta)

        # trim out empty apps
        apps = filter(lambda app: app, apps)
        apps = filter(
            lambda app: app_access.user_can_access_app(request.couch_user, app
                                                       ), apps)

        def _default_lang():
            if apps:
                # unfortunately we have to go back to the DB to find this
                return Application.get(apps[0]["_id"]).default_language
            else:
                return "en"

        # default language to user's preference, followed by
        # first app's default, followed by english
        language = request.couch_user.language or _default_lang()

        def _url_context():
            # given a url path, returns potentially the app, parent, and case, if
            # they're selected. the front end optimizes with these to avoid excess
            # server calls

            # there's an annoying dependency between this logic and backbone's
            # url routing that seems hard to solve well. this needs to be synced
            # with apps.js if anything changes

            # for apps anything with "view/app/" works

            # for cases it will be:
            # "view/:app/:module/:form/case/:case/"

            # if there are parent cases, it will be:
            # "view/:app/:module/:form/parent/:parent/case/:case/

            # could use regex here but this is actually simpler with the potential
            # absence of a trailing slash
            split = urlPath.split('/')
            app_id = split[1] if len(split) >= 2 else None

            if len(split) >= 5 and split[4] == "parent":
                parent_id = split[5]
                case_id = split[7] if len(split) >= 7 else None
            else:
                parent_id = None
                case_id = split[5] if len(split) >= 6 else None

            app = None
            if app_id:
                if app_id in [a['_id'] for a in apps]:
                    app = look_up_app_json(domain, app_id)
                else:
                    messages.info(
                        request,
                        _("That app is no longer valid. Try using the "
                          "navigation links to select an app."))
            if app is None and len(apps) == 1:
                app = look_up_app_json(domain, apps[0]['_id'])

            def _get_case(domain, case_id):
                case = accessor.get_case(case_id)
                assert case.domain == domain, "case %s not in %s" % (case_id,
                                                                     domain)
                return case.to_api_json()

            case = _get_case(domain, case_id) if case_id else None
            if parent_id is None and case is not None:
                parent_id = case.get('indices',
                                     {}).get('parent',
                                             {}).get('case_id', None)
Exemplo n.º 12
0
def get_apps_api(request, domain):
    return json_response(get_cloudcare_apps(domain))
Exemplo n.º 13
0
def get_apps_api(request, domain):
    return json_response(get_cloudcare_apps(domain))
Exemplo n.º 14
0
    def get(self, request, domain, urlPath):
        try:
            preview = string_to_boolean(request.GET.get("preview", "false"))
        except ValueError:
            # this is typically only set at all if it's intended to be true so this
            # is a reasonable default for "something went wrong"
            preview = True

        app_access = ApplicationAccess.get_by_domain(domain)
        accessor = CaseAccessors(domain)

        if not preview:
            apps = get_cloudcare_apps(domain)
            if request.project.use_cloudcare_releases:

                if (toggles.CLOUDCARE_LATEST_BUILD.enabled(domain) or
                        toggles.CLOUDCARE_LATEST_BUILD.enabled(request.couch_user.username)):
                    get_cloudcare_app = get_latest_build_doc
                else:
                    get_cloudcare_app = get_latest_released_app_doc

                apps = map(
                    lambda app: get_cloudcare_app(domain, app['_id']),
                    apps,
                )
                apps = filter(None, apps)
                apps = map(wrap_app, apps)

                # convert to json
                apps = [get_app_json(app) for app in apps]
            else:
                # legacy functionality - use the latest build regardless of stars
                apps = [get_latest_build_doc(domain, app['_id']) for app in apps]
                apps = [get_app_json(ApplicationBase.wrap(app)) for app in apps if app]

        else:
            # big TODO: write a new apps view for Formplayer, can likely cut most out now
            if toggles.USE_FORMPLAYER_FRONTEND.enabled(domain):
                apps = get_cloudcare_apps(domain)
            else:
                apps = get_brief_apps_in_domain(domain)
            apps = [get_app_json(app) for app in apps if app and (
                isinstance(app, RemoteApp) or app.application_version == V2)]
            meta = get_meta(request)
            track_clicked_preview_on_hubspot(request.couch_user, request.COOKIES, meta)

        # trim out empty apps
        apps = filter(lambda app: app, apps)
        apps = filter(lambda app: app_access.user_can_access_app(request.couch_user, app), apps)

        def _default_lang():
            if apps:
                # unfortunately we have to go back to the DB to find this
                return Application.get(apps[0]["_id"]).default_language
            else:
                return "en"

        # default language to user's preference, followed by
        # first app's default, followed by english
        language = request.couch_user.language or _default_lang()

        def _url_context():
            # given a url path, returns potentially the app, parent, and case, if
            # they're selected. the front end optimizes with these to avoid excess
            # server calls

            # there's an annoying dependency between this logic and backbone's
            # url routing that seems hard to solve well. this needs to be synced
            # with apps.js if anything changes

            # for apps anything with "view/app/" works

            # for cases it will be:
            # "view/:app/:module/:form/case/:case/"

            # if there are parent cases, it will be:
            # "view/:app/:module/:form/parent/:parent/case/:case/

            # could use regex here but this is actually simpler with the potential
            # absence of a trailing slash
            split = urlPath.split('/')
            app_id = split[1] if len(split) >= 2 else None

            if len(split) >= 5 and split[4] == "parent":
                parent_id = split[5]
                case_id = split[7] if len(split) >= 7 else None
            else:
                parent_id = None
                case_id = split[5] if len(split) >= 6 else None

            app = None
            if app_id:
                if app_id in [a['_id'] for a in apps]:
                    app = look_up_app_json(domain, app_id)
                else:
                    messages.info(request, _("That app is no longer valid. Try using the "
                                             "navigation links to select an app."))
            if app is None and len(apps) == 1:
                app = look_up_app_json(domain, apps[0]['_id'])

            def _get_case(domain, case_id):
                case = accessor.get_case(case_id)
                assert case.domain == domain, "case %s not in %s" % (case_id, domain)
                return case.to_api_json()

            case = _get_case(domain, case_id) if case_id else None
            if parent_id is None and case is not None:
                parent_id = case.get('indices', {}).get('parent', {}).get('case_id', None)
            parent = _get_case(domain, parent_id) if parent_id else None

            return {
                "app": app,
                "case": case,
                "parent": parent
            }

        context = {
            "domain": domain,
            "language": language,
            "apps": apps,
            "apps_raw": apps,
            "preview": preview,
            "maps_api_key": settings.GMAPS_API_KEY,
            "sessions_enabled": request.couch_user.is_commcare_user(),
            "use_cloudcare_releases": request.project.use_cloudcare_releases,
            "username": request.user.username,
            "formplayer_url": settings.FORMPLAYER_URL,
            'use_sqlite_backend': use_sqlite_backend(domain),
        }
        context.update(_url_context())
        if toggles.USE_FORMPLAYER_FRONTEND.enabled(domain):
            return render(request, "cloudcare/formplayer_home.html", context)
        else:
            return render(request, "cloudcare/cloudcare_home.html", context)
Exemplo n.º 15
0
    def get(self, request, domain, urlPath):
        try:
            preview = string_to_boolean(request.REQUEST.get("preview", "false"))
        except ValueError:
            # this is typically only set at all if it's intended to be true so this
            # is a reasonable default for "something went wrong"
            preview = True

        app_access = ApplicationAccess.get_by_domain(domain)

        if not preview:
            apps = get_cloudcare_apps(domain)
            if request.project.use_cloudcare_releases:
                # replace the apps with the last starred build of each app, removing the ones that aren't starred
                apps = filter(
                    lambda app: app.is_released,
                    [get_app(domain, app['_id'], latest=True) for app in apps]
                )
                # convert to json
                apps = [get_app_json(app) for app in apps]
            else:
                # legacy functionality - use the latest build regardless of stars
                apps = [get_latest_build_doc(domain, app['_id']) for app in apps]
                apps = [get_app_json(ApplicationBase.wrap(app)) for app in apps if app]

        else:
            apps = get_brief_apps_in_domain(domain)
            apps = [get_app_json(app) for app in apps if app and app.application_version == V2]

        # trim out empty apps
        apps = filter(lambda app: app, apps)
        apps = filter(lambda app: app_access.user_can_access_app(request.couch_user, app), apps)

        def _default_lang():
            if apps:
                # unfortunately we have to go back to the DB to find this
                return Application.get(apps[0]["_id"]).build_langs[0]
            else:
                return "en"

        # default language to user's preference, followed by
        # first app's default, followed by english
        language = request.couch_user.language or _default_lang()

        def _url_context():
            # given a url path, returns potentially the app, parent, and case, if
            # they're selected. the front end optimizes with these to avoid excess
            # server calls

            # there's an annoying dependency between this logic and backbone's
            # url routing that seems hard to solve well. this needs to be synced
            # with apps.js if anything changes

            # for apps anything with "view/app/" works

            # for cases it will be:
            # "view/:app/:module/:form/case/:case/"

            # if there are parent cases, it will be:
            # "view/:app/:module/:form/parent/:parent/case/:case/

            # could use regex here but this is actually simpler with the potential
            # absence of a trailing slash
            split = urlPath.split('/')
            app_id = split[1] if len(split) >= 2 else None

            if len(split) >= 5 and split[4] == "parent":
                parent_id = split[5]
                case_id = split[7] if len(split) >= 7 else None
            else:
                parent_id = None
                case_id = split[5] if len(split) >= 6 else None

            app = None
            if app_id:
                if app_id in [a['_id'] for a in apps]:
                    app = look_up_app_json(domain, app_id)
                else:
                    messages.info(request, _("That app is no longer valid. Try using the "
                                             "navigation links to select an app."))
            if app is None and len(apps) == 1:
                app = look_up_app_json(domain, apps[0]['_id'])

            def _get_case(domain, case_id):
                case = CommCareCase.get(case_id)
                assert case.domain == domain, "case %s not in %s" % (case_id, domain)
                return case.get_json()

            case = _get_case(domain, case_id) if case_id else None
            if parent_id is None and case is not None:
                parent_id = case.get('indices', {}).get('parent', {}).get('case_id', None)
            parent = _get_case(domain, parent_id) if parent_id else None

            return {
                "app": app,
                "case": case,
                "parent": parent
            }

        context = {
            "domain": domain,
            "language": language,
            "apps": apps,
            "apps_raw": apps,
            "preview": preview,
            "maps_api_key": settings.GMAPS_API_KEY,
            "offline_enabled": toggles.OFFLINE_CLOUDCARE.enabled(request.user.username),
            "sessions_enabled": request.couch_user.is_commcare_user(),
            "use_cloudcare_releases": request.project.use_cloudcare_releases,
            "username": request.user.username,
        }
        context.update(_url_context())
        return render(request, "cloudcare/cloudcare_home.html", context)