diff --git a/product/ERP5/Document/Telephone.py b/product/ERP5/Document/Telephone.py index 2f96d94dfd0e278895726a76d93083fc90bb730e..5c72112d9c6e533aa7f42257b78681c6bfdee037 100644 --- a/product/ERP5/Document/Telephone.py +++ b/product/ERP5/Document/Telephone.py @@ -61,14 +61,6 @@ class Telephone(Coordinate, Base): security = ClassSecurityInfo() security.declareObjectProtected(Permissions.AccessContentsInformation) - # The standard parser is used to read phone numbers - # written in a standard syntax - # +[country]([area])[number]/[extension] - # or in syntax retured by asText - # +[country](0)[area]-[number]/[extension] - standard_parser = re.compile('\+(?P<country>\d{,3})\(0\)(?P<area>\d+)-(?P<number>[^/]+)(\/(?P<ext>\d+))?') - input_parser = re.compile('(\+(?P<country>\d*))?(\((?P<area>\d*)\))?(?P<number>[^/]*)(\/(?P<ext>\d+))?') - # Declarative properties property_sheets = ( PropertySheet.Base , PropertySheet.SimpleItem @@ -78,61 +70,99 @@ class Telephone(Coordinate, Base): security.declareProtected(Permissions.ModifyPortalContent, 'fromText') def fromText(self, coordinate_text): - """ See ICoordinate.fromText """ - method = self._getTypeBasedMethod('fromText') - if method is not None: - return method(text=coordinate_text) - - if coordinate_text is None: - coordinate_text = '' - number_match = self.standard_parser.match(coordinate_text)\ - or self.input_parser.match(coordinate_text) - if not number_match: - return - number_dict = number_match.groupdict() - country = (number_dict.get('country', '') or '').strip() - area = (number_dict.get('area', '') or '').strip() - number = (number_dict.get('number', '') or '').strip().replace('-', ' ') - extension = (number_dict.get('ext', '') or '').strip() - self.edit(telephone_country = country, - telephone_area = area, - telephone_number = number, - telephone_extension = extension) - + """ See ICoordinate.fromText """ + method = self._getTypeBasedMethod('fromText') + if method is not None: + return method(text=coordinate_text) + + if coordinate_text is None: + coordinate_text = '' + + #This regexp get the coordinate text and extract only numbers + onlynumber = ''.join(re.findall('[0-9]', coordinate_text)) + ScriptgetRegexp = getattr(self, 'Telephone_getRegexp', None) + + #Test if coordinate_text has or not markups. + if len(coordinate_text) > len(onlynumber): + #trying to get a possible contry number to be used by script + country=re.match('((\+|)(?P<country>\d*))',coordinate_text).groupdict().get('country','') + if ScriptgetRegexp is not None: + temp_object = ScriptgetRegexp(index=country) + input_parser = temp_object.input + number_match = re.match(input_parser, coordinate_text) + if not number_match: + return + number_dict = number_match.groupdict() + else: + number_dict={'number':coordinate_text} + + country=number_dict.get('country','') + area=number_dict.get('area','') + number=number_dict.get('number','') + ext=number_dict.get('ext','') + + if ((country in ['', None]) and \ + (area in ['', None]) and \ + (number in ['', None]) and \ + (ext in ['', None])): + country=area=number=extension='' + else: + #The country and area is trying to get from dict, + #but if it fails must be get from preference + country = (number_dict.get('country') or \ + self.portal_preferences.default_site_preference.getPreferredTelephoneDefaultCountryNumber() or \ + '').strip() + area = (number_dict.get('area') or \ + self.portal_preferences.default_site_preference.getPreferredTelephoneDefaultAreaNumber() or + '').strip() + number = (number_dict.get('number') or '').strip().replace('-', '').replace(' ','') + extension = (number_dict.get('ext') or '').strip() + + self.edit(telephone_country = country, + telephone_area = area, + telephone_number = number, + telephone_extension = extension) + security.declareProtected(Permissions.ModifyPortalContent, '_setText') _setText = fromText security.declareProtected(Permissions.View, 'asText') def asText(self): - """ - Returns the telephone number in standard format - """ - script = self._getTypeBasedMethod('asText') - if script is not None: - return script() - - text = '+' - telephone_country = self.getTelephoneCountry() - if telephone_country is not None: - text += telephone_country - - text += '(0)' - telephone_area = self.getTelephoneArea() - if telephone_area is not None: - text += telephone_area - - text += '-' - telephone_number = self.getTelephoneNumber() - if telephone_number is not None: - text += telephone_number - - telephone_extension = self.getTelephoneExtension() - if telephone_extension is not None: - text += '/' + telephone_extension - - if text == '+(0)-': - text = '' - return text + """ + Returns the telephone number in standard format + """ + script = self._getTypeBasedMethod('asText') + if script is not None: + return script() + + telephone_country = self.getTelephoneCountry() or '' + telephone_area = self.getTelephoneArea() or '' + telephone_number = self.getTelephoneNumber() or '' + telephone_extension = self.getTelephoneExtension() or '' + + # If country, area, number, extension are blank the method + # should to return blank. + if ((telephone_country == '') and \ + (telephone_area == '') and \ + (telephone_number == '') and \ + (telephone_extension == '')): + return '' + + # Trying to get the notation from Telephone_getRegexp script + ScriptgetRegexp = getattr(self, 'Telephone_getRegexp', None) + if ScriptgetRegexp is not None: + temp_object = ScriptgetRegexp(index=telephone_country) + notation = temp_object.notation + else: + notation = '' + + if notation not in [None, '']: + notation=notation.replace('<country>',telephone_country) + notation=notation.replace('<area>',telephone_area) + notation=notation.replace('<number>',telephone_number) + notation=notation.replace('<ext>',telephone_extension) + + return notation security.declareProtected(Permissions.AccessContentsInformation, 'asURL') diff --git a/product/ERP5/PropertySheet/TelephonePreference.py b/product/ERP5/PropertySheet/TelephonePreference.py new file mode 100644 index 0000000000000000000000000000000000000000..8bbba998bf54a3e932b2d5ae8e1f705b69701324 --- /dev/null +++ b/product/ERP5/PropertySheet/TelephonePreference.py @@ -0,0 +1,58 @@ +############################################################################# +# +# Copyright (c) 2008 Nexedi SA and Contributors. All Rights Reserved. +# Lucas Carvalho Teixeira <lucas@nexedi.com> +# +# WARNING: This program as such is intended to be used by professional +# programmers who take the whole responsability of assessing all potential +# consequences resulting from its eventual inadequacies and bugs +# End users who are looking for a ready-to-use solution with commercial +# garantees and support are strongly adviced to contract a Free Software +# Service Company +# +# This program is Free Software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +############################################################################## + + +class TelephonePreference: + """ + This property sheet defines configurable default values for + Telephone configuration. + """ + + _properties = ( + { 'id' : 'preferred_telephone_default_country_number', + 'description' : 'The default country number.', + 'type' : 'string', + 'preference' : 1, + 'mode' : 'w', + 'default' : '', + }, + { 'id' : 'preferred_telephone_default_area_number', + 'description' : 'The default area number.', + 'type' : 'string', + 'preference' : 1, + 'mode' : 'w', + 'default' : '', + }, + { 'id' : 'preferred_telephone_default_region', + 'description' : 'The default region.', + 'type' : 'string', + 'preference' : 1, + 'mode' : 'w', + 'default' : '', + }, + ) diff --git a/product/ERP5/tests/testERP5Base.py b/product/ERP5/tests/testERP5Base.py index 44a75f7708aad2a506834102fd38d957e48e8682..62aa9ce0b98c82e29916a4d4ff9e0144507f9e16 100644 --- a/product/ERP5/tests/testERP5Base.py +++ b/product/ERP5/tests/testERP5Base.py @@ -37,7 +37,6 @@ from Products.ERP5Type.tests.Sequence import SequenceList from Products.ERP5Type.tests.utils import FileUpload from AccessControl.SecurityManagement import newSecurityManager - class TestERP5Base(ERP5TypeTestCase): """ERP5 Base tests. @@ -76,6 +75,7 @@ class TestERP5Base(ERP5TypeTestCase): self.portal = self.getPortal() self.portal_categories = self.getCategoryTool() self.portal_catalog = self.getCatalogTool() + self.portal_preferences = self.getPreferenceTool() self.createCategories() # self.login_as_member() @@ -863,15 +863,50 @@ class TestERP5Base(ERP5TypeTestCase): getattr(org.getCreationDate(), slot)(), 'Wrong creation date %s' % org.getCreationDate()) - def test_TelephoneAsText(self): # Test asText method pers = self.getPersonModule().newContent(portal_type='Person') tel = pers.newContent(portal_type='Telephone') tel.setTelephoneCountry(33) - tel.setTelephoneNumber(123456789) - self.assertEquals('+33(0)-123456789', tel.asText()) + tel.setTelephoneArea(2) + tel.setTelephoneNumber(12345678) + tel.setTelephoneExtension(999) + self.assertEquals('+33(0)2-12345678/999', tel.asText()) + + def test_TelephoneInputList(self): + pers = self.getPersonModule().newContent(portal_type='Person') + tel = pers.newContent(portal_type='Telephone') + pref = self.portal_preferences.default_site_preference + pref.setPreferredTelephoneDefaultCountryNumber('33') + pref.setPreferredTelephoneDefaultAreaNumber('2') + pref.enable() + inputdict=[ + ['+33(0)2-27224896/999','+33(0)2-27224896/999'], + ['+33(0)2-27224896/','+33(0)2-27224896/'], + ['+33(629)02 44 25/222','+33(0)629-024425/222'], + ['(22)27224897','+33(0)22-27224897/'], + ['12345678','+33(0)2-12345678/'], + ['(22) 12345678','+33(0)22-12345678/'], + ['66187654321','+33(0)2-66187654321/'], + ['(22)-12345678','+33(0)22-12345678/'], + ['33 2 098765432/1','+33(0)2-098765432/1'] + ] + + for i in inputdict: + tel.fromText(coordinate_text=i[0]) + self.assertEquals(i[1],tel.asText()) + + def test_TelephoneWhenTheDefaultCountryAndAreaPreferenceIsBlank(self): + pers = self.getPersonModule().newContent(portal_type='Person') + tel = pers.newContent(portal_type='Telephone') + tel.fromText(coordinate_text='12345678') + self.assertEquals('+(0)-12345678/',tel.asText()) + def test_TelephoneAsTextBlankNumber(self): + # Test asText method with blank number + pers = self.getPersonModule().newContent(portal_type='Person') + tel = pers.newContent(portal_type='Telephone') + self.assertEquals('', tel.asText()) def test_TelephoneUrl(self): # http://www.rfc-editor.org/rfc/rfc3966.txt