convert .ptl to .py files
This commit is contained in:
parent
4747ab0f5f
commit
fda091677f
|
@ -16,6 +16,7 @@
|
||||||
|
|
||||||
from quixote import get_publisher, get_request, get_response, get_session, redirect
|
from quixote import get_publisher, get_request, get_response, get_session, redirect
|
||||||
from quixote.directory import Directory, AccessControlled
|
from quixote.directory import Directory, AccessControlled
|
||||||
|
from quixote.html import TemplateIO, htmltext
|
||||||
|
|
||||||
from qommon import errors
|
from qommon import errors
|
||||||
from qommon.admin.texts import TextsDirectory
|
from qommon.admin.texts import TextsDirectory
|
||||||
|
@ -32,7 +33,7 @@ from boconfig import ConfigDirectory
|
||||||
import quota
|
import quota
|
||||||
|
|
||||||
|
|
||||||
def generate_user_info [html] ():
|
def generate_user_info():
|
||||||
# same as backoffice.menu.generate_user_info, without the admin link, but
|
# same as backoffice.menu.generate_user_info, without the admin link, but
|
||||||
# with a configuration link
|
# with a configuration link
|
||||||
if not get_request().user:
|
if not get_request().user:
|
||||||
|
@ -47,15 +48,18 @@ def generate_user_info [html] ():
|
||||||
|
|
||||||
logout_url = get_publisher().get_root_url() + 'logout'
|
logout_url = get_publisher().get_root_url() + 'logout'
|
||||||
config_url = get_publisher().get_root_url() + 'backoffice/config/'
|
config_url = get_publisher().get_root_url() + 'backoffice/config/'
|
||||||
'<ul class="user-info">'
|
|
||||||
'<li class="ui-name">%s</li>' % username
|
r = TemplateIO(html=True)
|
||||||
'<li class="ui-logout"><a href="%s">%s</a></li>' % (logout_url, _('logout'))
|
r += htmltext('<ul class="user-info">')
|
||||||
|
r += htmltext('<li class="ui-name">%s</li>') % username
|
||||||
|
r += htmltext('<li class="ui-logout"><a href="%s">%s</a></li>') % (logout_url, _('logout'))
|
||||||
|
|
||||||
if get_publisher().backoffice_help_url and \
|
if get_publisher().backoffice_help_url and \
|
||||||
get_request().language in get_publisher().backoffice_help_url:
|
get_request().language in get_publisher().backoffice_help_url:
|
||||||
help_url = get_publisher().backoffice_help_url[get_request().language]
|
help_url = get_publisher().backoffice_help_url[get_request().language]
|
||||||
'<li class="ui-help"><a href="%s">%s</a></li>' % (help_url, _('help'))
|
r += htmltext('<li class="ui-help"><a href="%s">%s</a></li>') % (help_url, _('help'))
|
||||||
'</ul>'
|
r += htmltext('</ul>')
|
||||||
|
return r.getvalue()
|
||||||
|
|
||||||
qommon.backoffice.menu.generate_user_info = generate_user_info
|
qommon.backoffice.menu.generate_user_info = generate_user_info
|
||||||
|
|
||||||
|
@ -120,64 +124,67 @@ class RootDirectory(AccessControlled, Directory):
|
||||||
|
|
||||||
self.create_asec_objects()
|
self.create_asec_objects()
|
||||||
|
|
||||||
def _q_index [html] (self):
|
def _q_index(self):
|
||||||
get_response().breadcrumb = [ ('backoffice/', _('Back Office of your site')) ]
|
get_response().breadcrumb = [ ('backoffice/', _('Back Office of your site')) ]
|
||||||
html_top('', _('Questionnaires'))
|
html_top('', _('Questionnaires'))
|
||||||
|
r = TemplateIO(html=True)
|
||||||
|
|
||||||
if quota.is_expired():
|
if quota.is_expired():
|
||||||
TextsDirectory.get_html_text('asec-expired-site-backoffice')
|
r += TextsDirectory.get_html_text('asec-expired-site-backoffice')
|
||||||
|
|
||||||
formdefs = FormDef.select(order_by='name', ignore_errors=True)
|
formdefs = FormDef.select(order_by='name', ignore_errors=True)
|
||||||
|
|
||||||
if formdefs:
|
if formdefs:
|
||||||
'<h2>%s</h2>' % _('Existing Questionnaires')
|
r += htmltext('<h2>%s</h2>') % _('Existing Questionnaires')
|
||||||
|
|
||||||
'<ul class="biglist" id="all-forms">'
|
r += htmltext('<ul class="biglist" id="all-forms">')
|
||||||
for formdef in formdefs:
|
for formdef in formdefs:
|
||||||
if formdef.disabled:
|
if formdef.disabled:
|
||||||
'<li class="disabled">'
|
r += htmltext('<li class="disabled">')
|
||||||
else:
|
else:
|
||||||
'<li>'
|
r += htmltext('<li>')
|
||||||
'<strong class="label"><a href="forms/%s/">%s</a></strong>' % (formdef.id, formdef.name)
|
r += htmltext('<strong class="label"><a href="forms/%s/">%s</a></strong>') % (formdef.id, formdef.name)
|
||||||
'</li>'
|
r += htmltext('</li>')
|
||||||
'</ul>'
|
r += htmltext('</ul>')
|
||||||
|
|
||||||
if quota.may_add_a_new_form():
|
if quota.may_add_a_new_form():
|
||||||
'<h2>%s</h2>' % _('New Questionnaire')
|
r += htmltext('<h2>%s</h2>') % _('New Questionnaire')
|
||||||
|
|
||||||
form = Form(enctype='multipart/form-data', action='new')
|
form = Form(enctype='multipart/form-data', action='new')
|
||||||
form.add(StringWidget, 'name', title=_('Title'), size=40, required=True)
|
form.add(StringWidget, 'name', title=_('Title'), size=40, required=True)
|
||||||
form.add_submit('submit', _('Create New Questionnaire'))
|
form.add_submit('submit', _('Create New Questionnaire'))
|
||||||
form.render()
|
r += form.render()
|
||||||
|
|
||||||
get_response().filter['sidebar'] = self.get_sidebar()
|
get_response().filter['sidebar'] = self.get_sidebar()
|
||||||
|
return r.getvalue()
|
||||||
|
|
||||||
def get_sidebar [html] (self):
|
def get_sidebar(self):
|
||||||
# manually add those scripts, as the sidebar is not parsed when looking
|
# manually add those scripts, as the sidebar is not parsed when looking
|
||||||
# for popup links
|
# for popup links
|
||||||
|
|
||||||
get_response().add_javascript(['jquery.js', 'simplemodal/jquery.simplemodal.js', 'popup.js'])
|
get_response().add_javascript(['jquery.js', 'simplemodal/jquery.simplemodal.js', 'popup.js'])
|
||||||
'<div class="bo-block">'
|
r = TemplateIO(html=True)
|
||||||
'<h3>%s</h3>' % _('Your Profile')
|
r += htmltext('<div class="bo-block">')
|
||||||
|
r += htmltext('<h3>%s</h3>') % _('Your Profile')
|
||||||
# TODO: possiblity to create additional administrator accounts?
|
# TODO: possiblity to create additional administrator accounts?
|
||||||
|
|
||||||
'<ul>'
|
r += htmltext('<ul>')
|
||||||
' <li><a href="config/contact" rel="popup">%s</a></li>' % _('Contact Information')
|
r += htmltext(' <li><a href="config/contact" rel="popup">%s</a></li>') % _('Contact Information')
|
||||||
' <li><a href="config/password" rel="popup">%s</a></li>' % _('Password Change')
|
r += htmltext(' <li><a href="config/password" rel="popup">%s</a></li>') % _('Password Change')
|
||||||
'</ul>'
|
r += htmltext('</ul>')
|
||||||
'</div>'
|
r += htmltext('</div>')
|
||||||
|
|
||||||
'<div class="bo-block">'
|
r += htmltext('<div class="bo-block">')
|
||||||
'<h3>%s</h3>' % _('Site Settings')
|
r += htmltext('<h3>%s</h3>') % _('Site Settings')
|
||||||
|
|
||||||
'<ul>'
|
r += htmltext('<ul>')
|
||||||
' <li><a href="config/sitetitle" rel="popup">%s</a></li>' % _('Title')
|
r += htmltext(' <li><a href="config/sitetitle" rel="popup">%s</a></li>') % _('Title')
|
||||||
' <li><a href="config/homepage">%s</a></li>' % _('Welcome Text')
|
r += htmltext(' <li><a href="config/homepage">%s</a></li>') % _('Welcome Text')
|
||||||
' <li><a href="config/texts/asec-recorded-vote">%s</a></li>' % _('End Text')
|
r += htmltext(' <li><a href="config/texts/asec-recorded-vote">%s</a></li>') % _('End Text')
|
||||||
if quota.can_logo() or quota.can_theme():
|
if quota.can_logo() or quota.can_theme():
|
||||||
' <li><a href="config/appearance">%s</a></li>' % _('Appearance')
|
r += htmltext(' <li><a href="config/appearance">%s</a></li>') % _('Appearance')
|
||||||
'</ul>'
|
r += htmltext('</ul>')
|
||||||
'</div>'
|
r += htmltext('</div>')
|
||||||
|
return r.getvalue()
|
||||||
|
|
||||||
def new(self):
|
def new(self):
|
||||||
if not quota.may_add_a_new_form():
|
if not quota.may_add_a_new_form():
|
|
@ -18,6 +18,7 @@ import imghdr
|
||||||
|
|
||||||
from quixote import get_request, get_response, get_session, redirect
|
from quixote import get_request, get_response, get_session, redirect
|
||||||
from quixote.directory import Directory
|
from quixote.directory import Directory
|
||||||
|
from quixote.html import TemplateIO, htmltext
|
||||||
|
|
||||||
from qommon import misc, get_cfg, get_logger
|
from qommon import misc, get_cfg, get_logger
|
||||||
from qommon.admin.cfg import cfg_submit
|
from qommon.admin.cfg import cfg_submit
|
||||||
|
@ -57,11 +58,12 @@ class ConfigDirectory(Directory):
|
||||||
del self.texts.texts_dict[k]
|
del self.texts.texts_dict[k]
|
||||||
return Directory._q_traverse(self, path)
|
return Directory._q_traverse(self, path)
|
||||||
|
|
||||||
def _q_index [html] (self):
|
def _q_index(self):
|
||||||
return redirect('..')
|
return redirect('..')
|
||||||
|
|
||||||
def contact [html] (self):
|
def contact(self):
|
||||||
get_response().breadcrumb.append( ('contact', _('Contact Information')) )
|
get_response().breadcrumb.append( ('contact', _('Contact Information')) )
|
||||||
|
r = TemplateIO(html=True)
|
||||||
|
|
||||||
form = Form(enctype='multipart/form-data')
|
form = Form(enctype='multipart/form-data')
|
||||||
user = get_request().user
|
user = get_request().user
|
||||||
|
@ -82,8 +84,9 @@ class ConfigDirectory(Directory):
|
||||||
return redirect('.')
|
return redirect('.')
|
||||||
|
|
||||||
html_top('config', _('Contact Information'))
|
html_top('config', _('Contact Information'))
|
||||||
'<h2>%s</h2>' % _('Contact Information')
|
r += htmltext('<h2>%s</h2>') % _('Contact Information')
|
||||||
form.render()
|
r += form.render()
|
||||||
|
return r.getvalue()
|
||||||
|
|
||||||
def contact_submit(self, form):
|
def contact_submit(self, form):
|
||||||
user = get_request().user
|
user = get_request().user
|
||||||
|
@ -93,7 +96,7 @@ class ConfigDirectory(Directory):
|
||||||
setattr(user, f, widget.parse())
|
setattr(user, f, widget.parse())
|
||||||
user.store()
|
user.store()
|
||||||
|
|
||||||
def password [html] (self):
|
def password(self):
|
||||||
get_response().breadcrumb.append( ('password', _('Password Change')) )
|
get_response().breadcrumb.append( ('password', _('Password Change')) )
|
||||||
ident_method = get_cfg('identification', {}).get('methods', ['idp'])[0]
|
ident_method = get_cfg('identification', {}).get('methods', ['idp'])[0]
|
||||||
if ident_method != 'password':
|
if ident_method != 'password':
|
||||||
|
@ -134,10 +137,12 @@ class ConfigDirectory(Directory):
|
||||||
return redirect('.')
|
return redirect('.')
|
||||||
|
|
||||||
html_top('config', _('Password Change'))
|
html_top('config', _('Password Change'))
|
||||||
'<h2>%s</h2>' % _('Password Change')
|
r = TemplateIO(html=True)
|
||||||
form.render()
|
r += htmltext('<h2>%s</h2>') % _('Password Change')
|
||||||
|
r += form.render()
|
||||||
|
return r.getvalue()
|
||||||
|
|
||||||
def sitetitle [html] (self):
|
def sitetitle(self):
|
||||||
get_response().breadcrumb.append( ('sitetitle', _('Site Title')) )
|
get_response().breadcrumb.append( ('sitetitle', _('Site Title')) )
|
||||||
|
|
||||||
misc_cfg = get_cfg('misc', {})
|
misc_cfg = get_cfg('misc', {})
|
||||||
|
@ -152,13 +157,15 @@ class ConfigDirectory(Directory):
|
||||||
|
|
||||||
if not form.is_submitted() or form.has_errors():
|
if not form.is_submitted() or form.has_errors():
|
||||||
html_top('config', title = _('Site Title'))
|
html_top('config', title = _('Site Title'))
|
||||||
'<h2>%s</h2>' % _('Site Title')
|
r = TemplateIO(html=True)
|
||||||
form.render()
|
r += htmltext('<h2>%s</h2>') % _('Site Title')
|
||||||
|
r += form.render()
|
||||||
|
return r.getvalue()
|
||||||
else:
|
else:
|
||||||
cfg_submit(form, 'misc', ['sitename'])
|
cfg_submit(form, 'misc', ['sitename'])
|
||||||
redirect('.')
|
redirect('.')
|
||||||
|
|
||||||
def homepage [html] (self):
|
def homepage(self):
|
||||||
get_response().breadcrumb.append( ('homepage', _('Home Page Text')) )
|
get_response().breadcrumb.append( ('homepage', _('Home Page Text')) )
|
||||||
texts_cfg = get_cfg('texts', {})
|
texts_cfg = get_cfg('texts', {})
|
||||||
|
|
||||||
|
@ -175,8 +182,10 @@ class ConfigDirectory(Directory):
|
||||||
|
|
||||||
if not form.is_submitted() or form.has_errors():
|
if not form.is_submitted() or form.has_errors():
|
||||||
html_top('config', title = _('Home Page Text'))
|
html_top('config', title = _('Home Page Text'))
|
||||||
'<h2>%s</h2>' % _('Home Page Text')
|
r = TemplateIO(html=True)
|
||||||
form.render()
|
r += htmltext('<h2>%s</h2>') % _('Home Page Text')
|
||||||
|
r += form.render()
|
||||||
|
return r.getvalue()
|
||||||
else:
|
else:
|
||||||
texts_cfg[str('text-welcome-unlogged')] = form.get_widget('welcome-unlogged').parse()
|
texts_cfg[str('text-welcome-unlogged')] = form.get_widget('welcome-unlogged').parse()
|
||||||
texts_cfg[str('text-welcome-logged')] = form.get_widget('welcome-logged').parse()
|
texts_cfg[str('text-welcome-logged')] = form.get_widget('welcome-logged').parse()
|
||||||
|
@ -184,18 +193,21 @@ class ConfigDirectory(Directory):
|
||||||
get_publisher().write_cfg()
|
get_publisher().write_cfg()
|
||||||
redirect('.')
|
redirect('.')
|
||||||
|
|
||||||
def appearance [html] (self):
|
def appearance(self):
|
||||||
get_response().breadcrumb.append(('appearance', _('Appearance')))
|
get_response().breadcrumb.append(('appearance', _('Appearance')))
|
||||||
html_top('config', title = _('Appearance'))
|
html_top('config', title = _('Appearance'))
|
||||||
|
r = TemplateIO(html=True)
|
||||||
|
|
||||||
if quota.can_theme():
|
if quota.can_theme():
|
||||||
"<h2>%s</h2>" % _('Appearance')
|
r += htmltext("<h2>%s</h2>") % _('Appearance')
|
||||||
self.appearance_theme()
|
r += self.appearance_theme()
|
||||||
|
|
||||||
if quota.can_logo():
|
if quota.can_logo():
|
||||||
self.appearance_logo()
|
r += self.appearance_logo()
|
||||||
|
|
||||||
def appearance_theme [html] (self):
|
return r.getvalue()
|
||||||
|
|
||||||
|
def appearance_theme(self):
|
||||||
request = get_request()
|
request = get_request()
|
||||||
if request.form.has_key('theme'):
|
if request.form.has_key('theme'):
|
||||||
themes = qommon.template.get_themes()
|
themes = qommon.template.get_themes()
|
||||||
|
@ -207,11 +219,12 @@ class ConfigDirectory(Directory):
|
||||||
|
|
||||||
current_theme = get_cfg('branding', {}).get('theme', 'default')
|
current_theme = get_cfg('branding', {}).get('theme', 'default')
|
||||||
|
|
||||||
'<div class="themes">'
|
r = TemplateIO(html=True)
|
||||||
|
r += htmltext('<div class="themes">')
|
||||||
|
|
||||||
'<p>'
|
r += htmltext('<p>')
|
||||||
_('Click on a thumbnail to change the appearance of your site.')
|
r += _('Click on a thumbnail to change the appearance of your site.')
|
||||||
'</p>'
|
r += htmltext('</p>')
|
||||||
|
|
||||||
themes = qommon.template.get_themes()
|
themes = qommon.template.get_themes()
|
||||||
for theme, (label, desc, author, icon) in sorted(themes.items()):
|
for theme, (label, desc, author, icon) in sorted(themes.items()):
|
||||||
|
@ -222,34 +235,35 @@ class ConfigDirectory(Directory):
|
||||||
active = ' active'
|
active = ' active'
|
||||||
else:
|
else:
|
||||||
active = ''
|
active = ''
|
||||||
'<div class="theme%s">' % active
|
r += htmltext('<div class="theme%s">') % active
|
||||||
'<a href="appearance?theme=%s">' % theme
|
r += htmltext('<a href="appearance?theme=%s">') % theme
|
||||||
'<img src="/themes/%s/icon.png" alt="" class="theme-icon" />' % theme
|
r += htmltext('<img src="/themes/%s/icon.png" alt="" class="theme-icon" />') % theme
|
||||||
'</a>'
|
r += htmltext('</a>')
|
||||||
'</div>'
|
r += htmltext('</div>')
|
||||||
'<hr class="clear" />'
|
r += htmltext('<hr class="clear" />')
|
||||||
'</div>'
|
r += htmltext('</div>')
|
||||||
|
return r.getvalue()
|
||||||
|
|
||||||
def appearance_logo [html] (self):
|
def appearance_logo(self):
|
||||||
'<div id="logo-selection">'
|
r = TemplateIO(html=True)
|
||||||
'<h2>%s</h2>' % _('Logo')
|
r += htmltext('<div id="logo-selection">')
|
||||||
|
r += htmltext('<h2>%s</h2>') % _('Logo')
|
||||||
get_session().display_message()
|
r += get_session().display_message()
|
||||||
|
|
||||||
logo_url = get_logo_url()
|
logo_url = get_logo_url()
|
||||||
if logo_url:
|
if logo_url:
|
||||||
'<img src="%s" />' % logo_url
|
r += htmltext('<img src="%s" />') % logo_url
|
||||||
|
|
||||||
'<form action="logo" enctype="multipart/form-data" method="post">'
|
r += htmltext('<form action="logo" enctype="multipart/form-data" method="post">')
|
||||||
'<input type="file" name="file" />'
|
r += htmltext('<input type="file" name="file" />')
|
||||||
if logo_url:
|
if logo_url:
|
||||||
'<input type="submit" name="submit" value="%s" />' % _('Upload New Logo')
|
r += htmltext('<input type="submit" name="submit" value="%s" />') % _('Upload New Logo')
|
||||||
'<input type="submit" name="remove" value="%s" />' % _('Remove Current Logo')
|
r += htmltext('<input type="submit" name="remove" value="%s" />') % _('Remove Current Logo')
|
||||||
else:
|
else:
|
||||||
'<input type="submit" name="submit" value="%s" />' % _('Upload Logo')
|
r += htmltext('<input type="submit" name="submit" value="%s" />') % _('Upload Logo')
|
||||||
'</form>'
|
r += htmltext('</form>')
|
||||||
'</div>'
|
r += htmltext('</div>')
|
||||||
|
return r.getvalue()
|
||||||
|
|
||||||
def logo(self):
|
def logo(self):
|
||||||
if not quota.can_logo():
|
if not quota.can_logo():
|
|
@ -21,7 +21,7 @@ from sets import Set
|
||||||
|
|
||||||
from quixote import get_publisher, get_request, get_response, get_session, redirect
|
from quixote import get_publisher, get_request, get_response, get_session, redirect
|
||||||
from quixote.directory import Directory
|
from quixote.directory import Directory
|
||||||
from quixote.html import htmltext
|
from quixote.html import TemplateIO, htmltext
|
||||||
|
|
||||||
from qommon.backoffice.menu import html_top
|
from qommon.backoffice.menu import html_top
|
||||||
from qommon.admin.emails import EmailsDirectory
|
from qommon.admin.emails import EmailsDirectory
|
||||||
|
@ -208,7 +208,7 @@ class DiffusionDirectory(Directory):
|
||||||
self.objectdef.store()
|
self.objectdef.store()
|
||||||
return redirect('.')
|
return redirect('.')
|
||||||
|
|
||||||
def emailfrom [html] (self):
|
def emailfrom(self):
|
||||||
emails_cfg = get_cfg('emails', {})
|
emails_cfg = get_cfg('emails', {})
|
||||||
form = Form(enctype='multipart/form-data')
|
form = Form(enctype='multipart/form-data')
|
||||||
form.add(EmailWidget, 'from', title=_('Sender Address'),
|
form.add(EmailWidget, 'from', title=_('Sender Address'),
|
||||||
|
@ -222,13 +222,15 @@ class DiffusionDirectory(Directory):
|
||||||
if not form.is_submitted() or form.has_errors():
|
if not form.is_submitted() or form.has_errors():
|
||||||
get_response().breadcrumb.append( ('emailfrom', _('Sender Address')) )
|
get_response().breadcrumb.append( ('emailfrom', _('Sender Address')) )
|
||||||
html_top('config', title = _('Sender Address'))
|
html_top('config', title = _('Sender Address'))
|
||||||
'<h2>%s</h2>' % _('Sender Address')
|
r = TemplateIO(html=True)
|
||||||
form.render()
|
r += htmltext('<h2>%s</h2>') % _('Sender Address')
|
||||||
|
r += form.render()
|
||||||
|
return r.getvalue()
|
||||||
else:
|
else:
|
||||||
cfg_submit(form, 'emails', ['from'])
|
cfg_submit(form, 'emails', ['from'])
|
||||||
redirect('.')
|
redirect('.')
|
||||||
|
|
||||||
def emailnotify [html] (self):
|
def emailnotify(self):
|
||||||
emails_cfg = get_cfg('emails', {})
|
emails_cfg = get_cfg('emails', {})
|
||||||
form = Form(enctype='multipart/form-data')
|
form = Form(enctype='multipart/form-data')
|
||||||
|
|
||||||
|
@ -247,8 +249,10 @@ class DiffusionDirectory(Directory):
|
||||||
if not form.is_submitted() or form.has_errors():
|
if not form.is_submitted() or form.has_errors():
|
||||||
get_response().breadcrumb.append( ('emailfrom', _('Sender Address')) )
|
get_response().breadcrumb.append( ('emailfrom', _('Sender Address')) )
|
||||||
html_top('config', title = _('Sender Address'))
|
html_top('config', title = _('Sender Address'))
|
||||||
'<h2>%s</h2>' % _('Sender Address')
|
r = TemplateIO(html=True)
|
||||||
form.render()
|
r += htmltext('<h2>%s</h2>') % _('Sender Address')
|
||||||
|
r += form.render()
|
||||||
|
return r.getvalue()
|
||||||
else:
|
else:
|
||||||
v = form.get_widget('notify').parse()
|
v = form.get_widget('notify').parse()
|
||||||
if v:
|
if v:
|
||||||
|
@ -273,77 +277,80 @@ class DiffusionDirectory(Directory):
|
||||||
def html_top(self, section, *args, **kwargs):
|
def html_top(self, section, *args, **kwargs):
|
||||||
html_top('forms/%s/diffusion' % self.objectdef.id, *args, **kwargs)
|
html_top('forms/%s/diffusion' % self.objectdef.id, *args, **kwargs)
|
||||||
|
|
||||||
def _q_index [html] (self):
|
def _q_index (self):
|
||||||
# XXX: it would be nice to be manage groups, to select an existing group
|
# XXX: it would be nice to be manage groups, to select an existing group
|
||||||
|
|
||||||
self.html_top(_('Diffusion'))
|
self.html_top(_('Diffusion'))
|
||||||
|
r = TemplateIO(html=True)
|
||||||
|
|
||||||
'<ul id="main-actions">'
|
r += htmltext('<ul id="main-actions">')
|
||||||
'<li><a href="add" rel="popup">%s</a></li>' % _('Add a participant')
|
r += htmltext('<li><a href="add" rel="popup">%s</a></li>') % _('Add a participant')
|
||||||
'</ul>'
|
r += htmltext('</ul>')
|
||||||
|
|
||||||
'<h2>%s</h2>' % _('Diffusion')
|
r += htmltext('<h2>%s</h2>') % _('Diffusion')
|
||||||
|
|
||||||
'<ul>'
|
r += htmltext('<ul>')
|
||||||
' <li>%s ' % _('Participants:')
|
r += htmltext(' <li>%s ') % _('Participants:')
|
||||||
if self.objectdef.roles:
|
if self.objectdef.roles:
|
||||||
'<a href="disable">%s</a>' % _('Anybody')
|
r += htmltext('<a href="disable">%s</a>') % _('Anybody')
|
||||||
' - '
|
r += htmltext(' - ')
|
||||||
'<strong>%s</strong>' % _('List of persons')
|
r += htmltext('<strong>%s</strong>') % _('List of persons')
|
||||||
else:
|
else:
|
||||||
'<strong>%s</strong>' % _('Anybody')
|
r += htmltext('<strong>%s</strong>') % _('Anybody')
|
||||||
' - '
|
r += htmltext(' - ')
|
||||||
' <a href="enable">%s</a>' % _('List of persons')
|
r += htmltext(' <a href="enable">%s</a>') % _('List of persons')
|
||||||
'</li>'
|
r += htmltext('</li>')
|
||||||
|
|
||||||
access_mode = get_form_access_mode(self.objectdef)
|
access_mode = get_form_access_mode(self.objectdef)
|
||||||
' <li>%s ' % _('Questionnaire Address:')
|
r += htmltext(' <li>%s ') % _('Questionnaire Address:')
|
||||||
if access_mode == 'public':
|
if access_mode == 'public':
|
||||||
'<strong>%s</strong>' % _('Visible')
|
r += htmltext('<strong>%s</strong>') % _('Visible')
|
||||||
else:
|
else:
|
||||||
' <a href="access-public">%s</a>' % _('Visible')
|
r += htmltext(' <a href="access-public">%s</a>') % _('Visible')
|
||||||
' - '
|
r += htmltext(' - ')
|
||||||
if access_mode == 'private':
|
if access_mode == 'private':
|
||||||
'<strong>%s</strong>' % _('Hidden')
|
r += htmltext('<strong>%s</strong>') % _('Hidden')
|
||||||
else:
|
else:
|
||||||
' <a href="access-private">%s</a>' % _('Hidden')
|
r += htmltext(' <a href="access-private">%s</a>') % _('Hidden')
|
||||||
'<ul><li>'
|
r += htmltext('<ul><li>')
|
||||||
url = get_form_url(self.objectdef)
|
url = get_form_url(self.objectdef)
|
||||||
'<a href="%s">%s</a>' % (url, url)
|
r += htmltext('<a href="%s">%s</a>') % (url, url)
|
||||||
'</li></ul>'
|
r += htmltext('</li></ul>')
|
||||||
'</li>'
|
r += htmltext('</li>')
|
||||||
|
|
||||||
emails_cfg = get_cfg('emails', {})
|
emails_cfg = get_cfg('emails', {})
|
||||||
'<li>%s' % _('Sender Address: ')
|
r += htmltext('<li>%s') % _('Sender Address: ')
|
||||||
if emails_cfg.get('from', ''):
|
if emails_cfg.get('from', ''):
|
||||||
emails_cfg.get('from')
|
emails_cfg.get('from')
|
||||||
' (<a href="emailfrom" rel="popup">%s</a>)' % _('change address')
|
r += htmltext(' (<a href="emailfrom" rel="popup">%s</a>)') % _('change address')
|
||||||
else:
|
else:
|
||||||
_('None set')
|
r += _('None set')
|
||||||
' (<a href="emailfrom" rel="popup">%s</a>)' % _('set address')
|
r += htmltext(' (<a href="emailfrom" rel="popup">%s</a>)') % _('set address')
|
||||||
'</li>'
|
r += htmltext('</li>')
|
||||||
|
|
||||||
'<li>%s' % _('Notification when a questionnaire is filled: ')
|
r += htmltext('<li>%s') % _('Notification when a questionnaire is filled: ')
|
||||||
if not self.objectdef.workflow_options:
|
if not self.objectdef.workflow_options:
|
||||||
self.objectdef.workflow_options = {}
|
self.objectdef.workflow_options = {}
|
||||||
if self.objectdef.workflow_options.get('done*mail-on-filled*to'):
|
if self.objectdef.workflow_options.get('done*mail-on-filled*to'):
|
||||||
self.objectdef.workflow_options.get('done*mail-on-filled*to')
|
self.objectdef.workflow_options.get('done*mail-on-filled*to')
|
||||||
' (<a href="emailnotify" rel="popup">%s</a>)' % _('change address')
|
r += htmltext(' (<a href="emailnotify" rel="popup">%s</a>)') % _('change address')
|
||||||
else:
|
else:
|
||||||
_('None set')
|
r += _('None set')
|
||||||
' (<a href="emailnotify" rel="popup">%s</a>)' % _('set address')
|
r += htmltext(' (<a href="emailnotify" rel="popup">%s</a>)') % _('set address')
|
||||||
'</li>'
|
r += htmltext('</li>')
|
||||||
|
|
||||||
'</ul>'
|
r += htmltext('</ul>')
|
||||||
|
|
||||||
get_response().filter['sidebar'] = self.get_sidebar()
|
get_response().filter['sidebar'] = self.get_sidebar()
|
||||||
|
|
||||||
get_session().display_message()
|
get_session().display_message()
|
||||||
|
|
||||||
if self.objectdef.roles:
|
if self.objectdef.roles:
|
||||||
self.display_participants()
|
r += self.display_participants()
|
||||||
|
|
||||||
def display_participants [html] (self):
|
return r.getvalue()
|
||||||
|
|
||||||
|
def display_participants(self):
|
||||||
users = []
|
users = []
|
||||||
many_users = False
|
many_users = False
|
||||||
search_result = False
|
search_result = False
|
||||||
|
@ -400,15 +407,17 @@ class DiffusionDirectory(Directory):
|
||||||
|
|
||||||
# XXX: and now, convert from user_ids to User objects?
|
# XXX: and now, convert from user_ids to User objects?
|
||||||
|
|
||||||
|
r = TemplateIO(html=True)
|
||||||
|
|
||||||
if user_ids:
|
if user_ids:
|
||||||
# XXX: paragraph of explanation, and option to get a list of access
|
# XXX: paragraph of explanation, and option to get a list of access
|
||||||
# codes instead of sending them out
|
# codes instead of sending them out
|
||||||
|
|
||||||
'<p>'
|
r += htmltext('<p>')
|
||||||
_('%s participants.') % len(user_ids)
|
r += _('%s participants.') % len(user_ids)
|
||||||
if search_result:
|
if search_result:
|
||||||
' <a href=".">%s</a>' % _('Back to full listing')
|
r += htmltext(' <a href=".">%s</a>') % _('Back to full listing')
|
||||||
'</p>'
|
r += htmltext('</p>')
|
||||||
|
|
||||||
if len(user_ids) < 500:
|
if len(user_ids) < 500:
|
||||||
# reasonable number, load all of them, so it's possible to
|
# reasonable number, load all of them, so it's possible to
|
||||||
|
@ -420,62 +429,65 @@ class DiffusionDirectory(Directory):
|
||||||
all_users = sorted(user_ids)
|
all_users = sorted(user_ids)
|
||||||
user_are_objects = False
|
user_are_objects = False
|
||||||
|
|
||||||
'<div class="splitcontent-left">'
|
r += htmltext('<div class="splitcontent-left">')
|
||||||
'<ul class="biglist">'
|
r += htmltext('<ul class="biglist">')
|
||||||
rightcol = False
|
rightcol = False
|
||||||
|
|
||||||
for i, user in enumerate(all_users):
|
for i, user in enumerate(all_users):
|
||||||
if user_are_objects:
|
if user_are_objects:
|
||||||
user_id = user.id
|
user_id = user.id
|
||||||
'<li><strong>%s</strong> ' % user.display_name
|
r += htmltext('<li><strong>%s</strong> ') % user.display_name
|
||||||
else:
|
else:
|
||||||
user_id = user
|
user_id = user
|
||||||
'<li><strong>%s</strong> ' % user_id
|
r += htmltext('<li><strong>%s</strong> ') % user_id
|
||||||
'(<a href="remove?id=%s">%s</a>)' % (user_id, _('remove'))
|
r += htmltext('(<a href="remove?id=%s">%s</a>)') % (user_id, _('remove'))
|
||||||
'</li>'
|
r += htmltext('</li>')
|
||||||
if not rightcol and (i+1) >= len(user_ids)/2.0:
|
if not rightcol and (i+1) >= len(user_ids)/2.0:
|
||||||
rightcol = True
|
rightcol = True
|
||||||
'</ul>'
|
r += htmltext('</ul>')
|
||||||
'</div>'
|
r += htmltext('</div>')
|
||||||
'<div class="splitcontent-right">'
|
r += htmltext('<div class="splitcontent-right">')
|
||||||
'<ul class="biglist">'
|
r += htmltext('<ul class="biglist">')
|
||||||
'</ul>'
|
r += htmltext('</ul>')
|
||||||
'</div>'
|
r += htmltext('</div>')
|
||||||
# XXX: add pagination
|
# XXX: add pagination
|
||||||
|
|
||||||
elif user_ids is None: # unknown set
|
elif user_ids is None: # unknown set
|
||||||
'<p>'
|
r += htmltext('<p>')
|
||||||
_('Unable to get a list of participants.')
|
r += _('Unable to get a list of participants.')
|
||||||
' '
|
r += ' '
|
||||||
_('System overloaded?')
|
r += _('System overloaded?')
|
||||||
# XXX: + use search form on the right.
|
# XXX: + use search form on the right.
|
||||||
'</p>'
|
r += htmltext('</p>')
|
||||||
else:
|
else:
|
||||||
'<p>'
|
r += htmltext('<p>')
|
||||||
if search_result:
|
if search_result:
|
||||||
_('There is currently no participants matching your query.')
|
r += _('There is currently no participants matching your query.')
|
||||||
else:
|
else:
|
||||||
_('There is currently no participants defined.')
|
r += _('There is currently no participants defined.')
|
||||||
'</p>'
|
r += htmltext('</p>')
|
||||||
|
return r.getvalue()
|
||||||
|
|
||||||
def get_sidebar [html] (self):
|
def get_sidebar(self):
|
||||||
if not self.objectdef.roles:
|
if not self.objectdef.roles:
|
||||||
return ''
|
return ''
|
||||||
|
|
||||||
'<ul>'
|
r = TemplateIO(html=True)
|
||||||
'<li><a href="import" rel="popup">%s</a></li>' % _('Import list of participants')
|
r += htmltext('<ul>')
|
||||||
'<li><a href="import-disabled" rel="popup">%s</a></li>' % _(
|
r += htmltext('<li><a href="import" rel="popup">%s</a></li>') % _('Import list of participants')
|
||||||
|
r += htmltext('<li><a href="import-disabled" rel="popup">%s</a></li>') % _(
|
||||||
'Import list of participants to disable')
|
'Import list of participants to disable')
|
||||||
'<li><a href="mail-access-codes">%s</a></li>' % _('Mail access codes')
|
r += htmltext('<li><a href="mail-access-codes">%s</a></li>') % _('Mail access codes')
|
||||||
if quota.can_mail():
|
if quota.can_mail():
|
||||||
'<li><a href="mail-participants">%s</a></li>' % _('Mail participants')
|
r += htmltext('<li><a href="mail-participants">%s</a></li>') % _('Mail participants')
|
||||||
'</ul>'
|
r += htmltext('</ul>')
|
||||||
|
|
||||||
'<h4>%s</h4>' % _('Search a participant')
|
r += htmltext('<h4>%s</h4>') % _('Search a participant')
|
||||||
search_form = Form(enctype='multipart/form-data', use_tokens=False)
|
search_form = Form(enctype='multipart/form-data', use_tokens=False)
|
||||||
search_form.add(StringWidget, 'email', title=_('Email'))
|
search_form.add(StringWidget, 'email', title=_('Email'))
|
||||||
search_form.add_submit('submit', _('Search'))
|
search_form.add_submit('submit', _('Search'))
|
||||||
search_form.render()
|
r += search_form.render()
|
||||||
|
return r.getvalue()
|
||||||
|
|
||||||
def remove(self):
|
def remove(self):
|
||||||
user_id = get_request().form.get('id')
|
user_id = get_request().form.get('id')
|
||||||
|
@ -491,7 +503,7 @@ class DiffusionDirectory(Directory):
|
||||||
user.store()
|
user.store()
|
||||||
return redirect('.')
|
return redirect('.')
|
||||||
|
|
||||||
def add [html] (self):
|
def add(self):
|
||||||
form = Form(enctype='multipart/form-data')
|
form = Form(enctype='multipart/form-data')
|
||||||
form.add(StringWidget, 'name', title=_('Name'), size=40, required=False)
|
form.add(StringWidget, 'name', title=_('Name'), size=40, required=False)
|
||||||
form.add(EmailWidget, 'email', title=_('Email'), required=True)
|
form.add(EmailWidget, 'email', title=_('Email'), required=True)
|
||||||
|
@ -509,7 +521,9 @@ class DiffusionDirectory(Directory):
|
||||||
|
|
||||||
get_response().breadcrumb.append( ('add', _('Add')) )
|
get_response().breadcrumb.append( ('add', _('Add')) )
|
||||||
self.html_top(_('Add a Participant'))
|
self.html_top(_('Add a Participant'))
|
||||||
form.render()
|
r = TemplateIO(html=True)
|
||||||
|
r += form.render()
|
||||||
|
return r.getvalue()
|
||||||
|
|
||||||
def add_submit(self, form):
|
def add_submit(self, form):
|
||||||
name = form.get_widget('name').parse()
|
name = form.get_widget('name').parse()
|
||||||
|
@ -536,7 +550,7 @@ class DiffusionDirectory(Directory):
|
||||||
|
|
||||||
return redirect('.')
|
return redirect('.')
|
||||||
|
|
||||||
def p_import [html] (self):
|
def p_import(self):
|
||||||
if get_request().form.get('job'):
|
if get_request().form.get('job'):
|
||||||
return self.participants_importing()
|
return self.participants_importing()
|
||||||
|
|
||||||
|
@ -556,17 +570,19 @@ class DiffusionDirectory(Directory):
|
||||||
|
|
||||||
get_response().breadcrumb.append( ('import', _('Import')) )
|
get_response().breadcrumb.append( ('import', _('Import')) )
|
||||||
self.html_top(_('Import a List of Participants'))
|
self.html_top(_('Import a List of Participants'))
|
||||||
'<h2>%s</h2>' % _('Importing a List of Participants')
|
r = TemplateIO(html=True)
|
||||||
'<p>'
|
r += htmltext('<h2>%s</h2>') % _('Importing a List of Participants')
|
||||||
_('The file should be in the CSV file format. Using your spreadsheet '\
|
r += htmltext('<p>')
|
||||||
'program (Calc, Excel...), click "Save as" and select the CSV format.')
|
r += _('The file should be in the CSV file format. Using your spreadsheet '\
|
||||||
'</p>'
|
'program (Calc, Excel...), click "Save as" and select the CSV format.')
|
||||||
'<p>'
|
r += htmltext('</p>')
|
||||||
_('The file should have email addresses in the first column, and, '\
|
r += htmltext('<p>')
|
||||||
'optionnaly, names in the second column.')
|
r += _('The file should have email addresses in the first column, and, '\
|
||||||
'</p>'
|
'optionnaly, names in the second column.')
|
||||||
get_session().display_message()
|
r += htmltext('</p>')
|
||||||
form.render()
|
r += get_session().display_message()
|
||||||
|
r += form.render()
|
||||||
|
return r.getvalue()
|
||||||
|
|
||||||
def import_submit(self, form):
|
def import_submit(self, form):
|
||||||
class ParticipantsImporter:
|
class ParticipantsImporter:
|
||||||
|
@ -648,30 +664,32 @@ class DiffusionDirectory(Directory):
|
||||||
|
|
||||||
return redirect('import?job=%s' % job.id)
|
return redirect('import?job=%s' % job.id)
|
||||||
|
|
||||||
def participants_importing [html] (self):
|
def participants_importing(self):
|
||||||
try:
|
try:
|
||||||
job = AfterJob.get(get_request().form.get('job'))
|
job = AfterJob.get(get_request().form.get('job'))
|
||||||
except KeyError:
|
except KeyError:
|
||||||
return redirect('.')
|
return redirect('.')
|
||||||
|
|
||||||
self.html_top( _('Importing Participants'))
|
self.html_top( _('Importing Participants'))
|
||||||
|
r = TemplateIO(html=True)
|
||||||
get_response().add_javascript(['jquery.js', 'interface.js', 'afterjob.js'])
|
get_response().add_javascript(['jquery.js', 'interface.js', 'afterjob.js'])
|
||||||
'<dl class="job-status">'
|
r += htmltext('<dl class="job-status">')
|
||||||
'<dt>'
|
r += htmltext('<dt>')
|
||||||
_(job.label)
|
r += _(job.label)
|
||||||
'</dt>'
|
r += htmltext('</dt>')
|
||||||
'<dd>'
|
r += htmltext('<dd>')
|
||||||
'<span class="afterjob" id="%s">' % job.id
|
r += htmltext('<span class="afterjob" id="%s">') % job.id
|
||||||
_(job.status)
|
r += _(job.status)
|
||||||
'</span>'
|
r += htmltext('</span>')
|
||||||
'</dd>'
|
r += htmltext('</dd>')
|
||||||
'</dl>'
|
r += htmltext('</dl>')
|
||||||
|
|
||||||
'<div class="done">'
|
r += htmltext('<div class="done">')
|
||||||
'<a href="./">%s</a>' % _('Back')
|
r += htmltext('<a href="./">%s</a>') % _('Back')
|
||||||
'</div>'
|
r += htmltext('</div>')
|
||||||
|
return r.getvalue()
|
||||||
|
|
||||||
def mail_access_codes [html] (self):
|
def mail_access_codes(self):
|
||||||
if get_request().form.get('job'):
|
if get_request().form.get('job'):
|
||||||
return self.access_code_mailing()
|
return self.access_code_mailing()
|
||||||
|
|
||||||
|
@ -682,7 +700,7 @@ class DiffusionDirectory(Directory):
|
||||||
|
|
||||||
form = Form(enctype='multipart/form-data')
|
form = Form(enctype='multipart/form-data')
|
||||||
form.add(EmailWidget, 'mail_from', title=_('From'), size=40, required=False,
|
form.add(EmailWidget, 'mail_from', title=_('From'), size=40, required=False,
|
||||||
value=emails_cfg.get('from', ''), size=30)
|
value=emails_cfg.get('from', ''))
|
||||||
form.add(StringWidget, 'mail_subject', title=_('Subject'), size=40, required=True,
|
form.add(StringWidget, 'mail_subject', title=_('Subject'), size=40, required=True,
|
||||||
value=default_subject)
|
value=default_subject)
|
||||||
form.add(TextWidget, 'mail_body', title=_('Body'), cols=70, rows=20, required=True,
|
form.add(TextWidget, 'mail_body', title=_('Body'), cols=70, rows=20, required=True,
|
||||||
|
@ -718,33 +736,37 @@ class DiffusionDirectory(Directory):
|
||||||
return redirect('mail-access-codes?job=%s' % job.id)
|
return redirect('mail-access-codes?job=%s' % job.id)
|
||||||
|
|
||||||
self.html_top(_('Mailing access codes'))
|
self.html_top(_('Mailing access codes'))
|
||||||
'<h2>%s</h2>' % _('Mailing access codes')
|
r = TemplateIO(html=True)
|
||||||
form.render()
|
r += htmltext('<h2>%s</h2>') % _('Mailing access codes')
|
||||||
|
r += form.render()
|
||||||
|
return r.getvalue()
|
||||||
|
|
||||||
def access_code_mailing [html] (self):
|
def access_code_mailing(self):
|
||||||
try:
|
try:
|
||||||
job = AfterJob.get(get_request().form.get('job'))
|
job = AfterJob.get(get_request().form.get('job'))
|
||||||
except KeyError:
|
except KeyError:
|
||||||
return redirect('.')
|
return redirect('.')
|
||||||
|
|
||||||
self.html_top(_('Mailing access codes'))
|
self.html_top(_('Mailing access codes'))
|
||||||
|
r = TemplateIO(html=True)
|
||||||
get_response().add_javascript(['jquery.js', 'interface.js', 'afterjob.js'])
|
get_response().add_javascript(['jquery.js', 'interface.js', 'afterjob.js'])
|
||||||
'<dl class="job-status">'
|
r += htmltext('<dl class="job-status">')
|
||||||
'<dt>'
|
r += htmltext('<dt>')
|
||||||
_(job.label)
|
r += _(job.label)
|
||||||
'</dt>'
|
r += htmltext('</dt>')
|
||||||
'<dd>'
|
r += htmltext('<dd>')
|
||||||
'<span class="afterjob" id="%s">' % job.id
|
r += htmltext('<span class="afterjob" id="%s">') % job.id
|
||||||
_(job.status)
|
r += _(job.status)
|
||||||
'</span>'
|
r += htmltext('</span>')
|
||||||
'</dd>'
|
r += htmltext('</dd>')
|
||||||
'</dl>'
|
r += htmltext('</dl>')
|
||||||
|
|
||||||
'<div class="done">'
|
r += htmltext('<div class="done">')
|
||||||
'<a href="./">%s</a>' % _('Back')
|
r += htmltext('<a href="./">%s</a>') % _('Back')
|
||||||
'</div>'
|
r += htmltext('</div>')
|
||||||
|
return r.getvalue()
|
||||||
|
|
||||||
def import_disabled [html] (self):
|
def import_disabled(self):
|
||||||
if get_request().form.get('job'):
|
if get_request().form.get('job'):
|
||||||
return self.participants_disabling()
|
return self.participants_disabling()
|
||||||
|
|
||||||
|
@ -764,16 +786,18 @@ class DiffusionDirectory(Directory):
|
||||||
|
|
||||||
get_response().breadcrumb.append( ('import', _('Import')) )
|
get_response().breadcrumb.append( ('import', _('Import')) )
|
||||||
self.html_top(_('Import a List of Participants to Disable'))
|
self.html_top(_('Import a List of Participants to Disable'))
|
||||||
'<h2>%s</h2>' % _('Importing a List of Participants to Disable')
|
r = TemplateIO(html=True)
|
||||||
'<p>'
|
r += htmltext('<h2>%s</h2>') % _('Importing a List of Participants to Disable')
|
||||||
_('The file should be in the CSV file format. Using your spreadsheet '\
|
r += htmltext('<p>')
|
||||||
'program (Calc, Excel...), click "Save as" and select the CSV format.')
|
r += _('The file should be in the CSV file format. Using your spreadsheet '\
|
||||||
'</p>'
|
'program (Calc, Excel...), click "Save as" and select the CSV format.')
|
||||||
'<p>'
|
r += htmltext('</p>')
|
||||||
_('The file should consist of email addresses, one per line.')
|
r += htmltext('<p>')
|
||||||
'</p>'
|
r += _('The file should consist of email addresses, one per line.')
|
||||||
get_session().display_message()
|
r += htmltext('</p>')
|
||||||
form.render()
|
r += get_session().display_message()
|
||||||
|
r += form.render()
|
||||||
|
return r.getvalue()
|
||||||
|
|
||||||
def import_disabled_submit(self, form):
|
def import_disabled_submit(self, form):
|
||||||
class ParticipantsDisabler:
|
class ParticipantsDisabler:
|
||||||
|
@ -853,30 +877,32 @@ class DiffusionDirectory(Directory):
|
||||||
|
|
||||||
return redirect('import-disabled?job=%s' % job.id)
|
return redirect('import-disabled?job=%s' % job.id)
|
||||||
|
|
||||||
def participants_disabling [html] (self):
|
def participants_disabling(self):
|
||||||
try:
|
try:
|
||||||
job = AfterJob.get(get_request().form.get('job'))
|
job = AfterJob.get(get_request().form.get('job'))
|
||||||
except KeyError:
|
except KeyError:
|
||||||
return redirect('.')
|
return redirect('.')
|
||||||
|
|
||||||
self.html_top(_('Disabling Participants'))
|
self.html_top(_('Disabling Participants'))
|
||||||
|
r = TemplateIO(html=True)
|
||||||
get_response().add_javascript(['jquery.js', 'interface.js', 'afterjob.js'])
|
get_response().add_javascript(['jquery.js', 'interface.js', 'afterjob.js'])
|
||||||
'<dl class="job-status">'
|
r += htmltext('<dl class="job-status">')
|
||||||
'<dt>'
|
r += htmltext('<dt>')
|
||||||
_(job.label)
|
r += _(job.label)
|
||||||
'</dt>'
|
r += htmltext('</dt>')
|
||||||
'<dd>'
|
r += htmltext('<dd>')
|
||||||
'<span class="afterjob" id="%s">' % job.id
|
r += htmltext('<span class="afterjob" id="%s">') % job.id
|
||||||
_(job.status)
|
r += _(job.status)
|
||||||
'</span>'
|
r += htmltext('</span>')
|
||||||
'</dd>'
|
r += htmltext('</dd>')
|
||||||
'</dl>'
|
r += htmltext('</dl>')
|
||||||
|
|
||||||
'<div class="done">'
|
r += htmltext('<div class="done">')
|
||||||
'<a href="./">%s</a>' % _('Back')
|
r += htmltext('<a href="./">%s</a>') % _('Back')
|
||||||
'</div>'
|
r += htmltext('</div>')
|
||||||
|
return r.getvalue()
|
||||||
|
|
||||||
def mail_participants [html] (self):
|
def mail_participants(self):
|
||||||
if get_request().form.get('job'):
|
if get_request().form.get('job'):
|
||||||
return self.participants_mailing()
|
return self.participants_mailing()
|
||||||
|
|
||||||
|
@ -890,7 +916,7 @@ class DiffusionDirectory(Directory):
|
||||||
|
|
||||||
form = Form(enctype='multipart/form-data')
|
form = Form(enctype='multipart/form-data')
|
||||||
form.add(EmailWidget, 'mail_from', title=_('From'), size=40, required=False,
|
form.add(EmailWidget, 'mail_from', title=_('From'), size=40, required=False,
|
||||||
value=emails_cfg.get('from', ''), size=30)
|
value=emails_cfg.get('from', ''))
|
||||||
form.add(StringWidget, 'mail_subject', title=_('Subject'), size=40, required=True,
|
form.add(StringWidget, 'mail_subject', title=_('Subject'), size=40, required=True,
|
||||||
value=default_subject)
|
value=default_subject)
|
||||||
form.add(TextWidget, 'mail_body', title=_('Body'), cols=70, rows=20, required=True,
|
form.add(TextWidget, 'mail_body', title=_('Body'), cols=70, rows=20, required=True,
|
||||||
|
@ -925,10 +951,12 @@ class DiffusionDirectory(Directory):
|
||||||
return redirect('mail-participants?job=%s' % job.id)
|
return redirect('mail-participants?job=%s' % job.id)
|
||||||
|
|
||||||
self.html_top(_('Mailing participants'))
|
self.html_top(_('Mailing participants'))
|
||||||
'<h2>%s</h2>' % _('Mailing participants')
|
r = TemplateIO(html=True)
|
||||||
form.render()
|
r += htmltext('<h2>%s</h2>') % _('Mailing participants')
|
||||||
|
r += form.render()
|
||||||
|
return r.getvalue()
|
||||||
|
|
||||||
def participants_mailing [html] (self):
|
def participants_mailing(self):
|
||||||
try:
|
try:
|
||||||
job = AfterJob.get(get_request().form.get('job'))
|
job = AfterJob.get(get_request().form.get('job'))
|
||||||
except KeyError:
|
except KeyError:
|
||||||
|
@ -936,20 +964,22 @@ class DiffusionDirectory(Directory):
|
||||||
|
|
||||||
self.html_top(_('Mailing participants'))
|
self.html_top(_('Mailing participants'))
|
||||||
get_response().add_javascript(['jquery.js', 'interface.js', 'afterjob.js'])
|
get_response().add_javascript(['jquery.js', 'interface.js', 'afterjob.js'])
|
||||||
'<dl class="job-status">'
|
r = TemplateIO(html=True)
|
||||||
'<dt>'
|
r += htmltext('<dl class="job-status">')
|
||||||
_(job.label)
|
r += htmltext('<dt>')
|
||||||
'</dt>'
|
r += _(job.label)
|
||||||
'<dd>'
|
r += htmltext('</dt>')
|
||||||
'<span class="afterjob" id="%s">' % job.id
|
r += htmltext('<dd>')
|
||||||
_(job.status)
|
r += htmltext('<span class="afterjob" id="%s">') % job.id
|
||||||
'</span>'
|
r += _(job.status)
|
||||||
'</dd>'
|
r += htmltext('</span>')
|
||||||
'</dl>'
|
r += htmltext('</dd>')
|
||||||
|
r += htmltext('</dl>')
|
||||||
|
|
||||||
'<div class="done">'
|
r += htmltext('<div class="done">')
|
||||||
'<a href="./">%s</a>' % _('Back')
|
r += htmltext('<a href="./">%s</a>') % _('Back')
|
||||||
'</div>'
|
r += htmltext('</div>')
|
||||||
|
return r.getvalue()
|
||||||
|
|
||||||
EmailsDirectory.register('asec-voting-instructions',
|
EmailsDirectory.register('asec-voting-instructions',
|
||||||
N_('Instructions and access codes'),
|
N_('Instructions and access codes'),
|
|
@ -21,7 +21,7 @@ from sets import Set
|
||||||
|
|
||||||
from quixote import get_publisher, get_request, get_response, get_session, redirect
|
from quixote import get_publisher, get_request, get_response, get_session, redirect
|
||||||
from quixote.directory import Directory
|
from quixote.directory import Directory
|
||||||
from quixote.html import htmltext
|
from quixote.html import TemplateIO, htmltext
|
||||||
|
|
||||||
from qommon.backoffice.menu import html_top
|
from qommon.backoffice.menu import html_top
|
||||||
from qommon.admin.menu import command_icon
|
from qommon.admin.menu import command_icon
|
||||||
|
@ -49,7 +49,7 @@ class CustomFieldDefPage(FieldDefPage):
|
||||||
section = 'forms/'
|
section = 'forms/'
|
||||||
wsf_support = False
|
wsf_support = False
|
||||||
|
|
||||||
def html_top(self, section, *args, **kwargs):
|
def html_top(self, *args, **kwargs):
|
||||||
html_top('forms/%s' % self.objectdef.id, *args, **kwargs)
|
html_top('forms/%s' % self.objectdef.id, *args, **kwargs)
|
||||||
|
|
||||||
def duplicate(self):
|
def duplicate(self):
|
||||||
|
@ -81,7 +81,7 @@ class FormDirectory(FieldsDirectory):
|
||||||
support_import = False
|
support_import = False
|
||||||
blacklisted_types = ['file']
|
blacklisted_types = ['file']
|
||||||
|
|
||||||
def html_top(self, section, *args, **kwargs):
|
def html_top(self, *args, **kwargs):
|
||||||
html_top('forms/%s' % self.objectdef.id, *args, **kwargs)
|
html_top('forms/%s' % self.objectdef.id, *args, **kwargs)
|
||||||
|
|
||||||
def __init__(self, objectdef):
|
def __init__(self, objectdef):
|
||||||
|
@ -91,7 +91,7 @@ class FormDirectory(FieldsDirectory):
|
||||||
if not hasattr(self.objectdef, 'asec_status'):
|
if not hasattr(self.objectdef, 'asec_status'):
|
||||||
self.objectdef.asec_status = 'running'
|
self.objectdef.asec_status = 'running'
|
||||||
|
|
||||||
def title [html] (self):
|
def title(self):
|
||||||
form = Form(enctype='multipart/form-data')
|
form = Form(enctype='multipart/form-data')
|
||||||
form.add(StringWidget, 'name', title=_('Title'), size=40,
|
form.add(StringWidget, 'name', title=_('Title'), size=40,
|
||||||
required=True, value=self.objectdef.name)
|
required=True, value=self.objectdef.name)
|
||||||
|
@ -110,14 +110,14 @@ class FormDirectory(FieldsDirectory):
|
||||||
get_response().breadcrumb.append( ('forms/', None) )
|
get_response().breadcrumb.append( ('forms/', None) )
|
||||||
get_response().breadcrumb.append( ('new', _('New Questionnaire')) )
|
get_response().breadcrumb.append( ('new', _('New Questionnaire')) )
|
||||||
html_top('forms', _('Change Title'))
|
html_top('forms', _('Change Title'))
|
||||||
form.render()
|
return form.render()
|
||||||
|
|
||||||
def title_submit(self, form):
|
def title_submit(self, form):
|
||||||
self.objectdef.name = form.get_widget('name').parse()
|
self.objectdef.name = form.get_widget('name').parse()
|
||||||
self.objectdef.store()
|
self.objectdef.store()
|
||||||
return redirect('.')
|
return redirect('.')
|
||||||
|
|
||||||
def delete [html] (self):
|
def delete(self):
|
||||||
form = Form(enctype='multipart/form-data')
|
form = Form(enctype='multipart/form-data')
|
||||||
form.widgets.append(HtmlWidget('<p>%s</p>' % _(
|
form.widgets.append(HtmlWidget('<p>%s</p>' % _(
|
||||||
'You are about to irrevocably delete this questionnaire.')))
|
'You are about to irrevocably delete this questionnaire.')))
|
||||||
|
@ -129,8 +129,10 @@ class FormDirectory(FieldsDirectory):
|
||||||
if not form.is_submitted() or form.has_errors():
|
if not form.is_submitted() or form.has_errors():
|
||||||
get_response().breadcrumb.append(('delete', _('Delete')))
|
get_response().breadcrumb.append(('delete', _('Delete')))
|
||||||
html_top('forms', title = _('Delete Questionnaire'))
|
html_top('forms', title = _('Delete Questionnaire'))
|
||||||
'<h2>%s %s</h2>' % (_('Deleting Questionnaire:'), self.objectdef.name)
|
r = TemplateIO(html=True)
|
||||||
form.render()
|
r += htmltext('<h2>%s %s</h2>') % (_('Deleting Questionnaire:'), self.objectdef.name)
|
||||||
|
r += form.render()
|
||||||
|
return r.getvalue()
|
||||||
else:
|
else:
|
||||||
# XXX: should also remove participants role, and participants to no
|
# XXX: should also remove participants role, and participants to no
|
||||||
# other forms
|
# other forms
|
||||||
|
@ -144,31 +146,35 @@ class FormDirectory(FieldsDirectory):
|
||||||
return t
|
return t
|
||||||
return self._q_index_view()
|
return self._q_index_view()
|
||||||
|
|
||||||
def _q_index_view [html] (self):
|
def _q_index_view(self):
|
||||||
self.html_top(self.objectdef.name)
|
self.html_top(self.objectdef.name)
|
||||||
get_response().add_javascript(['jquery.js', 'interface.js', 'biglist.js'])
|
get_response().add_javascript(['jquery.js', 'interface.js', 'biglist.js'])
|
||||||
|
r = TemplateIO(html=True)
|
||||||
|
|
||||||
self.index_top()
|
r += self.index_top()
|
||||||
|
|
||||||
form = self.get_preview_form()
|
form = self.get_preview_form()
|
||||||
'<div class="form-preview bo-block">'
|
r += htmltext('<div class="form-preview bo-block">')
|
||||||
form.render()
|
r += form.render()
|
||||||
'</div>'
|
r += htmltext('</div>')
|
||||||
|
|
||||||
get_response().filter['sidebar'] = self.get_results_sidebar()
|
get_response().filter['sidebar'] = self.get_results_sidebar()
|
||||||
|
return r.getvalue()
|
||||||
|
|
||||||
def get_results_sidebar [html] (self):
|
def get_results_sidebar(self):
|
||||||
|
r = TemplateIO(html=True)
|
||||||
if self.objectdef.asec_status == 'running':
|
if self.objectdef.asec_status == 'running':
|
||||||
'<h3>%s</h3>' % _('Visualisation & export of preliminary results')
|
r += htmltext('<h3>%s</h3>') % _('Visualisation & export of preliminary results')
|
||||||
else:
|
else:
|
||||||
'<h3>%s</h3>' % _('Visualisation & export of results')
|
r += htmltext('<h3>%s</h3>') % _('Visualisation & export of results')
|
||||||
|
|
||||||
'<ul>'
|
r += htmltext('<ul>')
|
||||||
' <li><a href="results/">%s</a></li>' % _('Statistics')
|
r += htmltext(' <li><a href="results/">%s</a></li>') % _('Statistics')
|
||||||
' <li><a href="results/csv">%s</a></li>' % _('CSV Export')
|
r += htmltext(' <li><a href="results/csv">%s</a></li>') % _('CSV Export')
|
||||||
if str(self.objectdef.workflow_id).endswith(str('+anonymous')):
|
if str(self.objectdef.workflow_id).endswith(str('+anonymous')):
|
||||||
' <li><a href="results/participation">%s</a>' % _('Participation')
|
r += htmltext(' <li><a href="results/participation">%s</a>') % _('Participation')
|
||||||
'</ul>'
|
r += htmltext('</ul>')
|
||||||
|
return r.getvalue()
|
||||||
|
|
||||||
def get_preview_form(self):
|
def get_preview_form(self):
|
||||||
form = Form()
|
form = Form()
|
||||||
|
@ -206,87 +212,91 @@ class FormDirectory(FieldsDirectory):
|
||||||
else:
|
else:
|
||||||
raise quota.QuotaExceeded()
|
raise quota.QuotaExceeded()
|
||||||
|
|
||||||
def index_top [html] (self):
|
def index_top(self):
|
||||||
'<ul id="main-actions">'
|
r = TemplateIO(html=True)
|
||||||
|
r += htmltext('<ul id="main-actions">')
|
||||||
if self.objectdef.asec_status == 'soon-available':
|
if self.objectdef.asec_status == 'soon-available':
|
||||||
'<li><a href="title" rel="popup">%s</a></li>' % _('Change Title')
|
r += htmltext('<li><a href="title" rel="popup">%s</a></li>') % _('Change Title')
|
||||||
'<li><a href="delete" rel="popup">%s</a></li>' % _('Delete')
|
r += htmltext('<li><a href="delete" rel="popup">%s</a></li>') % _('Delete')
|
||||||
'</ul>'
|
r += htmltext('</ul>')
|
||||||
|
|
||||||
'<h2>%s</h2>' % _('Design')
|
r += htmltext('<h2>%s</h2>') % _('Design')
|
||||||
get_session().display_message()
|
r += get_session().display_message()
|
||||||
|
|
||||||
'<ul>'
|
r += htmltext('<ul>')
|
||||||
if self.objectdef.roles:
|
if self.objectdef.roles:
|
||||||
'<li>%s ' % _('Anonymity:')
|
r += htmltext('<li>%s ') % _('Anonymity:')
|
||||||
if str(self.objectdef.workflow_id).endswith(str('+anonymous')):
|
if str(self.objectdef.workflow_id).endswith(str('+anonymous')):
|
||||||
'<strong>%s</strong>' % _('Enabled')
|
r += htmltext('<strong>%s</strong>') % _('Enabled')
|
||||||
' - '
|
r += ' - '
|
||||||
'<a href="anonymity-off">%s</a>' % _('Disabled')
|
r += htmltext('<a href="anonymity-off">%s</a>') % _('Disabled')
|
||||||
else:
|
else:
|
||||||
'<a href="anonymity-on">%s</a>' % _('Enabled')
|
r += htmltext('<a href="anonymity-on">%s</a>') % _('Enabled')
|
||||||
' - '
|
r += ' - '
|
||||||
'<strong>%s</strong>' % _('Disabled')
|
r += htmltext('<strong>%s</strong>') % _('Disabled')
|
||||||
'</li>'
|
r += htmltext('</li>')
|
||||||
|
|
||||||
if not self.objectdef.disabled:
|
if not self.objectdef.disabled:
|
||||||
' <li>%s ' % _('Current Status:')
|
r += htmltext(' <li>%s ') % _('Current Status:')
|
||||||
if self.objectdef.asec_status == 'soon-available':
|
if self.objectdef.asec_status == 'soon-available':
|
||||||
'<strong>%s</strong>' % _('Soon Available')
|
r += htmltext('<strong>%s</strong>') % _('Soon Available')
|
||||||
else:
|
else:
|
||||||
'<a href="status-soonavailable">%s</a> ' % _('Soon Available')
|
r += htmltext('<a href="status-soonavailable">%s</a> ') % _('Soon Available')
|
||||||
' - '
|
r += ' - '
|
||||||
if self.objectdef.asec_status == 'running':
|
if self.objectdef.asec_status == 'running':
|
||||||
'<strong>%s</strong>' % _('Running')
|
r += htmltext('<strong>%s</strong>') % _('Running')
|
||||||
else:
|
else:
|
||||||
if self.objectdef.fields:
|
if self.objectdef.fields:
|
||||||
'<a href="status-running">%s</a> ' % _('Running')
|
r += htmltext('<a href="status-running">%s</a> ') % _('Running')
|
||||||
else:
|
else:
|
||||||
_('Running')
|
r += _('Running')
|
||||||
' - '
|
r += ' - '
|
||||||
if self.objectdef.asec_status == 'closed':
|
if self.objectdef.asec_status == 'closed':
|
||||||
'<strong>%s</strong>' % _('Closed')
|
r += htmltext('<strong>%s</strong>') % _('Closed')
|
||||||
else:
|
else:
|
||||||
if self.objectdef.fields:
|
if self.objectdef.fields:
|
||||||
'<a href="status-closed">%s</a> ' % _('Closed')
|
r += htmltext('<a href="status-closed">%s</a> ') % _('Closed')
|
||||||
else:
|
else:
|
||||||
_('Closed')
|
r += _('Closed')
|
||||||
'</li>'
|
r += htmltext('</li>')
|
||||||
|
|
||||||
'</ul>'
|
r += htmltext('</ul>')
|
||||||
|
|
||||||
if not self.objectdef.fields:
|
if not self.objectdef.fields:
|
||||||
'<p>'
|
r += htmltext('<p>')
|
||||||
_('There are not yet any fields for this questionnaire.')
|
r += _('There are not yet any fields for this questionnaire.')
|
||||||
'</p>'
|
r += htmltext('</p>')
|
||||||
'<p>'
|
r += htmltext('<p>')
|
||||||
_('You should use the controls at the right of the page to add fields.')
|
r += _('You should use the controls at the right of the page to add fields.')
|
||||||
'</p>'
|
r += htmltext('</p>')
|
||||||
|
|
||||||
'<h3>%s</h3>' % _('Contents of your questionnaire')
|
r += htmltext('<h3>%s</h3>') % _('Contents of your questionnaire')
|
||||||
|
return r.getvalue()
|
||||||
|
|
||||||
def get_new_field_form [html] (self, page_no):
|
def get_new_field_form(self, page_no):
|
||||||
|
r = TemplateIO(html=True)
|
||||||
if not self.objectdef.disabled:
|
if not self.objectdef.disabled:
|
||||||
if not hasattr(self.objectdef, str('asec_status')):
|
if not hasattr(self.objectdef, str('asec_status')):
|
||||||
self.objectdef.asec_status = 'running'
|
self.objectdef.asec_status = 'running'
|
||||||
|
|
||||||
if self.objectdef.asec_status == 'soon-available':
|
if self.objectdef.asec_status == 'soon-available':
|
||||||
if self.objectdef.data_class().keys():
|
if self.objectdef.data_class().keys():
|
||||||
'<p>'
|
r += htmltext('<p>')
|
||||||
'<strong>%s</strong> ' % _('Warning:')
|
r += htmltext('<strong>%s</strong> ') % _('Warning:')
|
||||||
_('This form already contains submitted items.')
|
r += _('This form already contains submitted items.')
|
||||||
' '
|
r += ' '
|
||||||
'<a href="clean" rel="popup">%s</a>' % _('Remove Them')
|
r += htmltext('<a href="clean" rel="popup">%s</a>') % _('Remove Them')
|
||||||
'</p>'
|
r += htmltext('</p>')
|
||||||
|
|
||||||
if quota.may_add_a_new_field(self.objectdef):
|
if quota.may_add_a_new_field(self.objectdef):
|
||||||
super(FormDirectory, self).get_new_field_form(page_no)
|
r += super(FormDirectory, self).get_new_field_form(page_no)
|
||||||
else:
|
else:
|
||||||
'<p>'
|
r += htmltext('<p>')
|
||||||
_('This questionnaire has reached its number of questions quota.')
|
r += _('This questionnaire has reached its number of questions quota.')
|
||||||
'</p>'
|
r += htmltext('</p>')
|
||||||
|
return r.getvalue()
|
||||||
|
|
||||||
def clean [html] (self):
|
def clean(self):
|
||||||
form = Form(enctype='multipart/form-data')
|
form = Form(enctype='multipart/form-data')
|
||||||
form.widgets.append(HtmlWidget('<p>%s</p>' % _(
|
form.widgets.append(HtmlWidget('<p>%s</p>' % _(
|
||||||
'You are about to irrevocably remove all submitted questionnaires.')))
|
'You are about to irrevocably remove all submitted questionnaires.')))
|
||||||
|
@ -303,7 +313,7 @@ class FormDirectory(FieldsDirectory):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
html_top('forms', _('Remove submitted questionnaires'))
|
html_top('forms', _('Remove submitted questionnaires'))
|
||||||
form.render()
|
return form.render()
|
||||||
|
|
||||||
def clean_submit(self):
|
def clean_submit(self):
|
||||||
get_logger().info('form %s - wiped submitted form' % self.objectdef.id)
|
get_logger().info('form %s - wiped submitted form' % self.objectdef.id)
|
||||||
|
@ -348,7 +358,7 @@ class FormDirectory(FieldsDirectory):
|
||||||
self.objectdef.id, self.objectdef.asec_status))
|
self.objectdef.id, self.objectdef.asec_status))
|
||||||
return redirect('.')
|
return redirect('.')
|
||||||
|
|
||||||
def options [html] (self):
|
def options(self):
|
||||||
form = Form(enctype='multipart/form-data')
|
form = Form(enctype='multipart/form-data')
|
||||||
if self.objectdef.roles: # list of participants -> access codes
|
if self.objectdef.roles: # list of participants -> access codes
|
||||||
form.add(CheckboxWidget, 'access_as_password',
|
form.add(CheckboxWidget, 'access_as_password',
|
||||||
|
@ -369,8 +379,10 @@ class FormDirectory(FieldsDirectory):
|
||||||
get_response().breadcrumb.append( ('forms/', None) )
|
get_response().breadcrumb.append( ('forms/', None) )
|
||||||
get_response().breadcrumb.append( ('options', _('Options')) )
|
get_response().breadcrumb.append( ('options', _('Options')) )
|
||||||
html_top('forms', _('Options'))
|
html_top('forms', _('Options'))
|
||||||
'<h2>%s</h2>' % _('Options')
|
r = TemplateIO(html=True)
|
||||||
form.render()
|
r += htmltext('<h2>%s</h2>') % _('Options')
|
||||||
|
r += form.render()
|
||||||
|
return r.getvalue()
|
||||||
|
|
||||||
def options_submit(self, form):
|
def options_submit(self, form):
|
||||||
for widget in ('access_as_password',):
|
for widget in ('access_as_password',):
|
||||||
|
@ -393,7 +405,7 @@ class FormDirectory(FieldsDirectory):
|
||||||
class FormsDirectory(Directory):
|
class FormsDirectory(Directory):
|
||||||
_q_exports = ['']
|
_q_exports = ['']
|
||||||
|
|
||||||
def _q_index [html] (self):
|
def _q_index(self):
|
||||||
return redirect('..')
|
return redirect('..')
|
||||||
|
|
||||||
def _q_lookup(self, component):
|
def _q_lookup(self, component):
|
|
@ -16,6 +16,7 @@
|
||||||
|
|
||||||
from quixote import get_request, get_response, redirect
|
from quixote import get_request, get_response, redirect
|
||||||
from quixote.directory import Directory
|
from quixote.directory import Directory
|
||||||
|
from quixote.html import TemplateIO, htmltext
|
||||||
|
|
||||||
from qommon.backoffice.menu import html_top
|
from qommon.backoffice.menu import html_top
|
||||||
from qommon import errors, misc, get_logger
|
from qommon import errors, misc, get_logger
|
||||||
|
@ -56,33 +57,36 @@ class FormResultDirectory(FormPage):
|
||||||
def html_top(self, section, *args, **kwargs):
|
def html_top(self, section, *args, **kwargs):
|
||||||
html_top('forms/%s/results' % self.formdef.id, *args, **kwargs)
|
html_top('forms/%s/results' % self.formdef.id, *args, **kwargs)
|
||||||
|
|
||||||
def _q_index [html] (self):
|
def _q_index(self):
|
||||||
self.html_top(_('Analysis'))
|
self.html_top(_('Analysis'))
|
||||||
|
r = TemplateIO(html=True)
|
||||||
'<h2>%s</h2>' % _('Analysis')
|
r += htmltext('<h2>%s</h2>') % _('Analysis')
|
||||||
|
|
||||||
if self.formdef.asec_status == 'running':
|
if self.formdef.asec_status == 'running':
|
||||||
'<p>'
|
r += htmltext('<p>')
|
||||||
_('The questionnaire is still running, this is therefore preliminary data.')
|
r += _('The questionnaire is still running, this is therefore preliminary data.')
|
||||||
'</p>'
|
r += htmltext('</p>')
|
||||||
|
|
||||||
values = self.formdef.data_class().select()
|
values = self.formdef.data_class().select()
|
||||||
|
|
||||||
no_forms = len(values)
|
no_forms = len(values)
|
||||||
'<p>%s %d</p>' % (_('Total number of records:'), no_forms)
|
r += htmltext('<p>%s %d</p>') % (_('Total number of records:'), no_forms)
|
||||||
# XXX: insert participation stats here
|
# XXX: insert participation stats here
|
||||||
self.stats_fields(values)
|
r += self.stats_fields(values)
|
||||||
|
|
||||||
get_response().filter['sidebar'] = self.get_results_sidebar()
|
get_response().filter['sidebar'] = self.get_results_sidebar()
|
||||||
|
return r.getvalue()
|
||||||
|
|
||||||
def get_results_sidebar [html] (self, qs=''):
|
def get_results_sidebar(self, qs=''):
|
||||||
'<ul>'
|
r = TemplateIO(html=True)
|
||||||
' <li><a href="list%s">%s</a></li>' % (qs, _('List of results'))
|
r += htmltext('<ul>')
|
||||||
' <li><a href="table%s">%s</a></li>' % (qs, _('Table of results'))
|
r += htmltext(' <li><a href="list%s">%s</a></li>') % (qs, _('List of results'))
|
||||||
' <li><a href="csv%s">%s</a></li>' % (qs, _('CSV Export'))
|
r += htmltext(' <li><a href="table%s">%s</a></li>') % (qs, _('Table of results'))
|
||||||
|
r += htmltext(' <li><a href="csv%s">%s</a></li>') % (qs, _('CSV Export'))
|
||||||
if str(self.formdef.workflow_id).endswith(str('+anonymous')):
|
if str(self.formdef.workflow_id).endswith(str('+anonymous')):
|
||||||
' <li><a href="participation">%s</a>' % _('Participation')
|
r += htmltext(' <li><a href="participation">%s</a>') % _('Participation')
|
||||||
'</ul>'
|
r += htmltext('</ul>')
|
||||||
|
return r.getvalue()
|
||||||
|
|
||||||
def csv_tuple_heading(self, fields):
|
def csv_tuple_heading(self, fields):
|
||||||
if str(self.formdef.workflow_id).endswith(str('+anonymous')):
|
if str(self.formdef.workflow_id).endswith(str('+anonymous')):
|
||||||
|
@ -116,13 +120,14 @@ class FormResultDirectory(FormPage):
|
||||||
return get_request().form['filter']
|
return get_request().form['filter']
|
||||||
return 'all'
|
return 'all'
|
||||||
|
|
||||||
def participation [html] (self):
|
def participation(self):
|
||||||
if not str(self.formdef.workflow_id).endswith(str('+anonymous')):
|
if not str(self.formdef.workflow_id).endswith(str('+anonymous')):
|
||||||
raise errors.TraversalError()
|
raise errors.TraversalError()
|
||||||
get_logger().info('backoffice - form %s - participation' % self.formdef.name)
|
get_logger().info('backoffice - form %s - participation' % self.formdef.name)
|
||||||
self.html_top('%s - %s' % (_('Participation'), self.formdef.name))
|
self.html_top('%s - %s' % (_('Participation'), self.formdef.name))
|
||||||
|
r = TemplateIO(html=True)
|
||||||
get_response().breadcrumb.append( ('participation', _('Participation')) )
|
get_response().breadcrumb.append( ('participation', _('Participation')) )
|
||||||
'<h2>%s - %s</h2>' % (self.formdef.name, _('Participation'))
|
r += htmltext('<h2>%s - %s</h2>') % (self.formdef.name, _('Participation'))
|
||||||
|
|
||||||
nb_users = 0
|
nb_users = 0
|
||||||
if self.formdef.roles:
|
if self.formdef.roles:
|
||||||
|
@ -134,26 +139,27 @@ class FormResultDirectory(FormPage):
|
||||||
continue
|
continue
|
||||||
nb_users += 1
|
nb_users += 1
|
||||||
|
|
||||||
'<ul>'
|
r += htmltext('<ul>')
|
||||||
' <li>%s</li>' % _('Registered Participants: %s') % nb_users
|
r += htmltext(' <li>%s</li>') % _('Registered Participants: %s') % nb_users
|
||||||
|
|
||||||
voters = anonymity.get_voters(self.formdef)
|
voters = anonymity.get_voters(self.formdef)
|
||||||
' <li>%s</li>' % _('Registered Responses: %s') % len(voters)
|
r += htmltext(' <li>%s</li>') % _('Registered Responses: %s') % len(voters)
|
||||||
if nb_users:
|
if nb_users:
|
||||||
' <li>%s</li>' % _('Abstention: %.2f%%') % (100*(1.0-(1.0*len(voters)/nb_users)))
|
r += htmltext(' <li>%s</li>') % _('Abstention: %.2f%%') % (100*(1.0-(1.0*len(voters)/nb_users)))
|
||||||
else:
|
else:
|
||||||
' <li>%s</li>' % _('Abstention: n/a')
|
r += htmltext(' <li>%s</li>') % _('Abstention: n/a')
|
||||||
'</ul>'
|
r += htmltext('</ul>')
|
||||||
|
|
||||||
'<h3>%s</h3>' % _('List of participants')
|
r += htmltext('<h3>%s</h3>') % _('List of participants')
|
||||||
|
|
||||||
'<ul>'
|
r += htmltext('<ul>')
|
||||||
for v in sorted(voters):
|
for v in sorted(voters):
|
||||||
try:
|
try:
|
||||||
'<li>%s</li>' % User.get(v).display_name
|
r += htmltext('<li>%s</li>') % User.get(v).display_name
|
||||||
except KeyError:
|
except KeyError:
|
||||||
'<li>%s</li>' % _('Deleted user')
|
r += htmltext('<li>%s</li>') % _('Deleted user')
|
||||||
'</ul>'
|
r += htmltext('</ul>')
|
||||||
|
return r.getvalue()
|
||||||
|
|
||||||
def get_fields_from_query(self):
|
def get_fields_from_query(self):
|
||||||
field_ids = [x for x in get_request().form.keys()]
|
field_ids = [x for x in get_request().form.keys()]
|
||||||
|
@ -171,8 +177,9 @@ class FormResultDirectory(FormPage):
|
||||||
|
|
||||||
return fields
|
return fields
|
||||||
|
|
||||||
def list [html] (self):
|
def list(self):
|
||||||
self.html_top('%s - %s' % (_('List of results'), self.formdef.name))
|
self.html_top('%s - %s' % (_('List of results'), self.formdef.name))
|
||||||
|
r = TemplateIO(html=True)
|
||||||
fields = self.get_fields_from_query()
|
fields = self.get_fields_from_query()
|
||||||
qs = ''
|
qs = ''
|
||||||
if get_request().get_query():
|
if get_request().get_query():
|
||||||
|
@ -181,11 +188,11 @@ class FormResultDirectory(FormPage):
|
||||||
get_response().breadcrumb.append( ('list', _('List of results')) )
|
get_response().breadcrumb.append( ('list', _('List of results')) )
|
||||||
|
|
||||||
if len(fields) == 1:
|
if len(fields) == 1:
|
||||||
'<h2>%s</h2>' % fields[0].label
|
r += htmltext('<h2>%s</h2>') % fields[0].label
|
||||||
else:
|
else:
|
||||||
'<h2>%s</h2>' % _('List of results')
|
r += htmltext('<h2>%s</h2>') % _('List of results')
|
||||||
|
|
||||||
'<div class="fields-listing">'
|
r += htmltext('<div class="fields-listing">')
|
||||||
for result in self.formdef.data_class().select(order_by='id'):
|
for result in self.formdef.data_class().select(order_by='id'):
|
||||||
had_data = False
|
had_data = False
|
||||||
for field in fields:
|
for field in fields:
|
||||||
|
@ -219,19 +226,21 @@ class FormResultDirectory(FormPage):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if not had_data:
|
if not had_data:
|
||||||
'<div class="dataview">'
|
r += htmltext('<div class="dataview">')
|
||||||
had_data = True
|
had_data = True
|
||||||
if len(fields) > 1:
|
if len(fields) > 1:
|
||||||
'<p><span class="label">%s</span> ' % field.label
|
r += htmltext('<p><span class="label">%s</span> ') % field.label
|
||||||
'<span class="value">'
|
r += htmltext('<span class="value">')
|
||||||
value
|
r += value
|
||||||
'</span></p>'
|
r += htmltext('</span></p>')
|
||||||
if had_data:
|
if had_data:
|
||||||
'</div>'
|
r += htmltext('</div>')
|
||||||
'</div>'
|
r += htmltext('</div>')
|
||||||
|
return r.getvalue()
|
||||||
|
|
||||||
def table [html] (self):
|
def table(self):
|
||||||
self.html_top('%s - %s' % (_('Table of results'), self.formdef.name))
|
self.html_top('%s - %s' % (_('Table of results'), self.formdef.name))
|
||||||
|
r = TemplateIO(html=True)
|
||||||
fields = self.get_fields_from_query()
|
fields = self.get_fields_from_query()
|
||||||
qs = ''
|
qs = ''
|
||||||
if get_request().get_query():
|
if get_request().get_query():
|
||||||
|
@ -239,14 +248,14 @@ class FormResultDirectory(FormPage):
|
||||||
get_response().filter['sidebar'] = self.get_results_sidebar(qs) + self.get_fields_sidebar(fields)
|
get_response().filter['sidebar'] = self.get_results_sidebar(qs) + self.get_fields_sidebar(fields)
|
||||||
get_response().breadcrumb.append( ('table', _('Table of results')) )
|
get_response().breadcrumb.append( ('table', _('Table of results')) )
|
||||||
|
|
||||||
'<h2>%s</h2>' % _('Table of results')
|
r += htmltext('<h2>%s</h2>') % _('Table of results')
|
||||||
|
|
||||||
'<table id="listing">'
|
r += htmltext('<table id="listing">')
|
||||||
'<thead>'
|
r += htmltext('<thead>')
|
||||||
for field in fields:
|
for field in fields:
|
||||||
'<th>%s</th>' % field.label
|
r += htmltext('<th>%s</th>') % field.label
|
||||||
'</thead>'
|
r += htmltext('</thead>')
|
||||||
'<tbody>'
|
r += htmltext('<tbody>')
|
||||||
for result in self.formdef.data_class().select(order_by='id'):
|
for result in self.formdef.data_class().select(order_by='id'):
|
||||||
had_data = False
|
had_data = False
|
||||||
for field in fields:
|
for field in fields:
|
||||||
|
@ -274,32 +283,35 @@ class FormResultDirectory(FormPage):
|
||||||
value = value.replace(str('[download]'), str(''))
|
value = value.replace(str('[download]'), str(''))
|
||||||
|
|
||||||
if not had_data:
|
if not had_data:
|
||||||
'<tr>'
|
r += htmltext('<tr>')
|
||||||
had_data = True
|
had_data = True
|
||||||
'<td>'
|
r += htmltext('<td>')
|
||||||
value
|
r += value
|
||||||
'</td>'
|
r += htmltext('</td>')
|
||||||
if had_data:
|
if had_data:
|
||||||
'</tr>'
|
r += htmltext('</tr>')
|
||||||
'</tbody>'
|
r += htmltext('</tbody>')
|
||||||
'</table>'
|
r += htmltext('</table>')
|
||||||
|
return r.getvalue()
|
||||||
|
|
||||||
def get_fields_sidebar [html] (self, fields):
|
def get_fields_sidebar(self, fields):
|
||||||
'<h3>%s</h3>' % _('Fields to display')
|
r = TemplateIO(html=True)
|
||||||
'<form>'
|
r += htmltext('<h3>%s</h3>') % _('Fields to display')
|
||||||
'<ul>'
|
r += htmltext('<form>')
|
||||||
|
r += htmltext('<ul>')
|
||||||
for field in self.get_formdef_fields():
|
for field in self.get_formdef_fields():
|
||||||
if not hasattr(field, str('get_view_value')):
|
if not hasattr(field, str('get_view_value')):
|
||||||
continue
|
continue
|
||||||
'<li><input type="checkbox" name="%s"' % field.id
|
r += htmltext('<li><input type="checkbox" name="%s"') % field.id
|
||||||
if field.id in [x.id for x in fields]:
|
if field.id in [x.id for x in fields]:
|
||||||
' checked="checked"'
|
r += htmltext(' checked="checked"')
|
||||||
'/>'
|
r += htmltext('/>')
|
||||||
'<label for="%s">%s</label>' % (field.id, field.label)
|
r += htmltext('<label for="%s">%s</label>') % (field.id, field.label)
|
||||||
'</li>'
|
r += htmltext('</li>')
|
||||||
'</ul>'
|
r += htmltext('</ul>')
|
||||||
'<input type="submit" value="%s"/>' % _('Reload')
|
r += htmltext('<input type="submit" value="%s"/>') % _('Reload')
|
||||||
'</form>'
|
r += htmltext('</form>')
|
||||||
|
return r.getvalue()
|
||||||
|
|
||||||
def get_formdef_fields(self):
|
def get_formdef_fields(self):
|
||||||
fields = []
|
fields = []
|
|
@ -16,6 +16,7 @@
|
||||||
|
|
||||||
from quixote import get_request, redirect
|
from quixote import get_request, redirect
|
||||||
from quixote.directory import Directory
|
from quixote.directory import Directory
|
||||||
|
from quixote.html import TemplateIO, htmltext
|
||||||
from qommon.admin.texts import TextsDirectory
|
from qommon.admin.texts import TextsDirectory
|
||||||
from qommon.admin.emails import EmailsDirectory
|
from qommon.admin.emails import EmailsDirectory
|
||||||
from qommon import errors
|
from qommon import errors
|
||||||
|
@ -43,7 +44,8 @@ class ResultsDirectory(Directory):
|
||||||
if self.formdef.asec_status != 'closed':
|
if self.formdef.asec_status != 'closed':
|
||||||
raise errors.AccessForbiddenError()
|
raise errors.AccessForbiddenError()
|
||||||
|
|
||||||
def stats_fields [html] (self, values):
|
def stats_fields(self, values):
|
||||||
|
r = TemplateIO(html=True)
|
||||||
had_page = False
|
had_page = False
|
||||||
last_page = None
|
last_page = None
|
||||||
last_title = None
|
last_title = None
|
||||||
|
@ -62,22 +64,24 @@ class ResultsDirectory(Directory):
|
||||||
continue
|
continue
|
||||||
if last_page:
|
if last_page:
|
||||||
if had_page:
|
if had_page:
|
||||||
'</div>'
|
r += htmltext('</div>')
|
||||||
'<div class="page">'
|
r += htmltext('<div class="page">')
|
||||||
'<h3>%s</h3>' % last_page
|
r += htmltext('<h3>%s</h3>') % last_page
|
||||||
had_page = True
|
had_page = True
|
||||||
last_page = None
|
last_page = None
|
||||||
if last_title:
|
if last_title:
|
||||||
'<h3>%s</h3>' % last_title
|
r += htmltext('<h3>%s</h3>') % last_title
|
||||||
last_title = None
|
last_title = None
|
||||||
t
|
r += t
|
||||||
|
|
||||||
if had_page:
|
if had_page:
|
||||||
'</div>'
|
r += htmltext('</div>')
|
||||||
|
return r.getvalue()
|
||||||
|
|
||||||
|
|
||||||
def _q_index [html] (self):
|
def _q_index(self):
|
||||||
wcs.forms.root.html_top(self.formdef.name)
|
wcs.forms.root.html_top(self.formdef.name)
|
||||||
|
r = TemplateIO(html=True)
|
||||||
|
|
||||||
# XXX: need an option to decide if we want results to be displayed
|
# XXX: need an option to decide if we want results to be displayed
|
||||||
#values = self.formdef.data_class().select()
|
#values = self.formdef.data_class().select()
|
||||||
|
@ -85,18 +89,19 @@ class ResultsDirectory(Directory):
|
||||||
|
|
||||||
if str(self.formdef.workflow_id).endswith(str('+anonymous')):
|
if str(self.formdef.workflow_id).endswith(str('+anonymous')):
|
||||||
# Verification Code
|
# Verification Code
|
||||||
'<div class="verification-code">'
|
r += htmltext('<div class="verification-code">')
|
||||||
'<h3>%s</h3>' % _('Anonymous Verification Code Check')
|
r += htmltext('<h3>%s</h3>') % _('Anonymous Verification Code Check')
|
||||||
form = Form(action='check')
|
form = Form(action='check')
|
||||||
form.add(StringWidget, 'code', title=('Verification Code'), required=True)
|
form.add(StringWidget, 'code', title=('Verification Code'), required=True)
|
||||||
_('Enter your verification code to check it against the recorded ballot.')
|
r += _('Enter your verification code to check it against the recorded ballot.')
|
||||||
form.add_submit('submit', _('Submit'))
|
form.add_submit('submit', _('Submit'))
|
||||||
form.render()
|
r += form.render()
|
||||||
_('Or search for it in the list of all the ballots:')
|
r += _('Or search for it in the list of all the ballots:')
|
||||||
' <a href="listing">%s</a>' % _('complete listing')
|
r += htmltext(' <a href="listing">%s</a>') % _('complete listing')
|
||||||
'</div>'
|
r += htmltext('</div>')
|
||||||
|
return r.getvalue()
|
||||||
|
|
||||||
def check [html] (self):
|
def check(self):
|
||||||
if not str(self.formdef.workflow_id).endswith(str('+anonymous')):
|
if not str(self.formdef.workflow_id).endswith(str('+anonymous')):
|
||||||
raise errors.TraversalError()
|
raise errors.TraversalError()
|
||||||
wcs.forms.root.html_top(self.formdef.name)
|
wcs.forms.root.html_top(self.formdef.name)
|
||||||
|
@ -107,36 +112,39 @@ class ResultsDirectory(Directory):
|
||||||
return redirect('.')
|
return redirect('.')
|
||||||
|
|
||||||
code = get_request().form.get('code')
|
code = get_request().form.get('code')
|
||||||
|
r = TemplateIO(html=True)
|
||||||
|
|
||||||
import anonymity
|
import anonymity
|
||||||
if code not in anonymity.get_verification_codes(self.formdef):
|
if code not in anonymity.get_verification_codes(self.formdef):
|
||||||
'<p>'
|
r += htmltext('<p>')
|
||||||
_('No ballot has been found with such a verification code.')
|
r += _('No ballot has been found with such a verification code.')
|
||||||
'</p>'
|
r += htmltext('</p>')
|
||||||
else:
|
else:
|
||||||
for formdata in self.formdef.data_class().select():
|
for formdata in self.formdef.data_class().select():
|
||||||
if hasattr(formdata, str('verification_code')) and formdata.verification_code == code:
|
if hasattr(formdata, str('verification_code')) and formdata.verification_code == code:
|
||||||
form_status = wcs.forms.root.PublicFormStatusPage(self.formdef, formdata)
|
form_status = wcs.forms.root.PublicFormStatusPage(self.formdef, formdata)
|
||||||
'<p>'
|
r += htmltext('<p>')
|
||||||
_('The following ballot has been recorded:')
|
r += _('The following ballot has been recorded:')
|
||||||
'</p>'
|
r += htmltext('</p>')
|
||||||
form_status.receipt(show_status=False, show_signature=False, form_url=None)
|
r += form_status.receipt(show_status=False, show_signature=False, form_url=None)
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
'<p>'
|
r += htmltext('<p>')
|
||||||
_('No ballot has been found with such a verification code.')
|
r += _('No ballot has been found with such a verification code.')
|
||||||
'</p>'
|
r += htmltext('</p>')
|
||||||
|
return r.getvalue()
|
||||||
|
|
||||||
def listing [html] (self):
|
def listing(self):
|
||||||
if not str(self.formdef.workflow_id).endswith(str('+anonymous')):
|
if not str(self.formdef.workflow_id).endswith(str('+anonymous')):
|
||||||
raise errors.TraversalError()
|
raise errors.TraversalError()
|
||||||
wcs.forms.root.html_top(self.formdef.name)
|
wcs.forms.root.html_top(self.formdef.name)
|
||||||
import anonymity
|
import anonymity
|
||||||
|
|
||||||
'<ul>'
|
r += htmltext('<ul>')
|
||||||
for code in anonymity.get_verification_codes(self.formdef):
|
for code in anonymity.get_verification_codes(self.formdef):
|
||||||
'<li><a href="check?code=%s">%s</a></li>' % (code, code)
|
r += htmltext('<li><a href="check?code=%s">%s</a></li>') % (code, code)
|
||||||
'</ul>'
|
r += htmltext('</ul>')
|
||||||
|
return r.getvalue()
|
||||||
|
|
||||||
|
|
||||||
class FormPage(wcs.forms.root.FormPage):
|
class FormPage(wcs.forms.root.FormPage):
|
||||||
|
@ -187,17 +195,19 @@ class FormPage(wcs.forms.root.FormPage):
|
||||||
except AlreadyVotedError:
|
except AlreadyVotedError:
|
||||||
return self.already_voted_error()
|
return self.already_voted_error()
|
||||||
|
|
||||||
def expired [html] (self):
|
def expired(self):
|
||||||
wcs.forms.root.html_top(self.formdef.name)
|
wcs.forms.root.html_top(self.formdef.name)
|
||||||
TextsDirectory.get_html_text('asec-expired-site-questionnaire')
|
return TextsDirectory.get_html_text('asec-expired-site-questionnaire')
|
||||||
|
|
||||||
def soon_available [html] (self):
|
def soon_available(self):
|
||||||
wcs.forms.root.html_top(self.formdef.name)
|
wcs.forms.root.html_top(self.formdef.name)
|
||||||
'<div id="access-asec-identify">'
|
r = TemplateIO(html=True)
|
||||||
TextsDirectory.get_html_text('asec-soon-available')
|
r += htmltext('<div id="access-asec-identify">')
|
||||||
'</div>'
|
r += TextsDirectory.get_html_text('asec-soon-available')
|
||||||
|
r += htmltext('</div>')
|
||||||
|
return r.getvalue()
|
||||||
|
|
||||||
def participant_ask_token [html] (self):
|
def participant_ask_token(self):
|
||||||
form = Form(enctype='multipart/form-data')
|
form = Form(enctype='multipart/form-data')
|
||||||
form.add(EmailWidget, 'email', title=_('Email'), required=True)
|
form.add(EmailWidget, 'email', title=_('Email'), required=True)
|
||||||
if self.formdef.access_as_password:
|
if self.formdef.access_as_password:
|
||||||
|
@ -220,26 +230,28 @@ class FormPage(wcs.forms.root.FormPage):
|
||||||
form_reminder.clear_errors()
|
form_reminder.clear_errors()
|
||||||
|
|
||||||
wcs.forms.root.html_top(self.formdef.name)
|
wcs.forms.root.html_top(self.formdef.name)
|
||||||
|
r = TemplateIO(html=True)
|
||||||
|
|
||||||
'<div id="access-asec">'
|
r += htmltext('<div id="access-asec">')
|
||||||
get_session().display_message()
|
r += get_session().display_message()
|
||||||
|
|
||||||
'<div id="access-asec-identify">'
|
r += htmltext('<div id="access-asec-identify">')
|
||||||
if self.formdef.asec_status == 'soon-available':
|
if self.formdef.asec_status == 'soon-available':
|
||||||
TextsDirectory.get_html_text('asec-soon-available')
|
r += TextsDirectory.get_html_text('asec-soon-available')
|
||||||
else:
|
else:
|
||||||
TextsDirectory.get_html_text('asec-please-identify')
|
r += TextsDirectory.get_html_text('asec-please-identify')
|
||||||
form.render()
|
r += form.render()
|
||||||
'</div>'
|
r += htmltext('</div>')
|
||||||
|
|
||||||
'<div id="access-asec-reminder">'
|
r += htmltext('<div id="access-asec-reminder">')
|
||||||
'<h3>%s</h3>' % _('Lost or forgotten access code?')
|
r += htmltext('<h3>%s</h3>') % _('Lost or forgotten access code?')
|
||||||
'<p>'
|
r += htmltext('<p>')
|
||||||
_('Please enter your e-mail address to get a new access code sent to you.')
|
r += _('Please enter your e-mail address to get a new access code sent to you.')
|
||||||
'</p>'
|
r += htmltext('</p>')
|
||||||
form_reminder.render()
|
r += form_reminder.render()
|
||||||
'</div>'
|
r += htmltext('</div>')
|
||||||
'</div> <!-- #access-asec -->'
|
r += htmltext('</div> <!-- #access-asec -->')
|
||||||
|
return r.getvalue()
|
||||||
|
|
||||||
def participant_ask_token_submit(self, form):
|
def participant_ask_token_submit(self, form):
|
||||||
email = form.get_widget('email').parse()
|
email = form.get_widget('email').parse()
|
||||||
|
@ -300,9 +312,9 @@ class FormPage(wcs.forms.root.FormPage):
|
||||||
|
|
||||||
return redirect('.')
|
return redirect('.')
|
||||||
|
|
||||||
def already_voted_error [html] (self):
|
def already_voted_error(self):
|
||||||
wcs.forms.root.html_top(self.formdef.name)
|
wcs.forms.root.html_top(self.formdef.name)
|
||||||
TextsDirectory.get_html_text('asec-already-voted')
|
return TextsDirectory.get_html_text('asec-already-voted')
|
||||||
|
|
||||||
|
|
||||||
TextsDirectory.register('asec-already-voted',
|
TextsDirectory.register('asec-already-voted',
|
|
@ -19,6 +19,7 @@ import os
|
||||||
from quixote import get_publisher, get_request, get_response, redirect
|
from quixote import get_publisher, get_request, get_response, redirect
|
||||||
from quixote.directory import Directory
|
from quixote.directory import Directory
|
||||||
from quixote.util import StaticDirectory
|
from quixote.util import StaticDirectory
|
||||||
|
from quixote.html import TemplateIO, htmltext
|
||||||
|
|
||||||
from qommon.admin.texts import TextsDirectory
|
from qommon.admin.texts import TextsDirectory
|
||||||
from qommon import template
|
from qommon import template
|
||||||
|
@ -83,7 +84,7 @@ class RootDirectory(wcs.root.RootDirectory):
|
||||||
return TextsDirectory.get_html_text('asec-locked-site')
|
return TextsDirectory.get_html_text('asec-locked-site')
|
||||||
return Directory._q_traverse(self, path)
|
return Directory._q_traverse(self, path)
|
||||||
|
|
||||||
def _q_index [html] (self):
|
def _q_index(self):
|
||||||
template.html_top()
|
template.html_top()
|
||||||
|
|
||||||
formdefs = FormDef.select(order_by='name', ignore_errors=True)
|
formdefs = FormDef.select(order_by='name', ignore_errors=True)
|
||||||
|
@ -91,26 +92,28 @@ class RootDirectory(wcs.root.RootDirectory):
|
||||||
if quota.is_expired():
|
if quota.is_expired():
|
||||||
return self.index_expired()
|
return self.index_expired()
|
||||||
|
|
||||||
|
r = TemplateIO(html=True)
|
||||||
if len(formdefs) == 0:
|
if len(formdefs) == 0:
|
||||||
TextsDirectory.get_html_text('asec-welcome-empty-site')
|
r += TextsDirectory.get_html_text('asec-welcome-empty-site')
|
||||||
else:
|
else:
|
||||||
if get_request().user:
|
if get_request().user:
|
||||||
TextsDirectory.get_html_text('welcome-logged')
|
r += TextsDirectory.get_html_text('welcome-logged')
|
||||||
else:
|
else:
|
||||||
TextsDirectory.get_html_text('welcome-unlogged')
|
r += TextsDirectory.get_html_text('welcome-unlogged')
|
||||||
|
|
||||||
'<ul>'
|
r += htmltext('<ul>')
|
||||||
for formdef in formdefs:
|
for formdef in formdefs:
|
||||||
if formdef.disabled:
|
if formdef.disabled:
|
||||||
continue
|
continue
|
||||||
if formdef.private:
|
if formdef.private:
|
||||||
continue
|
continue
|
||||||
'<li><a href="%s/">%s</a></li>' % (formdef.url_name, formdef.name)
|
r += htmltext('<li><a href="%s/">%s</a></li>') % (formdef.url_name, formdef.name)
|
||||||
'</ul>'
|
r += htmltext('</ul>')
|
||||||
|
return r.getvalue()
|
||||||
|
|
||||||
def index_expired [html] (self):
|
def index_expired(self):
|
||||||
template.html_top()
|
template.html_top()
|
||||||
TextsDirectory.get_html_text('asec-expired-site-homepage')
|
return TextsDirectory.get_html_text('asec-expired-site-homepage')
|
||||||
|
|
||||||
def _q_lookup(self, component):
|
def _q_lookup(self, component):
|
||||||
if component in ('css','images'):
|
if component in ('css','images'):
|
Reference in New Issue