X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=mediagoblin%2Finit%2F__init__.py;h=05a267925cada2fa137eacb2c350a9511cf8fa10;hb=a63d628f594f115b3fbe61590ccc2a8962a36d8a;hp=5f7f83d4f889d2e8f2ccc44edc870404abbfcc59;hpb=463a5dcc433f6e4a442eeaee67bd22910cfb2d08;p=mediagoblin.git diff --git a/mediagoblin/init/__init__.py b/mediagoblin/init/__init__.py index 5f7f83d4..05a26792 100644 --- a/mediagoblin/init/__init__.py +++ b/mediagoblin/init/__init__.py @@ -1,5 +1,5 @@ # GNU MediaGoblin -- federated, autonomous media hosting -# Copyright (C) 2011 MediaGoblin contributors. See AUTHORS. +# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS. # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by @@ -14,20 +14,22 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -from beaker.cache import CacheManager -from beaker.util import parse_cache_config_options import jinja2 -from mediagoblin import staticdirect +from mediagoblin.tools import staticdirect +from mediagoblin.tools.translate import set_available_locales from mediagoblin.init.config import ( read_mediagoblin_config, generate_validation_report) from mediagoblin import mg_globals from mediagoblin.mg_globals import setup_globals -from mediagoblin.db.open import setup_connection_and_db_from_config -from mediagoblin.db.util import MigrationManager -from mediagoblin.workbench import WorkbenchManager +from mediagoblin.db.open import setup_connection_and_db_from_config, \ + check_db_migrations_current, load_models +from mediagoblin.tools.pluginapi import hook_runall +from mediagoblin.tools.workbench import WorkbenchManager from mediagoblin.storage import storage_system_from_config +from mediagoblin.tools.transition import DISABLE_GLOBALS + class Error(Exception): pass @@ -37,6 +39,11 @@ class ImproperlyConfigured(Error): pass +def setup_locales(): + """Checks which language translations are available and sets them""" + set_available_locales() + + def setup_global_and_app_config(config_path): global_config, validation_result = read_mediagoblin_config(config_path) app_config = global_config['mediagoblin'] @@ -53,40 +60,36 @@ def setup_global_and_app_config(config_path): return global_config, app_config -def setup_database(): - app_config = mg_globals.app_config - - # This MUST be imported so as to set up the appropriate migrations! - from mediagoblin.db.mongo import migrations +def setup_database(app): + app_config = app.app_config + global_config = app.global_config + run_migrations = app_config['run_migrations'] + # Load all models for media types (plugins, ...) + load_models(app_config) # Set up the database - connection, db = setup_connection_and_db_from_config(app_config) - - # Init the migration number if necessary - migration_manager = MigrationManager(db) - migration_manager.install_migration_version_if_missing() - - # Tiny hack to warn user if our migration is out of date - if not migration_manager.database_at_latest_migration(): - db_migration_num = migration_manager.database_current_migration() - latest_migration_num = migration_manager.latest_migration() - if db_migration_num < latest_migration_num: - print ( - "*WARNING:* Your migrations are out of date, " - "maybe run ./bin/gmg migrate?") - elif db_migration_num > latest_migration_num: - print ( - "*WARNING:* Your migrations are out of date... " - "in fact they appear to be from the future?!") + db = setup_connection_and_db_from_config( + app_config, run_migrations, app=app) + # run_migrations is used for tests + if run_migrations: + # Run the migrations to initialize/update the database. + # We only run the alembic migrations in the case of unit + # tests, in which case we don't need to run the legacy + # migrations. + from mediagoblin.gmg_commands.dbupdate import ( + run_alembic_migrations, run_foundations) + run_alembic_migrations(db, app_config, global_config) + run_foundations(db, global_config) + else: + check_db_migrations_current(db) - setup_globals( - db_connection=connection, - database=db) + setup_globals(database=db) - return connection, db + return db -def get_jinja_loader(user_template_path=None): +def get_jinja_loader(user_template_path=None, current_theme=None, + plugin_template_paths=None): """ Set up the Jinja template loaders, possibly allowing for user overridden templates. @@ -94,28 +97,48 @@ def get_jinja_loader(user_template_path=None): (In the future we may have another system for providing theming; for now this is good enough.) """ - if user_template_path: - return jinja2.ChoiceLoader( - [jinja2.FileSystemLoader(user_template_path), - jinja2.PackageLoader('mediagoblin', 'templates')]) - else: - return jinja2.PackageLoader('mediagoblin', 'templates') + path_list = [] + + # Add user path first--this takes precedence over everything. + if user_template_path is not None: + path_list.append(jinja2.FileSystemLoader(user_template_path)) + + # Any theme directories in the registry + if current_theme and current_theme.get('templates_dir'): + path_list.append( + jinja2.FileSystemLoader( + current_theme['templates_dir'])) + + # Add plugin template paths next--takes precedence over + # core templates. + if plugin_template_paths is not None: + path_list.extend((jinja2.FileSystemLoader(path) + for path in plugin_template_paths)) + + # Add core templates last. + path_list.append(jinja2.PackageLoader('mediagoblin', 'templates')) + + return jinja2.ChoiceLoader(path_list) def get_staticdirector(app_config): - if 'direct_remote_path' in app_config: - return staticdirect.RemoteStaticDirect( - app_config['direct_remote_path'].strip()) - elif 'direct_remote_paths' in app_config: - direct_remote_path_lines = app_config[ - 'direct_remote_paths'].strip().splitlines() - return staticdirect.MultiRemoteStaticDirect( - dict([line.strip().split(' ', 1) - for line in direct_remote_path_lines])) - else: + # At minimum, we need the direct_remote_path + if not 'direct_remote_path' in app_config \ + or not 'theme_web_path' in app_config: raise ImproperlyConfigured( - "One of direct_remote_path or " - "direct_remote_paths must be provided") + "direct_remote_path and theme_web_path must be provided") + + direct_domains = {None: app_config['direct_remote_path'].strip()} + direct_domains['theme'] = app_config['theme_web_path'].strip() + + # Let plugins load additional paths + for plugin_static in hook_runall("static_setup"): + direct_domains[plugin_static.name] = "%s/%s" % ( + app_config['plugin_web_path'].rstrip('/'), + plugin_static.name) + + return staticdirect.StaticDirect( + direct_domains) def setup_storage(): @@ -141,17 +164,7 @@ def setup_workbench(): workbench_manager = WorkbenchManager(app_config['workbench_path']) - setup_globals(workbench_manager=workbench_manager) - + if not DISABLE_GLOBALS: + setup_globals(workbench_manager=workbench_manager) -def setup_beaker_cache(): - """ - Setup the Beaker Cache manager. - """ - cache_config = mg_globals.global_config['beaker.cache'] - cache_config = dict( - [(u'cache.%s' % key, value) - for key, value in cache_config.iteritems()]) - cache = CacheManager(**parse_cache_config_options(cache_config)) - setup_globals(cache=cache) - return cache + return workbench_manager