X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=mediagoblin%2Finit%2F__init__.py;h=e0711416378cbf4c1e5cf7ceb874297a544bffb3;hb=4a698535bc97b37c8eb42ffea2cc3e7bd48565e6;hp=b8ed2456c8fe3c885dc72e93cc298a31490ec41b;hpb=1f69672478a4f65fc6b84e3feedb5f3763c420f1;p=mediagoblin.git diff --git a/mediagoblin/init/__init__.py b/mediagoblin/init/__init__.py index b8ed2456..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 @@ -16,8 +16,70 @@ import jinja2 +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, \ + 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 -def get_jinja_loader(user_template_path=None): + +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): + global_config, validation_result = read_mediagoblin_config(config_path) + app_config = global_config['mediagoblin'] + # report errors if necessary + validation_report = generate_validation_report( + global_config, validation_result) + if validation_report: + raise ImproperlyConfigured(validation_report) + + setup_globals( + app_config=app_config, + global_config=global_config) + + return global_config, app_config + + +def setup_database(run_migrations=False): + app_config = mg_globals.app_config + global_config = mg_globals.global_config + + # Load all models for media types (plugins, ...) + load_models(app_config) + # Set up the database + 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) + + setup_globals(database=db) + + return db + + +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. @@ -25,9 +87,71 @@ 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): + # 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( + "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(): + global_config = mg_globals.global_config + + key_short = 'publicstore' + key_long = "storage:" + key_short + public_store = storage_system_from_config(global_config[key_long]) + + 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) + + return public_store, queue_store + + +def setup_workbench(): + app_config = mg_globals.app_config + + workbench_manager = WorkbenchManager(app_config['workbench_path']) + + setup_globals(workbench_manager=workbench_manager)