Ejemplo n.º 1
0
def get_apps_by_id(domain, app_ids):
    from .models import Application
    from corehq.apps.app_manager.util import get_correct_app_class
    if isinstance(app_ids, str):
        app_ids = [app_ids]
    docs = iter_docs(Application.get_db(), app_ids)
    return [get_correct_app_class(doc).wrap(doc) for doc in docs]
Ejemplo n.º 2
0
    def assertNoMissingXmlnss(self, delete_apps=True):
        submissions = XFormInstance.get_db().view(
            'couchforms/by_xmlns',
            key="undefined",
            include_docs=False,
            reduce=False,
        ).all()
        self.assertEqual(submissions, [])

        saved_apps = Application.get_db().view(
            'app_manager/saved_app',
            include_docs=True,
        )
        apps = [
            get_correct_app_class(row['doc']).wrap(row['doc'])
            for row in saved_apps
        ]
        try:
            for app in apps:
                for form in app.get_forms():
                    self.assertEqual(form.source.count('xmlns="undefined"'), 0)
                    self.assertNotEqual(form.xmlns, 'undefined')
        finally:
            if delete_apps:
                for app in apps:
                    app.delete()
Ejemplo n.º 3
0
def get_pre_migration_copy(app):
    from corehq.apps.app_manager.util import get_correct_app_class

    def date_key(doc):
        return doc.get("built_on") or mindate

    mindate = json_format_datetime(datetime(1980, 1, 1))
    migrate_date = json_format_datetime(ORIGINAL_MIGRATION_DATE)
    skip = 0
    docs = None

    while docs is None or date_key(docs[-1]) > migrate_date:
        docs = saved_apps = [
            row['doc'] for row in Application.get_db().view(
                'app_manager/saved_app',
                startkey=[app.domain, app._id, {}],
                endkey=[app.domain, app._id],
                descending=True,
                skip=skip,
                limit=5,
                include_docs=True,
            )
        ]
        if not docs:
            break
        skip += len(docs)
        docs = sorted(saved_apps, key=date_key, reverse=True)
        for doc in docs:
            if date_key(doc) < migrate_date:
                copy = get_correct_app_class(doc).wrap(doc)
                if copy.version < app.version:
                    return copy
    return None
Ejemplo n.º 4
0
def get_pre_migration_copy(app):
    from corehq.apps.app_manager.util import get_correct_app_class

    def date_key(doc):
        return doc.get("built_on") or mindate

    mindate = json_format_datetime(datetime(1980, 1, 1))
    migrate_date = json_format_datetime(ORIGINAL_MIGRATION_DATE)
    skip = 0
    docs = None

    while docs is None or date_key(docs[-1]) > migrate_date:
        docs = saved_apps = [row['doc'] for row in Application.get_db().view(
            'app_manager/saved_app',
            startkey=[app.domain, app._id, {}],
            endkey=[app.domain, app._id],
            descending=True,
            skip=skip,
            limit=5,
            include_docs=True,
        )]
        if not docs:
            break
        skip += len(docs)
        docs = sorted(saved_apps, key=date_key, reverse=True)
        for doc in docs:
            if date_key(doc) < migrate_date:
                copy = get_correct_app_class(doc).wrap(doc)
                if copy.version < app.version:
                    return copy
    return None
Ejemplo n.º 5
0
def get_apps_by_id(domain, app_ids):
    from .models import Application
    from corehq.apps.app_manager.util import get_correct_app_class
    if isinstance(app_ids, six.string_types):
        app_ids = [app_ids]
    docs = iter_docs(Application.get_db(), app_ids)
    return [get_correct_app_class(doc).wrap(doc) for doc in docs]
