This repository has been archived on 2023-02-21. You can view files and clone it, but cannot push or open issues or pull requests.
lcs/lcs/admin/settings.ptl

284 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>'
'<h2>%s</h2>' % _('Import / Export')
'<dl>'
'<dt><a href="import">%s</a></dt> <dd>%s</dd>' % (
_('Import'), _('Import data from another site'))
'<dt><a href="export">%s</a></dt> <dd>%s</dd>' % (
_('Export'), _('Export data for another site'))
'</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('.')