def get_app(config=None): """ App factory. :param dict config: configuration that can override config from `settings.py` :return: a new SuperdeskEve app instance """ app_config = flask.Config(".") # get content api default conf app_config.from_object("content_api.app.settings") # set some required fields app_config.update({"DOMAIN": {"upload": {}}, "SOURCES": {}}) try: # override from settings module, but only things defined in default config import settings as server_settings for key in dir(server_settings): if key.isupper() and key in app_config: app_config[key] = getattr(server_settings, key) except ImportError: pass # if exists if config: app_config.update(config) media_storage = SuperdeskGridFSMediaStorage if app_config.get("AMAZON_CONTAINER_NAME"): from superdesk.storage import AmazonMediaStorage media_storage = AmazonMediaStorage app = Eve( auth=SubscriberTokenAuth, settings=app_config, data=SuperdeskDataLayer, media=media_storage, json_encoder=MongoJSONEncoder, validator=SuperdeskValidator, ) app.notification_client = None set_error_handlers(app) for module_name in app.config.get("CONTENTAPI_INSTALLED_APPS", []): app_module = importlib.import_module(module_name) try: app_module.init_app(app) except AttributeError: pass app.sentry = SuperdeskSentry(app) return app
def get_app(config=None): """ App factory. :param dict config: configuration that can override config from `settings.py` :return: a new SuperdeskEve app instance """ app_config = flask.Config('.') # default config app_config.from_object('prod_api.app.settings') # https://docs.python-eve.org/en/stable/config.html#domain-configuration app_config.update({'DOMAIN': {'upload': {}}}) # override from instance settings module, but only things defined in default config try: import settings as server_settings for key in dir(server_settings): if key.isupper() and key in app_config: app_config[key] = getattr(server_settings, key) except ImportError: pass if config: app_config.update(config) # media storage media_storage = SuperdeskGridFSMediaStorage if app_config.get('AMAZON_CONTAINER_NAME'): from superdesk.storage import AmazonMediaStorage media_storage = AmazonMediaStorage app = Eve( settings=app_config, data=SuperdeskDataLayer, media=media_storage, json_encoder=MongoJSONEncoder, validator=SuperdeskValidator ) set_error_handlers(app) for module_name in app.config.get('PRODAPI_INSTALLED_APPS', []): app_module = importlib.import_module(module_name) try: init_app = app_module.init_app except AttributeError: pass else: init_app(app) app.sentry = SuperdeskSentry(app) 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 test_sentry_not_configured(self): app = flask.Flask(__name__) sentry = SuperdeskSentry(app) self.assertIsNone(sentry.captureMessage("test")) self.assertIsNone(sentry.captureException())
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 test_sentry_not_configured(self): app = flask.Flask(__name__) sentry = SuperdeskSentry(app) self.assertIsNone(sentry.captureMessage('test')) self.assertIsNone(sentry.captureException())
def get_app(config=None): """ App factory. :param dict config: configuration that can override config from `settings.py` :return: a new SuperdeskEve app instance """ app_config = flask.Config(".") # default config app_config.from_object("prod_api.app.settings") # https://docs.python-eve.org/en/stable/config.html#domain-configuration app_config.update({"DOMAIN": {"upload": {}}}) # override from instance settings module, but only things defined in default config try: import settings as server_settings # type: ignore for key in dir(server_settings): if key.isupper() and key in app_config: app_config[key] = getattr(server_settings, key) except ImportError: pass if config: app_config.update(config) # media storage media_storage = get_media_storage_class(app_config) # auth auth = None if app_config["PRODAPI_AUTH_ENABLED"]: auth = JWTAuth app = Eve( auth=auth, settings=app_config, data=SuperdeskDataLayer, media=media_storage, json_encoder=MongoJSONEncoder, validator=SuperdeskValidator, ) app.notification_client = None set_error_handlers(app) for module_name in app.config.get("PRODAPI_INSTALLED_APPS", []): app_module = importlib.import_module(module_name) try: init_app = app_module.init_app except AttributeError: pass else: init_app(app) app.sentry = SuperdeskSentry(app) 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, 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