Ensure that all configuration variables are unicode.
[infos-pratiques:etalage.git] / etalage / environment.py
1 # -*- coding: utf-8 -*-
2
3
4 # Etalage -- Open Data POIs portal
5 # By: Emmanuel Raviart <eraviart@easter-eggs.com>
6 #
7 # Copyright (C) 2011, 2012 Easter-eggs
8 # http://gitorious.org/infos-pratiques/etalage
9 #
10 # This file is part of Etalage.
11 #
12 # Etalage is free software; you can redistribute it and/or modify
13 # it under the terms of the GNU Affero General Public License as
14 # published by the Free Software Foundation, either version 3 of the
15 # License, or (at your option) any later version.
16 #
17 # Etalage is distributed in the hope that it will be useful,
18 # but WITHOUT ANY WARRANTY; without even the implied warranty of
19 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20 # GNU Affero General Public License for more details.
21 #
22 # You should have received a copy of the GNU Affero General Public License
23 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
24
25
26 """Environment configuration"""
27
28
29 import logging
30 import os
31 import sys
32
33 from biryani import strings
34 import mako.lookup
35 import pymongo
36 from suq import monpyjama
37 from etalage import ramdb
38
39 import etalage
40 from . import conv, model, templates
41
42
43 app_dir = os.path.dirname(os.path.abspath(__file__))
44
45
46 def load_environment(global_conf, app_conf):
47     """Configure the application environment."""
48     conf = etalage.conf # Empty dictionary
49     conf.update({
50         'app_conf': app_conf,
51         'app_dir': app_dir,
52         'cache_dir': os.path.join(os.path.dirname(app_dir), 'cache'),
53         'categories_collection': 'categories',
54         'data_updates_collection': 'data_updates',
55         'database': 'souk',
56         'debug': False,
57         'global_conf': global_conf,
58         'i18n_dir': os.path.join(app_dir, 'i18n'),
59         'log_level': 'WARNING',
60         'organism_types_collection': 'organism_types',
61         'pois_collection': 'pois',
62         'package_name': 'etalage',
63         'static_files': True, # Whether this application serves its own static files
64         'static_files_dir': os.path.join(app_dir, 'static'),
65         'territories_collection': 'territories',
66         })
67     conf.update(strings.deep_decode(global_conf))
68     conf.update(strings.deep_decode(app_conf))
69     conf['debug'] = conv.check(conv.pipe(conv.guess_bool, conv.default(False)))(conf['debug'])
70     conf['log_level'] = getattr(logging, conf['log_level'].upper())
71     conf['static_files'] = conv.check(conv.pipe(conv.guess_bool, conv.default(False)))(conf['static_files'])
72
73     # Configure logging.
74     logging.basicConfig(level = conf['log_level'], stream = sys.stdout)
75
76     errorware = conf.setdefault('errorware', {})
77     errorware['debug'] = conf['debug']
78     if not errorware['debug']:
79         errorware['error_email'] = conf['email_to']
80         errorware['error_log'] = conf.get('error_log', None)
81         errorware['error_message'] = conf.get('error_message', 'An internal server error occurred')
82         errorware['error_subject_prefix'] = conf.get('error_subject_prefix', 'Etalage Error: ')
83         errorware['from_address'] = conf['from_address']
84         errorware['smtp_server'] = conf.get('smtp_server', 'localhost')
85
86     # Connect to MongoDB database.
87     monpyjama.Wrapper.db = model.db = pymongo.Connection()[conf['database']]
88     # Initialize ramdb database from MongoDB.
89     ramdb.load()
90
91     # Create the Mako TemplateLookup, with the default auto-escaping.
92     templates.lookup = mako.lookup.TemplateLookup(
93         default_filters = ['h'],
94         directories = [os.path.join(app_dir, 'templates')],
95 #        error_handler = handle_mako_error,
96         input_encoding = 'utf-8', 
97         module_directory = os.path.join(conf['cache_dir'], 'templates'),
98 #        strict_undefined = True,
99         )
100