From ea65b672e75d2b544a2d9c3ef0d497c1e66075bc Mon Sep 17 00:00:00 2001 From: Robert Robinson Date: Sat, 12 Sep 2015 22:10:28 -0600 Subject: [PATCH] Initial cut at getting the stanzas to work. (cherry picked from commit 8c7df49) --- sleekxmpp/plugins/xep_0122/__init__.py | 1 + sleekxmpp/plugins/xep_0122/stanza.py | 83 +++++++++++++++ tests/test_stanza_xep_0122.py | 137 +++++++++++++++++++++++++ 3 files changed, 221 insertions(+) create mode 100644 sleekxmpp/plugins/xep_0122/__init__.py create mode 100644 sleekxmpp/plugins/xep_0122/stanza.py create mode 100644 tests/test_stanza_xep_0122.py diff --git a/sleekxmpp/plugins/xep_0122/__init__.py b/sleekxmpp/plugins/xep_0122/__init__.py new file mode 100644 index 00000000..65ce96a1 --- /dev/null +++ b/sleekxmpp/plugins/xep_0122/__init__.py @@ -0,0 +1 @@ +from sleekxmpp.plugins.xep_0122.stanza import FormValidation diff --git a/sleekxmpp/plugins/xep_0122/stanza.py b/sleekxmpp/plugins/xep_0122/stanza.py new file mode 100644 index 00000000..1807b11c --- /dev/null +++ b/sleekxmpp/plugins/xep_0122/stanza.py @@ -0,0 +1,83 @@ + +from sleekxmpp.xmlstream import ElementBase, ET + + +class FormValidation(ElementBase): + """ + Validation values for form fields. + + Example: + + + + 2003-10-06T11:22:00-07:00 + + """ + + namespace = 'http://jabber.org/protocol/xdata-validate' + name = 'validate' + plugin_attrib = 'validate' + interfaces = set(('datatype', 'basic', 'open', 'range', 'regex', )) + sub_interfaces = set(('basic', 'open', 'range', 'regex', )) + plugin_attrib_map = {} + plugin_tag_map = {} + + def _add_field(self, name): + item_xml = ET.Element('{%s}%s' % (self.namespace, name)) + self.xml.append(item_xml) + return item_xml + + def set_basic(self, value): + self.remove_all() + if value: + self._add_field('basic') + + def set_open(self, value): + self.remove_all() + if value: + self._add_field('open') + + def set_regex(self, regex): + self.remove_all() + if regex: + _regex = self._add_field('regex') + _regex.text = regex + + def set_range(self, value, minimum=None, maximum=None): + self.remove_all() + if value: + _range = self._add_field('range') + _range.attrib['min'] = str(minimum) + _range.attrib['max'] = str(maximum) + + def remove_all(self, except_tag=None): + for a in self.sub_interfaces: + if a != except_tag: + del self[a] + + def get_basic(self): + present = self.xml.find('{%s}basic' % self.namespace) + return present is not None + + def get_open(self): + present = self.xml.find('{%s}open' % self.namespace) + return present is not None + + def get_regex(self): + present = self.xml.find('{%s}regex' % self.namespace) + if present: + return present.text + + return False + + def get_range(self): + present = self.xml.find('{%s}regex' % self.namespace) + if present: + return dict(present.attrib) + + return False + + +FormValidation.getBasic = FormValidation.get_basic +FormValidation.setBasic = FormValidation.set_basic diff --git a/tests/test_stanza_xep_0122.py b/tests/test_stanza_xep_0122.py new file mode 100644 index 00000000..2330b6a2 --- /dev/null +++ b/tests/test_stanza_xep_0122.py @@ -0,0 +1,137 @@ +import unittest +from sleekxmpp import Message +from sleekxmpp.test import SleekTest +from sleekxmpp.thirdparty import OrderedDict + +import sleekxmpp.plugins.xep_0004 as xep_0004 +import sleekxmpp.plugins.xep_0122 as xep_0122 +from sleekxmpp.xmlstream import register_stanza_plugin + + +class TestDataForms(SleekTest): + + def setUp(self): + register_stanza_plugin(Message, xep_0004.Form) + register_stanza_plugin(xep_0004.Form, xep_0004.FormField, iterable=True) + register_stanza_plugin(xep_0004.FormField, xep_0004.FieldOption, iterable=True) + register_stanza_plugin(xep_0004.FormField, xep_0122.FormValidation) + + def test_basic_validation(self): + """Testing using multiple instructions elements in a data form.""" + msg = self.Message() + form = msg['form'] + field = form.addField(var='f1', + ftype='text-single', + label='Text', + desc='A text field', + required=True, + value='Some text!') + + validation = field['validate'] + validation['datatype'] = 'xs:string' + validation.set_basic(True) + + self.check(msg, """ + + + + A text field + + Some text! + + + + + + + """) + + def test_open_validation(self): + """Testing using multiple instructions elements in a data form.""" + msg = self.Message() + form = msg['form'] + field = form.addField(var='f1', + ftype='text-single', + label='Text', + desc='A text field', + required=True, + value='Some text!') + + validation = field['validate'] + validation.set_open(True) + + self.check(msg, """ + + + + A text field + + Some text! + + + + + + + """) + + def test_regex_validation(self): + """Testing using multiple instructions elements in a data form.""" + msg = self.Message() + form = msg['form'] + field = form.addField(var='f1', + ftype='text-single', + label='Text', + desc='A text field', + required=True, + value='Some text!') + + validation = field['validate'] + validation.set_regex('[0-9]+') + + self.check(msg, """ + + + + A text field + + Some text! + + [0-9]+ + + + + + """) + + def test_range_validation(self): + """Testing using multiple instructions elements in a data form.""" + msg = self.Message() + form = msg['form'] + field = form.addField(var='f1', + ftype='text-single', + label='Text', + desc='A text field', + required=True, + value='Some text!') + + validation = field['validate'] + validation.set_range(True, minimum=0, maximum=10) + + self.check(msg, """ + + + + A text field + + Some text! + + + + + + + """) + + +suite = unittest.TestLoader().loadTestsFromTestCase(TestDataForms)