Ejemplo n.º 6
0
def get_apps_in_domain(domain, full=False, include_remote=True):
    """
    Returns all apps(not builds) in a domain

    full use applications when true, otherwise applications_brief
    """
    if full:
        view_name = 'app_manager/applications'
        startkey = [domain, None]
        endkey = [domain, None, {}]
    else:
        view_name = 'app_manager/applications_brief'
        startkey = [domain]
        endkey = [domain, {}]

    from .models import Application
    view_results = Application.get_db().view(view_name,
                                             startkey=startkey,
                                             endkey=endkey,
                                             include_docs=True)

    remote_app_filter = None if include_remote else lambda app: not app.is_remote_app(
    )
    wrapped_apps = [
        get_correct_app_class(row['doc']).wrap(row['doc'])
        for row in view_results
    ]
    return filter(remote_app_filter, wrapped_apps)
    def migrate_app(self, app_doc):
        should_save = False
        for module in app_doc.get('modules', []):
            if module.get('search_config'):
                command_label = module['search_config'].get('command_label')
                search_label_label = module['search_config'].get(
                    'search_label', {}).get('label')
                # if there is some value set for old label but nothing has been set for new label yet
                if command_label and not search_label_label:
                    should_save = True
                    module['search_config']['search_label'] = {
                        'label': command_label
                    }

                again_label = module['search_config'].get('again_label')
                search_again_label_label = module['search_config'].get(
                    'search_again_label', {}).get('label')
                # if there is some value set for old label but nothing has been set for new label yet
                if again_label and not search_again_label_label:
                    should_save = True
                    module['search_config']['search_again_label'] = {
                        'label': again_label
                    }

        return get_correct_app_class(app_doc).wrap(
            app_doc) if should_save else None
def get_saved_apps(app):
    saved_apps = Application.get_db().view(
        'app_manager/saved_app',
        startkey=[app.domain, app._id],
        endkey=[app.domain, app._id, {}],
        include_docs=True,
    )
    return [get_correct_app_class(row['doc']).wrap(row['doc']) for row in saved_apps]
Ejemplo n.º 9
0
def get_saved_apps(app):
    saved_apps = Application.get_db().view(
        'app_manager/saved_app',
        startkey=[app.domain, app._id],
        endkey=[app.domain, app._id, {}],
        include_docs=True,
    )
    return [get_correct_app_class(row['doc']).wrap(row['doc']) for row in saved_apps]
Ejemplo n.º 10
0
def get_brief_app(domain, app_id):
    from .models import Application
    from corehq.apps.app_manager.util import get_correct_app_class
    result = Application.get_db().view(
        'app_manager/applications_brief',
        key=[domain, app_id],
    ).one(except_all=True)
    doc = result['value']
    return get_correct_app_class(doc).wrap(doc)
Ejemplo n.º 11
0
def get_brief_app(domain, app_id):
    from .models import Application
    from corehq.apps.app_manager.util import get_correct_app_class
    result = Application.get_db().view(
        'app_manager/applications_brief',
        key=[domain, app_id],
    ).one(except_all=True)
    doc = result['value']
    return get_correct_app_class(doc).wrap(doc)
Ejemplo n.º 12
0
 def _saved_apps():
     from .models import Application
     from corehq.apps.app_manager.util import get_correct_app_class
     saved_app_ids = Application.get_db().view(
         'app_manager/saved_app',
         startkey=[domain],
         endkey=[domain, {}],
         include_docs=False,
         wrapper=lambda row: row['id'],
     )
     correct_wrap = lambda app_doc: get_correct_app_class(app_doc).wrap(app_doc)
     return map(correct_wrap, iter_docs(Application.get_db(), saved_app_ids))
Ejemplo n.º 13
0
 def _saved_apps():
     from .models import Application
     from corehq.apps.app_manager.util import get_correct_app_class
     saved_app_ids = Application.get_db().view(
         'app_manager/saved_app',
         startkey=[domain],
         endkey=[domain, {}],
         include_docs=False,
         wrapper=lambda row: row['id'],
     )
     correct_wrap = lambda app_doc: get_correct_app_class(app_doc).wrap(app_doc)
     return map(correct_wrap, iter_docs(Application.get_db(), saved_app_ids))
