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]
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()
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
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
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]
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]
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)
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))
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
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
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()
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 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)
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()
def wrap_application(a): return get_correct_app_class(a['doc']).wrap(a['doc'])
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()
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
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
def change_transform(self, doc_dict): # perform any lazy migrations doc = get_correct_app_class(doc_dict).wrap(doc_dict) return doc.to_json()