[Erp5-report] r21309 - in /erp5/trunk/products/ERP5: Document/ tests/
nobody at svn.erp5.org
nobody at svn.erp5.org
Wed Jun 4 01:58:50 CEST 2008
Author: rafael
Date: Wed Jun 4 01:58:50 2008
New Revision: 21309
URL: http://svn.erp5.org?rev=21309&view=rev
Log:
Replaced dictionary per simple list of regex (Lucas)
Improved the code style (Rafael and Lucas)
Modified:
erp5/trunk/products/ERP5/Document/Telephone.py
erp5/trunk/products/ERP5/tests/testERP5Base.py
Modified: erp5/trunk/products/ERP5/Document/Telephone.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Document/Telephone.py?rev=21309&r1=21308&r2=21309&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/Document/Telephone.py (original)
+++ erp5/trunk/products/ERP5/Document/Telephone.py Wed Jun 4 01:58:50 2008
@@ -36,437 +36,273 @@
import re
class Telephone(Coordinate, Base):
- """
- A telephone is a coordinate which stores a telephone number
- The telephone class may be used by multiple content types (ex. Fax,
- Mobile Phone, Fax, Remote Access, etc.).
-
- A telephone is a terminating leaf
- in the OFS. It can not contain anything.
-
- Telephone inherits from Base and
- from the mix-in Coordinate
-
- A list of I18N telephone codes can be found here::
- http://kropla.com/dialcode.htm
- """
-
- meta_type = 'ERP5 Telephone'
- portal_type = 'Telephone'
- add_permission = Permissions.AddPortalContent
- isPortalContent = 1
- isRADContent = 1
-
- # Declarative security
- security = ClassSecurityInfo()
- security.declareObjectProtected(Permissions.AccessContentsInformation)
-
- # Declarative properties
- property_sheets = ( PropertySheet.Base
- , PropertySheet.SimpleItem
- , PropertySheet.Telephone
- )
+ """
+ A telephone is a coordinate which stores a telephone number
+ The telephone class may be used by multiple content types (ex. Fax,
+ Mobile Phone, Fax, Remote Access, etc.).
+
+ A telephone is a terminating leaf
+ in the OFS. It can not contain anything.
+
+ Telephone inherits from Base and
+ from the mix-in Coordinate
+
+ A list of I18N telephone codes can be found here::
+ http://kropla.com/dialcode.htm
+ """
+
+ meta_type = 'ERP5 Telephone'
+ portal_type = 'Telephone'
+ add_permission = Permissions.AddPortalContent
+ isPortalContent = 1
+ isRADContent = 1
+
+ # Declarative security
+ security = ClassSecurityInfo()
+ security.declareObjectProtected(Permissions.AccessContentsInformation)
+
+ # Declarative properties
+ property_sheets = ( PropertySheet.Base
+ , PropertySheet.SimpleItem
+ , PropertySheet.Telephone
+ )
+ # This is a list of regex.
+ # Each regex into the list handle a single (or should handle) input.
+ # The list is a priority list,
+ # be carefull to add a new regex.
+ regex_list = [
+ # Country, Area, Number, Extension*
+ # +33(0)2-27224896/999 or +33(0)2-27224896/ or +33(0)2-27224896
+ "\+(?P<country>\d+)\(0\)(?P<area>\d+)\-(?P<number>[\d\ ]*)(?:\/)?(?P<ext>\d+|)",
+
+ # Country, Area, Number, Extension*
+ # +81-2-27224896/999 or +81-2-27224896/ or +81-2-27224896
+ "\+(?P<country>\d+)-(?P<area>\d+)-(?P<number>[\d\ \-]*)(?:\/)?(?P<ext>\d+|)",
+
+ # Missing area
+ # +33(0)-27224896/999" or +33(0)-27224896/ or +33(0)-27224896
+ "\+(?P<country>\d+)\(0\)\-(?P<number>[\d\ ]*)(?:\/)?(?P<ext>\d+|)",
+
+ # Country, Area, Number, Extension*
+ # +55(2)27224896/999 or +55(2)27224896/ or +55(2)27224896
+ "\+(?P<country>\d+)\((?P<area>\d+)\)(?P<number>[\d\ ]*)(?:\/)?(?P<ext>\d+|)",
+
+ # Country, Area, Number, Extension*
+ # +221-2-27224896/999 or +221-2-27224896/ or +221-2-27224896
+ "\+(?P<country>\d+)-(?P<area>\d+)-(?P<number>[\d\ \-]*)(?:\/)?(?P<ext>\d+|)",
+
+ # Missing country
+ # +(0)2-27224896/999" or +(0)2-27224896/ or +(0)2-27224896
+ "\+\(0\)(?P<area>\d+)\-(?P<number>[\d\ ]*)(?:\/)?(?P<ext>\d+|)",
+
+ # Missing Country and Area
+ # +(0)-27224896/999" or +(0)-27224896/ or +(0)-27224896
+ "\+\(0\)\-(?P<number>[\d\ ]*)(?:\/)?(?P<ext>\d+|)",
+
+ # Area, Number Extension*
+ # Area between parenthesis.
+ # (22)27224897/333 or (22)27224897/ or (22)27224897
+ "\((?P<area>\d+)\)(?P<number>[\d\ \-]*)(?:\/)?(?P<ext>\d+|)",
+
+ # Missing country
+ # +(2)27224896/999" or +(2)27224896/ or +(2)27224896
+ "\+\((?P<area>\d+)\)(?P<number>[\d\ \-]*)(?:\/)?(?P<ext>\d+|)",
+
+ # Country, Area, Number and Extension*
+ # Country space area space number slash extension or not
+ # +33 2 098765432/1 or +33 2 098765432/ or +33 2 098765432
+ "\+(?P<country>\d+)\ (?P<area>\d+)\ (?P<number>[\d\ ]*)(?:\/)?(?P<ext>\d+|)",
+
+ # This regex is to handle two inputs very similar
+ # but with different behavior
+ # 631 22 43/999 or 631 22 43 or 631 22 43
+ # will result in {'area':'', 'number':'631 22 43', 'ext':'999 or empty'}
+ #
+ # 631-22 43/999 or 631-22 43 or 631-22 43
+ # will result in {'area':'631', 'number':'22 43', 'ext':'999 or empty'}
+ "^(?:0)?((?P<area>\d+)-)?(?P<number>[\d\-\ ]*)(?:\/)?(?P<ext>\d+|)$",
+
+ # Area, Number, Extension*
+ # It is a common input in France
+ # and in Japan but with different behavior.
+ # 047-336-5411/999 or 047-336-5411/ or 047-336-5411
+ # will result in {'area':'47', 'number':'336-5411', \
+ # 'ext':'999 or empty'} <= France
+ # will result in {'area':'047', 'number':'336-5411',
+ # 'ext':'999 or empty'} <= Japan
+ # so we have here two regex:
+ # To France: "^0(?P<area>\d+)-(?P<number>[\d\-\ ]*)(?:\/)?(?P<ext>\d+|)$",
+ # To Japan: "^(?P<area>\d+)-(?P<number>[\d\-\ ]*)(?:\/)?(?P<ext>\d+|)$",
+ "^0(?P<area>\d+)-(?P<number>[\d\-\ ]*)(?:\/)?(?P<ext>\d+|)$",
+
+ # Area, Number, Extension*
+ # It is a common input in France and in Japan but with different behavior.
+ # 047(336)5411/999 or 047(336)5411/ or 047(336)5411
+ # will result in {'area':'47', 'number':'336)5411',
+ # 'ext':'999 or empty'} <= France
+ # will result in {'area':'047', 'number':'336)5411',
+ # 'ext':'999 or empty'} <= Japan
+ # so we have here two regex:
+ #To France:
+ # "^0(?P<area>\d+)\((?P<number>[\d\)\(\ \-]*)(?:\/)?(?P<ext>\d+|)$",
+ #To Japan:
+ # "^(?P<area>\d+)\((?P<number>[\d\)\(\ \-]*)(?:\/)?(?P<ext>\d+|)$",
+ "^0(?P<area>\d+)\((?P<number>[\d\)\(\ \-]*)(?:\/)?(?P<ext>\d+|)$",
+
+ # Missing area
+ # +55()27224896/999" or +55()27224896/ or +55()27224896
+ "\+(?P<country>\d+)\(\)(?P<number>[\d\ \-]*)(?:\/)?(?P<ext>\d+|)"
+ ]
+
+ 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)
- # The notation always need to have:
- # <country> or <area> or <number> or <ext>
- # If uses a different tag it will be ignored.
- standard_dict = {
- # France
- '33' : {
- "regex_input_list" : [
- # Country, Area, Number, Extension*
- # +33(0)2-27224896/999 or +33(0)2-27224896/ or +33(0)2-27224896
- "\+(?P<country>\d+)\(0\)(?P<area>\d+)\-(?P<number>[\d\ ]*)(?:\/)?(?P<ext>\d+|)",
-
- # Missing country
- # +(0)2-27224896/999" or +(0)2-27224896/ or +(0)2-27224896
- "\+\(0\)(?P<area>\d+)\-(?P<number>[\d\ ]*)(?:\/)?(?P<ext>\d+|)",
-
- # Missing area
- # +33(0)-27224896/999" or +33(0)-27224896/ or +33(0)-27224896
- "\+(?P<country>\d+)\(0\)\-(?P<number>[\d\ ]*)(?:\/)?(?P<ext>\d+|)",
-
- # Missing Country and Area
- # +(0)-27224896/999" or +(0)-27224896/ or +(0)-27224896
- "\+\(0\)\-(?P<number>[\d\ ]*)(?:\/)?(?P<ext>\d+|)",
-
- # Country, Area, Number, Extension*
- # The area between parenthesis.
- # +33(629)024425/222 or +33(629)024425/ or +33(629)024425
- "^\+(?P<country>\d+)\((?P<area>\d+)\)(?P<number>[\d\ ]+)/?(?P<ext>\d+|)$",
- # Area, Number Extension*
- # Area between parenthesis.
- # (22)27224897/333 or (22)27224897/ or (22)27224897
- "\((?P<area>\d+)\)(?P<number>[\d\ \-]*)(?:\/)?(?P<ext>\d+|)",
-
- # Area, Number, Extension*
- # Area followed by '-'
- # (22)-12345678/222 or (22)-12345678/ or (22)-12345678
- "\((?P<area>\d+)\)\-?(?P<number>[\d\ ]*)(?:\/)?(?P<ext>\d+|)",
-
- # Country, Area, Number and Extension*
- # Country space area space number slash extension or not
- # +33 2 098765432/1 or +33 2 098765432/ or +33 2 098765432
- "\+(?P<country>\d+)\ (?P<area>\d+)\ (?P<number>[\d\ ]*)(?:\/)?(?P<ext>\d+|)",
-
- # This regex is to handle two inputs very similar
- # but with different behavior
- # 631 22 43/999 or 631 22 43 or 631 22 43
- # will result in {'area':'', 'country':'631 22 43', 'ext':'999 or empty'}
- #
- # 631-22 43/999 or 631-22 43 or 631-22 43
- # will result in {'area':'631', 'country':'22 43', 'ext':'999 or empty'}
- "^(?:0)?((?P<area>\d+)-)?(?P<number>[\d\-\ ]*)(?:\/)?(?P<ext>\d+|)$",
-
- # Area, Number, Extension*
- # 047-336-5411/999 or 047-336-5411/ or 047-336-5411
- "^0(?P<area>\d+)-(?P<number>[\d\-\ ]*)(?:\/)?(?P<ext>\d+|)$",
-
- # Area, Number, Extension*
- # 047(336)5411/999 or 047(336)5411/ or 047(336)5411
- "^0(?P<area>\d+)\((?P<number>[\d\)\(\ \-]*)(?:\/)?(?P<ext>\d+|)$"
- ],
- "notation" : "+<country>(0)<area>-<number>/<ext>"
- },
- # Brazil
- '55' : {
- "regex_input_list" : [
- # Country, Area, Number, Extension*
- # +55(2)27224896/999 or +55(2)27224896/ or +55(2)27224896
- "\+(?P<country>\d+)\((?P<area>\d+)\)(?P<number>[\d\ \-]*)(?:\/)?(?P<ext>\d+|)",
-
- # Country, Area, Number, Extension*
- # +55-2-27224896/999 or +55-2-27224896/ or +55-2-27224896
- "\+(?P<country>\d+)-(?P<area>\d+)-(?P<number>[\d\ \-]*)(?:\/)?(?P<ext>\d+|)",
-
- # Missing country
- # +(2)27224896/999 or +(2)27224896/ or +(2)27224896
- "\+\((?P<area>\d+)\)(?P<number>[\d\ \-]*)(?:\/)?(?P<ext>\d+|)",
-
- # Missing area
- # +55()-27224896/999 or +55()-27224896/ or +55()-27224896
- # +55()27224896/999 or +55()27224896/ or +55()27224896
- "\+(?P<country>\d+)\(\)(?:\-)?(?P<number>[\d\ ]*)(?:\/)?(?P<ext>\d+|)",
-
- # Missing Country and Area
- # +()27224896/999 or +()27224896/ or +()27224896
- "\+\(\)(?P<number>[\d\ \-]*)(?:\/)?(?P<ext>\d+|)",
-
- # Country, Area, Number, Extension*
- # The area between parenthesis.
- # +55(629)024425/222 or +55(629)024425/ or +55(629)024425
- "^\+(?P<country>\d+)\((?P<area>\d+)\)(?P<number>[\d\ ]+)/?(?P<ext>\d+|)$",
-
- # Area, Number Extension*
- # Area between parenthesis.
- # (22)27224897/333 or (22)27224897/ or (22)27224897
- "\((?P<area>\d+)\)(?P<number>[\d\ \-]*)(?:\/)?(?P<ext>\d+|)",
-
- # Country, Area, Number and Extension*
- # Country space area space number slash extension or not
- # +55 2 098765432/1 or +55 2 098765432/ or +55 2 098765432
- "\+(?P<country>\d+)\ (?P<area>\d+)\ (?P<number>[\d\ ]*)(?:\/)?(?P<ext>\d+|)",
-
- # This regex is to handle two inputs very similar
- # but with different behavior
- # 631 22 43/999 or 631 22 43 or 631 22 43
- # will result in {'area':'', 'country':'631 22 43', 'ext':'999 or empty'}
- #
- # 631-22 43/999 or 631-22 43 or 631-22 43
- # will result in {'area':'631', 'country':'22 43', 'ext':'999 or empty'}
- "^((?P<area>\d+)-)?(?P<number>[\d\-\ ]*)(?:\/)?(?P<ext>\d+|)$",
-
- # Area, Number, Extension*
- # 047-336-5411/999 or 047-336-5411/ or 047-336-5411
- "^(?P<area>\d+)-(?P<number>[\d\-\ ]*)(?:\/)?(?P<ext>\d+|)$",
-
- # Area, Number, Extension*
- # 047(336)5411/999 or 047(336)5411/ or 047(336)5411
- "^(?P<area>\d+)\((?P<number>[\d\)\(\ \-]*)(?:\/)?(?P<ext>\d+|)$"
- ],
- "notation" : "+<country>(<area>)<number>/<ext>",
- },
- # Senegal
- '221' : {
- "regex_input_list" : [
- # Country, Area, Number, Extension*
- # +221(2)27224896/999 or +221(2)27224896/ or +221(2)27224896
- "\+(?P<country>\d+)\((?P<area>\d+)\)(?P<number>[\d\ \-]*)(?:\/)?(?P<ext>\d+|)",
-
- # Country, Area, Number, Extension*
- # +221-2-27224896/999 or +221-2-27224896/ or +221-2-27224896
- "\+(?P<country>\d+)-(?P<area>\d+)-(?P<number>[\d\ \-]*)(?:\/)?(?P<ext>\d+|)",
-
- # Missing country
- # +(2)27224896/999" or +(2)27224896/ or +(2)27224896
- "\+\((?P<area>\d+)\)(?P<number>[\d\ \-]*)(?:\/)?(?P<ext>\d+|)",
-
- # Missing area
- # +221()27224896/999" or +221()27224896/ or +221()27224896
- "\+(?P<country>\d+)\(\)(?P<number>[\d\ \-]*)(?:\/)?(?P<ext>\d+|)",
-
- # Missing Country and Area
- # +()27224896/999" or +()27224896/ or +()27224896
- "\+\(\)(?P<number>[\d\ \-]*)(?:\/)?(?P<ext>\d+|)",
-
- # Country, Area, Number, Extension*
- # The area between parenthesis.
- # +221(629)024425/222 or +221(629)024425/ or +221(629)024425
- "^\+(?P<country>\d+)\((?P<area>\d+)\)(?P<number>[\d\ ]+)/?(?P<ext>\d+|)$",
- # Area, Number Extension*
- # Area between parenthesis.
- # (22)27224897/333 or (22)27224897/ or (22)27224897
- "\((?P<area>\d+)\)(?P<number>[\d\ \-]*)(?:\/)?(?P<ext>\d+|)",
-
- # Country, Area, Number and Extension*
- # Country space area space number slash extension or not
- # +221 2 098765432/1 or +221 2 098765432/ or +221 2 098765432
- "\+(?P<country>\d+)\ (?P<area>\d+)\ (?P<number>[\d\ ]*)(?:\/)?(?P<ext>\d+|)",
-
- # This regex is to handle two inputs very similar
- # but with different behavior
- # 631 22 43/999 or 631 22 43 or 631 22 43
- # will result in {'area':'', 'country':'631 22 43', 'ext':'999 or empty'}
- #
- # 631-22 43/999 or 631-22 43 or 631-22 43
- # will result in {'area':'631', 'country':'22 43', 'ext':'999 or empty'}
- "^((?P<area>\d+)-)?(?P<number>[\d\-\ ]*)(?:\/)?(?P<ext>\d+|)$",
-
- # Area, Number, Extension*
- # 047-336-5411/999 or 047-336-5411/ or 047-336-5411
- "^(?P<area>\d+)-(?P<number>[\d\-\ ]*)(?:\/)?(?P<ext>\d+|)$",
-
- # Area, Number, Extension*
- # 047(336)5411/999 or 047(336)5411/ or 047(336)5411
- "^(?P<area>\d+)\((?P<number>[\d\)\(\ \-]*)(?:\/)?(?P<ext>\d+|)$"
- ],
- "notation" : "+<country>(<area>)<number>/<ext>",
- },
- # Japan
- '81' : {
- "regex_input_list" : [
- # Country, Area, Number, Extension*
- # +81(2)27224896/999 or +81(2)27224896/ or +81(2)27224896
- "\+(?P<country>\d+)\((?P<area>\d+)\)(?P<number>[\d\ \-]*)(?:\/)?(?P<ext>\d+|)",
-
- # Country, Area, Number, Extension*
- # +81-2-27224896/999 or +81-2-27224896/ or +81-2-27224896
- "\+(?P<country>\d+)-(?P<area>\d+)-(?P<number>[\d\ \-]*)(?:\/)?(?P<ext>\d+|)",
-
- # Missing country
- # +(2)27224896/999" or +(2)27224896/ or +(2)27224896
- "\+\((?P<area>\d+)\)(?P<number>[\d\ \-]*)(?:\/)?(?P<ext>\d+|)",
-
- # Missing Country and Area
- # +()27224896/999" or +()27224896/ or +()27224896
- "\+\(\)(?P<number>[\d\ \-]*)(?:\/)?(?P<ext>\d+|)",
-
- # Country, Area, Number, Extension*
- # The area between parenthesis.
- # +81(629)024425/222 or +81(629)024425/ or +81(629)024425
- "^\+(?P<country>\d+)\((?P<area>\d+)\)(?P<number>[\d\ ]+)/?(?P<ext>\d+|)$",
- # Area, Number Extension*
- # Area between parenthesis.
- # (22)27224897/333 or (22)27224897/ or (22)27224897
- "\((?P<area>\d+)\)(?P<number>[\d\ \-]*)(?:\/)?(?P<ext>\d+|)",
-
- # Country, Area, Number and Extension*
- # Country space area space number slash extension or not
- # +81 2 098765432/1 or +81 2 098765432/ or +81 2 098765432
- "\+(?P<country>\d+)\ (?P<area>\d+)\ (?P<number>[\d\ ]*)(?:\/)?(?P<ext>\d+|)",
-
- # This regex is to handle two inputs very similar
- # but with different behavior
- # 631 22 43/999 or 631 22 43 or 631 22 43
- # will result in {'area':'', 'country':'631 22 43', 'ext':'999 or empty'}
- #
- # 631-22 43/999 or 631-22 43 or 631-22 43
- # will result in {'area':'631', 'country':'22 43', 'ext':'999 or empty'}
- "^((?P<area>\d+)-)?(?P<number>[\d\-\ ]*)(?:\/)?(?P<ext>\d+|)$",
-
- # Area, Number, Extension*
- # 047-336-5411/999 or 047-336-5411/ or 047-336-5411
- "^(?P<area>\d+)-(?P<number>[\d\-\ ]*)(?:\/)?(?P<ext>\d+|)$",
-
- # Area, Number, Extension*
- # 047(336)5411/999 or 047(336)5411/ or 047(336)5411
- "^(?P<area>\d+)\((?P<number>[\d\)\(\ \-]*)(?:\/)?(?P<ext>\d+|)$"
- ],
- "notation" : "+<country>(<area>)<number>/<ext>",
- }
- }
+ if coordinate_text is None:
+ coordinate_text = ''
+
+ # This regexp get the coordinate text
+ # and extract number and letters
+ input_regex_without_markup = '[0-9A-Za-z]'
+ input_without_markup = ''.join(re.findall(input_regex_without_markup,\
+ coordinate_text))
+ # Test if coordinate_text has or not markups.
+ if len(coordinate_text) > len(input_without_markup):
+ number_match = None
+ for regex in self._getRegexList():
+ possible_number_match = re.match(regex, coordinate_text)
+ if possible_number_match not in [None]:
+ number_match = possible_number_match
+ break
+ if number_match == None:
+ from zLOG import LOG, WARNING
+ msg = "Doesn't exist a regex to handle this telephone: ", \
+ coordinate_text
+ LOG('Telephone.fromText', WARNING, msg)
+ 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','')
+ extension = number_dict.get('ext','')
+
+ if ((country in ['', None]) and \
+ (area in ['', None]) and \
+ (number in ['', None]) and \
+ (extension 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
+ preference_tool = self.portal_preferences
+ if country in ['', None]:
+ country = preference_tool.getPreferredTelephoneDefaultCountryNumber('')
+ if area in ['', None]:
+ area = preference_tool.getPreferredTelephoneDefaultAreaNumber('')
+
+ country = country.strip()
+ area = area.strip()
+ number = number.strip()
+ extension = extension.strip()
+
+ # Formating the number.
+ # Removing any ")", "(", "-" and " "
+ for token in [")", "(", "-" ," "]:
+ number = number.replace(token, '')
+
+ 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()
- 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 = ''
-
- # This regexp get the coordinate text
- # and extract number and letters
- input_regex_without_markup = '[0-9A-Za-z]'
- input_without_markup = ''.join(re.findall(input_regex_without_markup,\
- coordinate_text))
- # Test if coordinate_text has or not markups.
- if len(coordinate_text) > len(input_without_markup):
- # Trying to get the regex list.
- input_parser_list = self._getRegexList(coordinate_text=coordinate_text)
- number_match = None
- for input_parser in input_parser_list:
- possible_number_match = re.match(input_parser, coordinate_text)
- if possible_number_match not in [None]:
- number_match = possible_number_match
- break
- if number_match == None:
- from zLOG import LOG, WARNING
- msg = "Doesn't exist a regex to handle this telephone: ", coordinate_text
- LOG('*** Telephone ***',WARNING,msg)
- 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_default_number = self.portal_preferences.getPreferredTelephoneDefaultCountryNumber()
- area_default_number = self.portal_preferences.getPreferredTelephoneDefaultAreaNumber()
-
- country = (number_dict.get('country') or \
- country_default_number or \
- '').strip()
- area = (number_dict.get('area') or \
- area_default_number or
- '').strip()
- number = (number_dict.get('number') or '').strip()
-
- # Formating the number.
- # Removing any ")", "(", "-" and " "
- number = number.replace('-', '')
- number = number.replace(' ','')
- number = number.replace(')','')
- number = number.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()
-
- 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
- notation = self._getNotation(telephone_country=telephone_country)
- 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)
-
- if telephone_extension == '':
- notation=notation.replace('/','')
-
- return notation
-
- security.declareProtected(Permissions.AccessContentsInformation,
- 'asURL')
- def asURL(self):
- """Returns a text representation of the Url if defined
- or None else.
- """
- telephone_country = self.getTelephoneCountry()
- if telephone_country is not None:
- url_string = '+%s' % telephone_country
- else :
- url_string = '0'
-
- telephone_area = self.getTelephoneArea()
- if telephone_area is not None:
- url_string += telephone_area
-
- telephone_number = self.getTelephoneNumber()
- if telephone_number is not None:
- url_string += telephone_number
-
- if url_string == '0':
- return None
- return 'tel:%s' % (url_string.replace(' ',''))
-
- security.declareProtected(Permissions.View, 'getText')
- getText = asText
-
- security.declareProtected(Permissions.View, 'standardTextFormat')
- def standardTextFormat(self):
- """
- Returns the standard text formats for telephone numbers
- """
- return ("+33(0)6-62 05 76 14",)
-
- def _getRegexDict(self, index=None):
- """
- Returns a dict with Regex and Notations based from
- country or region
- """
- # Trying to get the Regex Dict
- if index not in self.standard_dict.keys():
- index = self.portal_preferences.getPreferredTelephoneDefaultCountryNumber() or '33'
-
- return self.standard_dict.get(index)
-
- def _getRegexList(self, coordinate_text):
- """
- Returns the regex list.
- """
- # Trying to get a possible contry number
- country_regex = '((\+|)(?P<country>\d*))'
- country = re.match(country_regex, \
- coordinate_text).groupdict().get('country','')
- regex_dict = self._getRegexDict(index=country)
- input_parser = regex_dict.get('regex_input_list')
- return input_parser
-
- def _getNotation(self, telephone_country):
- """
- Returns the notation that will be used by asText method.
- """
- regex_dict = self._getRegexDict(index=telephone_country)
- notation = regex_dict.get('notation')
- return notation
+ country = self.getTelephoneCountry('')
+ area = self.getTelephoneArea('')
+ number = self.getTelephoneNumber('')
+ extension = self.getTelephoneExtension('')
+
+ # If country, area, number, extension are blank
+ # the method should to return blank.
+ if ((country == '') and \
+ (area == '') and \
+ (number == '') and \
+ (extension == '')):
+ return ''
+
+ # Define the notation
+ notation = self._getNotation()
+ if notation not in [None, '']:
+ notation = notation.replace('<country>',country)
+ notation = notation.replace('<area>',area)
+ notation = notation.replace('<number>',number)
+ notation = notation.replace('<ext>',extension)
+
+ if extension == '':
+ notation = notation.replace('/','')
+
+ return notation
+
+ security.declareProtected(Permissions.AccessContentsInformation,
+ 'asURL')
+ def asURL(self):
+ """Returns a text representation of the Url if defined
+ or None else.
+ """
+ telephone_country = self.getTelephoneCountry()
+ if telephone_country is not None:
+ url_string = '+%s' % telephone_country
+ else :
+ url_string = '0'
+
+ telephone_area = self.getTelephoneArea()
+ if telephone_area is not None:
+ url_string += telephone_area
+
+ telephone_number = self.getTelephoneNumber()
+ if telephone_number is not None:
+ url_string += telephone_number
+
+ if url_string == '0':
+ return None
+ return 'tel:%s' % (url_string.replace(' ',''))
+
+ security.declareProtected(Permissions.View, 'getText')
+ getText = asText
+
+ security.declareProtected(Permissions.View, 'standardTextFormat')
+ def standardTextFormat(self):
+ """
+ Returns the standard text formats for telephone numbers
+ """
+ return ("+33(0)6-62 05 76 14",)
+
+ def _getNotation(self):
+ """
+ Returns the notation that will be used by asText method.
+ """
+ # The notation can be changed.
+ # But needs to have <country>, <area>, <number> and <ext>
+ return "+<country>(0)<area>-<number>/<ext>"
+
+ def _getRegexList(self):
+ """
+ Returns the regex list that will be used by fromText method.
+ """
+ return self.regex_list
Modified: erp5/trunk/products/ERP5/tests/testERP5Base.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/tests/testERP5Base.py?rev=21309&r1=21308&r2=21309&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/tests/testERP5Base.py (original)
+++ erp5/trunk/products/ERP5/tests/testERP5Base.py Wed Jun 4 01:58:50 2008
@@ -873,7 +873,7 @@
tel.setTelephoneExtension(999)
self.assertEquals('+33(0)2-12345678/999', tel.asText())
- def test_TelephoneInputListForFrance(self):
+ def test_TelephoneInputList(self):
pers = self.getPersonModule().newContent(portal_type='Person')
tel = pers.newContent(portal_type='Telephone')
pref = self.portal_preferences.default_site_preference
@@ -925,7 +925,6 @@
["62 05 76 14/","+33(0)2-62057614"],
["62 05 76 14","+33(0)2-62057614"],
-
["631 22 43/999","+33(0)2-6312243/999"],
["631 22 43/","+33(0)2-6312243"],
["631 22 43","+33(0)2-6312243"],
@@ -947,269 +946,41 @@
["+33 662 1244 4112/999","+33(0)662-12444112/999"],
["+33 662 1244 4112/","+33(0)662-12444112"],
["+33 662 1244 4112","+33(0)662-12444112"],
+
+ ["+55(2)27224896/999","+55(0)2-27224896/999"],
+ ["+55(2)27224896/","+55(0)2-27224896"],
+ ["+55(2)27224896","+55(0)2-27224896"],
+
+ ["+55()27224896/999","+55(0)2-27224896/999"],
+ ["+55()27224896/","+55(0)2-27224896"],
+ ["+55()27224896","+55(0)2-27224896"],
+
+ ["+55()-27224896/999","+55(0)2-27224896/999"],
+ ["+55()-27224896/","+55(0)2-27224896"],
+ ["+55()-27224896","+55(0)2-27224896"],
+
+ ["+55(629)024425/222","+55(0)629-024425/222"],
+ ["+55(629)024425/","+55(0)629-024425"],
+ ["+55(629)024425","+55(0)629-024425"],
+
+ ["+55 2 098765432/1","+55(0)2-098765432/1"],
+ ["+55 2 098765432/","+55(0)2-098765432"],
+ ["+55 2 098765432","+55(0)2-098765432"],
+
+ ["+55 662 1241 1233/999","+55(0)662-12411233/999"],
+ ["+55 662 1241 1233/","+55(0)662-12411233"],
+ ["+55 662 1241 1233","+55(0)662-12411233"],
+
+ ["+55-047-12345678/990","+55(0)047-12345678/990"],
+ ["+55-047-12345678/","+55(0)047-12345678"],
+ ["+55-047-12345678","+55(0)047-12345678"]
+
]
for i in input_list:
tel.fromText(coordinate_text=i[0])
self.assertEquals(i[1],tel.asText())
-
- def test_TelephoneInputListForSenegal(self):
- pers = self.getPersonModule().newContent(portal_type='Person')
- tel = pers.newContent(portal_type='Telephone')
- pref = self.portal_preferences.default_site_preference
- pref.setPreferredTelephoneDefaultCountryNumber('221')
- pref.setPreferredTelephoneDefaultAreaNumber('')
- pref.enable()
- input_list = [
- ["+221(2)27224896/999","+221(2)27224896/999"],
- ["+221(2)27224896/","+221(2)27224896"],
- ["+221(2)27224896","+221(2)27224896"],
-
- ["+221()27224896/999","+221()27224896/999"],
- ["+221()27224896/","+221()27224896"],
- ["+221()27224896","+221()27224896"],
-
- ["+221()-27224896/999","+221()27224896/999"],
- ["+221()-27224896/","+221()27224896"],
- ["+221()-27224896","+221()27224896"],
-
- ["+(2)27224896/999","+221(2)27224896/999"],
- ["+(2)27224896/","+221(2)27224896"],
- ["+(2)27224896","+221(2)27224896"],
-
- ["+()27224896/999","+221()27224896/999"],
- ["+()27224896/","+221()27224896"],
- ["+()27224896","+221()27224896"],
-
- ["+221(629)024425/222","+221(629)024425/222"],
- ["+221(629)024425/","+221(629)024425"],
- ["+221(629)024425","+221(629)024425"],
-
- ["(22)27224897/333","+221(22)27224897/333"],
- ["(22)27224897/","+221(22)27224897"],
- ["(22)27224897","+221(22)27224897"],
-
- ["(22)-12345678/222","+221(22)12345678/222"],
- ["(22)-12345678/","+221(22)12345678"],
- ["(22)-12345678","+221(22)12345678"],
-
- ["+221 2 098765432/1","+221(2)098765432/1"],
- ["+221 2 098765432/","+221(2)098765432"],
- ["+221 2 098765432","+221(2)098765432"],
-
- ["+221 662 1241 1233/999","+221(662)12411233/999"],
- ["+221 662 1241 1233/","+221(662)12411233"],
- ["+221 662 1241 1233","+221(662)12411233"],
-
- ["6-62 05 76 14/999","+221(6)62057614/999"],
- ["6-62 05 76 14/","+221(6)62057614"],
- ["6-62 05 76 14","+221(6)62057614"],
-
- ["62 05 76 14/999","+221()62057614/999"],
- ["62 05 76 14/","+221()62057614"],
- ["62 05 76 14","+221()62057614"],
-
-
- ["631 22 43/999","+221()6312243/999"],
- ["631 22 43/","+221()6312243"],
- ["631 22 43","+221()6312243"],
-
- ["631-22 43/999","+221(631)2243/999"],
- ["631-22 43/","+221(631)2243"],
- ["631-22 43","+221(631)2243"],
-
- ["8291212/33","+221()8291212/33"],
-
- ["047-336-5411/999","+221(047)3365411/999"],
- ["047-336-5411/","+221(047)3365411"],
- ["047-336-5411","+221(047)3365411"],
-
- ["047(336)5411/999","+221(047)3365411/999"],
- ["047(336)5411/","+221(047)3365411"],
- ["047(336)5411","+221(047)3365411"],
-
- ["+221 662 1244 4112/999","+221(662)12444112/999"],
- ["+221 662 1244 4112/","+221(662)12444112"],
- ["+221 662 1244 4112","+221(662)12444112"],
-
- ["+221-047-12345678/990","+221(047)12345678/990"],
- ["+221-047-12345678/","+221(047)12345678"],
- ["+221-047-12345678","+221(047)12345678"]
- ]
-
- for i in input_list:
- tel.fromText(coordinate_text=i[0])
- self.assertEquals(i[1],tel.asText())
-
-
- def test_TelephoneInputListForBrazil(self):
- pers = self.getPersonModule().newContent(portal_type='Person')
- tel = pers.newContent(portal_type='Telephone')
- pref = self.portal_preferences.default_site_preference
- pref.setPreferredTelephoneDefaultCountryNumber('55')
- pref.setPreferredTelephoneDefaultAreaNumber('2')
- pref.enable()
- input_list = [
- ["+55(2)27224896/999","+55(2)27224896/999"],
- ["+55(2)27224896/","+55(2)27224896"],
- ["+55(2)27224896","+55(2)27224896"],
-
- ["+55()27224896/999","+55(2)27224896/999"],
- ["+55()27224896/","+55(2)27224896"],
- ["+55()27224896","+55(2)27224896"],
-
- ["+55()-27224896/999","+55(2)27224896/999"],
- ["+55()-27224896/","+55(2)27224896"],
- ["+55()-27224896","+55(2)27224896"],
-
- ["+(2)27224896/999","+55(2)27224896/999"],
- ["+(2)27224896/","+55(2)27224896"],
- ["+(2)27224896","+55(2)27224896"],
-
- ["+()27224896/999","+55(2)27224896/999"],
- ["+()27224896/","+55(2)27224896"],
- ["+()27224896","+55(2)27224896"],
-
- ["+55(629)024425/222","+55(629)024425/222"],
- ["+55(629)024425/","+55(629)024425"],
- ["+55(629)024425","+55(629)024425"],
-
- ["(22)27224897/333","+55(22)27224897/333"],
- ["(22)27224897/","+55(22)27224897"],
- ["(22)27224897","+55(22)27224897"],
-
- ["(22)-12345678/222","+55(22)12345678/222"],
- ["(22)-12345678/","+55(22)12345678"],
- ["(22)-12345678","+55(22)12345678"],
-
- ["+55 2 098765432/1","+55(2)098765432/1"],
- ["+55 2 098765432/","+55(2)098765432"],
- ["+55 2 098765432","+55(2)098765432"],
-
- ["+55 662 1241 1233/999","+55(662)12411233/999"],
- ["+55 662 1241 1233/","+55(662)12411233"],
- ["+55 662 1241 1233","+55(662)12411233"],
-
- ["6-62 05 76 14/999","+55(6)62057614/999"],
- ["6-62 05 76 14/","+55(6)62057614"],
- ["6-62 05 76 14","+55(6)62057614"],
-
- ["62 05 76 14/999","+55(2)62057614/999"],
- ["62 05 76 14/","+55(2)62057614"],
- ["62 05 76 14","+55(2)62057614"],
-
-
- ["631 22 43/999","+55(2)6312243/999"],
- ["631 22 43/","+55(2)6312243"],
- ["631 22 43","+55(2)6312243"],
-
- ["631-22 43/999","+55(631)2243/999"],
- ["631-22 43/","+55(631)2243"],
- ["631-22 43","+55(631)2243"],
-
- ["8291212/33","+55(2)8291212/33"],
-
- ["047-336-5411/999","+55(047)3365411/999"],
- ["047-336-5411/","+55(047)3365411"],
- ["047-336-5411","+55(047)3365411"],
-
- ["047(336)5411/999","+55(047)3365411/999"],
- ["047(336)5411/","+55(047)3365411"],
- ["047(336)5411","+55(047)3365411"],
-
- ["+55 662 1244 4112/999","+55(662)12444112/999"],
- ["+55 662 1244 4112/","+55(662)12444112"],
- ["+55 662 1244 4112","+55(662)12444112"],
-
- ["+55-047-12345678/990","+55(047)12345678/990"],
- ["+55-047-12345678/","+55(047)12345678"],
- ["+55-047-12345678","+55(047)12345678"]
- ]
-
- for i in input_list:
- tel.fromText(coordinate_text=i[0])
- self.assertEquals(i[1],tel.asText())
-
- def test_TelephoneInputListForJapan(self):
- pers = self.getPersonModule().newContent(portal_type='Person')
- tel = pers.newContent(portal_type='Telephone')
- pref = self.portal_preferences.default_site_preference
- pref.setPreferredTelephoneDefaultCountryNumber('81')
- pref.setPreferredTelephoneDefaultAreaNumber('2')
- pref.enable()
- input_list = [
- ["+81(2)27224896/999","+81(2)27224896/999"],
- ["+81(2)27224896/","+81(2)27224896"],
- ["+81(2)27224896","+81(2)27224896"],
-
- ["+(2)27224896/999","+81(2)27224896/999"],
- ["+(2)27224896/","+81(2)27224896"],
- ["+(2)27224896","+81(2)27224896"],
-
- ["+()27224896/999","+81(2)27224896/999"],
- ["+()27224896/","+81(2)27224896"],
- ["+()27224896","+81(2)27224896"],
-
- ["+81(629)024425/222","+81(629)024425/222"],
- ["+81(629)024425/","+81(629)024425"],
- ["+81(629)024425","+81(629)024425"],
-
- ["(22)27224897/333","+81(22)27224897/333"],
- ["(22)27224897/","+81(22)27224897"],
- ["(22)27224897","+81(22)27224897"],
-
- ["(22)-12345678/222","+81(22)12345678/222"],
- ["(22)-12345678/","+81(22)12345678"],
- ["(22)-12345678","+81(22)12345678"],
-
- ["+81 2 098765432/1","+81(2)098765432/1"],
- ["+81 2 098765432/","+81(2)098765432"],
- ["+81 2 098765432","+81(2)098765432"],
-
- ["+81 662 1241 1233/999","+81(662)12411233/999"],
- ["+81 662 1241 1233/","+81(662)12411233"],
- ["+81 662 1241 1233","+81(662)12411233"],
-
- ["6-62 05 76 14/999","+81(6)62057614/999"],
- ["6-62 05 76 14/","+81(6)62057614"],
- ["6-62 05 76 14","+81(6)62057614"],
-
- ["62 05 76 14/999","+81(2)62057614/999"],
- ["62 05 76 14/","+81(2)62057614"],
- ["62 05 76 14","+81(2)62057614"],
-
-
- ["631 22 43/999","+81(2)6312243/999"],
- ["631 22 43/","+81(2)6312243"],
- ["631 22 43","+81(2)6312243"],
-
- ["631-22 43/999","+81(631)2243/999"],
- ["631-22 43/","+81(631)2243"],
- ["631-22 43","+81(631)2243"],
-
- ["8291212/33","+81(2)8291212/33"],
-
- ["047-336-5411/999","+81(047)3365411/999"],
- ["047-336-5411/","+81(047)3365411"],
- ["047-336-5411","+81(047)3365411"],
-
- ["047(336)5411/999","+81(047)3365411/999"],
- ["047(336)5411/","+81(047)3365411"],
- ["047(336)5411","+81(047)3365411"],
-
- ["+81 662 1244 4112/999","+81(662)12444112/999"],
- ["+81 662 1244 4112/","+81(662)12444112"],
- ["+81 662 1244 4112","+81(662)12444112"],
-
- ["+81-047-12345678/990","+81(047)12345678/990"],
- ["+81-047-12345678/","+81(047)12345678"],
- ["+81-047-12345678","+81(047)12345678"]
- ]
-
- for i in input_list:
- 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')
More information about the Erp5-report
mailing list