コード例 #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]
コード例 #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()
コード例 #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
コード例 #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
コード例 #5
0
ファイル: dbaccessors.py プロジェクト: kkrampa/commcare-hq
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]
コード例 #6
0
ファイル: dbaccessors.py プロジェクト: ekush/commcare-hq
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)
コード例 #7
0
    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
コード例 #8
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]
コード例 #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]
コード例 #10
0
ファイル: dbaccessors.py プロジェクト: dimagi/commcare-hq
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)
コード例 #11
0
ファイル: dbaccessors.py プロジェクト: lskdev/commcare-hq
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)
コード例 #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))
コード例 #13
0
ファイル: dbaccessors.py プロジェクト: dimagi/commcare-hq
 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))
コード例 #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
コード例 #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
コード例 #16
0
ファイル: dbaccessors.py プロジェクト: bazuzi/commcare-hq
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
コード例 #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
コード例 #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
コード例 #19
0
    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
コード例 #20
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()
コード例 #21
0
ファイル: dbaccessors.py プロジェクト: nnestle/commcare-hq
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)
コード例 #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)
コード例 #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()
コード例 #24
0
ファイル: models.py プロジェクト: kkrampa/commcare-hq
 def wrap_application(a):
     return get_correct_app_class(a['doc']).wrap(a['doc'])
コード例 #25
0
ファイル: application.py プロジェクト: ye-man/commcare-hq
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()
コード例 #26
0
ファイル: dbaccessors.py プロジェクト: nnestle/commcare-hq
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
コード例 #27
0
 def wrap_application(a):
     return get_correct_app_class(a['doc']).wrap(a['doc'])
コード例 #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()
コード例 #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)
コード例 #30
0
ファイル: dbaccessors.py プロジェクト: ekush/commcare-hq
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
コード例 #31
0
ファイル: application.py プロジェクト: saketkanth/commcare-hq
 def change_transform(self, doc_dict):
     # perform any lazy migrations
     doc = get_correct_app_class(doc_dict).wrap(doc_dict)
     return doc.to_json()