Ejemplo n.º 14
0
def get_brief_apps_in_domain(domain, include_remote=True):
    from .models import Application
    from corehq.apps.app_manager.util import get_correct_app_class
    docs = [row['value'] for row in Application.get_db().view(
        'app_manager/applications_brief',
        startkey=[domain],
        endkey=[domain, {}]
    )]
    apps = [get_correct_app_class(doc).wrap(doc) for doc in docs]
    if not include_remote:
        apps = [app for app in apps if not app.is_remote_app()]
    return apps
Ejemplo n.º 15
0
def get_brief_apps_in_domain(domain, include_remote=True):
    from .models import Application
    from corehq.apps.app_manager.util import get_correct_app_class
    docs = [row['value'] for row in Application.get_db().view(
        'app_manager/applications_brief',
        startkey=[domain],
        endkey=[domain, {}]
    )]
    apps = [get_correct_app_class(doc).wrap(doc) for doc in docs]
    if not include_remote:
        apps = [app for app in apps if not app.is_remote_app()]
    return apps
Ejemplo n.º 16
0
def get_app(domain, app_id, wrap_cls=None, latest=False, target=None):
    """
    Utility for getting an app, making sure it's in the domain specified, and wrapping it in the right class
    (Application or RemoteApp).

    """
    from .models import Application
    from corehq.apps.app_manager.util import get_correct_app_class

    if latest:
        try:
            original_app = Application.get_db().get(app_id)
        except ResourceNotFound:
            raise Http404()
        if not domain:
            try:
                domain = original_app['domain']
            except Exception:
                raise Http404()

        if original_app.get('copy_of'):
            parent_app_id = original_app.get('copy_of')
            min_version = original_app['version'] if original_app.get('is_released') else -1
        else:
            parent_app_id = original_app['_id']
            min_version = -1

        if target == 'build':
            app = get_latest_build_doc(domain, parent_app_id)
        else:
            app = get_latest_released_app_doc(domain, parent_app_id, min_version=min_version)

        if not app:
            # If no builds/starred-builds, act as if latest=False
            app = original_app
    else:
        try:
            app = Application.get_db().get(app_id)
        except Exception:
            raise Http404()
    if domain and app['domain'] != domain:
        raise Http404()
    try:
        cls = wrap_cls or get_correct_app_class(app)
    except DocTypeError:
        raise Http404()
    app = cls.wrap(app)
    return app
Ejemplo n.º 17
0
def get_all_apps(domain):
    """
    Returns a list of all the apps ever built and current Applications.
    Used for subscription management when apps use subscription only features
    that shouldn't be present in built apps as well as app definitions.
    """
    from .models import Application
    from corehq.apps.app_manager.util import get_correct_app_class
    saved_apps = Application.get_db().view(
        'app_manager/saved_app',
        startkey=[domain],
        endkey=[domain, {}],
        include_docs=True,
    )
    all_apps = [get_correct_app_class(row['doc']).wrap(row['doc']) for row in saved_apps]
    all_apps.extend(get_apps_in_domain(domain))
    return all_apps
