X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=mediagoblin%2Finit%2F__init__.py;h=e0711416378cbf4c1e5cf7ceb874297a544bffb3;hb=4a698535bc97b37c8eb42ffea2cc3e7bd48565e6;hp=64fa9b9248e13e9c48d30a797262798d560906c0;hpb=dccef26263ba98c47fc5f8121a074a34b012ba89;p=mediagoblin.git diff --git a/mediagoblin/init/__init__.py b/mediagoblin/init/__init__.py index 64fa9b92..e0711416 100644 --- a/mediagoblin/init/__init__.py +++ b/mediagoblin/init/__init__.py @@ -1,5 +1,5 @@ # GNU MediaGoblin -- federated, autonomous media hosting -# Copyright (C) 2011 Free Software Foundation, Inc +# 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 @@ -15,19 +15,31 @@ # along with this program. If not, see . 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 -class Error(Exception): pass -class ImproperlyConfigured(Error): pass +class Error(Exception): + pass + + +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): @@ -46,33 +58,28 @@ def setup_global_and_app_config(config_path): return global_config, app_config -def setup_database(): +def setup_database(run_migrations=False): app_config = mg_globals.app_config + global_config = mg_globals.global_config - # This MUST be imported so as to set up the appropriate migrations! - from mediagoblin.db import 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() + db = setup_connection_and_db_from_config(app_config, run_migrations) + if run_migrations: + #Run the migrations to initialize/update the database. + from mediagoblin.gmg_commands.dbupdate import run_all_migrations + run_all_migrations(db, app_config, global_config) + else: + check_db_migrations_current(db) - # Tiny hack to warn user if our migration is out of date - if not migration_manager.database_at_latest_migration(): - print ( - "*WARNING:* Your migrations are out of date, " - "maybe run ./bin/gmg migrate?") + setup_globals(database=db) - setup_globals( - db_connection = connection, - database = db) + return db - return connection, 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. @@ -80,39 +87,64 @@ 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 app_config.has_key('direct_remote_path'): - return staticdirect.RemoteStaticDirect( - app_config['direct_remote_path'].strip()) - elif app_config.has_key('direct_remote_paths'): - 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(): - app_config = mg_globals.app_config + global_config = mg_globals.global_config + + key_short = 'publicstore' + key_long = "storage:" + key_short + public_store = storage_system_from_config(global_config[key_long]) - public_store = storage_system_from_config(app_config, 'publicstore') - queue_store = storage_system_from_config(app_config, 'queuestore') + key_short = 'queuestore' + key_long = "storage:" + key_short + queue_store = storage_system_from_config(global_config[key_long]) setup_globals( - public_store = public_store, - queue_store = queue_store) + public_store=public_store, + queue_store=queue_store) return public_store, queue_store @@ -122,4 +154,4 @@ def setup_workbench(): workbench_manager = WorkbenchManager(app_config['workbench_path']) - setup_globals(workbench_manager = workbench_manager) + setup_globals(workbench_manager=workbench_manager)