29 from new import classobj |
29 from new import classobj |
30 |
30 |
31 """ |
31 """ |
32 Regular expression models for extracting dates and times from a string |
32 Regular expression models for extracting dates and times from a string |
33 """ |
33 """ |
34 time_model = re.compile('([0-9]{2}):([0-9]{2}):([0-9]{2}(?:.[0-9]*)?)') |
34 time_model = re.compile('([0-9]{2}):([0-9]{2}):([0-9]{2}(?:\.[0-9]*)?)(?:Z)?') |
35 date_model = re.compile('([0-9]{4})-([0-9]{2})-([0-9]{2})') |
35 date_model = re.compile('([0-9]{4})-([0-9]{2})-([0-9]{2})((?:[\-\+][0-9]{2}:[0-9]{2})|Z)?') |
36 datetime_model = re.compile('([0-9]{4})-([0-9]{2})-([0-9]{2})[ T]([0-9]{2}):([0-9]{2}):([0-9]{2}(?:.[0-9]*)?)') |
36 datetime_model = re.compile('([0-9]{4})-([0-9]{2})-([0-9]{2})[ T]([0-9]{2}):([0-9]{2}):([0-9]{2}(?:\.[0-9]*)?)((?:[\-\+][0-9]{2}:[0-9]{2})|Z)?') |
|
37 |
|
38 class xml_timezone(tzinfo): |
|
39 |
|
40 def SetOffset(self, offset): |
|
41 if offset == "Z": |
|
42 self.__offset = timedelta(minutes = 0) |
|
43 self.__name = "UTC" |
|
44 else: |
|
45 sign = {"-" : -1, "+" : 1}[offset[0]] |
|
46 hours, minutes = [int(val) for val in offset[1:].split(":")] |
|
47 self.__offset = timedelta(minutes = sign * (hours * 60 + minutes)) |
|
48 self.__name = "" |
|
49 |
|
50 def utcoffset(self, dt): |
|
51 return self.__offset |
|
52 |
|
53 def tzname(self, dt): |
|
54 return self.__name |
|
55 |
|
56 def dst(self, dt): |
|
57 return ZERO |
37 |
58 |
38 XSD_INTEGER_TYPES = ["integer","nonPositiveInteger","negativeInteger","long", |
59 XSD_INTEGER_TYPES = ["integer","nonPositiveInteger","negativeInteger","long", |
39 "int","short","byte","nonNegativeInteger","unsignedLong","unsignedInt", |
60 "int","short","byte","nonNegativeInteger","unsignedLong","unsignedInt", |
40 "unsignedShort","unsignedByte","positiveInteger"] |
61 "unsignedShort","unsignedByte","positiveInteger"] |
41 |
62 |
107 else: |
128 else: |
108 raise ValueError, "\"%s\" is not a valid time!"%value |
129 raise ValueError, "\"%s\" is not a valid time!"%value |
109 elif type_compute == "date": |
130 elif type_compute == "date": |
110 result = date_model.match(value) |
131 result = date_model.match(value) |
111 if result: |
132 if result: |
112 date_values = [int(v) for v in result.groups()] |
133 values = result.groups() |
|
134 date_values = [int(v) for v in values[:3]] |
|
135 if values[3] is not None: |
|
136 tz = xml_timezone() |
|
137 tz.SetOffset(values[3]) |
|
138 date_values.append(tz) |
113 return date(*date_values) |
139 return date(*date_values) |
114 else: |
140 else: |
115 raise ValueError, "\"%s\" is not a valid date!"%value |
141 raise ValueError, "\"%s\" is not a valid date!"%value |
116 elif type_compute == "dateTime": |
142 elif type_compute == "dateTime": |
117 result = datetime_model.match(value) |
143 result = datetime_model.match(value) |
118 if result: |
144 if result: |
119 values = result.groups() |
145 values = result.groups() |
120 datetime_values = [int(v) for v in values[:5]] |
146 datetime_values = [int(v) for v in values[:5]] |
121 seconds = float(values[5]) |
147 seconds = float(values[5]) |
122 datetime_values.extend([int(seconds), int((seconds % 1) * 1000000)]) |
148 datetime_values.extend([int(seconds), int((seconds % 1) * 1000000)]) |
|
149 if values[6] is not None: |
|
150 tz = xml_timezone() |
|
151 tz.SetOffset(values[6]) |
|
152 datetime_values.append(tz) |
123 return datetime(*datetime_values) |
153 return datetime(*datetime_values) |
124 else: |
154 else: |
125 raise ValueError, "\"%s\" is not a valid datetime!"%value |
155 raise ValueError, "\"%s\" is not a valid datetime!"%value |
126 else: |
156 else: |
127 print "Can't affect: %s"%type_compute |
157 print "Can't affect: %s"%type_compute |
636 val.loadXMLTree(attr) |
666 val.loadXMLTree(attr) |
637 setattr(self, attrname, val) |
667 setattr(self, attrname, val) |
638 |
668 |
639 # Load the node childs if they are defined in the list |
669 # Load the node childs if they are defined in the list |
640 for node in tree.childNodes: |
670 for node in tree.childNodes: |
|
671 if node.nodeType == node.COMMENT_NODE: |
|
672 continue |
641 name = node.nodeName |
673 name = node.nodeName |
642 # We make fun of #text elements |
674 # We make fun of #text elements |
643 if name != "#text": |
675 if name != "#text": |
644 |
676 |
645 # Class has an attribute that can have different value types |
677 # Class has an attribute that can have different value types |