Ejemplo n.º 18
0
def get_all_apps(domain):
    """
    Returns a list of all the apps ever built and current Applications.
    Used for subscription management when apps use subscription only features
    that shouldn't be present in built apps as well as app definitions.
    """
    from .models import Application
    from corehq.apps.app_manager.util import get_correct_app_class
    saved_apps = Application.get_db().view(
        'app_manager/saved_app',
        startkey=[domain],
        endkey=[domain, {}],
        include_docs=True,
    )
    all_apps = [get_correct_app_class(row['doc']).wrap(row['doc']) for row in saved_apps]
    all_apps.extend(get_apps_in_domain(domain))
    return all_apps
    def migrate_app(self, app_doc):
        default = "count(instance('casedb')/casedb/case[@case_id=instance('commcaresession')/session/data/case_id]) = 0"
        prefix = f"({default}) and ("
        should_save = False

        for module in app_doc.get('modules', []):
            if module.get('search_config'):
                relevant = module['search_config'].get('relevant')
                properties = module['search_config'].get('properties')
                default_properties = module['search_config'].get('default_properties')
                if relevant and (properties or default_properties):
                    should_save = True
                    if relevant == default:
                        module['search_config']['default_relevant'] = True
                        module['search_config']['additional_relevant'] = ""
                    elif relevant.startswith(prefix):
                        module['search_config']['default_relevant'] = True
                        module['search_config']['additional_relevant'] = relevant[len(prefix):-1]
                    else:
                        module['search_config']['default_relevant'] = False
                        module['search_config']['additional_relevant'] = relevant
        return get_correct_app_class(app_doc).wrap(app_doc) if should_save else None
    def assertNoMissingXmlnss(self, delete_apps=True):
        submissions = XFormInstance.get_db().view(
            'couchforms/by_xmlns',
            key="undefined",
            include_docs=False,
            reduce=False,
        ).all()
        self.assertEqual(submissions, [])

        saved_apps = Application.get_db().view(
            'app_manager/saved_app',
            include_docs=True,
        )
        apps = [get_correct_app_class(row['doc']).wrap(row['doc']) for row in saved_apps]
        try:
            for app in apps:
                for form in app.get_forms():
                    self.assertEqual(form.source.count('xmlns="undefined"'), 0)
                    self.assertNotEqual(form.xmlns, 'undefined')
        finally:
            if delete_apps:
                for app in apps:
                    app.delete()
Ejemplo n.º 21
0
def get_apps_in_domain(domain, full=False, include_remote=True):
    """
    Returns all apps(not builds) in a domain

    full use applications when true, otherwise applications_brief
    """
    if full:
        view_name = 'app_manager/applications'
        startkey = [domain, None]
        endkey = [domain, None, {}]
    else:
        view_name = 'app_manager/applications_brief'
        startkey = [domain]
        endkey = [domain, {}]

    from .models import Application
    view_results = Application.get_db().view(view_name,
        startkey=startkey,
        endkey=endkey,
        include_docs=True)

    remote_app_filter = None if include_remote else lambda app: not app.is_remote_app()
    wrapped_apps = [get_correct_app_class(row['doc']).wrap(row['doc']) for row in view_results]
    return filter(remote_app_filter, wrapped_apps)
Ejemplo n.º 22
0
def wrap_app(app_doc, wrap_cls=None):
    """Will raise DocTypeError if it can't figure out the correct class"""
    from corehq.apps.app_manager.util import get_correct_app_class
    cls = wrap_cls or get_correct_app_class(app_doc)
    return cls.wrap(app_doc)
Ejemplo n.º 23
0
def transform_app_for_es(doc_dict):
    # perform any lazy migrations
    doc = get_correct_app_class(doc_dict).wrap(doc_dict)
    return doc.to_json()
Ejemplo n.º 24
0
 def wrap_application(a):
     return get_correct_app_class(a['doc']).wrap(a['doc'])
Ejemplo n.º 25
0
def transform_app_for_es(doc_dict):
    # perform any lazy migrations
    doc = get_correct_app_class(doc_dict).wrap(doc_dict)
    doc['@indexed_on'] = json_format_datetime(datetime.utcnow())
    return doc.to_json()
