276 lines
11 KiB
Plaintext
276 lines
11 KiB
Plaintext
import cStringIO
|
|
import cPickle
|
|
import re
|
|
import os
|
|
import lasso
|
|
import glob
|
|
import zipfile
|
|
import base64
|
|
|
|
from quixote import get_publisher, get_request, get_response, redirect
|
|
from quixote.directory import Directory, AccessControlled
|
|
|
|
from menu import *
|
|
|
|
from qommon import misc, get_cfg
|
|
from qommon.form import *
|
|
|
|
from qommon.admin.emails import EmailsDirectory
|
|
import qommon.ident
|
|
|
|
def cfg_submit(form, cfg_key, fields):
|
|
get_publisher().reload_cfg()
|
|
cfg_key = str(cfg_key)
|
|
cfg_dict = get_cfg(cfg_key, {})
|
|
for k in fields:
|
|
cfg_dict[str(k)] = form.get_widget(k).parse()
|
|
get_publisher().cfg[cfg_key] = cfg_dict
|
|
get_publisher().write_cfg()
|
|
|
|
class IdentificationDirectory(Directory):
|
|
_q_exports = ['']
|
|
|
|
def _q_index [html] (self):
|
|
get_response().breadcrumb.append( ('identification/', _('Identification')) )
|
|
identification_cfg = get_cfg('identification', {})
|
|
form = Form(enctype='multipart/form-data')
|
|
form.add(CheckboxesWidget, 'methods', title = _('Methods'),
|
|
value = identification_cfg.get('methods'),
|
|
elements = [
|
|
('idp', _('Delegated to Liberty/SAML2 identity provider')),
|
|
('password', _('Simple local username / password')),
|
|
],
|
|
inline = False)
|
|
|
|
form.add_submit('submit', _('Submit'))
|
|
form.add_submit('cancel', _('Cancel'))
|
|
if form.get_widget('cancel').parse():
|
|
return redirect('..')
|
|
|
|
if not form.is_submitted() or form.has_errors():
|
|
html_top('settings', title = _('Identification'))
|
|
'<h2>%s</h2>' % _('Identification')
|
|
form.render()
|
|
else:
|
|
cfg_submit(form, 'identification', ['methods'])
|
|
return redirect('..')
|
|
|
|
def _q_lookup(self, component):
|
|
get_response().breadcrumb.append( ('identification/', _('Identification')) )
|
|
return qommon.ident.get_method_admin_directory(component)
|
|
|
|
|
|
class SettingsDirectory(AccessControlled, Directory):
|
|
_q_exports = ['', 'themes', 'users',
|
|
'template', 'emails', 'debug_options', 'language',
|
|
'identification', 'sitename']
|
|
|
|
emails = EmailsDirectory()
|
|
identification = IdentificationDirectory()
|
|
|
|
def _q_access(self):
|
|
get_response().breadcrumb.append( ('settings/', _('Settings')) )
|
|
|
|
def _q_index [html] (self):
|
|
html_top('settings', title = _('Settings'))
|
|
|
|
'<dl> <dt><a href="identification/">%s</a></dt> <dd>%s</dd>' % (
|
|
_('Identification'), _('Configure identification parameters'))
|
|
|
|
identification_cfg = get_cfg('identification', {})
|
|
for method in identification_cfg.get('methods', []):
|
|
try:
|
|
method_admin = qommon.ident.get_method_admin_directory(method)
|
|
except AttributeError:
|
|
continue
|
|
|
|
'<dl> <dt><a href="identification/%s/">%s</a></dt> <dd>%s</dd>' % (
|
|
method, _(method_admin.title), _(method_admin.label))
|
|
|
|
'<h2>%s</h2>' % _('Customisation')
|
|
|
|
'<dl>'
|
|
'<dt><a href="sitename">%s</a></dt> <dd>%s</dd>' % (
|
|
_('Site Name'), _('Configure site name'))
|
|
'<dt><a href="language">%s</a></dt> <dd>%s</dd>' % (
|
|
_('Language'), _('Configure site language'))
|
|
'<dt><a href="themes">%s</a></dt> <dd>%s</dd>' % (
|
|
_('Theme'), _('Configure theme'))
|
|
'<dt><a href="template">%s</a></dt> <dd>%s</dd>' % (
|
|
_('Template'), _('Configure template'))
|
|
'<dt><a href="emails/">%s</a></dt> <dd>%s</dd>' % (
|
|
_('Emails'), _('Configure email settings'))
|
|
'</dl>'
|
|
|
|
'<h2>%s</h2>' % _('Misc')
|
|
'<dl>'
|
|
'<dt><a href="misc">%s</a></dt> <dd>%s</dd>' % (
|
|
_('Misc'), _('Configure misc options'))
|
|
'<dt><a href="debug_options">%s</a></dt> <dd>%s</dd>' % (
|
|
_('Debug Options'), _('Configure options useful for debugging'))
|
|
'</dl>'
|
|
|
|
|
|
def themes [html] (self):
|
|
import xml.dom.minidom
|
|
|
|
def getText(nodelist):
|
|
rc = ""
|
|
for node in nodelist:
|
|
if node.nodeType == node.TEXT_NODE:
|
|
rc = rc + node.data
|
|
return rc.encode('iso-8859-1')
|
|
|
|
request = get_request()
|
|
|
|
if not request.form.has_key('theme'):
|
|
current_theme = get_cfg('branding', {}).get('theme', 'default')
|
|
|
|
get_response().breadcrumb.append(('themes', _('Themes')))
|
|
html_top('settings', title = _('Themes'))
|
|
"<h2>%s</h2>" % _('Themes')
|
|
'<form action="themes" enctype="multipart/form-data" method="post">'
|
|
theme_files = glob.glob(os.path.join(get_publisher().DATA_DIR, str('themes/*/desc.xml')))
|
|
theme_files.sort()
|
|
'<ul class="biglist">'
|
|
for t in theme_files:
|
|
dom = xml.dom.minidom.parseString(open(t).read())
|
|
theme = dom.getElementsByTagName('theme')[0].attributes['name'].value.encode(
|
|
str('iso-8859-1'))
|
|
if current_theme == theme:
|
|
checked = ' checked="checked"'
|
|
else:
|
|
checked = ''
|
|
'<li>'
|
|
'<strong class="label">'
|
|
' <input name="theme" value="%s" type="radio"%s>%s</input></strong>' % (
|
|
theme, checked, getText(dom.getElementsByTagName('label')[0].childNodes))
|
|
icon_file = t.replace(str('desc.xml'), str('icon.png'))
|
|
if os.path.exists(icon_file):
|
|
'<img src="/themes/%s/icon.png" alt="" class="theme-icon" />' % theme
|
|
'<p class="details">%s<br/>by %s</p>' % (
|
|
getText(dom.getElementsByTagName('desc')[0].childNodes),
|
|
getText(dom.getElementsByTagName('author')[0].childNodes))
|
|
'</li>'
|
|
'</ul>'
|
|
'<div class="buttons">'
|
|
'<input type="submit" name="submit" value="%s" />' % _('Submit')
|
|
'</div>'
|
|
'</form>'
|
|
else:
|
|
if not misc.cfg.has_key('branding'):
|
|
misc.cfg[str('branding')] = {}
|
|
misc.cfg[str('branding')][str('theme')] = str(request.form['theme'])
|
|
misc.write_cfg()
|
|
return redirect('.')
|
|
|
|
|
|
def template [html] (self):
|
|
from qommon.template import DEFAULT_TEMPLATE_EZT
|
|
branding_cfg = get_cfg('branding', {})
|
|
template = branding_cfg.get('template', DEFAULT_TEMPLATE_EZT)
|
|
form = Form(enctype="multipart/form-data")
|
|
form.add(TextWidget, 'template', title = _('Site Template'), value = template,
|
|
cols = 80, rows = 25)
|
|
form.add_submit("submit", _("Submit"))
|
|
form.add_submit("cancel", _("Cancel"))
|
|
if form.get_widget('cancel').parse():
|
|
return redirect('.')
|
|
|
|
if not form.is_submitted() or form.has_errors():
|
|
get_response().breadcrumb.append(('template', _('Template')))
|
|
html_top('settings', title = _('Template'))
|
|
'<h2>%s</h2>' % _('Template')
|
|
form.render()
|
|
else:
|
|
self.template_submit(form)
|
|
redirect('.')
|
|
|
|
|
|
def template_submit(self, form):
|
|
get_publisher().reload_cfg()
|
|
branding_cfg = get_cfg('branding', {})
|
|
template = form.get_widget('template').parse()
|
|
if template == DEFAULT_TEMPLATE_EZT or not template:
|
|
if branding_cfg.has_key('template'):
|
|
del branding_cfg['template']
|
|
else:
|
|
branding_cfg['template'] = template
|
|
misc.cfg['branding'] = branding_cfg
|
|
get_publisher().write_cfg()
|
|
|
|
|
|
def debug_options [html] (self):
|
|
form = Form(enctype="multipart/form-data")
|
|
debug_cfg = get_cfg('debug', {})
|
|
form.add(StringWidget, 'error_email', title = _('Email for Tracebacks'),
|
|
value = debug_cfg.get('error_email', ''))
|
|
form.add(SingleSelectWidget, 'display_exceptions', title = _('Display Exceptions'),
|
|
value = debug_cfg.get('display_exceptions', ''),
|
|
options = [ (str(''), _('No display')),
|
|
(str('text'), _('Display as Text')),
|
|
(str('text-in-html'), _('Display as Text in HTML an error page')),
|
|
(str('html'), _('Display as HTML')) ])
|
|
form.add(CheckboxWidget, 'logger', title = _('Logger'),
|
|
value = debug_cfg.get('logger', False))
|
|
form.add(CheckboxWidget, 'debug_mode', title = _('Enable debug mode'),
|
|
value = debug_cfg.get('debug_mode', False))
|
|
form.add_submit('submit', _('Submit'))
|
|
form.add_submit('cancel', _('Cancel'))
|
|
|
|
if form.get_widget('cancel').parse():
|
|
return redirect('.')
|
|
|
|
if not form.is_submitted() or form.has_errors():
|
|
get_response().breadcrumb.append(('debug_options', _('Debug Options')))
|
|
html_top('settings', title = _('Debug Options'))
|
|
'<h2>%s</h2>' % _('Debug Options')
|
|
form.render()
|
|
else:
|
|
cfg_submit(form, 'debug', ('error_email', 'display_exceptions', 'logger', 'debug_mode'))
|
|
redirect('.')
|
|
|
|
def language [html] (self):
|
|
form = Form(enctype='multipart/form-data')
|
|
language_cfg = get_cfg('language', {})
|
|
form.add(SingleSelectWidget, 'language', title = _('Language'),
|
|
value = language_cfg.get('language'),
|
|
options = [ (None, _('System Default')),
|
|
(str('HTTP'), _('From HTTP Accept-Language header')),
|
|
(str('en'), _('English')) ] )
|
|
|
|
form.add_submit('submit', _('Submit'))
|
|
form.add_submit('cancel', _('Cancel'))
|
|
if form.get_widget('cancel').parse():
|
|
return redirect('.')
|
|
|
|
if not form.is_submitted() or form.has_errors():
|
|
get_response().breadcrumb.append(('language', _('Language')))
|
|
html_top('settings', title = _('Language'))
|
|
'<h2>%s</h2>' % _('Language')
|
|
form.render()
|
|
else:
|
|
cfg_submit(form, 'language', ['language'])
|
|
redirect('.')
|
|
|
|
def sitename [html] (self):
|
|
form = Form(enctype='multipart/form-data')
|
|
misc_cfg = get_cfg('misc', {})
|
|
form.add(StringWidget, 'sitename', title = _('Site Name'),
|
|
value = get_cfg('sitename'))
|
|
|
|
form.add_submit('submit', _('Submit'))
|
|
form.add_submit('cancel', _('Cancel'))
|
|
if form.get_widget('cancel').parse():
|
|
return redirect('.')
|
|
|
|
if not form.is_submitted() or form.has_errors():
|
|
get_response().breadcrumb.append(('sitename', _('Site Name')))
|
|
html_top('settings', title = _('Site Name'))
|
|
'<h2>%s</h2>' % _('Site Name')
|
|
form.render()
|
|
else:
|
|
cfg_submit(form, 'misc', ['sitename'])
|
|
redirect('.')
|
|
|