def get_app(config=None): """App factory. :param config: configuration that can override config from `settings.py` :return: a new SuperdeskEve app instance """ if config is None: config = {} config['APP_ABSPATH'] = os.path.abspath(os.path.dirname(__file__)) config['CONTENT_STATE'] = 'state' for key in dir(settings): if key.isupper(): config.setdefault(key, getattr(settings, key)) media_storage = SuperdeskGridFSMediaStorage if config['AMAZON_CONTAINER_NAME']: from superdesk.storage.amazon.amazon_media_storage import AmazonMediaStorage from superdesk.storage.amazon.import_from_amazon import ImportFromAmazonCommand media_storage = AmazonMediaStorage superdesk.command('import:amazon', ImportFromAmazonCommand()) config['DOMAIN'] = {} app = eve.Eve( data=superdesk.SuperdeskDataLayer, auth=TokenAuth, media=media_storage, settings=config, json_encoder=MongoJSONEncoder, validator=SuperdeskValidator) superdesk.app = app custom_loader = jinja2.ChoiceLoader([ app.jinja_loader, jinja2.FileSystemLoader(['superdesk/templates']) ]) app.jinja_loader = custom_loader # cache app.cache = Cache(app, config={'CACHE_TYPE': 'simple'}) app.blog_cache = BlogCache(cache=app.cache) # mail app.mail = Mail(app) @app.errorhandler(SuperdeskError) def client_error_handler(error): """Return json error response. :param error: an instance of :attr:`superdesk.SuperdeskError` class """ return send_response(None, (error.to_dict(), None, None, error.status_code)) @app.errorhandler(500) def server_error_handler(error): """Log server errors.""" app.sentry.captureException() logger.exception(error) return_error = SuperdeskApiError.internalError() return client_error_handler(return_error) init_celery(app) for module_name in app.config['INSTALLED_APPS']: app_module = importlib.import_module(module_name) try: app_module.init_app(app) except AttributeError: pass for resource in superdesk.DOMAIN: app.register_resource(resource, superdesk.DOMAIN[resource]) for blueprint in superdesk.BLUEPRINTS: prefix = app.api_prefix or None app.register_blueprint(blueprint, url_prefix=prefix) # s3 s3.init_app(app) # embed feature app.register_blueprint(embed_blueprint) # we can only put mapping when all resources are registered app.data.elastic.put_mapping(app) app.sentry = sentry sentry.init_app(app) return app
def get_app(config=None, media_storage=None): """App factory. :param config: configuration that can override config from `settings.py` :return: a new SuperdeskEve app instance """ if config is None: config = {} abs_path = os.path.abspath(os.path.dirname(__file__)) config.setdefault('APP_ABSPATH', abs_path) for key in dir(superdesk.factory.settings): if key.isupper(): config.setdefault(key, getattr(superdesk.factory.settings, key)) if media_storage is None: media_storage = SuperdeskGridFSMediaStorage config.setdefault('DOMAIN', {}) app = eve.Eve(data=SuperdeskDataLayer, auth=TokenAuth, media=media_storage, settings=config, json_encoder=MongoJSONEncoder, validator=SuperdeskValidator) superdesk.app = app custom_loader = jinja2.ChoiceLoader([ app.jinja_loader, jinja2.FileSystemLoader([abs_path + '/../templates']) ]) app.jinja_loader = custom_loader app.mail = Mail(app) @app.errorhandler(SuperdeskError) def client_error_handler(error): """Return json error response. :param error: an instance of :attr:`superdesk.SuperdeskError` class """ return send_response(None, (error.to_dict(), None, None, error.status_code)) @app.errorhandler(500) def server_error_handler(error): """Log server errors.""" app.sentry.captureException() superdesk.logger.exception(error) return_error = SuperdeskApiError.internalError() return client_error_handler(return_error) init_celery(app) for module_name in app.config['INSTALLED_APPS']: app_module = importlib.import_module(module_name) try: app_module.init_app(app) except AttributeError: pass for resource in superdesk.DOMAIN: app.register_resource(resource, superdesk.DOMAIN[resource]) for blueprint in superdesk.BLUEPRINTS: prefix = app.api_prefix or None app.register_blueprint(blueprint, url_prefix=prefix) for name, jinja_filter in superdesk.JINJA_FILTERS.items(): app.jinja_env.filters[name] = jinja_filter # we can only put mapping when all resources are registered app.data.elastic.put_mapping(app) app.sentry = sentry sentry.init_app(app) # instantiate registered provider classes (leave non-classes intact) for key, provider in registered_feeding_services.items(): registered_feeding_services[key] = provider() if isinstance( provider, type) else provider return app
def get_app(config=None, media_storage=None, config_object=None): """App factory. :param config: configuration that can override config from `default_settings.py` :param media_storage: media storage class to use :param config_object: config object to load (can be module name, module or an object) :return: a new SuperdeskEve app instance """ abs_path = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) app_config = flask.Config(abs_path) app_config.from_object('superdesk.factory.default_settings') app_config.setdefault('APP_ABSPATH', abs_path) app_config.setdefault('DOMAIN', {}) app_config.setdefault('SOURCES', {}) if config_object: app_config.from_object(config_object) try: app_config.update(config or {}) except TypeError: app_config.from_object(config) if not media_storage and app_config.get('AMAZON_CONTAINER_NAME'): media_storage = AmazonMediaStorage elif not media_storage: media_storage = SuperdeskGridFSMediaStorage app = eve.Eve(data=SuperdeskDataLayer, auth=TokenAuth, media=media_storage, settings=app_config, json_encoder=MongoJSONEncoder, validator=SuperdeskValidator, template_folder=os.path.join(abs_path, 'templates')) superdesk.app = app custom_loader = jinja2.ChoiceLoader([ app.jinja_loader, jinja2.FileSystemLoader([abs_path + '/../templates']) ]) app.jinja_loader = custom_loader app.mail = Mail(app) app.sentry = SuperdeskSentry(app) @app.errorhandler(SuperdeskError) def client_error_handler(error): """Return json error response. :param error: an instance of :attr:`superdesk.SuperdeskError` class """ return send_response(None, (error.to_dict(), None, None, error.status_code)) @app.errorhandler(500) def server_error_handler(error): """Log server errors.""" app.sentry.captureException() superdesk.logger.exception(error) return_error = SuperdeskApiError.internalError() return client_error_handler(return_error) init_celery(app) for module_name in app.config.get('INSTALLED_APPS', []): app_module = importlib.import_module(module_name) try: app_module.init_app(app) except AttributeError: pass for resource in superdesk.DOMAIN: app.register_resource(resource, superdesk.DOMAIN[resource]) for blueprint in superdesk.BLUEPRINTS: prefix = app.api_prefix or None app.register_blueprint(blueprint, url_prefix=prefix) for name, jinja_filter in superdesk.JINJA_FILTERS.items(): app.jinja_env.filters[name] = jinja_filter # we can only put mapping when all resources are registered app.data.init_elastic(app) # instantiate registered provider classes (leave non-classes intact) for key, provider in registered_feeding_services.items(): registered_feeding_services[key] = provider() if isinstance( provider, type) else provider configure_logging(app.config['LOG_CONFIG_FILE']) return app
def get_app(config=None, media_storage=None, config_object=None): """App factory. :param config: configuration that can override config from `default_settings.py` :param media_storage: media storage class to use :param config_object: config object to load (can be module name, module or an object) :return: a new SuperdeskEve app instance """ abs_path = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) app_config = flask.Config(abs_path) app_config.from_object('superdesk.default_settings') app_config.setdefault('APP_ABSPATH', abs_path) app_config.setdefault('DOMAIN', {}) app_config.setdefault('SOURCES', {}) if config_object: app_config.from_object(config_object) try: app_config.update(config or {}) except TypeError: app_config.from_object(config) if not media_storage and app_config.get('AMAZON_CONTAINER_NAME'): media_storage = AmazonMediaStorage elif not media_storage: media_storage = SuperdeskGridFSMediaStorage app = eve.Eve( data=SuperdeskDataLayer, auth=TokenAuth, media=media_storage, settings=app_config, json_encoder=MongoJSONEncoder, validator=SuperdeskValidator, template_folder=os.path.join(abs_path, 'templates')) superdesk.app = app custom_loader = jinja2.ChoiceLoader([ jinja2.FileSystemLoader('templates'), jinja2.FileSystemLoader(os.path.join( os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'templates'))]) app.jinja_loader = custom_loader app.mail = Mail(app) app.sentry = SuperdeskSentry(app) @app.errorhandler(SuperdeskError) def client_error_handler(error): """Return json error response. :param error: an instance of :attr:`superdesk.SuperdeskError` class """ return send_response(None, (error.to_dict(), None, None, error.status_code)) @app.errorhandler(500) def server_error_handler(error): """Log server errors.""" app.sentry.captureException() superdesk.logger.exception(error) return_error = SuperdeskApiError.internalError() return client_error_handler(return_error) init_celery(app) installed = set() def install_app(module_name): if module_name in installed: return installed.add(module_name) app_module = importlib.import_module(module_name) try: app_module.init_app(app) except AttributeError: pass for module_name in app.config.get('INSTALLED_APPS', []): install_app(module_name) for module_name in app.config.get('CORE_APPS', []): install_app(module_name) for resource in superdesk.DOMAIN: app.register_resource(resource, superdesk.DOMAIN[resource]) for blueprint in superdesk.BLUEPRINTS: prefix = app.api_prefix or None app.register_blueprint(blueprint, url_prefix=prefix) for name, jinja_filter in superdesk.JINJA_FILTERS.items(): app.jinja_env.filters[name] = jinja_filter if not app_config.get('SUPERDESK_TESTING', False): # we can only put mapping when all resources are registered app.data.init_elastic(app) # instantiate registered provider classes (leave non-classes intact) for key, provider in registered_feeding_services.items(): registered_feeding_services[key] = provider() if isinstance(provider, type) else provider configure_logging(app.config['LOG_CONFIG_FILE']) return app
def get_app(config=None, media_storage=None, config_object=None, init_elastic=None): """App factory. :param config: configuration that can override config from ``default_settings.py`` :param media_storage: media storage class to use :param config_object: config object to load (can be module name, module or an object) :param init_elastic: obsolete config - kept there for BC :return: a new SuperdeskEve app instance """ abs_path = SUPERDESK_PATH app_config = flask.Config(abs_path) app_config.from_object('superdesk.default_settings') app_config.setdefault('APP_ABSPATH', abs_path) app_config.setdefault('DOMAIN', {}) app_config.setdefault('SOURCES', {}) if config_object: app_config.from_object(config_object) try: app_config.update(config or {}) except TypeError: app_config.from_object(config) if not media_storage and app_config.get('AMAZON_CONTAINER_NAME'): media_storage = AmazonMediaStorage elif not media_storage: media_storage = SuperdeskGridFSMediaStorage app = SuperdeskEve(data=SuperdeskDataLayer, auth=TokenAuth, media=media_storage, settings=app_config, json_encoder=SuperdeskJSONEncoder, validator=SuperdeskValidator, template_folder=os.path.join(abs_path, 'templates')) app.jinja_options = {'autoescape': False} app.json_encoder = SuperdeskJSONEncoder # seems like eve param doesn't set it on flask # init client_config with default config app.client_config = { 'content_expiry_minutes': app.config.get('CONTENT_EXPIRY_MINUTES', 0), 'ingest_expiry_minutes': app.config.get('INGEST_EXPIRY_MINUTES', 0) } superdesk.app = app custom_loader = jinja2.ChoiceLoader([ jinja2.FileSystemLoader('templates'), jinja2.FileSystemLoader(os.path.join(SUPERDESK_PATH, 'templates')), ]) app.jinja_loader = custom_loader app.mail = Mail(app) app.sentry = SuperdeskSentry(app) # setup babel app.config.setdefault('BABEL_TRANSLATION_DIRECTORIES', os.path.join(SUPERDESK_PATH, 'translations')) app.babel_tzinfo = None app.babel_locale = None app.babel_translations = None babel = Babel(app, configure_jinja=False) @babel.localeselector def get_locale(): user = getattr(g, 'user', {}) user_language = user.get('language', app.config.get('DEFAULT_LANGUAGE', 'en')) try: # Attempt to load the local using Babel.parse_local parse_locale(user_language.replace('-', '_')) except ValueError: # If Babel fails to recognise the locale, then use the default language user_language = app.config.get('DEFAULT_LANGUAGE', 'en') return user_language.replace('-', '_') set_error_handlers(app) @app.after_request def after_request(response): # fixing previous media prefixes if defined if app.config['MEDIA_PREFIXES_TO_FIX'] and app.config['MEDIA_PREFIX']: current_prefix = app.config['MEDIA_PREFIX'].rstrip('/').encode() for prefix in app.config['MEDIA_PREFIXES_TO_FIX']: response.data = response.data.replace( prefix.rstrip('/').encode(), current_prefix) return response init_celery(app) installed = set() def install_app(module_name): if module_name in installed: return installed.add(module_name) app_module = importlib.import_module(module_name) if hasattr(app_module, 'init_app'): app_module.init_app(app) for module_name in app.config.get('CORE_APPS', []): install_app(module_name) for module_name in app.config.get('INSTALLED_APPS', []): install_app(module_name) for resource in superdesk.DOMAIN: app.register_resource(resource, superdesk.DOMAIN[resource]) for name, jinja_filter in superdesk.JINJA_FILTERS.items(): app.jinja_env.filters[name] = jinja_filter configure_logging(app.config['LOG_CONFIG_FILE']) return app
def get_app(config=None, media_storage=None, config_object=None, init_elastic=None): """App factory. :param config: configuration that can override config from ``default_settings.py`` :param media_storage: media storage class to use :param config_object: config object to load (can be module name, module or an object) :param init_elastic: obsolete config - kept there for BC :return: a new SuperdeskEve app instance """ abs_path = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) app_config = flask.Config(abs_path) app_config.from_object('superdesk.default_settings') app_config.setdefault('APP_ABSPATH', abs_path) app_config.setdefault('DOMAIN', {}) app_config.setdefault('SOURCES', {}) if config_object: app_config.from_object(config_object) try: app_config.update(config or {}) except TypeError: app_config.from_object(config) if not media_storage and app_config.get('AMAZON_CONTAINER_NAME'): media_storage = AmazonMediaStorage elif not media_storage: media_storage = SuperdeskGridFSMediaStorage app = SuperdeskEve( data=SuperdeskDataLayer, auth=TokenAuth, media=media_storage, settings=app_config, json_encoder=MongoJSONEncoder, validator=SuperdeskValidator, template_folder=os.path.join(abs_path, 'templates')) app.jinja_options = {'autoescape': False} # init client_config with default config app.client_config = { 'content_expiry_minutes': app.config.get('CONTENT_EXPIRY_MINUTES', 0), 'ingest_expiry_minutes': app.config.get('INGEST_EXPIRY_MINUTES', 0) } superdesk.app = app custom_loader = jinja2.ChoiceLoader([ jinja2.FileSystemLoader('templates'), jinja2.FileSystemLoader(os.path.join( os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'templates'))]) app.jinja_loader = custom_loader app.mail = Mail(app) app.sentry = SuperdeskSentry(app) @app.errorhandler(SuperdeskError) def client_error_handler(error): """Return json error response. :param error: an instance of :attr:`superdesk.SuperdeskError` class """ return send_response(None, (error.to_dict(), None, None, error.status_code)) @app.errorhandler(403) def server_forbidden_handler(error): return send_response(None, ({'code': 403, 'error': error.response}, None, None, 403)) @app.errorhandler(500) def server_error_handler(error): """Log server errors.""" return_error = SuperdeskApiError.internalError(error) return client_error_handler(return_error) @app.after_request def after_request(response): # fixing previous media prefixes if defined if app.config['MEDIA_PREFIXES_TO_FIX'] and app.config['MEDIA_PREFIX']: current_prefix = app.config['MEDIA_PREFIX'].rstrip('/').encode() for prefix in app.config['MEDIA_PREFIXES_TO_FIX']: response.data = response.data.replace( prefix.rstrip('/').encode(), current_prefix ) return response init_celery(app) installed = set() def install_app(module_name): if module_name in installed: return installed.add(module_name) app_module = importlib.import_module(module_name) if hasattr(app_module, 'init_app'): app_module.init_app(app) for module_name in app.config.get('CORE_APPS', []): install_app(module_name) for module_name in app.config.get('INSTALLED_APPS', []): install_app(module_name) for resource in superdesk.DOMAIN: app.register_resource(resource, superdesk.DOMAIN[resource]) for name, jinja_filter in superdesk.JINJA_FILTERS.items(): app.jinja_env.filters[name] = jinja_filter # instantiate registered provider classes (leave non-classes intact) for key, provider in registered_feeding_services.items(): registered_feeding_services[key] = provider() if isinstance(provider, type) else provider configure_logging(app.config['LOG_CONFIG_FILE']) return app
def get_app(config=None, media_storage=None): """App factory. :param config: configuration that can override config from `settings.py` :return: a new SuperdeskEve app instance """ if config is None: config = {} abs_path = os.path.abspath(os.path.dirname(__file__)) config.setdefault('APP_ABSPATH', abs_path) for key in dir(superdesk.factory.settings): if key.isupper(): config.setdefault(key, getattr(superdesk.factory.settings, key)) if media_storage is None: media_storage = SuperdeskGridFSMediaStorage config.setdefault('DOMAIN', {}) configure_logging(config) app = eve.Eve( data=SuperdeskDataLayer, auth=TokenAuth, media=media_storage, settings=config, json_encoder=MongoJSONEncoder, validator=SuperdeskValidator) superdesk.app = app custom_loader = jinja2.ChoiceLoader([ app.jinja_loader, jinja2.FileSystemLoader([abs_path + '/../templates']) ]) app.jinja_loader = custom_loader app.mail = Mail(app) @app.errorhandler(SuperdeskError) def client_error_handler(error): """Return json error response. :param error: an instance of :attr:`superdesk.SuperdeskError` class """ return send_response(None, (error.to_dict(), None, None, error.status_code)) @app.errorhandler(500) def server_error_handler(error): """Log server errors.""" app.sentry.captureException() superdesk.logger.exception(error) return_error = SuperdeskApiError.internalError() return client_error_handler(return_error) init_celery(app) for module_name in app.config['INSTALLED_APPS']: app_module = importlib.import_module(module_name) try: app_module.init_app(app) except AttributeError: pass for resource in superdesk.DOMAIN: app.register_resource(resource, superdesk.DOMAIN[resource]) for blueprint in superdesk.BLUEPRINTS: prefix = app.api_prefix or None app.register_blueprint(blueprint, url_prefix=prefix) for name, jinja_filter in superdesk.JINJA_FILTERS.items(): app.jinja_env.filters[name] = jinja_filter # we can only put mapping when all resources are registered app.data.elastic.put_mapping(app) app.sentry = sentry sentry.init_app(app) # instantiate registered provider classes (leave non-classes intact) for key, provider in registered_feeding_services.items(): registered_feeding_services[key] = provider() if isinstance(provider, type) else provider return app
def get_app(config=None): """App factory. :param config: configuration that can override config from `settings.py` :return: a new SuperdeskEve app instance """ if config is None: config = {} for key in dir(settings): if key.isupper(): config.setdefault(key, getattr(settings, key)) media_storage = SuperdeskGridFSMediaStorage if config['AMAZON_CONTAINER_NAME']: from superdesk.storage.amazon.amazon_media_storage import AmazonMediaStorage from superdesk.storage.amazon.import_from_amazon import ImportFromAmazonCommand media_storage = AmazonMediaStorage superdesk.command('import:amazon', ImportFromAmazonCommand()) config['DOMAIN'] = {} app = eve.Eve(data=superdesk.SuperdeskDataLayer, auth=TokenAuth, media=media_storage, settings=config, json_encoder=MongoJSONEncoder, validator=SuperdeskValidator) custom_loader = jinja2.ChoiceLoader( [app.jinja_loader, jinja2.FileSystemLoader(['superdesk/templates'])]) app.jinja_loader = custom_loader app.mail = Mail(app) app.on_fetched_resource += signals.proxy_resource_signal('read', app) app.on_fetched_item += signals.proxy_item_signal('read', app) app.on_inserted += signals.proxy_resource_signal('created', app) @app.errorhandler(superdesk.SuperdeskError) def client_error_handler(error): """Return json error response. :param error: an instance of :attr:`superdesk.SuperdeskError` class """ return send_response(None, (error.to_dict(), None, None, error.status_code)) @app.errorhandler(500) def server_error_handler(error): """Log server errors.""" app.sentry.captureException() logger.exception(error) return_error = superdesk.SuperdeskError(status_code=500) return client_error_handler(return_error) init_celery(app) for module_name in app.config['INSTALLED_APPS']: app_module = importlib.import_module(module_name) try: app_module.init_app(app) except AttributeError: pass for resource in superdesk.DOMAIN: app.register_resource(resource, superdesk.DOMAIN[resource]) for blueprint in superdesk.BLUEPRINTS: prefix = app.api_prefix or None app.register_blueprint(blueprint, url_prefix=prefix) # we can only put mapping when all resources are registered app.data.elastic.put_mapping(app) app.sentry = sentry sentry.init_app(app) superdesk.app = app return app
def get_app(config=None, media_storage=None, config_object=None, init_elastic=True): """App factory. :param config: configuration that can override config from ``default_settings.py`` :param media_storage: media storage class to use :param config_object: config object to load (can be module name, module or an object) :param init_elastic: should it init elastic indexes or not :return: a new SuperdeskEve app instance """ abs_path = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) app_config = flask.Config(abs_path) app_config.from_object('superdesk.default_settings') app_config.setdefault('APP_ABSPATH', abs_path) app_config.setdefault('DOMAIN', {}) app_config.setdefault('SOURCES', {}) if config_object: app_config.from_object(config_object) try: app_config.update(config or {}) except TypeError: app_config.from_object(config) if not media_storage and app_config.get('AMAZON_CONTAINER_NAME'): media_storage = AmazonMediaStorage elif not media_storage: media_storage = SuperdeskGridFSMediaStorage app = SuperdeskEve(data=SuperdeskDataLayer, auth=TokenAuth, media=media_storage, settings=app_config, json_encoder=MongoJSONEncoder, validator=SuperdeskValidator, template_folder=os.path.join(abs_path, 'templates')) app.init_indexes = init_elastic app.jinja_options = {'autoescape': False} superdesk.app = app custom_loader = jinja2.ChoiceLoader([ jinja2.FileSystemLoader('templates'), jinja2.FileSystemLoader( os.path.join( os.path.dirname(os.path.dirname(os.path.realpath(__file__))), 'templates')) ]) app.jinja_loader = custom_loader app.mail = Mail(app) app.sentry = SuperdeskSentry(app) @app.errorhandler(SuperdeskError) def client_error_handler(error): """Return json error response. :param error: an instance of :attr:`superdesk.SuperdeskError` class """ return send_response(None, (error.to_dict(), None, None, error.status_code)) @app.errorhandler(500) def server_error_handler(error): """Log server errors.""" return_error = SuperdeskApiError.internalError(error) return client_error_handler(return_error) init_celery(app) installed = set() def install_app(module_name): if module_name in installed: return installed.add(module_name) app_module = importlib.import_module(module_name) if hasattr(app_module, 'init_app'): app_module.init_app(app) for module_name in app.config.get('CORE_APPS', []): install_app(module_name) for module_name in app.config.get('INSTALLED_APPS', []): install_app(module_name) for resource in superdesk.DOMAIN: app.register_resource(resource, superdesk.DOMAIN[resource]) for name, jinja_filter in superdesk.JINJA_FILTERS.items(): app.jinja_env.filters[name] = jinja_filter if not app_config.get('SUPERDESK_TESTING', False) and init_elastic: # we can only put mapping when all resources are registered app.data.init_elastic(app) # instantiate registered provider classes (leave non-classes intact) for key, provider in registered_feeding_services.items(): registered_feeding_services[key] = provider() if isinstance( provider, type) else provider configure_logging(app.config['LOG_CONFIG_FILE']) return app