Ejemplo n.º 26
0
def get_app(domain, app_id, wrap_cls=None, latest=False, target=None):
    """
    Utility for getting an app, making sure it's in the domain specified, and wrapping it in the right class
    (Application or RemoteApp).

    """
    from .models import Application

    if latest:
        try:
            original_app = Application.get_db().get(app_id)
        except ResourceNotFound:
            raise Http404()
        if not domain:
            try:
                domain = original_app['domain']
            except Exception:
                raise Http404()

        if original_app.get('copy_of'):
            parent_app_id = original_app.get('copy_of')
            min_version = original_app['version'] if original_app.get('is_released') else -1
        else:
            parent_app_id = original_app['_id']
            min_version = -1

        if target == 'build':
            # get latest-build regardless of star
            couch_view = 'app_manager/saved_app'
            startkey = [domain, parent_app_id, {}]
            endkey = [domain, parent_app_id]
        else:
            # get latest starred-build
            couch_view = 'app_manager/applications'
            startkey = ['^ReleasedApplications', domain, parent_app_id, {}]
            endkey = ['^ReleasedApplications', domain, parent_app_id, min_version]

        latest_app = Application.get_db().view(
            couch_view,
            startkey=startkey,
            endkey=endkey,
            limit=1,
            descending=True,
            include_docs=True
        ).one()

        try:
            app = latest_app['doc']
        except TypeError:
            # If no builds/starred-builds, return act as if latest=False
            app = original_app
    else:
        try:
            app = get_db().get(app_id)
        except Exception:
            raise Http404()
    if domain and app['domain'] != domain:
        raise Http404()
    try:
        cls = wrap_cls or get_correct_app_class(app)
    except DocTypeError:
        raise Http404()
    app = cls.wrap(app)
    return app
Ejemplo n.º 27
0
 def wrap_application(a):
     return get_correct_app_class(a['doc']).wrap(a['doc'])
Ejemplo n.º 28
0
def transform_app_for_es(doc_dict):
    # perform any lazy migrations
    doc = get_correct_app_class(doc_dict).wrap(doc_dict)
    return doc.to_json()
Ejemplo n.º 29
0
def wrap_app(app_doc, wrap_cls=None):
    """Will raise DocTypeError if it can't figure out the correct class"""
    from corehq.apps.app_manager.util import get_correct_app_class
    cls = wrap_cls or get_correct_app_class(app_doc)
    return cls.wrap(app_doc)
Ejemplo n.º 30
0
def get_app(domain, app_id, wrap_cls=None, latest=False, target=None):
    """
    Utility for getting an app, making sure it's in the domain specified, and wrapping it in the right class
    (Application or RemoteApp).

    """

    if latest:
        try:
            original_app = get_db().get(app_id)
        except ResourceNotFound:
            raise Http404()
        if not domain:
            try:
                domain = original_app['domain']
            except Exception:
                raise Http404()

        if original_app.get('copy_of'):
            parent_app_id = original_app.get('copy_of')
            min_version = original_app['version'] if original_app.get(
                'is_released') else -1
        else:
            parent_app_id = original_app['_id']
            min_version = -1

        if target == 'build':
            # get latest-build regardless of star
            couch_view = 'app_manager/saved_app'
            startkey = [domain, parent_app_id, {}]
            endkey = [domain, parent_app_id]
        else:
            # get latest starred-build
            couch_view = 'app_manager/applications'
            startkey = ['^ReleasedApplications', domain, parent_app_id, {}]
            endkey = [
                '^ReleasedApplications', domain, parent_app_id, min_version
            ]

        latest_app = get_db().view(couch_view,
                                   startkey=startkey,
                                   endkey=endkey,
                                   limit=1,
                                   descending=True,
                                   include_docs=True).one()

        try:
            app = latest_app['doc']
        except TypeError:
            # If no builds/starred-builds, return act as if latest=False
            app = original_app
    else:
        try:
            app = get_db().get(app_id)
        except Exception:
            raise Http404()
    if domain and app['domain'] != domain:
        raise Http404()
    try:
        cls = wrap_cls or get_correct_app_class(app)
    except DocTypeError:
        raise Http404()
    app = cls.wrap(app)
    return app
Ejemplo n.º 31
0
 def change_transform(self, doc_dict):
     # perform any lazy migrations
     doc = get_correct_app_class(doc_dict).wrap(doc_dict)
     return doc.to_json()