aboutsummaryrefslogtreecommitdiffstats
path: root/mediagoblin/init/__init__.py
blob: 64fa9b9248e13e9c48d30a797262798d560906c0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
# GNU MediaGoblin -- federated, autonomous media hosting
# Copyright (C) 2011 Free Software Foundation, Inc
#
# 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
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

import jinja2
from mediagoblin import staticdirect
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.storage import storage_system_from_config


class Error(Exception): pass
class ImproperlyConfigured(Error): pass


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():
    app_config = mg_globals.app_config

    # This MUST be imported so as to set up the appropriate migrations!
    from mediagoblin.db import migrations

    # 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():
        print (
            "*WARNING:* Your migrations are out of date, "
            "maybe run ./bin/gmg migrate?")

    setup_globals(
        db_connection = connection,
        database = db)

    return connection, db


def get_jinja_loader(user_template_path=None):
    """
    Set up the Jinja template loaders, possibly allowing for user
    overridden templates.

    (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')


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:
        raise ImproperlyConfigured(
            "One of direct_remote_path or "
            "direct_remote_paths must be provided")


def setup_storage():
    app_config = mg_globals.app_config

    public_store = storage_system_from_config(app_config, 'publicstore')
    queue_store = storage_system_from_config(app_config, 'queuestore')

    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)