Commit ab94e3df0bed4f5bd980bf8231a6990a6369beac
Exists in
master
and in
33 other branches
Merge branch 'settings_py'
Showing
13 changed files
with
295 additions
and
139 deletions
Show diff stats
.gitignore
colab/plugins/context_processors.py
... | ... | @@ -2,10 +2,10 @@ |
2 | 2 | from django.conf import settings |
3 | 3 | |
4 | 4 | |
5 | -def proxied_apps(request): | |
6 | - proxied_apps = {} | |
5 | +def colab_apps(request): | |
6 | + colab_apps = {} | |
7 | 7 | |
8 | 8 | for app_name, app in settings.COLAB_APPS.items(): |
9 | - proxied_apps[app_name] = app | |
9 | + colab_apps[app_name] = app | |
10 | 10 | |
11 | - return {'proxy': proxied_apps} | |
11 | + return {'plugins': colab_apps} | ... | ... |
colab/plugins/templates/plugins/menu_template.html
1 | 1 | {% for title, links in menu_links.items %} |
2 | 2 | {% if links|length == 1 %} |
3 | - {% for text, link in links %} | |
3 | + {% for colab_url in links %} | |
4 | 4 | <li> |
5 | - <a href="{{ link }}">{{ title }}</a> | |
5 | + <a href="{{ colab_url.url }}">{{ title }}</a> | |
6 | 6 | </li> |
7 | 7 | {% endfor %} |
8 | 8 | {% else %} |
9 | 9 | <li class="dropdown"> |
10 | 10 | <a href="#" class="dropdown-toggle" data-toggle="dropdown">{{ title }} <b class="caret"></b></a> |
11 | 11 | <ul class="dropdown-menu"> |
12 | - {% for text, link in links %} | |
13 | - <li><a href="{{ link }}">{{ text }}</a></li> | |
12 | + {% for colab_url in links %} | |
13 | + <li><a href="{{ colab_url.url }}">{{ colab_url.display }}</a></li> | |
14 | 14 | {% endfor %} |
15 | 15 | </ul> |
16 | 16 | </li> | ... | ... |
colab/plugins/templatetags/plugins.py
... | ... | @@ -3,45 +3,48 @@ from collections import OrderedDict |
3 | 3 | from django import template |
4 | 4 | from django.core.cache import cache |
5 | 5 | from django.template.loader import render_to_string |
6 | -from django.utils.translation import ugettext_lazy as _ | |
6 | +from django.utils.translation import get_language | |
7 | 7 | |
8 | 8 | register = template.Library() |
9 | 9 | |
10 | 10 | |
11 | 11 | @register.simple_tag(takes_context=True) |
12 | 12 | def plugins_menu(context): |
13 | + | |
13 | 14 | if context['user'].is_authenticated(): |
14 | 15 | cache_key = 'colab-proxy-menu-authenticated' |
15 | 16 | else: |
16 | 17 | cache_key = 'colab-proxy-menu-anonymous' |
17 | 18 | |
19 | + lang = get_language() | |
20 | + cache_key += '-{}'.format(lang) | |
21 | + | |
18 | 22 | menu_from_cache = cache.get(cache_key) |
19 | 23 | |
20 | 24 | if menu_from_cache: |
21 | 25 | return menu_from_cache |
22 | 26 | |
23 | 27 | menu_links = OrderedDict() |
24 | - proxied_apps = context.get('proxy', {}) | |
28 | + colab_apps = context.get('plugins', {}) | |
25 | 29 | |
26 | - for app_name, app in proxied_apps.items(): | |
27 | - if not app.get('menu'): | |
30 | + for app_name, app in colab_apps.items(): | |
31 | + if not app.get('menu_urls'): | |
28 | 32 | continue |
29 | 33 | |
30 | - menu = app.get('menu') | |
31 | - title = menu.get('title', app_name) | |
32 | - links = menu.get('links', tuple()).items() | |
33 | - if context['user'].is_active: | |
34 | - links += menu.get('auth_links', tuple()).items() | |
35 | - | |
36 | - if not links: | |
37 | - continue | |
34 | + menu = app.get('menu_urls') | |
35 | + title = app.get('menu_title', app_name) | |
38 | 36 | |
39 | 37 | if title not in menu_links: |
40 | - menu_links[_(title)] = [] | |
38 | + menu_links[title] = [] | |
39 | + | |
40 | + for colab_url in menu: | |
41 | + if not context['user'].is_active and colab_url.auth: | |
42 | + continue | |
43 | + | |
44 | + menu_links[title].append(colab_url) | |
41 | 45 | |
42 | - for text, link in links: | |
43 | - url = link | |
44 | - menu_links[_(title)].append((_(text), url)) | |
46 | + if not menu_links[title]: | |
47 | + del menu_links[title] | |
45 | 48 | |
46 | 49 | menu = render_to_string('plugins/menu_template.html', |
47 | 50 | {'menu_links': menu_links}) | ... | ... |
colab/plugins/urls.py
... | ... | @@ -14,8 +14,8 @@ for app_name, app in settings.COLAB_APPS.items(): |
14 | 14 | urls = app.get('urls') |
15 | 15 | if not urls.get('include'): |
16 | 16 | raise ImproperlyConfigured(undef_url_include_msg) |
17 | - print urls['include'] | |
18 | 17 | urlpatterns += patterns('', |
19 | 18 | url(urls.get('prefix', r''), include(urls['include'], |
20 | 19 | namespace=urls.get('namespace'))), |
21 | - ) | |
22 | 20 | \ No newline at end of file |
21 | + ) | |
22 | + | ... | ... |
... | ... | @@ -0,0 +1,25 @@ |
1 | +from django.core.urlresolvers import reverse_lazy | |
2 | + | |
3 | + | |
4 | +class ColabUrl(object): | |
5 | + def __init__(self, display, url, auth): | |
6 | + self.display = display | |
7 | + self.url = url | |
8 | + self.auth = auth | |
9 | + | |
10 | + | |
11 | +def colab_url_factory(namespace): | |
12 | + | |
13 | + def url(display, viewname, namespace=namespace, args=tuple(), | |
14 | + kwargs={}, auth=False): | |
15 | + | |
16 | + if namespace: | |
17 | + rev_viewname = ':'.join((namespace, viewname)) | |
18 | + else: | |
19 | + rev_viewname = viewname | |
20 | + | |
21 | + url = reverse_lazy(rev_viewname, args=args, kwargs=kwargs) | |
22 | + | |
23 | + return ColabUrl(display, url, auth) | |
24 | + | |
25 | + return url | ... | ... |
colab/settings.py
... | ... | @@ -194,7 +194,7 @@ TEMPLATE_CONTEXT_PROCESSORS = ( |
194 | 194 | 'django.core.context_processors.request', |
195 | 195 | 'django_mobile.context_processors.is_mobile', |
196 | 196 | 'colab.super_archives.context_processors.mailarchive', |
197 | - 'colab.plugins.context_processors.proxied_apps', | |
197 | + 'colab.plugins.context_processors.colab_apps', | |
198 | 198 | 'colab.home.context_processors.robots', |
199 | 199 | 'colab.home.context_processors.ribbon', |
200 | 200 | 'colab.home.context_processors.google_analytics', |
... | ... | @@ -280,8 +280,13 @@ CONVERSEJS_SHOW_ONLY_ONLINE_USERS = True |
280 | 280 | TASTYPIE_DEFAULT_FORMATS = ['json', ] |
281 | 281 | |
282 | 282 | from .utils.conf import load_yaml_settings |
283 | +from .utils.conf import load_py_settings | |
284 | +from .utils.conf import load_colab_apps | |
285 | + | |
283 | 286 | locals().update(load_yaml_settings()) |
284 | 287 | |
288 | +locals().update(load_py_settings()) | |
289 | + | |
285 | 290 | if locals().get('RAVEN_DSN', False): |
286 | 291 | RAVEN_CONFIG = { |
287 | 292 | 'dsn': RAVEN_DSN + '?timeout=30', # noqa |
... | ... | @@ -291,6 +296,8 @@ if locals().get('RAVEN_DSN', False): |
291 | 296 | BROWSERID_ENABLED = locals().get('BROWSERID_ENABLED') or False |
292 | 297 | SOCIAL_NETWORK_ENABLED = locals().get('SOCIAL_NETWORK_ENABLED') or False |
293 | 298 | |
299 | +locals().update(load_colab_apps()) | |
300 | + | |
294 | 301 | COLAB_APPS = locals().get('COLAB_APPS') or {} |
295 | 302 | PROXIED_APPS = {} |
296 | 303 | ... | ... |
colab/utils/conf.py
1 | 1 | |
2 | 2 | import os |
3 | +import sys | |
4 | + | |
5 | +import warnings | |
6 | + | |
3 | 7 | import yaml |
4 | 8 | |
5 | 9 | import yamlordereddictloader |
6 | 10 | |
7 | 11 | from django.core.exceptions import ImproperlyConfigured |
8 | 12 | |
13 | +import importlib | |
14 | + | |
15 | + | |
16 | +USING_YAML_SETTINGS = False | |
17 | + | |
9 | 18 | |
10 | 19 | class InaccessibleYAMLSettings(ImproperlyConfigured): |
11 | 20 | """Settings YAML is Inaccessible. |
... | ... | @@ -29,22 +38,144 @@ def _load_yaml_file(yaml_path): |
29 | 38 | |
30 | 39 | def load_yaml_settings(): |
31 | 40 | settings_dir = '/etc/colab/settings.d' |
32 | - yaml_path = os.getenv('COLAB_SETTINGS', '/etc/colab/settings.yaml') | |
41 | + yaml_path = os.getenv('COLAB_YAML_SETTINGS', '/etc/colab/settings.yaml') | |
33 | 42 | |
34 | - if not os.path.exists(yaml_path): | |
35 | - msg = "The yaml file {} does not exist".format(yaml_path) | |
36 | - raise InaccessibleYAMLSettings(msg) | |
43 | + if os.path.exists(yaml_path): | |
44 | + global USING_YAML_SETTINGS | |
45 | + USING_YAML_SETTINGS = True | |
46 | + warnings.warn("YAML Settings file is deprecated. Use Py file instead.") | |
47 | + else: | |
48 | + return {} | |
37 | 49 | |
38 | 50 | yaml_settings = _load_yaml_file(yaml_path) |
39 | 51 | |
52 | + parse_yml_menus(yaml_settings) | |
53 | + | |
40 | 54 | # Try to read settings from settings.d |
41 | 55 | if os.path.exists(settings_dir): |
42 | 56 | for file_name in os.listdir(settings_dir): |
43 | 57 | if file_name.endswith('.yaml') or file_name.endswith('yml'): |
44 | 58 | file_path = os.path.join(settings_dir, file_name) |
45 | 59 | yaml_settings_d = _load_yaml_file(file_path) |
60 | + | |
61 | + parse_yml_menus(yaml_settings_d) | |
62 | + | |
46 | 63 | yaml_settings.update(yaml_settings_d) |
47 | 64 | |
48 | 65 | return yaml_settings or {} |
49 | 66 | |
50 | -yaml_settings = load_yaml_settings() | |
67 | + | |
68 | +class InaccessiblePySettings(ImproperlyConfigured): | |
69 | + """Settings.py is Inaccessible. | |
70 | + | |
71 | + Check if the file exists and if you have read permissions.""" | |
72 | + | |
73 | + | |
74 | +def _load_py_file(py_path, path): | |
75 | + original_path = sys.path | |
76 | + | |
77 | + sys.path = [path] | |
78 | + try: | |
79 | + py_settings = importlib.import_module(py_path) | |
80 | + | |
81 | + except IOError: | |
82 | + msg = ('Could not open settings file {}. Please ' | |
83 | + 'check if the file exists and if user ' | |
84 | + 'has read rights.').format(py_path) | |
85 | + raise InaccessiblePySettings(msg) | |
86 | + | |
87 | + except SyntaxError as excpt: | |
88 | + msg = ('Syntax Error: {}'.format(excpt)) | |
89 | + raise InaccessiblePySettings(msg) | |
90 | + | |
91 | + finally: | |
92 | + sys.path = original_path | |
93 | + | |
94 | + py_setting = {var: getattr(py_settings, var) for var in dir(py_settings) | |
95 | + if not var.startswith('__')} | |
96 | + | |
97 | + return py_setting | |
98 | + | |
99 | + | |
100 | +def load_py_settings(): | |
101 | + settings_dir = '/etc/colab/settings.d' | |
102 | + settings_file = os.getenv('COLAB_SETTINGS', '/etc/colab/settings.py') | |
103 | + settings_module = settings_file.split('.')[-2].split('/')[-1] | |
104 | + py_path = "/".join(settings_file.split('/')[:-1]) | |
105 | + | |
106 | + global USING_YAML_SETTINGS | |
107 | + if not os.path.exists(py_path) and not USING_YAML_SETTINGS: | |
108 | + msg = "The py file {} does not exist".format(py_path) | |
109 | + raise InaccessiblePySettings(msg) | |
110 | + elif USING_YAML_SETTINGS: | |
111 | + return {} | |
112 | + | |
113 | + py_settings = _load_py_file(settings_module, py_path) | |
114 | + | |
115 | + # Try to read settings from settings.d | |
116 | + | |
117 | + if os.path.exists(settings_dir): | |
118 | + return py_settings | |
119 | + for file_name in os.listdir(settings_dir): | |
120 | + if file_name.endswith('.py'): | |
121 | + file_module = file_name.split('.')[0] | |
122 | + py_settings_d = _load_py_file(file_module, settings_dir) | |
123 | + py_settings.update(py_settings_d) | |
124 | + | |
125 | + return py_settings | |
126 | + | |
127 | + | |
128 | +def load_colab_apps(): | |
129 | + plugins_dir = os.getenv('COLAB_PLUGINS', '/etc/colab/plugins.d/') | |
130 | + | |
131 | + global USING_YAML_SETTINGS | |
132 | + if USING_YAML_SETTINGS: | |
133 | + return {} | |
134 | + | |
135 | + COLAB_APPS = {} | |
136 | + | |
137 | + # Try to read settings from plugins.d | |
138 | + if os.path.exists(plugins_dir): | |
139 | + for file_name in os.listdir(plugins_dir): | |
140 | + if file_name.endswith('.py'): | |
141 | + file_module = file_name.split('.')[0] | |
142 | + py_settings_d = _load_py_file(file_module, plugins_dir) | |
143 | + fields = ['verbose_name', 'upstream', 'urls', | |
144 | + 'menu_urls', 'middlewares', 'dependencies', | |
145 | + 'context_processors'] | |
146 | + | |
147 | + app_name = py_settings_d.get('name') | |
148 | + if not app_name: | |
149 | + warnings.warn("Plugin missing name variable") | |
150 | + continue | |
151 | + | |
152 | + COLAB_APPS[app_name] = {} | |
153 | + COLAB_APPS[app_name]['menu_title'] = \ | |
154 | + py_settings_d.get('menu_title') | |
155 | + | |
156 | + for key in fields: | |
157 | + value = py_settings_d.get(key) | |
158 | + if value: | |
159 | + COLAB_APPS[app_name][key] = value | |
160 | + | |
161 | + return {'COLAB_APPS': COLAB_APPS} | |
162 | + | |
163 | + | |
164 | +def parse_yml_menus(yaml_settings): | |
165 | + if 'COLAB_APPS' in yaml_settings: | |
166 | + for key, plugin in yaml_settings['COLAB_APPS'].items(): | |
167 | + if 'menu' in plugin: | |
168 | + parse_yml_tuples(yaml_settings['COLAB_APPS'][key]['menu']) | |
169 | + | |
170 | + | |
171 | +def parse_yml_tuples(menu): | |
172 | + dict_links = menu['links'] | |
173 | + dict_auth_links = menu['auth_links'] | |
174 | + menu['links'] = tuple() | |
175 | + menu['auth_links'] = tuple() | |
176 | + | |
177 | + for key, value in dict_links.items(): | |
178 | + menu['links'] += ((key, value),) | |
179 | + | |
180 | + for key, value in dict_auth_links.items(): | |
181 | + menu['auth_links'] += ((key, value),) | ... | ... |
docs/source/user.rst
... | ... | @@ -14,41 +14,33 @@ Install |
14 | 14 | |
15 | 15 | Plugins |
16 | 16 | ------- |
17 | -.. attribute:: COLAB_APPS | |
17 | +.. attribute:: name | |
18 | 18 | |
19 | - :default: None | |
19 | +Declares the absolute name of the plugin app as a python import path. Example: | |
20 | +directory.something.someplugin | |
21 | + | |
22 | +.. attribute:: verbose_name | |
20 | 23 | |
21 | - Describes the activated plugins and its configurations. It's necessary to describe | |
22 | - for each app its name as the variable. The apps described here can be devided into | |
23 | - two categories, that beeing, colab proxy apps and third-party apps. | |
24 | - The upstream variable is only needed to colab proxy apps. | |
24 | +Delclare the description name of the plugin. | |
25 | 25 | |
26 | 26 | .. attribute:: upstream |
27 | 27 | |
28 | -Declares the upstream server url of the proxy. Only declare if the plugin is a proxy. | |
28 | +Declares the upstream server url of the proxy. Only declare if the plugin is a | |
29 | +proxy. | |
29 | 30 | |
30 | -dependecies | |
31 | -+++++++++++ | |
31 | +.. attribute:: middlewares | |
32 | 32 | |
33 | - A list of the plugin dependecies that will be added to INSTALLED_APPS. | |
34 | - This doesn't automatically install the python dependecies, only add to django apps. | |
33 | +Declares the middlewares of the plugin in a list format. | |
35 | 34 | |
35 | +.. attribute:: context_processors | |
36 | 36 | |
37 | -menu | |
38 | -++++ | |
37 | +Declares the context processors of the plugin in a list format too. | |
39 | 38 | |
40 | -.. attribute:: title | |
39 | +.. attribute:: dependency | |
41 | 40 | |
42 | - Declares the menu title. | |
43 | -.. attribute:: links | |
44 | - | |
45 | - Declares the menu items and its links. | |
46 | -.. attribute:: auth_links | |
47 | - | |
48 | - Declares the menu items and its links when the user authenticated. | |
49 | -.. attribute:: dependecies | |
50 | - | |
51 | -Declares a list of the plugin dependecies. | |
41 | +Declares the additional installed apps that this plugin depends on. | |
42 | +This doesn't automatically install the python dependecies, only add to django | |
43 | +apps. | |
52 | 44 | |
53 | 45 | urls |
54 | 46 | ++++ |
... | ... | @@ -63,16 +55,35 @@ urls |
63 | 55 | |
64 | 56 | Declares the namespace for the url. |
65 | 57 | |
66 | -context_processors | |
67 | -++++++++++++++++++ | |
58 | +menu | |
59 | +++++ | |
68 | 60 | |
69 | - Declares the plugin context processors. | |
61 | +These variables defines the menu title and links of the plugin. | |
70 | 62 | |
71 | -middlewares | |
72 | -+++++++++++ | |
63 | +.. attribute:: menu_title | |
64 | + | |
65 | + Declares the menu title. | |
66 | +.. attribute:: menu_links | |
67 | + | |
68 | + Declares the menu items and its links. | |
69 | + This should be a tuple object with several colab_url elements. | |
70 | + The colab_url_factory creates a factory for your links along with your | |
71 | + namespace. | |
72 | + The auth parameter indicates wether the link should only be displayed when | |
73 | + the user is logged in. | |
74 | + | |
75 | +Example: | |
76 | + | |
77 | +.. code-block:: python | |
73 | 78 | |
74 | - Declares the plugin middlewares. | |
79 | + from colab.plugins.utils.menu import colab_url_factory | |
75 | 80 | |
81 | + url = colab_url_factory('plugin_app_name') | |
82 | + | |
83 | + menu_urls = ( | |
84 | + url(display=_('Profile'), viewname='profile', kwargs={'path': '/profile/'}, auth=True), | |
85 | + url(display=_('Profile Two'), viewname='profile2', kwargs={'path': '/profile/2'}, auth=True), | |
86 | + ) | |
76 | 87 | |
77 | 88 | Extra Template Folders |
78 | 89 | ++++++++++++++++++++++ |
... | ... | @@ -113,12 +124,12 @@ SVN |
113 | 124 | .. TODO |
114 | 125 | |
115 | 126 | Social Networks |
116 | -++++ | |
127 | ++++++++++++++++ | |
117 | 128 | .. attribute:: SOCIAL_NETWORK_ENABLED |
118 | 129 | |
119 | 130 | :default: False |
120 | 131 | |
121 | - When this variable is True, the social networks fields, like Facebook and | |
132 | + When this variable is True, the social networks fields, like Facebook and | |
122 | 133 | Twitter, are added in user profile. By default, this fields are disabled. |
123 | 134 | |
124 | 135 | Auth | ... | ... |
... | ... | @@ -0,0 +1,11 @@ |
1 | +SECRET_KEY = 'ddddddddddddddddddddddddddddddddddddddddddddddddddddddaddddddddd' | |
2 | + | |
3 | +DATABASES = { | |
4 | + 'default': { | |
5 | + 'ENGINE': 'django.db.backends.postgresql_psycopg2', | |
6 | + 'HOST': 'localhost', | |
7 | + 'NAME': 'colab', | |
8 | + 'USER': 'colab', | |
9 | + 'PASSWORD': 'colab', | |
10 | + } | |
11 | +} | ... | ... |
... | ... | @@ -0,0 +1,39 @@ |
1 | +from django.utils.translation import ugettext_lazy as _ | |
2 | + | |
3 | +name = 'colab.plugins.gitlab' | |
4 | +verbose_name = 'Gitlab Proxy' | |
5 | + | |
6 | +upstream = 'localhost' | |
7 | +#middlewares = [] | |
8 | + | |
9 | +menu = { | |
10 | +'title': _('Code'), | |
11 | +'links': ( | |
12 | + (_('Public Projects'), 'public/projects'), | |
13 | +), | |
14 | +'auth_links': ( | |
15 | + (_('Profile'), 'profile'), | |
16 | + (_('New Project'), 'projects/new'), | |
17 | + (_('Projects'), 'dashboard/projects'), | |
18 | + (_('Groups'), 'profile/groups'), | |
19 | + (_('Issues'), 'dashboard/issues'), | |
20 | + (_('Merge Requests'), 'dashboard/merge_requests'), | |
21 | + | |
22 | +), | |
23 | +} | |
24 | + | |
25 | + | |
26 | +# dpaste: | |
27 | +# dependencies: | |
28 | +# - 'mptt' | |
29 | +# urls: | |
30 | +# include: 'dpaste.urls.dpaste' | |
31 | +# prefix: '^paste/' | |
32 | +# namespace: 'dpaste' | |
33 | +# menu: | |
34 | +# title: 'Dpaste' | |
35 | +# links: | |
36 | +# Public Projects: '/paste' | |
37 | +# auth_links: | |
38 | +# Profile: '/projects' | |
39 | +# New Project: '/projects/new' | ... | ... |
tests/run.py
... | ... | @@ -4,7 +4,9 @@ import os |
4 | 4 | import sys |
5 | 5 | |
6 | 6 | os.environ['DJANGO_SETTINGS_MODULE'] = 'tests.settings' |
7 | -os.environ['COLAB_SETTINGS'] = 'tests/settings.yaml' | |
7 | +os.environ['COLAB_SETTINGS'] = 'tests/config_settings.py' | |
8 | +os.environ['COLAB_YAML_SETTINGS'] = 'tests/settings.yaml' | |
9 | +os.environ['COLAB_PLUGINS'] = 'tests/plugins.d' | |
8 | 10 | os.environ['COVERAGE_PROCESS_START'] = '.coveragerc' |
9 | 11 | os.environ['REUSE_DB'] = '0' |
10 | 12 | ... | ... |
tests/settings.yaml
... | ... | @@ -1,73 +0,0 @@ |
1 | - | |
2 | - | |
3 | -## Set to false in production | |
4 | -DEBUG: true | |
5 | -TEMPLATE_DEBUG: true | |
6 | - | |
7 | -## System admins | |
8 | -ADMINS: &admin | |
9 | - - | |
10 | - - John Foo | |
11 | - - john@example.com | |
12 | - - | |
13 | - - Mary Bar | |
14 | - - mary@example.com | |
15 | - | |
16 | -MANAGERS: *admin | |
17 | - | |
18 | -COLAB_FROM_ADDRESS: '"Colab" <noreply@example.com>' | |
19 | -SERVER_EMAIL: '"Colab" <noreply@example.com>' | |
20 | - | |
21 | -EMAIL_HOST: localhost | |
22 | -EMAIL_PORT: 25 | |
23 | -EMAIL_SUBJECT_PREFIX: '[colab]' | |
24 | - | |
25 | -SECRET_KEY: 'hu8-)szdcjjsz%f02gt$5djbluxc$v0a%01l)di6oi)np7%8lu' | |
26 | - | |
27 | -# Must use it without trailing slash | |
28 | -SITE_URL: 'http://localhost:8000' | |
29 | -BROWSERID_AUDIENCES: | |
30 | - - http://localhost:8000 | |
31 | -# - http://example.com | |
32 | -# - https://example.org | |
33 | -# - http://example.net | |
34 | - | |
35 | -ALLOWED_HOSTS: | |
36 | - - localhost | |
37 | -# - example.com | |
38 | -# - example.org | |
39 | -# - example.net | |
40 | - | |
41 | -### Uncomment to enable Broswer ID protocol for authentication | |
42 | -# BROWSERID_ENABLED: True | |
43 | - | |
44 | -### Uncomment to enable Converse.js | |
45 | -# CONVERSEJS_ENABLED: True | |
46 | - | |
47 | -### Uncomment to enable auto-registration | |
48 | -# CONVERSEJS_AUTO_REGISTER: 'xmpp.example.com' | |
49 | - | |
50 | -## Database settings | |
51 | -DATABASES: | |
52 | - default: | |
53 | - ENGINE: django.db.backends.postgresql_psycopg2 | |
54 | - HOST: localhost | |
55 | - NAME: colab | |
56 | - USER: colab | |
57 | - PASSWORD: colab | |
58 | - | |
59 | -## Disable indexing | |
60 | -ROBOTS_NOINDEX: false | |
61 | - | |
62 | -### Log errors to Sentry instance | |
63 | -# RAVEN_DSN: 'http://public:secret@example.com/1' | |
64 | - | |
65 | -### Colab proxied apps | |
66 | -COLAB_APPS: | |
67 | - colab.plugins.gitlab: | |
68 | - upstream: 'http://localhost:8090/gitlab/' | |
69 | - private_token: '' | |
70 | -# colab.plugins.trac: | |
71 | -# upstream: 'http://localhost:5000/trac/' | |
72 | - | |
73 | - |