def create_settings_form(): """Create settings form for ZMIForm. """ form = BasicForm('manage_settings') title = fields.StringField('title', title="Title", required=False, default="") row_length = fields.IntegerField( 'row_length', title='Number of groups in row (in order tab)', required=True, default=4) name = fields.StringField('name', title="Form name", required=False, default="") action = fields.StringField('action', title='Form action', required=False, default="") method = fields.ListField('method', title='Form method', items=[('POST', 'POST'), ('GET', 'GET')], required=True, size=1, default='POST') enctype = fields.ListField('enctype', title='Form enctype', items=[('No enctype', ""), ('application/x-www-form-urlencoded', 'application/x-www-form-urlencoded'), ('multipart/form-data', 'multipart/form-data')], required=False, size=1, default=None) encoding = fields.StringField('encoding', title='Encoding of pages the form is in', default="UTF-8", required=True) stored_encoding = fields.StringField('stored_encoding', title='Encoding of form properties', default='ISO-8859-1', required=True) unicode_mode = fields.CheckBoxField('unicode_mode', title='Form properties are unicode', default=False, required=True) form.add_fields([ title, row_length, name, action, method, enctype, encoding, stored_encoding, unicode_mode ]) return form
class LinkValidator(StringValidator): property_names = StringValidator.property_names +\ ['check_link', 'check_timeout', 'link_type'] check_link = fields.CheckBoxField('check_link', title='Check Link', description=( "Check whether the link is not broken."), default=0) check_timeout = fields.FloatField('check_timeout', title='Check Timeout', description=( "Maximum amount of seconds to check link. Required"), default=7.0, required=1) link_type = fields.ListField('link_type', title='Type of Link', default="external", size=1, items=[('External Link', 'external'), ('Internal Link', 'internal'), ('Relative Link', 'relative')], description=( "Define the type of the link. Required."), required=1) message_names = StringValidator.message_names + ['not_link'] not_link = 'The specified link is broken.' def validate(self, field, key, REQUEST): value = StringValidator.validate(self, field, key, REQUEST) if value == "" and not field.get_value('required'): return value link_type = field.get_value('link_type') if link_type == 'internal': value = urljoin(REQUEST['BASE0'], value) elif link_type == 'relative': value = urljoin(REQUEST['URL1'], value) # otherwise must be external # FIXME: should try regular expression to do some more checking here? # if we don't need to check the link, we're done now if not field.get_value('check_link'): return value # resolve internal links using Zope's resolve_url if link_type in ['internal', 'relative']: try: REQUEST.resolve_url(value) except: self.raise_error('not_link', field) # check whether we can open the link link = LinkHelper(value) thread = Thread(target=link.open) thread.start() thread.join(field.get_value('check_timeout')) del thread if not link.status: self.raise_error('not_link', field) return value