def test_validatorMethod(self): self.root.manage_addProduct['Formulator'] \ .manage_add('form', 'Test Form') form = self.root.form self.root.manage_addDTMLMethod('test_dtml', 'Test DTML', 'ok') form.manage_addField('string_field', '<string> Field', 'StringField') form.string_field.values['external_validator'] = Method('test_dtml') # test that the override works: self.assertEquals('ok', form.string_field.get_value('external_validator')()) # now serialize it: xml = formToXML(form) # get the external validator from the output # XXX this could be more elegant, I guess ... for line in xml.split('\n'): m = re.match( r'\s*<external_validator type="method">(.*?)</external_validator>\s*', line) if m: break else: self.fail('external_validator not found in xml') self.assertEquals('test_dtml', m.group(1)) # deserialize it self.root.manage_addProduct['Formulator'] \ .manage_add('form2', 'Test Form') form2 = self.root.form2 XMLToForm(xml, form2) self.assertEquals('ok', form2.string_field.get_value('external_validator')())
def test_messages(self): """ test if the error messages are exported """ factory = self.root.manage_addProduct['Formulator'] factory.manage_add('form', 'Test Form') form = self.root.form form.manage_addField('int_field', 'int Field', 'IntegerField') form2 = ZMIForm('test2', 'ValueTest') request = TestRequest() for message_key in form.int_field.get_error_names(): request.form[ message_key] = 'test message for error key <%s>' % message_key form.int_field.manage_messages(REQUEST=request) xml = formToXML(form) XMLToForm(xml, form2) # print xml request = TestRequest(form={'field_int_field': 'not a number'}) try: form.validate_all(request) self.fail('form should fail in validation') except FormValidationError, e: self.assertEquals(1, len(e.errors)) text1 = e.errors[0].error_text
def test_messages(self): """ test if the error messages are exported """ form = ZMIForm('test', '<EncodingTest>') form.manage_addField('int_field', 'int Field', 'IntegerField') form2 = ZMIForm('test2', 'ValueTest') request = FakeRequest() for message_key in form.int_field.get_error_names(): request[ message_key] = 'test message for error key <%s>' % message_key form.int_field.manage_messages(REQUEST=request) xml = formToXML(form) XMLToForm(xml, form2) # print xml request.clear() request['field_int_field'] = 'not a number' try: form.validate_all(request) self.fail('form should fail in validation') except FormValidationError, e: self.assertEqual(1, len(e.errors)) text1 = e.errors[0].error_text
def test_emptyGroup(self): """ test bugfix: empty groups are allowed in the XMLForm """ form = ZMIForm('test', 'GroupTest') form.add_group('empty') form2 = ZMIForm('test2', 'GroupTestCopy') xml = formToXML(form) XMLToForm(xml, form2) # print xml self.assertEqualForms(form, form2)
def test_serializeDateTimeValues(self): form = ZMIForm('test', 'DateTime') form.manage_addField('date_field', 'Date Field', 'DateTimeField') form.date_field.values['start_datetime'] = DateTime( '2004/01/01 12:01:00') form2 = ZMIForm('test', 'DateTime2') xml = formToXML(form) XMLToForm(xml, form2) self.assertEqualForms(form, form2)
def _readFile(self, reparse): f = open(expandpath(self._filepath), 'rb') # update the form with the xml data try: XMLToForm(f.read(), self) except: # bare except here, but I hope this is ok, as the # exception should be reraised # (except if the LOG raises another one ... should we be more paranoid here?) import zLOG zLOG.LOG('Formulator.FSForm',zLOG.ERROR, 'error reading form from file '+expandpath(self._filepath)) raise f.close()
def test_emptyGroup(self): """ test bugfix: empty groups are allowed in the XMLForm """ form = ZMIForm('test', 'GroupTest') form.add_group('empty') form2 = ZMIForm('test2', 'GroupTestCopy') xml = formToXML(form) XMLToForm(xml, form2) # print xml # XXX actually the empty group is not rendered anyway, but # if we get here, we are behind the bug anyway ... self.assertEqual(form.render(), form2.render()) self.assertEqual(form.get_groups(), form2.get_groups())
def question_created(question, event): service = getUtility(IServicePolls) editable = question.get_editable() if service.automatically_hide_question(): # Hide poll question of tocs if setting is set by default. binding = getUtility(IMetadataService).getMetadata(editable) binding.setValues('silva-extra', {'hide_from_tocs': 'hide'}, reindex=1) # Create question in storage. editable.qid = service.create_question('', []) # Set the code source configuration form thingy. cs_form = ZMIForm('form', 'Properties Form') cs_filename = os.path.join(os.path.dirname(__file__), 'cs_configuration_form.form') with open(cs_filename) as cs_file: XMLToForm(cs_file.read(), cs_form) question.parameters = cs_form
def test_serializeProxyField(self): """Test formToXML and XMLToForm with proxyfields. """ portal_skins = self.getSkinsTool() # Create the default field library with a template field portal_skins.manage_addProduct['OFSP'].manage_addFolder('erp5_geek') skin_folder = portal_skins._getOb('erp5_geek') skin_folder.manage_addProduct['ERP5Form'].addERP5Form( 'Base_viewGeekFieldLibrary', 'View') form = skin_folder._getOb('Base_viewGeekFieldLibrary', None) form.manage_addField('my_title', 'My Geek Title', 'StringField') # Custom field library has to have an higher priority selection = portal_skins.getSkinPath('View') selection = selection.split(',') selection.append('erp5_geek') portal_skins.manage_skinLayers(skinpath=tuple(selection), skinname='View', add_skin=1) portal_skins.getPortalObject().changeSkin(None) skin_folder = portal_skins._getOb('custom') skin_folder.manage_addProduct['ERP5Form'].addERP5Form( 'Base_viewGeek', 'View') form = skin_folder._getOb('Base_viewGeek', None) form.manage_addField('my_title', 'Title', 'ProxyField') field = form._getOb('my_title') field.manage_edit_xmlrpc( dict(form_id='Base_viewGeekFieldLibrary', field_id='my_title')) my_title = 'My Custom Proxy Title' field.manage_edit_surcharged_xmlrpc({'title': my_title}) # Test xml serialisation of form. xml_string = formToXML(form) xml_tree = etree.fromstring(xml_string) field_node = xml_tree.find('groups/group/fields/field') self.assertEqual(field_node.find('type').text, 'ProxyField') self.assertTrue(field_node.find('delegated_list/title') is not None) skin_folder.manage_addProduct['ERP5Form'].addERP5Form( 'Base_viewSuperGeek', 'View') form = skin_folder._getOb('Base_viewSuperGeek') # Test objectification of XML XMLToForm(xml_string, form) self.assertTrue(form.my_title.get_value('title'), my_title)
def PUT(self, REQUEST, RESPONSE): """Handle HTTP PUT requests.""" self.dav__init(REQUEST, RESPONSE) self.dav__simpleifhandler(REQUEST, RESPONSE, refresh=1) body=REQUEST.get('BODY', '') # Empty the form (XMLToForm is unable to empty things before reopening) for k in self.get_field_ids(): try: self._delObject(k) except AttributeError: pass self.groups = {} self.group_list = [] # And reimport XMLToForm(body, self) self.ZCacheable_invalidate() RESPONSE.setStatus(204) return RESPONSE
def test_deserializeFlushesOldFields(self): # test that deserializing a form removes old values which # have been defined on that from previously # this may be an issue if one edits a form directly # via the ZMI "XML" tab; removing a field in the XML did not # remove that field from the form contents form = ZMIForm('test', 'Source') form2 = ZMIForm('test2', 'Target') form.manage_addField('date_field', 'Date Field', 'DateTimeField') form2.manage_addField('another_field', 'String Field', 'StringField') xml = formToXML(form) XMLToForm(xml, form2) self.assertEqualForms(form, form2) self.failIf(form2.has_field('another_field')) self.failIf('another_field' in form2.objectIds())
def _readFile(self, reparse): file = open(self._filepath, 'rb') try: data = file.read() finally: file.close() # update the form with the xml data try: XMLToForm(data, self) except: # bare except here, but I hope this is ok, as the # exception should be reraised # (except if the LOG raises another one ... # should we be more paranoid here?) import zLOG zLOG.LOG('Formulator.FSForm', zLOG.ERROR, 'error reading form from file ' + self._filepath) raise
def test_escaping(self): """ test if the necessary elements are escaped in the XML. (Actually this test is very incomplete) """ form = ZMIForm('test', '<EncodingTest>') # XXX don't test escaping of name, as needs to be javascript # valid anyway? form.name = 'name' form.add_group('a & b') form.manage_addField('string_field', '<string> Field', 'StringField') form.manage_addField('int_field', '<int> Field', 'IntegerField') form.manage_addField('float_field', '<Float> Field', 'FloatField') form.manage_addField('date_field', '<Date> Field', 'DateTimeField') form.manage_addField('list_field', '<List> Field', 'ListField') form.manage_addField('multi_field', '<Checkbox> Field', 'MultiCheckBoxField') form2 = ZMIForm('test2', 'ValueTest') xml = formToXML(form) XMLToForm(xml, form2) for field in form.get_fields(): self.assert_(form2.has_field(field.getId())) field2 = getattr(form2, field.getId()) # XXX test if values are the same self.assertEqual(field.values, field2.values) # test if default renderings are the same self.assertEqual(field.render(), field2.render()) self.assertEqual(form.title, form2.title) self.assertEqual(form.name, form2.name) self.assertEqual(form.action, form2.action) self.assertEqual(form.enctype, form2.enctype) self.assertEqual(form.method, form2.method) # if we have forgotten something, this will usually remind us ;-) self.assertEqual(form.render(), form2.render())
def test_escaping(self): """ test if the necessary elements are escaped in the XML. (Actually this test is very incomplete) """ form = ZMIForm('test', '<EncodingTest>') # XXX don't test escaping of name, as needs to be javascript # valid anyway? form.name = 'name' form.add_group('a & b') form.manage_addField('string_field', '<string> Field', 'StringField') form.manage_addField('int_field', '<int> Field', 'IntegerField') form.manage_addField('float_field', '<Float> Field', 'FloatField') form.manage_addField('date_field', '<Date> Field', 'DateTimeField') form.manage_addField('list_field', '<List> Field', 'ListField') form.manage_addField('multi_field', '<Checkbox> Field', 'MultiCheckBoxField') form2 = ZMIForm('test2', 'ValueTest') xml = formToXML(form) XMLToForm(xml, form2) self.assertEqualForms(form, form2)
def reset_parameter_form(source): with open(os.path.join(DATA_PATH, 'csvparameters.xml')) as data: form = ZMIForm('form', 'Parameters form', unicode_mode=1) XMLToForm(data.read(), form) source.set_form(form)
def test_serializeDeserializeEncodedMessages(self): # test for serializing and deserializing XML with non-ascii text in # the message tags xml1 = """\ <?xml version="1.0"?> <form> <title></title> <row_length>4</row_length> <name>testform_bugs</name> <action></action> <method>POST</method> <enctype></enctype> <encoding>UTF-8</encoding> <stored_encoding>UTF-8</stored_encoding> <unicode_mode>false</unicode_mode> <i18n_domain></i18n_domain> <groups> <group> <title>Default</title> <fields> <field><id>string</id> <type>StringField</type> <values> <alternate_name></alternate_name> <css_class></css_class> <default></default> <description>मैं काँच खा सकता हूँ, मुझे उस से कोई पीडा</description> <display_maxwidth></display_maxwidth> <display_width type="int">20</display_width> <enabled type="int">1</enabled> <external_validator></external_validator> <extra></extra> <hidden type="int">0</hidden> <max_length></max_length> <required type="int">1</required> <title>मैं काँच खा सकता हूँ, मुझे उस से कोई पीडा</title> <truncate type="int">0</truncate> <unicode type="int">0</unicode> <whitespace_preserve type="int">0</whitespace_preserve> </values> <tales> </tales> <messages> <message name="external_validator_failed">मैं काँच खा सकता हूँ, मुझे उस से कोई पीडा</message> <message name="required_not_found">मैं काँच खा सकता हूँ, मुझे उस से कोई पीडा</message> <message name="too_long">मैं काँच खा सकता हूँ, मुझे उस से कोई पीडा</message> </messages> </field> </fields> </group> </groups> </form> """ # we're not expecting exceptions, and don't really care about anything # else, so no asserts here... form = ZMIForm('foo', 'Foo') XMLToForm(xml1, form) xml_roundtrip = formToXML(form) xml1 = """\ <?xml version="1.0"?> <form> <title></title> <row_length>4</row_length> <name>testform_bugs</name> <action></action> <method>POST</method> <enctype></enctype> <encoding>UTF-8</encoding> <stored_encoding>UTF-8</stored_encoding> <unicode_mode>true</unicode_mode> <i18n_domain></i18n_domain> <groups> <group> <title>Default</title> <fields> <field><id>string</id> <type>StringField</type> <values> <alternate_name></alternate_name> <css_class></css_class> <default></default> <description>मैं काँच खा सकता हूँ, मुझे उस से कोई पीडा</description> <display_maxwidth></display_maxwidth> <display_width type="int">20</display_width> <enabled type="int">1</enabled> <external_validator></external_validator> <extra></extra> <hidden type="int">0</hidden> <max_length></max_length> <required type="int">1</required> <title>मैं काँच खा सकता हूँ, मुझे उस से कोई पीडा</title> <truncate type="int">0</truncate> <unicode type="int">0</unicode> <whitespace_preserve type="int">0</whitespace_preserve> </values> <tales> </tales> <messages> <message name="external_validator_failed">मैं काँच खा सकता हूँ, मुझे उस से कोई पीडा</message> <message name="required_not_found">मैं काँच खा सकता हूँ, मुझे उस से कोई पीडा</message> <message name="too_long">मैं काँच खा सकता हूँ, मुझे उस से कोई पीडा</message> </messages> </field> </fields> </group> </groups> </form> """ # we're not expecting exceptions, and don't really care about anything # else, so no asserts here... form = ZMIForm('foo', 'Foo') XMLToForm(xml1, form) xml_roundtrip = formToXML(form)
def _set_form(self): self.parameters = ZMIForm('form', 'Properties Form') with open(os.path.join(_home, 'photo_gallery_form.form')) as form: XMLToForm(form.read(), self.parameters)
def test_simpleSerialize(self): form = ZMIForm('test', 'My test') xml = '''\ <?xml version="1.0" encoding="iso-8859-1" ?> <form> <title></title> <name>tab_status_form</name> <action></action> <enctype></enctype> <method></method> <groups> <group> <title>Default</title> <fields> <field><id>message</id> <type>RawTextAreaField</type> <values> <alternate_name></alternate_name> <hidden type="int">0</hidden> <max_length></max_length> <width type="int">65</width> <external_validator></external_validator> <height type="int">7</height> <required type="int">0</required> <css_class></css_class> <default></default> <title>Message</title> <truncate type="int">0</truncate> <description></description> <extra>wrap="soft"</extra> </values> <tales> </tales> </field> <field><id>publish_datetime</id> <type>DateTimeField</type> <values> <date_only type="int">0</date_only> <alternate_name></alternate_name> <input_style>list</input_style> <hidden type="int">0</hidden> <input_order>dmy</input_order> <time_separator>:</time_separator> <date_separator>/</date_separator> <external_validator></external_validator> <required type="int">0</required> <default_now type="int">0</default_now> <css_class></css_class> <title>Publish time</title> <description></description> </values> <tales> <time_separator>python:form.time_punctuation</time_separator> <date_separator>python:form.date_punctuation</date_separator> </tales> </field> <field><id>expiration_datetime</id> <type>DateTimeField</type> <values> <date_only type="int">0</date_only> <alternate_name></alternate_name> <input_style>list</input_style> <css_class></css_class> <hidden type="int">0</hidden> <input_order>dmy</input_order> <time_separator>:</time_separator> <date_separator>/</date_separator> <external_validator></external_validator> <required type="int">0</required> <default_now type="int">0</default_now> <title>Expiration time</title> <description>If this document should expire, set the time.</description> </values> <tales> <time_separator>python:form.time_punctuation</time_separator> <date_separator>python:form.date_punctuation</date_separator> </tales> </field> <field><id>expires_flag</id> <type>CheckBoxField</type> <values> <alternate_name></alternate_name> <hidden type="int">0</hidden> <css_class></css_class> <default type="int">0</default> <title>Expire flag</title> <description>Turn on expiration time?</description> <external_validator></external_validator> <extra></extra> </values> <tales> </tales> </field> </fields> </group> </groups> </form>''' XMLToForm(xml, form) s = formToXML(form) f = open('output1.txt', 'w') f.write(s) f.close() form2 = ZMIForm('another', 'Something') XMLToForm(xml, form2) f = open('output2.txt', 'w') f.write(formToXML(form2)) f.close()
request['field_%s' % key] = sub_field.render_pdf() request.update(default_values) request.update({ 'field_default': 'None', 'field_required': '', }) empty_field.manage_edit(REQUEST=request) except ValidationError, e: self.fail('error when editing field %s; error message: %s' % (e.field_id, e.error_text)) form2 = ZMIForm('test2', 'ValueTest') xml = formToXML(form) XMLToForm(xml, form2) for field in form.get_fields(): self.assert_(form2.has_field(field.getId())) field2 = getattr(form2, field.getId()) # XXX In Formulator, None and '' are treated as nearly # being identical, and validators often turn '' to None. # So there may be false positive, if we compare the values # naively. message = 'the values of %r and %r are different: %r != %r' \ % (field, field2, field.values, field2.values) self.assertEqual(sorted(field.values.iterkeys()), sorted(field2.values.keys()), message) def compare(a, b):