forms: add description and keywords to formdefs (#6194)

This commit is contained in:
Frédéric Péters 2015-01-26 14:43:24 +01:00
parent f4ed497c38
commit 78c0dad11f
4 changed files with 73 additions and 4 deletions

View File

@ -414,6 +414,28 @@ def test_form_qrcode():
resp = resp.click(href='qrcode')
assert '<div id="qrcode">' in resp.body
def test_form_description():
create_superuser()
create_role()
FormDef.wipe()
formdef = FormDef()
formdef.name = 'form title'
formdef.fields = []
formdef.store()
app = login(get_app(pub))
resp = app.get('/admin/forms/1/')
assert 'No description or keywords' in resp.body
resp = resp.click(href='information')
resp.forms[0]['description'].value = '<p>Hello World</p>'
resp = resp.forms[0].submit()
assert resp.location == 'http://example.net/admin/forms/1/'
resp = resp.follow()
assert 'No description or keywords' not in resp.body
assert 'Hello World' in resp.body
def test_form_new_field():
create_superuser()
create_role()

View File

@ -173,7 +173,7 @@ class FormDefPage(Directory):
'category', 'role', ('workflow-options', 'workflow_options'),
('workflow-status-remapping', 'workflow_status_remapping'),
'roles', 'title', 'options', ('acl-read', 'acl_read'),
'overwrite', 'qrcode']
'overwrite', 'qrcode', 'information']
def __init__(self, component):
try:
@ -194,7 +194,8 @@ class FormDefPage(Directory):
self.html_top(title = self.formdef.name)
r = TemplateIO(html=True)
get_response().filter['sidebar'] = self.get_sidebar()
get_response().add_javascript(['jquery.js', 'widget_list.js'])
get_response().add_javascript(['jquery.js', 'widget_list.js',
'ckeditor/ckeditor.js', 'qommon.wysiwyg.js', 'ckeditor/adapters/jquery.js'])
DateWidget.prepare_javascript()
r += htmltext('<h2>%s - ') % _('Form')
@ -222,6 +223,18 @@ class FormDefPage(Directory):
r += get_session().display_message()
r += htmltext('<div class="bo-block">')
r += htmltext('<h3>%s') % _('Information')
if not (self.formdef.description or self.formdef.keywords):
r += htmltext(' <span class="change">(%s)</span>') % _('No description or keywords')
r += htmltext(' <span class="change">(<a rel="popup" href="information">%s</a>)</span></h3>') % _('change')
if self.formdef.description:
r += htmltext(self.formdef.description)
if self.formdef.keywords:
r += htmltext('<p>%s %s</p>') % (
_('Keywords:'), self.formdef.keywords)
r += htmltext('</div>')
r += htmltext('<div class="splitcontent-left">')
r += htmltext('<div class="bo-block">')
r += htmltext('<h3>%s</h3>') % _('Access')
@ -488,6 +501,33 @@ class FormDefPage(Directory):
r += form.render()
return r.getvalue()
def information(self):
form = Form(enctype='multipart/form-data')
form.add(WysiwygTextWidget, 'description', title=_('Description'),
value=self.formdef.description)
form.add(StringWidget, 'keywords', title=_('Keywords'),
value=self.formdef.keywords, size=50)
form.add_submit('submit', _('Submit'))
form.add_submit('cancel', _('Cancel'))
if form.get_widget('cancel').parse():
return redirect('.')
if form.is_submitted() and not form.has_errors():
for field_name in ('description', 'keywords'):
widget = form.get_widget(field_name)
if widget:
setattr(self.formdef, field_name, widget.parse())
self.formdef.store()
return redirect('.')
get_response().breadcrumb.append( ('information', _('Information')) )
self.html_top(title=self.formdef.name)
r = TemplateIO(html=True)
r += htmltext('<h2>%s</h2>') % _('Information')
r += form.render()
return r.getvalue()
def options(self):
form = Form(enctype='multipart/form-data')
form.add(CheckboxWidget, 'confirmation', title=_('Include confirmation page'),

View File

@ -58,6 +58,8 @@ class FormDef(StorableObject):
_indexes = ['url_name']
name = None
description = None
keywords = None
url_name = None
table_name = None # for SQL only
fields = None
@ -86,7 +88,7 @@ class FormDef(StorableObject):
max_field_id = None
# declarations for serialization
TEXT_ATTRIBUTES = ['name', 'url_name',
TEXT_ATTRIBUTES = ['name', 'url_name', 'description', 'keywords',
'publication_date', 'expiration_date',
'disabled_redirection',]
BOOLEAN_ATTRIBUTES = ['discussion', 'detailed_emails', 'disabled',

View File

@ -958,11 +958,16 @@ class RootDirectory(AccessControlled, Directory):
if formdef.acl_read == 'all':
r += htmltext(' <a class="listing" href="%s%s/listing">%s</a>') % (
url_prefix, formdef.url_name, _('(listing)'))
if formdef.description:
r += htmltext('<div class="description">%s</div>' % formdef.description)
r += htmltext('</li>')
for formdef in advertised_forms:
r += htmltext('<li class="required-authentication">')
r += htmltext('<a href="%s%s/">%s</a>') % (url_prefix, formdef.url_name, formdef.name)
r += htmltext('<span> (%s)</span></li>') % _('authentication required')
r += htmltext('<span> (%s)</span>') % _('authentication required')
if formdef.description:
r += htmltext('<div class="description">%s</div>' % formdef.description)
r += htmltext('</li>')
r += htmltext('</ul>')
r += htmltext('</div>')
return r.getvalue()