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 import os.path
30 import sys
31 import datetime
32 import logging
33 import omero
34 import omero.config
35 import omero.clients
36 import tempfile
37 import re
38
39 from django.utils import simplejson as json
40 from portalocker import LockException
41
42 logger = logging.getLogger(__name__)
43
44
45
46
47
48
49 if os.environ.has_key('OMERO_HOME'):
50 OMERO_HOME =os.environ.get('OMERO_HOME')
51 else:
52 OMERO_HOME = os.path.join(os.path.dirname(__file__), '..', '..', '..')
53 OMERO_HOME = os.path.normpath(OMERO_HOME)
54
55 INSIGHT_JARS = os.path.join(OMERO_HOME, "lib", "insight").replace('\\','/')
56 WEBSTART = False
57 if os.path.isdir(INSIGHT_JARS):
58 WEBSTART = True
59
60
61 LOGDIR = os.path.join(OMERO_HOME, 'var', 'log').replace('\\','/')
62
63 if not os.path.isdir(LOGDIR):
64 try:
65 os.makedirs(LOGDIR)
66 except Exception, x:
67 exctype, value = sys.exc_info()[:2]
68 raise exctype, value
69
70
71
72
73
74 LOGGING = {
75 'version': 1,
76 'disable_existing_loggers': True,
77 'formatters': {
78 'standard': {
79 'format': '%(asctime)s %(levelname)5.5s [%(name)40.40s] (proc.%(process)5.5d) %(funcName)s:%(lineno)d %(message)s'
80 },
81 },
82 'handlers': {
83 'default': {
84 'level':'DEBUG',
85 'class':'logging.handlers.RotatingFileHandler',
86 'filename': os.path.join(LOGDIR, 'OMEROweb.log').replace('\\','/'),
87 'maxBytes': 1024*1024*5,
88 'backupCount': 5,
89 'formatter':'standard',
90 },
91 'request_handler': {
92 'level':'DEBUG',
93 'class':'logging.handlers.RotatingFileHandler',
94 'filename': os.path.join(LOGDIR, 'OMEROweb_request.log').replace('\\','/'),
95 'maxBytes': 1024*1024*5,
96 'backupCount': 5,
97 'formatter':'standard',
98 },
99 'null': {
100 'level':'DEBUG',
101 'class':'django.utils.log.NullHandler',
102 },
103 'console':{
104 'level':'DEBUG',
105 'class':'logging.StreamHandler',
106 'formatter': 'standard'
107 },
108 },
109 'loggers': {
110 'django.request': {
111 'handlers': ['request_handler'],
112 'level': 'DEBUG',
113 'propagate': False
114 },
115 'django': {
116 'handlers': ['null'],
117 'level': 'DEBUG',
118 'propagate': True
119 },
120 '': {
121 'handlers': ['default'],
122 'level': 'DEBUG',
123 'propagate': True
124 }
125 }
126 }
127
128
129
130 from omero.util.concurrency import get_event
131 CONFIG_XML = os.path.join(OMERO_HOME, 'etc', 'grid', 'config.xml')
132 count = 10
133 event = get_event("websettings")
134
135 while True:
136 try:
137 CONFIG_XML = omero.config.ConfigXml(CONFIG_XML)
138 CUSTOM_SETTINGS = CONFIG_XML.as_map()
139 CONFIG_XML.close()
140 break
141 except LockException:
142
143 exctype, value = sys.exc_info()[:2]
144 count -= 1
145 if not count:
146 raise exctype, value
147 else:
148 event.wait(1)
149 except:
150
151 exctype, value = sys.exc_info()[:2]
152 raise exctype, value
153
154 del event
155 del count
156 del get_event
157
158 FASTCGI = "fastcgi"
159 FASTCGITCP = "fastcgi-tcp"
160 FASTCGI_TYPES = (FASTCGI, FASTCGITCP)
161 DEVELOPMENT = "development"
162 DEFAULT_SERVER_TYPE = FASTCGITCP
163 ALL_SERVER_TYPES = (FASTCGITCP, FASTCGI, DEVELOPMENT)
164
165 DEFAULT_SESSION_ENGINE = 'django.contrib.sessions.backends.file'
166 SESSION_ENGINE_VALUES = ('django.contrib.sessions.backends.db',
167 'django.contrib.sessions.backends.file',
168 'django.contrib.sessions.backends.cache',
169 'django.contrib.sessions.backends.cached_db')
170
172 s = s.strip().lower()
173 if s in ('true', '1', 't'):
174 return True
175 return False
176
178 return [os.path.normpath(path) for path in json.loads(s)]
179
184
189
192
194 if s is not None and len(s) > 0:
195 if s.endswith("/"):
196 s = s[:-1]
197 return s
198
201
203 if s is None:
204 raise LeaveUnset()
205 return s
206
211
212 CUSTOM_SETTINGS_MAPPINGS = {
213 "omero.web.apps": ["ADDITIONAL_APPS", '[]', json.loads],
214 "omero.web.public.enabled": ["PUBLIC_ENABLED", "false", parse_boolean],
215 "omero.web.public.url_filter": ["PUBLIC_URL_FILTER", r'^/(?!webadmin)', re.compile],
216 "omero.web.public.server_id": ["PUBLIC_SERVER_ID", 1, int],
217 "omero.web.public.user": ["PUBLIC_USER", None, leave_none_unset],
218 "omero.web.public.password": ["PUBLIC_PASSWORD", None, leave_none_unset],
219 "omero.web.public.cache.enabled": ["PUBLIC_CACHE_ENABLED", "false", parse_boolean],
220 "omero.web.public.cache.key": ["PUBLIC_CACHE_KEY", "omero.web.public.cache.key", str],
221 "omero.web.public.cache.timeout": ["PUBLIC_CACHE_TIMEOUT", 60 * 60 * 24, int],
222 "omero.web.databases": ["DATABASES", '{}', json.loads],
223 "omero.web.admins": ["ADMINS", '[]', json.loads],
224 "omero.web.application_server": ["APPLICATION_SERVER", DEFAULT_SERVER_TYPE, check_server_type],
225 "omero.web.application_server.host": ["APPLICATION_SERVER_HOST", "0.0.0.0", str],
226 "omero.web.application_server.port": ["APPLICATION_SERVER_PORT", "4080", str],
227 "omero.web.application_server.max_requests": ["APPLICATION_SERVER_MAX_REQUESTS", 400, int],
228 "omero.web.ping_interval": ["PING_INTERVAL", 60000, int],
229 "omero.web.force_script_name": ["FORCE_SCRIPT_NAME", None, leave_none_unset],
230 "omero.web.static_url": ["STATIC_URL", "/static/", str],
231 "omero.web.staticfile_dirs": ["STATICFILES_DIRS", '[]', json.loads],
232 "omero.web.index_template": ["INDEX_TEMPLATE", None, identity],
233 "omero.web.caches": ["CACHES", '{}', json.loads],
234 "omero.web.webgateway_cache": ["WEBGATEWAY_CACHE", None, leave_none_unset],
235 "omero.web.session_engine": ["SESSION_ENGINE", DEFAULT_SESSION_ENGINE, check_session_engine],
236 "omero.web.debug": ["DEBUG", "false", parse_boolean],
237 "omero.upgrades.url": ["UPGRADES_URL", "http://upgrade.openmicroscopy.org.uk/", str],
238 "omero.web.email_host": ["EMAIL_HOST", None, identity],
239 "omero.web.email_host_password": ["EMAIL_HOST_PASSWORD", None, identity],
240 "omero.web.email_host_user": ["EMAIL_HOST_USER", None, identity],
241 "omero.web.email_port": ["EMAIL_PORT", None, identity],
242 "omero.web.email_subject_prefix": ["EMAIL_SUBJECT_PREFIX", "[OMERO.web] ", str],
243 "omero.web.email_use_tls": ["EMAIL_USE_TLS", "false", parse_boolean],
244 "omero.web.logdir": ["LOGDIR", LOGDIR, str],
245 "omero.web.login_view": ["LOGIN_VIEW", "weblogin", str],
246 "omero.web.send_broken_link_emails": ["SEND_BROKEN_LINK_EMAILS", "true", parse_boolean],
247 "omero.web.server_email": ["SERVER_EMAIL", None, identity],
248 "omero.web.server_list": ["SERVER_LIST", '[["localhost", 4064, "omero"]]', json.loads],
249
250 "omero.web.viewer.initial_zoom_level": ["VIEWER_INITIAL_ZOOM_LEVEL", None, leave_none_unset_int],
251
252 "omero.web.open_astex_max_side": ["OPEN_ASTEX_MAX_SIDE", 400, int],
253 "omero.web.open_astex_min_side": ["OPEN_ASTEX_MIN_SIDE", 20, int],
254 "omero.web.open_astex_max_voxels": ["OPEN_ASTEX_MAX_VOXELS", 27000000, int],
255 "omero.web.scripts_to_ignore": ["SCRIPTS_TO_IGNORE", '["/omero/figure_scripts/Movie_Figure.py", '\
256 '"/omero/figure_scripts/Split_View_Figure.py", "/omero/figure_scripts/Thumbnail_Figure.py", '\
257 '"/omero/figure_scripts/ROI_Split_Figure.py", "/omero/export_scripts/Make_Movie.py",'\
258 '"/omero/setup_scripts/FLIM_initialise.py", "/omero/import_scripts/Populate_ROI.py"]', parse_paths],
259
260
261 "omero.web.ui.top_links": ["TOP_LINKS", '[]', json.loads],
262
263
264 "omero.web.ui.right_plugins": ["RIGHT_PLUGINS", '[["Acquisition", "webclient/data/includes/right_plugin.acquisition.js.html", "metadata_tab"],'\
265
266 '["Preview", "webclient/data/includes/right_plugin.preview.js.html", "preview_tab"]]', json.loads],
267
268
269 "omero.web.ui.center_plugins": ["CENTER_PLUGINS", '['\
270
271 ']'
272 , json.loads],
273
274
275
276
277
278
279 "omero.web.webstart_jar": ["WEBSTART_JAR", "omero.insight.jar", str],
280 "omero.web.webstart_icon": ["WEBSTART_ICON", "webstart/img/icon-omero-insight.png", str],
281 "omero.web.webstart_heap": ["WEBSTART_HEAP", "1024m", str],
282 "omero.web.webstart_host": ["WEBSTART_HOST", "localhost", str],
283 "omero.web.webstart_port": ["WEBSTART_PORT", "4064", str],
284 "omero.web.webstart_class": ["WEBSTART_CLASS", "org.openmicroscopy.shoola.Main", str],
285 "omero.web.webstart_title": ["WEBSTART_TITLE", "OMERO.insight", str],
286 "omero.web.webstart_vendor": ["WEBSTART_VENDOR", "The Open Microscopy Environment", str],
287 "omero.web.webstart_homepage": ["WEBSTART_HOMEPAGE", "http://www.openmicroscopy.org", str],
288 "omero.web.nanoxml_jar": ["NANOXML_JAR", "nanoxml.jar", str],
289 }
290
292 logging.info('Processing custom settings for module %s' % module.__name__)
293 for key, values in getattr(module, 'CUSTOM_SETTINGS_MAPPINGS', {}).items():
294
295
296
297 if len(values) == 4:
298 continue
299
300 global_name, default_value, mapping = values
301
302 try:
303 global_value = CUSTOM_SETTINGS[key]
304 values.append(False)
305 except KeyError:
306 global_value = default_value
307 values.append(True)
308
309 try:
310 setattr(module, global_name, mapping(global_value))
311 except ValueError:
312 raise ValueError("Invalid %s JSON: %r" % (global_name, global_value))
313 except LeaveUnset:
314 pass
315
316 process_custom_settings(sys.modules[__name__])
317
318
319 if not DEBUG:
320 LOGGING['loggers']['django.request']['level'] = 'INFO'
321 LOGGING['loggers']['django']['level'] = 'INFO'
322 LOGGING['loggers']['']['level'] = 'INFO'
323
324
325
326
327
328
329
330
331 TEMPLATE_DEBUG = DEBUG
332
334 from django.views.debug import cleanse_setting
335 custom_settings_mappings = getattr(module, 'CUSTOM_SETTINGS_MAPPINGS', {})
336 for key in sorted(custom_settings_mappings):
337 values = custom_settings_mappings[key]
338 global_name, default_value, mapping, using_default = values
339 source = using_default and "default" or key
340 global_value = getattr(module, global_name, None)
341 if global_name.isupper():
342 logger.debug("%s = %r (source:%s)", global_name, cleanse_setting(global_name, global_value), source)
343
344 report_settings(sys.modules[__name__])
345
346 SITE_ID = 1
347
348
349
350
351
352
353 TIME_ZONE = 'Europe/London'
354 FIRST_DAY_OF_WEEK = 0
355
356
357
358 LANGUAGE_CODE = 'en-gb'
359
360
361
362
363
364 SECRET_KEY = '@@k%g#7=%4b6ib7yr1tloma&g0s2nni6ljf!m0h&x9c712c7yj'
365
366
367
368
369 USE_I18N = True
370
371
372
373 MIDDLEWARE_CLASSES = (
374 'django.middleware.common.CommonMiddleware',
375 'django.contrib.sessions.middleware.SessionMiddleware',
376
377 'django.contrib.messages.middleware.MessageMiddleware',
378 )
379
380
381
382
383
384 ROOT_URLCONF = 'omeroweb.urls'
385
386
387
388
389
390 STATICFILES_FINDERS = (
391 "django.contrib.staticfiles.finders.FileSystemFinder",
392 "django.contrib.staticfiles.finders.AppDirectoriesFinder"
393 )
394
395
396
397
398
399
400
401
402
403
404 STATIC_ROOT = os.path.join(os.path.dirname(__file__), 'static').replace('\\','/')
405
406
407
408
409 if WEBSTART:
410 STATICFILES_DIRS += (("webstart/jars", INSIGHT_JARS),)
411
412
413
414
415 TEMPLATE_CONTEXT_PROCESSORS = (
416 "django.core.context_processors.debug",
417 "django.core.context_processors.i18n",
418 "django.core.context_processors.media",
419 "django.core.context_processors.static",
420 "django.contrib.messages.context_processors.messages"
421 )
422
423
424
425
426
427 TEMPLATE_LOADERS = (
428 'django.template.loaders.filesystem.Loader',
429 'django.template.loaders.app_directories.Loader',
430 )
431
432
433
434
435
436
437
438
439
440
441 INSTALLED_APPS = (
442 'django.contrib.staticfiles',
443 'django.contrib.markup',
444 'django.contrib.auth',
445 'django.contrib.contenttypes',
446 'django.contrib.sessions',
447 'django.contrib.sites',
448 'omeroweb.feedback',
449 'omeroweb.webadmin',
450 'omeroweb.webclient',
451 'omeroweb.webgateway',
452 'omeroweb.webtest',
453 'omeroweb.webredirect',
454 'omeroweb.webstart',
455
456 )
457
458
459
460 for app in ADDITIONAL_APPS:
461
462
463
464
465
466
467 try:
468 __import__('omeroweb.%s' % app)
469 INSTALLED_APPS += ('omeroweb.%s' % app,)
470 except ImportError:
471 INSTALLED_APPS += (app,)
472 try:
473 logger.debug('Attempting to import additional app settings for app: %s' % app)
474 module = __import__('%s.settings' % app)
475 process_custom_settings(module.settings)
476 report_settings(module.settings)
477 except ImportError:
478 logger.debug("Couldn't import settings from app: %s" % app)
479
480 logger.debug('INSTALLED_APPS=%s' % [INSTALLED_APPS])
481
482
483
484
485 FEEDBACK_URL = "qa.openmicroscopy.org.uk:80"
486
487
488
489
490
491
492
493
494
495 SESSION_FILE_PATH = tempfile.gettempdir()
496
497
498 SESSION_EXPIRE_AT_BROWSER_CLOSE = True
499
500
501 SESSION_COOKIE_AGE = 86400
502
503
504 FILE_UPLOAD_TEMP_DIR = tempfile.gettempdir()
505
506
507
508 FILE_UPLOAD_MAX_MEMORY_SIZE = 2621440
509
510
511
512 DEFAULT_IMG = os.path.join(os.path.dirname(__file__), 'webgateway', 'static', 'webgateway', 'img', 'image128.png').replace('\\','/')
513
514
515
516 DEFAULT_USER = os.path.join(os.path.dirname(__file__), 'webgateway', 'static', 'webgateway', 'img', 'personal32.png').replace('\\','/')
517
518
519
520 MANAGERS = ADMINS
521
522
523 try:
524 PAGE
525 except:
526 PAGE = 200
527
528 EMAIL_TEMPLATES = {
529 'create_share': {
530 'html_content':'<p>Hi,</p><p>I would like to share some of my data with you.<br/>Please find it on the <a href="%s?server=%i">%s?server=%i</a>.</p><p>%s</p>',
531 'text_content':'Hi, I would like to share some of my data with you. Please find it on the %s?server=%i. /n %s'
532 },
533 'add_member_to_share': {
534 'html_content':'<p>Hi,</p><p>I would like to share some of my data with you.<br/>Please find it on the <a href="%s?server=%i">%s?server=%i</a>.</p><p>%s</p>',
535 'text_content':'Hi, I would like to share some of my data with you. Please find it on the %s?server=%i. /n %s'
536 },
537 'remove_member_from_share': {
538 'html_content':'<p>You were removed from the share <a href="%s?server=%i">%s?server=%i</a>. This share is no longer available for you.</p>',
539 'text_content':'You were removed from the share %s?server=%i. This share is no longer available for you.'
540 },
541 'add_comment_to_share': {
542 'html_content':'<p>New comment is available on share <a href="%s?server=%i">%s?server=%i</a>.</p>',
543 'text_content':'New comment is available on share %s?server=%i.'
544 }
545 }
546
547
548 from connector import Server
554 load_server_list()
555