def init_test_db(force=False): """Same as `init_db` command, but creates a database that will be used to run tests. `TEST_SQLALCHEMY_DATABASE_URI` must be defined in the config file. """ if force: exit_code = _run_psql('drop_test_db.sql') if exit_code != 0: raise Exception( 'Failed to drop existing database and user! Exit code: %i' % exit_code) print('Creating database and user for testing...') exit_code = _run_psql('create_test_db.sql') if exit_code != 0: raise Exception( 'Failed to create new database and user! Exit code: %i' % exit_code) exit_code = _run_psql('create_extensions.sql', 'meb_test') if exit_code != 0: raise Exception('Failed to create database extensions! Exit code: %i' % exit_code) db.init_db_engine(config.TEST_SQLALCHEMY_DATABASE_URI) db.run_sql_script(os.path.join(ADMIN_SQL_DIR, 'create_types.sql')) db.run_sql_script(os.path.join(ADMIN_SQL_DIR, 'create_tables.sql')) db.run_sql_script(os.path.join(ADMIN_SQL_DIR, 'create_primary_keys.sql')) db.run_sql_script(os.path.join(ADMIN_SQL_DIR, 'create_foreign_keys.sql')) db.run_sql_script(os.path.join(ADMIN_SQL_DIR, 'create_indexes.sql')) print("Done!")
def create_app(self): app = create_app(config_path=os.path.join( os.path.dirname(os.path.realpath(__file__)), 'test_config.py' )) db.init_db_engine(app.config['SQLALCHEMY_DATABASE_URI']) return app
def init_db(force): if force: exit_code = _run_psql('drop_db.sql') if exit_code != 0: raise Exception('Failed to drop existing database and user! Exit code: %i' % exit_code) print('Creating user and a database...') exit_code = _run_psql('create_db.sql') if exit_code != 0: raise Exception('Failed to create new database and user! Exit code: %i' % exit_code) print('Creating database extensions...') exit_code = _run_psql('create_extensions.sql', 'metabrainz') if exit_code != 0: raise Exception('Failed to create database extensions! Exit code: %i' % exit_code) db.init_db_engine(application.config["SQLALCHEMY_DATABASE_URI"]) print('Creating types...') db.run_sql_script(os.path.join(ADMIN_SQL_DIR, 'create_types.sql')) print('Creating tables...') db.run_sql_script(os.path.join(ADMIN_SQL_DIR, 'create_tables.sql')) print('Creating primary and foreign keys...') db.run_sql_script(os.path.join(ADMIN_SQL_DIR, 'create_primary_keys.sql')) db.run_sql_script(os.path.join(ADMIN_SQL_DIR, 'create_foreign_keys.sql')) print('Creating indexes...') db.run_sql_script(os.path.join(ADMIN_SQL_DIR, 'create_indexes.sql')) print("Done!")
def init_test_db(force=False): """Same as `init_db` command, but creates a database that will be used to run tests. `TEST_SQLALCHEMY_DATABASE_URI` must be defined in the config file. """ if force: exit_code = _run_psql('drop_test_db.sql') if exit_code != 0: raise Exception('Failed to drop existing database and user! Exit code: %i' % exit_code) print('Creating database and user for testing...') exit_code = _run_psql('create_test_db.sql') if exit_code != 0: raise Exception('Failed to create new database and user! Exit code: %i' % exit_code) exit_code = _run_psql('create_extensions.sql', 'meb_test') if exit_code != 0: raise Exception('Failed to create database extensions! Exit code: %i' % exit_code) db.init_db_engine(config.TEST_SQLALCHEMY_DATABASE_URI) db.run_sql_script(os.path.join(ADMIN_SQL_DIR, 'create_types.sql')) db.run_sql_script(os.path.join(ADMIN_SQL_DIR, 'create_tables.sql')) db.run_sql_script(os.path.join(ADMIN_SQL_DIR, 'create_primary_keys.sql')) db.run_sql_script(os.path.join(ADMIN_SQL_DIR, 'create_foreign_keys.sql')) db.run_sql_script(os.path.join(ADMIN_SQL_DIR, 'create_indexes.sql')) print("Done!")
def init_db(force): if force: exit_code = _run_psql('drop_db.sql') if exit_code != 0: raise Exception('Failed to drop existing database and user! Exit code: %i' % exit_code) print('Creating user and a database...') exit_code = _run_psql('create_db.sql') if exit_code != 0: raise Exception('Failed to create new database and user! Exit code: %i' % exit_code) print('Creating database extensions...') exit_code = _run_psql('create_extensions.sql', 'metabrainz') if exit_code != 0: raise Exception('Failed to create database extensions! Exit code: %i' % exit_code) db.init_db_engine(config.SQLALCHEMY_DATABASE_URI) print('Creating types...') db.run_sql_script(os.path.join(ADMIN_SQL_DIR, 'create_types.sql')) print('Creating tables...') db.run_sql_script(os.path.join(ADMIN_SQL_DIR, 'create_tables.sql')) print('Creating primary and foreign keys...') db.run_sql_script(os.path.join(ADMIN_SQL_DIR, 'create_primary_keys.sql')) db.run_sql_script(os.path.join(ADMIN_SQL_DIR, 'create_foreign_keys.sql')) print('Creating indexes...') db.run_sql_script(os.path.join(ADMIN_SQL_DIR, 'create_indexes.sql')) print("Done!")
def create_app(self): app = create_app() app.config['TESTING'] = True app.config['DEBUG_TB_INTERCEPT_REDIRECTS'] = False # otherwise redirects aren't going to return right status app.config['SQLALCHEMY_DATABASE_URI'] = app.config['TEST_SQLALCHEMY_DATABASE_URI'] db.init_db_engine(app.config['TEST_SQLALCHEMY_DATABASE_URI']) return app
def create_app(self): app = create_app() app.config['TESTING'] = True app.config[ 'DEBUG_TB_INTERCEPT_REDIRECTS'] = False # otherwise redirects aren't going to return right status app.config['SQLALCHEMY_DATABASE_URI'] = app.config[ 'TEST_SQLALCHEMY_DATABASE_URI'] db.init_db_engine(app.config['TEST_SQLALCHEMY_DATABASE_URI']) return app
def init_db(force=False, create_db=False): db_uri = application.config["SQLALCHEMY_DATABASE_URI"] if force: click.echo('Dropping existing database... ', nl=False) exit_code = _run_psql('drop_db.sql', db_uri) if exit_code != 0: raise Exception('Failed to drop existing database and user! Exit code: %i' % exit_code) click.echo('Done.') if create_db: click.echo('Creating user and a database... ', nl=False) exit_code = _run_psql('create_db.sql', db_uri) if exit_code != 0: raise Exception('Failed to create new database and user! Exit code: %i' % exit_code) click.echo('Done.') click.echo('Creating database extensions... ', nl=False) exit_code = _run_psql('create_extensions.sql', db_uri, database='metabrainz') if exit_code != 0: raise Exception('Failed to create database extensions! Exit code: %i' % exit_code) click.echo('Done.') db.init_db_engine(db_uri) click.echo('Creating types... ', nl=False) db.run_sql_script(os.path.join(ADMIN_SQL_DIR, 'create_types.sql')) click.echo('Done.') click.echo('Creating tables... ', nl=False) db.run_sql_script(os.path.join(ADMIN_SQL_DIR, 'create_tables.sql')) click.echo('Done.') click.echo('Creating primary and foreign keys... ', nl=False) db.run_sql_script(os.path.join(ADMIN_SQL_DIR, 'create_primary_keys.sql')) db.run_sql_script(os.path.join(ADMIN_SQL_DIR, 'create_foreign_keys.sql')) click.echo('Done.') click.echo('Creating indexes... ', nl=False) db.run_sql_script(os.path.join(ADMIN_SQL_DIR, 'create_indexes.sql')) click.echo('Done.') click.echo("Database has been initialized successfully!")
def create_app(): app = Flask(__name__) # Configuration app.config.from_object('metabrainz.default_config') app.config.from_object('metabrainz.config') # Logging from metabrainz import loggers loggers.init_loggers(app) if app.debug: # Debug toolbar from flask_debugtoolbar import DebugToolbarExtension DebugToolbarExtension(app) app.config['DEBUG_TB_TEMPLATE_EDITOR_ENABLED'] = True # Database from metabrainz import db db.init_db_engine(app.config["SQLALCHEMY_DATABASE_URI"]) from metabrainz import model model.db.init_app(app) # Memcached if 'MEMCACHED_SERVERS' in app.config: from metabrainz import cache cache.init(app.config['MEMCACHED_SERVERS'], app.config['MEMCACHED_NAMESPACE'], debug=1 if app.debug else 0) # MusicBrainz OAuth from metabrainz.users import login_manager, musicbrainz_login login_manager.init_app(app) musicbrainz_login.init( app.config['MUSICBRAINZ_BASE_URL'], app.config['MUSICBRAINZ_CLIENT_ID'], app.config['MUSICBRAINZ_CLIENT_SECRET'] ) # Templates from metabrainz.utils import reformat_datetime app.jinja_env.filters['datetime'] = reformat_datetime app.jinja_env.filters['nl2br'] = lambda val: val.replace('\n', '<br />') if val else '' # Error handling from metabrainz.errors import init_error_handlers init_error_handlers(app) add_robots(app) # Blueprints _register_blueprints(app) # ADMIN SECTION from flask_admin import Admin from metabrainz.admin.views import HomeView admin = Admin(app, index_view=HomeView(name='Pending users')) # Models from metabrainz.model.user import UserAdminView from metabrainz.model.payment import PaymentAdminView from metabrainz.model.tier import TierAdminView admin.add_view(UserAdminView(model.db.session, category='Users', endpoint="user_model")) admin.add_view(PaymentAdminView(model.db.session, endpoint="donation_model")) admin.add_view(TierAdminView(model.db.session, endpoint="tier_model")) # Custom stuff from metabrainz.admin.views import CommercialUsersView from metabrainz.admin.views import UsersView from metabrainz.admin.views import TokensView from metabrainz.admin.views import StatsView admin.add_view(CommercialUsersView(name='Commercial users', category='Users')) admin.add_view(UsersView(name='Search', category='Users')) admin.add_view(TokensView(name='Access tokens', category='Users')) admin.add_view(StatsView(name='Statistics')) return app
def create_app(debug=None, config_path=None): app = CustomFlask( import_name=__name__, use_flask_uuid=True, ) print("Starting metabrainz service with %s environment." % deploy_env) # Now load other bits of configuration print("loading %s" % os.path.join(os.path.dirname(os.path.realpath(__file__)), '..', 'default_config.py')) app.config.from_pyfile( os.path.join(os.path.dirname(os.path.realpath(__file__)), '..', 'default_config.py')) print("loading %s" % os.path.join( os.path.dirname(os.path.realpath(__file__)), '..', 'custom_config.py')) app.config.from_pyfile(os.path.join( os.path.dirname(os.path.realpath(__file__)), '..', 'custom_config.py'), silent=True) if config_path: print("loading custom %s" % config_path) app.config.from_pyfile(config_path) # Load configuration files: If we're running under a docker deployment, wait until # the consul configuration is available. if deploy_env: consul_config = os.path.join( os.path.dirname(os.path.realpath(__file__)), '..', 'consul_config.py') print("loading consul %s" % consul_config) for i in range(CONSUL_CONFIG_FILE_RETRY_COUNT): if not os.path.exists(consul_config): sleep(1) if not os.path.exists(consul_config): print( "No configuration file generated yet. Retried %d times, exiting." % CONSUL_CONFIG_FILE_RETRY_COUNT) sys.exit(-1) app.config.from_pyfile(consul_config, silent=True) if debug is not None: app.debug = debug if app.debug and app.config['SECRET_KEY']: app.init_debug_toolbar() # Printing out some debug values such as config and git commit try: with open(".git-version") as f: git_version = f.read() print('Running on git commit %s' % git_version.strip()) except IOError: print( "Unable to retrieve git commit. Use docker/push.sh to push images for production." ) print('Configuration values are as follows: ') print(pprint.pformat(app.config, indent=4)) app.init_loggers( file_config=app.config.get('LOG_FILE'), email_config=app.config.get('LOG_EMAIL'), sentry_config=app.config.get('LOG_SENTRY'), ) # Database from metabrainz import db db.init_db_engine(app.config["SQLALCHEMY_DATABASE_URI"]) from metabrainz import model model.db.init_app(app) # Redis (cache) from brainzutils import cache cache.init(**app.config['REDIS']) # MusicBrainz OAuth from metabrainz.users import login_manager, musicbrainz_login login_manager.init_app(app) musicbrainz_login.init(app.config['MUSICBRAINZ_BASE_URL'], app.config['MUSICBRAINZ_CLIENT_ID'], app.config['MUSICBRAINZ_CLIENT_SECRET']) # Templates from metabrainz.utils import reformat_datetime app.jinja_env.filters['datetime'] = reformat_datetime app.jinja_env.filters['nl2br'] = lambda val: val.replace('\n', '<br />' ) if val else '' # Error handling from metabrainz.errors import init_error_handlers init_error_handlers(app) add_robots(app) from metabrainz import babel babel.init_app(app) from flask_uploads import configure_uploads from metabrainz.admin.forms import LOGO_UPLOAD_SET configure_uploads(app, upload_sets=[ LOGO_UPLOAD_SET, ]) # Blueprints _register_blueprints(app) # ADMIN SECTION from flask_admin import Admin from metabrainz.admin.views import HomeView admin = Admin(app, index_view=HomeView(name='Pending users'), template_mode='bootstrap3') # Models from metabrainz.model.user import UserAdminView from metabrainz.model.payment import PaymentAdminView from metabrainz.model.tier import TierAdminView admin.add_view( UserAdminView(model.db.session, category='Users', endpoint="user_model")) admin.add_view( PaymentAdminView(model.db.session, category='Payments', endpoint="payment_model")) admin.add_view(TierAdminView(model.db.session, endpoint="tier_model")) # Custom stuff from metabrainz.admin.views import CommercialUsersView from metabrainz.admin.views import UsersView from metabrainz.admin.views import PaymentsView from metabrainz.admin.views import TokensView from metabrainz.admin.views import StatsView admin.add_view( CommercialUsersView(name='Commercial users', category='Users')) admin.add_view(UsersView(name='Search', category='Users')) admin.add_view(PaymentsView(name='All', category='Payments')) admin.add_view(TokensView(name='Access tokens', category='Users')) admin.add_view(StatsView(name='Statistics')) return app
def create_app(config_path=None): app = CustomFlask( import_name=__name__, use_flask_uuid=True, use_debug_toolbar=True, ) # Configuration files app.config.from_pyfile( os.path.join(os.path.dirname(os.path.realpath(__file__)), '..', 'default_config.py')) app.config.from_pyfile(os.path.join( os.path.dirname(os.path.realpath(__file__)), '..', 'consul_config.py'), silent=True) app.config.from_pyfile(os.path.join( os.path.dirname(os.path.realpath(__file__)), '..', 'custom_config.py'), silent=True) if config_path: app.config.from_pyfile(config_path) app.init_loggers( file_config=app.config.get('LOG_FILE'), email_config=app.config.get('LOG_EMAIL'), sentry_config=app.config.get('LOG_SENTRY'), ) # Database from metabrainz import db db.init_db_engine(app.config["SQLALCHEMY_DATABASE_URI"]) from metabrainz import model model.db.init_app(app) # Redis (cache) from brainzutils import cache cache.init(**app.config['REDIS']) # MusicBrainz OAuth from metabrainz.users import login_manager, musicbrainz_login login_manager.init_app(app) musicbrainz_login.init(app.config['MUSICBRAINZ_BASE_URL'], app.config['MUSICBRAINZ_CLIENT_ID'], app.config['MUSICBRAINZ_CLIENT_SECRET']) # Templates from metabrainz.utils import reformat_datetime app.jinja_env.filters['datetime'] = reformat_datetime app.jinja_env.filters['nl2br'] = lambda val: val.replace('\n', '<br />' ) if val else '' # Error handling from metabrainz.errors import init_error_handlers init_error_handlers(app) add_robots(app) from metabrainz import babel babel.init_app(app) from flask_uploads import configure_uploads from metabrainz.admin.forms import LOGO_UPLOAD_SET configure_uploads(app, upload_sets=[ LOGO_UPLOAD_SET, ]) # Blueprints _register_blueprints(app) # ADMIN SECTION from flask_admin import Admin from metabrainz.admin.views import HomeView admin = Admin(app, index_view=HomeView(name='Pending users'), template_mode='bootstrap3') # Models from metabrainz.model.user import UserAdminView from metabrainz.model.payment import PaymentAdminView from metabrainz.model.tier import TierAdminView admin.add_view( UserAdminView(model.db.session, category='Users', endpoint="user_model")) admin.add_view( PaymentAdminView(model.db.session, category='Payments', endpoint="payment_model")) admin.add_view(TierAdminView(model.db.session, endpoint="tier_model")) # Custom stuff from metabrainz.admin.views import CommercialUsersView from metabrainz.admin.views import UsersView from metabrainz.admin.views import PaymentsView from metabrainz.admin.views import TokensView from metabrainz.admin.views import StatsView admin.add_view( CommercialUsersView(name='Commercial users', category='Users')) admin.add_view(UsersView(name='Search', category='Users')) admin.add_view(PaymentsView(name='All', category='Payments')) admin.add_view(TokensView(name='Access tokens', category='Users')) admin.add_view(StatsView(name='Statistics')) return app
def create_app(): app = Flask(__name__) # Configuration app.config.from_object('metabrainz.default_config') app.config.from_object('metabrainz.config') # Logging from metabrainz import loggers loggers.init_loggers(app) if app.debug: # Debug toolbar from flask_debugtoolbar import DebugToolbarExtension DebugToolbarExtension(app) app.config['DEBUG_TB_TEMPLATE_EDITOR_ENABLED'] = True # Database from metabrainz import db db.init_db_engine(app.config["SQLALCHEMY_DATABASE_URI"]) from metabrainz import model model.db.init_app(app) # Memcached if 'MEMCACHED_SERVERS' in app.config: from metabrainz import cache cache.init(app.config['MEMCACHED_SERVERS'], app.config['MEMCACHED_NAMESPACE'], debug=1 if app.debug else 0) # MusicBrainz OAuth from metabrainz.users import login_manager, musicbrainz_login login_manager.init_app(app) musicbrainz_login.init(app.config['MUSICBRAINZ_BASE_URL'], app.config['MUSICBRAINZ_CLIENT_ID'], app.config['MUSICBRAINZ_CLIENT_SECRET']) # Templates from metabrainz.utils import reformat_datetime app.jinja_env.filters['datetime'] = reformat_datetime app.jinja_env.filters['nl2br'] = lambda val: val.replace('\n', '<br />' ) if val else '' # Error handling from metabrainz.errors import init_error_handlers init_error_handlers(app) add_robots(app) # Blueprints _register_blueprints(app) # ADMIN SECTION from flask_admin import Admin from metabrainz.admin.views import HomeView admin = Admin(app, index_view=HomeView(name='Pending users')) # Models from metabrainz.model.user import UserAdminView from metabrainz.model.payment import PaymentAdminView from metabrainz.model.tier import TierAdminView admin.add_view( UserAdminView(model.db.session, category='Users', endpoint="user_model")) admin.add_view( PaymentAdminView(model.db.session, endpoint="donation_model")) admin.add_view(TierAdminView(model.db.session, endpoint="tier_model")) # Custom stuff from metabrainz.admin.views import CommercialUsersView from metabrainz.admin.views import UsersView from metabrainz.admin.views import TokensView from metabrainz.admin.views import StatsView admin.add_view( CommercialUsersView(name='Commercial users', category='Users')) admin.add_view(UsersView(name='Search', category='Users')) admin.add_view(TokensView(name='Access tokens', category='Users')) admin.add_view(StatsView(name='Statistics')) return app
def create_app(config_path=None): app = CustomFlask( import_name=__name__, use_flask_uuid=True, use_debug_toolbar=True, ) # Configuration files app.config.from_pyfile(os.path.join( os.path.dirname(os.path.realpath(__file__)), '..', 'default_config.py' )) app.config.from_pyfile(os.path.join( os.path.dirname(os.path.realpath(__file__)), '..', 'consul_config.py' ), silent=True) app.config.from_pyfile(os.path.join( os.path.dirname(os.path.realpath(__file__)), '..', 'custom_config.py' ), silent=True) if config_path: app.config.from_pyfile(config_path) app.init_loggers( file_config=app.config.get('LOG_FILE'), email_config=app.config.get('LOG_EMAIL'), sentry_config=app.config.get('LOG_SENTRY'), ) # Database from metabrainz import db db.init_db_engine(app.config["SQLALCHEMY_DATABASE_URI"]) from metabrainz import model model.db.init_app(app) # Redis (cache) from brainzutils import cache cache.init(**app.config['REDIS']) # MusicBrainz OAuth from metabrainz.users import login_manager, musicbrainz_login login_manager.init_app(app) musicbrainz_login.init( app.config['MUSICBRAINZ_BASE_URL'], app.config['MUSICBRAINZ_CLIENT_ID'], app.config['MUSICBRAINZ_CLIENT_SECRET'] ) # Templates from metabrainz.utils import reformat_datetime app.jinja_env.filters['datetime'] = reformat_datetime app.jinja_env.filters['nl2br'] = lambda val: val.replace('\n', '<br />') if val else '' # Error handling from metabrainz.errors import init_error_handlers init_error_handlers(app) add_robots(app) # Blueprints _register_blueprints(app) # ADMIN SECTION from flask_admin import Admin from metabrainz.admin.views import HomeView admin = Admin(app, index_view=HomeView(name='Pending users')) # Models from metabrainz.model.user import UserAdminView from metabrainz.model.payment import PaymentAdminView from metabrainz.model.tier import TierAdminView admin.add_view(UserAdminView(model.db.session, category='Users', endpoint="user_model")) admin.add_view(PaymentAdminView(model.db.session, endpoint="donation_model")) admin.add_view(TierAdminView(model.db.session, endpoint="tier_model")) # Custom stuff from metabrainz.admin.views import CommercialUsersView from metabrainz.admin.views import UsersView from metabrainz.admin.views import TokensView from metabrainz.admin.views import StatsView admin.add_view(CommercialUsersView(name='Commercial users', category='Users')) admin.add_view(UsersView(name='Search', category='Users')) admin.add_view(TokensView(name='Access tokens', category='Users')) admin.add_view(StatsView(name='Statistics')) return app
def create_app(self): app = create_app(config_path=os.path.join( os.path.dirname(os.path.realpath(__file__)), 'test_config.py')) db.init_db_engine(app.config['SQLALCHEMY_DATABASE_URI']) return app
def create_app(debug=None, config_path = None): app = CustomFlask( import_name=__name__, use_flask_uuid=True, ) # get rid of some really pesky warning. Remove this in April 2020, when it shouldn't be needed anymore. app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True print("Starting metabrainz service with %s environment." % deploy_env); # This is used to run tests, but not for dev or deployment if config_path: print("loading %s" % config_path) app.config.from_pyfile(config_path) else: print("loading %s" % os.path.join( os.path.dirname(os.path.realpath(__file__)), '..', 'config.py')) app.config.from_pyfile(os.path.join( os.path.dirname(os.path.realpath(__file__)), '..', 'config.py' )) # Load configuration files: If we're running under a docker deployment, wait until # the consul configuration is available. if deploy_env: consul_config = os.path.join( os.path.dirname(os.path.realpath(__file__)), '..', 'consul_config.py') print("loading consul %s" % consul_config) for i in range(CONSUL_CONFIG_FILE_RETRY_COUNT): if not os.path.exists(consul_config): sleep(1) if not os.path.exists(consul_config): print("No configuration file generated yet. Retried %d times, exiting." % CONSUL_CONFIG_FILE_RETRY_COUNT); sys.exit(-1) app.config.from_pyfile(consul_config, silent=True) if debug is not None: app.debug = debug if app.debug and app.config['SECRET_KEY']: app.init_debug_toolbar() # Printing out some debug values such as config and git commit try: with open(".git-version") as f: git_version = f.read() print('Running on git commit %s' % git_version.strip()) except IOError: print("Unable to retrieve git commit. Use docker/push.sh to push images for production.") print('Configuration values are as follows: ') print(pprint.pformat(app.config, indent=4)) app.init_loggers( file_config=app.config.get('LOG_FILE'), email_config=app.config.get('LOG_EMAIL'), sentry_config=app.config.get('LOG_SENTRY'), ) # Database from metabrainz import db db.init_db_engine(app.config["SQLALCHEMY_DATABASE_URI"]) from metabrainz import model model.db.init_app(app) # Redis (cache) from brainzutils import cache cache.init(**app.config['REDIS']) # MusicBrainz OAuth from metabrainz.users import login_manager, musicbrainz_login login_manager.init_app(app) musicbrainz_login.init( app.config['MUSICBRAINZ_BASE_URL'], app.config['MUSICBRAINZ_CLIENT_ID'], app.config['MUSICBRAINZ_CLIENT_SECRET'] ) # Templates from metabrainz.utils import reformat_datetime app.jinja_env.filters['datetime'] = reformat_datetime app.jinja_env.filters['nl2br'] = lambda val: val.replace('\n', '<br />') if val else '' # Error handling from metabrainz.errors import init_error_handlers init_error_handlers(app) add_robots(app) from metabrainz import babel babel.init_app(app) from flask_uploads import configure_uploads from metabrainz.admin.forms import LOGO_UPLOAD_SET configure_uploads(app, upload_sets=[ LOGO_UPLOAD_SET, ]) # Blueprints _register_blueprints(app) # ADMIN SECTION from flask_admin import Admin from metabrainz.admin.views import HomeView admin = Admin(app, index_view=HomeView(name='Pending users'), template_mode='bootstrap3') # Models from metabrainz.model.user import UserAdminView from metabrainz.model.payment import PaymentAdminView from metabrainz.model.tier import TierAdminView admin.add_view(UserAdminView(model.db.session, category='Users', endpoint="user_model")) admin.add_view(PaymentAdminView(model.db.session, category='Payments', endpoint="payment_model")) admin.add_view(TierAdminView(model.db.session, endpoint="tier_model")) # Custom stuff from metabrainz.admin.views import CommercialUsersView from metabrainz.admin.views import UsersView from metabrainz.admin.views import PaymentsView from metabrainz.admin.views import TokensView from metabrainz.admin.views import StatsView admin.add_view(CommercialUsersView(name='Commercial users', category='Users')) admin.add_view(UsersView(name='Search', category='Users')) admin.add_view(PaymentsView(name='All', category='Payments')) admin.add_view(TokensView(name='Access tokens', category='Users')) admin.add_view(StatsView(name='Statistics', category='Statistics')) admin.add_view(StatsView(name='Top IPs', endpoint="statsview/top-ips", category='Statistics')) admin.add_view(StatsView(name='Top Tokens', endpoint="statsview/top-tokens", category='Statistics')) return app