comparison Generic/fiebdc.py @ 17:a7b9f7e7dfa4

Improvements importing FIEBDC files
author Miguel Ángel Bárcena Rodríguez <miguelangel@obraencurso.es>
date Sat, 02 Nov 2013 19:26:09 +0100
parents 0359329a1c26
children 878159a13494
comparison
equal deleted inserted replaced
16:60bc5117926c 17:a7b9f7e7dfa4
1 #!/usr/bin/python 1 #!/usr/bin/python
2 # -*- coding: utf-8 -*- 2 # -*- coding: utf-8 -*-
3 ## File fiebdc.py 3 ## File fiebdc.py
4 ## This file is part of pyArq-Presupuestos. 4 ## This file is part of pyArq-Presupuestos.
5 ## 5 ##
6 ## Copyright (C) 2010 Miguel Ángel Bárcena Rodríguez 6 ## Copyright (C) 2010-2013 Miguel Ángel Bárcena Rodríguez
7 ## <miguelangel@obraencurso.es> 7 ## <miguelangel@obraencurso.es>
8 ## 8 ##
9 ## pyArq-Presupuestos is free software: you can redistribute it and/or modify 9 ## pyArq-Presupuestos is free software: you can redistribute it and/or modify
10 ## it under the terms of the GNU General Public License as published by 10 ## it under the terms of the GNU General Public License as published by
11 ## the Free Software Foundation, either version 3 of the License, or 11 ## the Free Software Foundation, either version 3 of the License, or
24 # Modules 24 # Modules
25 import time 25 import time
26 import re 26 import re
27 import calendar 27 import calendar
28 import os.path 28 import os.path
29 29 import unicodedata
30 import hashlib
30 # pyArq-Presupuestos modules 31 # pyArq-Presupuestos modules
31 import base 32 import base
32 from Generic import utils 33 from Generic import utils
33 from Generic import globalVars 34 from Generic import globalVars
34 35
95 "437" : "cp437"} 96 "437" : "cp437"}
96 self.__file_format = "FIEBDC-3/2007" 97 self.__file_format = "FIEBDC-3/2007"
97 self.__generator = globalVars.version 98 self.__generator = globalVars.version
98 self.__character_set = "850" 99 self.__character_set = "850"
99 self.__pattern = { 100 self.__pattern = {
100 "control_tilde" : re.compile("((\r\n)| |\t)+~"), 101 "control_tilde" : re.compile(u"((\r\n)| |\t)+~"),
101 "control_vbar" : re.compile("((\r\n)| |\t)+\|"), 102 "control_vbar" : re.compile(u"((\r\n)| |\t)+\|"),
102 "control_backslash" : re.compile(r"((\r\n)| |\t)+\\"), 103 "control_backslash" : re.compile(ur"((\r\n)| |\t)+\\"),
103 "valid_code" : re.compile("[^A-Za-z0-9ñÑ.$#%&_]"), 104 "valid_code" : re.compile(u"[^A-Za-z0-9ñÑ.$#%&_]"),
104 "special_char": re.compile("[#%&]"), 105 "special_char": re.compile(u"[#%&]"),
105 "no_float": re.compile("[^0-9.]"), 106 "no_float": re.compile(u"[^0-9.]"),
106 "formula" : re.compile(".*[^0123456789\.()\+\-\*/\^abcdp ].*"), 107 "formula" : re.compile(u".*[^0123456789\.()\+\-\*/\^abcdp ].*"),
107 "comment": re.compile("#.*\r\n"), 108 "comment": re.compile(u"#.*\r\n"),
108 "empty_line": re.compile(r"(\r\n) *\r\n"), 109 "empty_line": re.compile(ur"(\r\n) *\r\n"),
109 "space_before_backslash" : re.compile(r"( )+\\"), 110 "space_before_backslash" : re.compile(ur"( )+\\"),
110 "space_after_backslash" : re.compile(r"\\( )+"), 111 "space_after_backslash" : re.compile(ur"\\( )+"),
111 "start_noend_backslash" : re.compile("(\r\n\\\.*[^\\\])\r\n"), 112 "start_noend_backslash" : re.compile(u"(\r\n\\\.*[^\\\])\r\n"),
112 "end_oper": re.compile("(\+|-|\*|/|/^|@|&|<|>|<=|>=|=|!) *\r\n"), 113 "end_oper": re.compile(u"(\+|-|\*|/|/^|@|&|<|>|<=|>=|=|!) *\r\n"),
113 "matricial_var" : re.compile("(\r\n *[%|\$][A-ZÑ].*=.*,) *\r\n"), 114 "matricial_var" : re.compile(u"(\r\n *[%|\$][A-ZÑ].*=.*,) *\r\n"),
114 "descomposition" : re.compile("^([^:]+):(.*)$"), 115 "descomposition" : re.compile(u"^([^:]+):(.*)$"),
115 "var" : re.compile("^([$%][A-ZÑ][()0-9, ]*)=(.*)$"), 116 "var" : re.compile(u"^([$%][A-ZÑ][()0-9, ]*)=(.*)$"),
116 "after_first_tilde" : re.compile("^[^~]*~"), 117 "after_first_tilde" : re.compile(u"^[^~]*~"),
117 "end_control" : re.compile("((\r\n)| |\t)+$"), 118 "end_control" : re.compile(u"((\r\n)| |\t)+$"),
118 } 119 }
119 120
120 def cancel(self): 121 def cancel(self):
121 """def cancel(self) 122 """def cancel(self)
122 123
132 '~', '|' erased. 133 '~', '|' erased.
133 Before separator \ not deleted because it affects the reading of the 134 Before separator \ not deleted because it affects the reading of the
134 record ~P 135 record ~P
135 """ 136 """
136 # "control_tilde" : "((\r\n)| |\t)+~" 137 # "control_tilde" : "((\r\n)| |\t)+~"
137 string = self.__pattern["control_tilde"].sub("~",string) 138 string = self.__pattern["control_tilde"].sub(u"~",string)
138 # "control_vbar" : "((\r\n)| |\t)+\|" 139 # "control_vbar" : "((\r\n)| |\t)+\|"
139 string = self.__pattern["control_vbar"].sub("|",string) 140 string = self.__pattern["control_vbar"].sub(u"|",string)
140 # "control_backslash" : r"((\r\n)| |\t)+\\" 141 # "control_backslash" : r"((\r\n)| |\t)+\\"
141 #string = self.__pattern["control_backslash"].sub(r"\\",string) 142 #string = self.__pattern["control_backslash"].sub(r"\\",string)
142 return string 143 return string
143 144
144 def validateCode(self, code): 145 def validateCode(self, code):
145 """validateCode(self, code) 146 """validateCode(self, code)
146 147
147 Test if the code have invalid characters and try to erase it, 148 Test if the code have invalid characters and try to erase it,
148 if it is posible return a valid code else return a empty string. 149 if it is posible return a valid code else return a empty string.
149 """ 150 """
150 if not isinstance(code, str): 151 if not isinstance(code, unicode):
151 print _("Invalid code, it must be a string") 152 print _("Invalid code, it must be a unicode string")
152 return "" 153 return u""
153 # Valid chararcter: A-Z a-z 0-9 ñ Ñ . $ # % & _ 154 # Valid chararcter: A-Z a-z 0-9 ñ Ñ . $ # % & _
154 # "valid_code" : "[^A-Za-z0-9ñÑ.$#%&_]" 155 # "valid_code" : "[^A-Za-z0-9ñÑ.$#%&_]"
155 _code = self.__pattern["valid_code"].sub("", code) 156 _ucode = self.__pattern["valid_code"].sub(u"", code)
156 if _code != code: 157 if _ucode != code:
157 print utils.mapping(_("The code '$1' have invalid characters."), 158 try:
158 (code,)) 159 print utils.mapping(_("The code '$1' have invalid characters."),
159 code = _code 160 (code.encode("utf8"),))
161 except:
162 print utils.mapping(_("The code '$1' have invalid characters and can not be encoded in utf8."), (code,))
163
164 if len(_ucode) == 0:
165 _normalize_code = ''.join((c for c in unicodedata.normalize('NFD', _ucode) if unicodedata.category(c) != 'Mn'))
166 # from http://www.leccionespracticas.com/uncategorized/eliminar-tildes-con-python-solucionado/
167 _ucode = self.__pattern["valid_code"].sub(u"", _normalize_code)
168 if len(_ucode) == 0:
169 _hash_code = hashlib.sha256()
170 _hash_code.update(code.encode('utf-8'))
171 _hexdigest_code = _hash_code.hexdigest()
172 _ucode = self.__pattern["valid_code"].sub(u"", _hexdigest_code)
173 code = _ucode
160 # the lasts characters can not be <#> or <##> 174 # the lasts characters can not be <#> or <##>
161 # <##> -> root record in FIEFDC-3 175 # <##> -> root record in FIEFDC-3
162 # <#> -> chapter record in FIEFDC-3 176 # <#> -> chapter record in FIEFDC-3
163 if len(code) > 0: 177 if len(code) > 0:
164 while code[-1] == "#": 178 while code[-1] == u"#":
165 code = code[:-1] 179 code = code[:-1]
166 if len(code) > 20: 180 if len(code) > 20:
167 code = code[:20] 181 code = code[:20]
168 # only one charecter # % or & 182 # only one charecter # % or &
169 if sum([code.count(c) for c in '#%&']) > 1: 183 if sum([code.count(c) for c in u'#%&']) > 1:
170 print utils.mapping(_("The code '$1' contains special "\ 184 print utils.mapping(_("The code '$1' contains special "\
171 "characters repeated."),(code,)) 185 "characters repeated."),(code.encode("utf8"),))
172 _i = min([code.find(c) for c in '#%&']) 186 _i = min([code.find(c) for c in u'#%&'])
173 code = code[:_i+1] + \ 187 code = code[:_i+1] + \
174 self.__pattern["special_char"].sub("", code[_i+1:]) 188 self.__pattern["special_char"].sub(u"", code[_i+1:])
175 return code 189 return code
176 190
177 def parseDate(self, date): 191 def parseDate(self, date):
178 """parseDate(self, date) 192 """parseDate(self, date)
179 193
185 len < 3 YY 199 len < 3 YY
186 Test date string and return a tuple (YYYY, MM, DD) 200 Test date string and return a tuple (YYYY, MM, DD)
187 or None if the date format is invalid 201 or None if the date format is invalid
188 """ 202 """
189 # All characters must be numbers, len <= 8 and not empty string 203 # All characters must be numbers, len <= 8 and not empty string
190 if not date.isdigit() or len(date) > 8 or date == "": 204 if not date.isdigit() or len(date) > 8 or date == u"":
191 return None 205 return None
192 else: 206 else:
193 if len(date)%2 == 1: # uneven len: add a leading 0 207 if len(date)%2 == 1: # uneven len: add a leading 0
194 date = "0" + date 208 date = u"0" + date
195 if len(date) == 8: 209 if len(date) == 8:
196 _d = int(date[:2]) 210 _d = int(date[:2])
197 _m = int(date[2:4]) 211 _m = int(date[2:4])
198 _y = int(date[4:8]) 212 _y = int(date[4:8])
199 elif len(date) <= 6: 213 elif len(date) <= 6:
305 # TODO: ~L ~J RTF and HTML files 319 # TODO: ~L ~J RTF and HTML files
306 # TODO: test ~Q ~J ~G 320 # TODO: test ~Q ~J ~G
307 # TODO: ~P. Registro tipo Descripción Paramétrica. 321 # TODO: ~P. Registro tipo Descripción Paramétrica.
308 # TODO: ~O. Registro tipo Relación Comercial. 322 # TODO: ~O. Registro tipo Relación Comercial.
309 # TODO: test records 323 # TODO: test records
310 _field_list = record.split("|") 324 _field_list = record.split(u"|")
311 self._record_number = self._record_number +1 325 self._record_number = self._record_number +1
312 _budget = self.__budget 326 _budget = self.__budget
313 if _field_list[0] == "V": 327 if _field_list[0] == u"V":
314 self._record_V_number += 1 328 self._record_V_number += 1
315 self._parseV(_field_list) 329 self._parseV(_field_list)
316 elif _field_list[0] == "C": 330 elif _field_list[0] == u"C":
317 self._record_C_number += 1 331 self._record_C_number += 1
318 self._parseC(_field_list) 332 self._parseC(_field_list)
319 elif _field_list[0] == "D": 333 elif _field_list[0] == u"D":
320 self._record_D_number += 1 334 self._record_D_number += 1
321 self._parseDY(_field_list) 335 self._parseDY(_field_list)
322 elif _field_list[0] == "Y": 336 elif _field_list[0] == u"Y":
323 self._record_Y_number += 1 337 self._record_Y_number += 1
324 self._parseDY(_field_list) 338 self._parseDY(_field_list)
325 elif _field_list[0] == "M": 339 elif _field_list[0] == u"M":
326 self._record_M_number += 1 340 self._record_M_number += 1
327 self._parseMN(_field_list) 341 self._parseMN(_field_list)
328 elif _field_list[0] == "N": 342 elif _field_list[0] == u"N":
329 self._record_N_number += 1 343 self._record_N_number += 1
330 self._parseMN(_field_list) 344 self._parseMN(_field_list)
331 elif _field_list[0] == "T": 345 elif _field_list[0] == u"T":
332 self._record_T_number += 1 346 self._record_T_number += 1
333 self._parseT(_field_list) 347 self._parseT(_field_list)
334 elif _field_list[0] == "K": 348 elif _field_list[0] == u"K":
335 self._record_K_number += 1 349 self._record_K_number += 1
336 self._parseK(_field_list) 350 self._parseK(_field_list)
337 elif _field_list[0] == "W": 351 elif _field_list[0] == u"W":
338 self._record_W_number += 1 352 self._record_W_number += 1
339 self._parseW(_field_list) 353 self._parseW(_field_list)
340 elif _field_list[0] == "L": 354 elif _field_list[0] == u"L":
341 self._record_L_number += 1 355 self._record_L_number += 1
342 self._parseL(_field_list) 356 self._parseL(_field_list)
343 elif _field_list[0] == "Q": 357 elif _field_list[0] == u"Q":
344 self._record_Q_number += 1 358 self._record_Q_number += 1
345 self._parseQ(_field_list) 359 self._parseQ(_field_list)
346 elif _field_list[0] == "J": 360 elif _field_list[0] == u"J":
347 self._record_J_number += 1 361 self._record_J_number += 1
348 self._parseJ(_field_list) 362 self._parseJ(_field_list)
349 elif _field_list[0] == "G": 363 elif _field_list[0] == u"G":
350 self._record_G_number += 1 364 self._record_G_number += 1
351 self._parseG(_field_list) 365 self._parseG(_field_list)
352 elif _field_list[0] == "E": 366 elif _field_list[0] == u"E":
353 self._record_E_number += 1 367 self._record_E_number += 1
354 self._parseE(_field_list) 368 self._parseE(_field_list)
355 elif _field_list[0] == "O": 369 elif _field_list[0] == "O":
356 self._record_O_number += 1 370 self._record_O_number += 1
357 elif _field_list[0] == "P": 371 elif _field_list[0] == u"P":
358 self._record_P_number += 1 372 self._record_P_number += 1
359 self._parseP(_field_list) 373 self._parseP(_field_list)
360 elif _field_list[0] == "X": 374 elif _field_list[0] == u"X":
361 self._record_X_number += 1 375 self._record_X_number += 1
362 self._parseX(_field_list) 376 self._parseX(_field_list)
363 elif _field_list[0] == "B": 377 elif _field_list[0] == u"B":
364 self._record_B_number += 1 378 self._record_B_number += 1
365 self._parseB(_field_list) 379 self._parseB(_field_list)
366 elif _field_list[0] == "F": 380 elif _field_list[0] == u"F":
367 self._record_F_number += 1 381 self._record_F_number += 1
368 self._parseF(_field_list) 382 self._parseF(_field_list)
369 elif _field_list[0] == "A": 383 elif _field_list[0] == u"A":
370 self._record_A_number += 1 384 self._record_A_number += 1
371 self._parseA(_field_list) 385 self._parseA(_field_list)
372 else: 386 else:
373 self._record_Unknow_number += 1 387 self._record_Unknow_number += 1
374 388
399 if len(field_list) > 10: 413 if len(field_list) > 10:
400 field_list = field_list[:10] 414 field_list = field_list[:10]
401 # If there are no sufficient fields, the fields are added 415 # If there are no sufficient fields, the fields are added
402 # with empty value:"" 416 # with empty value:""
403 else: 417 else:
404 field_list = field_list + [""]*(10-len(field_list)) 418 field_list = field_list + [u""]*(10-len(field_list))
405 # control character are erased: end of line, tab, space 419 # control character are erased: end of line, tab, space
406 # only leading and trailing whitespace in owner, generator, comment 420 # only leading and trailing whitespace in owner, generator, comment
407 # _____Fields_____ 421 # _____Fields_____
408 _record_type = self.delete_control_space(field_list[0]) 422 _record_type = self.delete_control_space(field_list[0])
409 _owner = field_list[1].strip() 423 _owner = field_list[1].strip()
412 _generator = field_list[3].strip() 426 _generator = field_list[3].strip()
413 _generator = self.delete_control(_generator) 427 _generator = self.delete_control(_generator)
414 _header_title = field_list[4].strip() 428 _header_title = field_list[4].strip()
415 _header_title = self.delete_control(_header_title) 429 _header_title = self.delete_control(_header_title)
416 _character_set = self.delete_control_space(field_list[5]) 430 _character_set = self.delete_control_space(field_list[5])
417 _comment = field_list[6].strip("\t \n\r") 431 _comment = field_list[6].strip(u"\t \n\r")
418 _data_type = self.delete_control_space(field_list[7]) 432 _data_type = self.delete_control_space(field_list[7])
419 _number_certificate = self.delete_control_space(field_list[8]) 433 _number_certificate = self.delete_control_space(field_list[8])
420 __date_certificate = self.delete_control_space(field_list[9]) 434 __date_certificate = self.delete_control_space(field_list[9])
421 # _____Owner_____ 435 # _____Owner_____
422 self.__budget.setOwner(_owner) 436 self.__budget.setOwner(_owner)
423 # _____Version-Date_____ 437 # _____Version-Date_____
424 _version_date = _version_date.split("\\") 438 _version_date = _version_date.split(u"\\")
425 _file_format = _version_date[0] 439 _file_format = _version_date[0]
426 if _file_format in self.__format_list: 440 if _file_format in self.__format_list:
427 self.__file_format = _file_format 441 self.__file_format = _file_format
428 print _("FIEBDC format: %s" % _file_format) 442 print utils.mapping(_("FIEBDC format: $1"),(_file_format,))
443
429 if len(_version_date) > 1: 444 if len(_version_date) > 1:
430 _date = _version_date[1] 445 _date = _version_date[1]
431 if _date != "": 446 if _date != u"":
432 _parsed_date = self.parseDate(_date) 447 _parsed_date = self.parseDate(_date)
433 if _parsed_date is not None: 448 if _parsed_date is not None:
434 self.__budget.setDate(_parsed_date) 449 self.__budget.setDate(_parsed_date)
435 # _____Generator_____ 450 # _____Generator_____
436 # ignored field 451 # ignored field
437 print _("FIEBDC file generated by %s" % _generator) 452 print utils.mapping(_("FIEBDC file generated by $1"),(_generator,))
438 # _____Header_Title_____ 453 # _____Header_Title_____
439 _header_title = _header_title.split("\\") 454 _header_title = _header_title.split(u"\\")
440 _header_title = [_title.strip() for _title in _header_title] 455 _header_title = [_title.strip() for _title in _header_title]
441 _header = _header_title.pop(0) 456 _header = _header_title.pop(0)
457 _header = [_item.encode("utf8") for _item in _header]
442 _title = [ ] 458 _title = [ ]
443 for _title_index in _header_title: 459 for _title_index in _header_title:
444 if _title_index != "": 460 if _title_index != u"":
445 _title.append(_title_index) 461 _title.append(_title_index)
446 if _header != "": 462 _title = [_item.encode("utf8") for _item in _title]
447 self.__budget.setTitleList([ _header, _title ]) 463 if _header != u"":
464 self.__budget.setTitleList([ _header, _title])
448 # _____Characters_set_____ 465 # _____Characters_set_____
449 # field parsed in readFile method 466 # field parsed in readFile method
450 # _____Comment_____ 467 # _____Comment_____
451 if _comment != "": 468 if _comment != u"":
452 self.__budget.setComment(_comment) 469 self.__budget.setComment(_comment.encode("utf8"))
453 # _____Data type_____ 470 # _____Data type_____
454 # 1 -> Base data. 471 # 1 -> Base data.
455 # 2 -> Budget. 472 # 2 -> Budget.
456 # 3 -> Budget certificate. 473 # 3 -> Budget certificate.
457 # 4 -> Base date update. 474 # 4 -> Base date update.
506 # _____Fields_____ 523 # _____Fields_____
507 _field0 = self.delete_control_space(field_list[0]) 524 _field0 = self.delete_control_space(field_list[0])
508 _field1 = self.delete_control_space(field_list[1]) 525 _field1 = self.delete_control_space(field_list[1])
509 _field2 = self.delete_control_space(field_list[2]) 526 _field2 = self.delete_control_space(field_list[2])
510 # _____Field 1_____ 527 # _____Field 1_____
511 if len(_field1) > 0 and _field1[-1] == "\\": 528 if len(_field1) > 0 and _field1[-1] == u"\\":
512 _field1 = _field1[:-1] 529 _field1 = _field1[:-1]
513 # if there are a \ character at the end it must be erased 530 # if there are a \ character at the end it must be erased
514 _percentages = _field1.split("\\") 531 _percentages = _field1.split(u"\\")
515 if len(_percentages) > 5: 532 if len(_percentages) > 5:
516 _percentages = _percentages[:5] 533 _percentages = _percentages[:5]
517 # If there are no sufficient subfields, the subfields are added 534 # If there are no sufficient subfields, the subfields are added
518 # with empty value:"" 535 # with empty value:""
519 else: 536 else:
520 _percentages = _percentages + [""]*(5-len(_percentages)) 537 _percentages = _percentages + [u""]*(5-len(_percentages))
521 _percentage_titles = [ "CI", "GG", "BI", "BAJA", "IVA" ] 538 _percentage_titles = [ "CI", "GG", "BI", "BAJA", "IVA" ]
522 _percentage_dict = {} 539 _percentage_dict = {}
523 for _percentage_index in range(len(_percentages)): 540 for _percentage_index in range(len(_percentages)):
524 try: 541 try:
525 _percentage = int(_percentages[_percentage_index]) 542 _percentage = int(_percentages[_percentage_index])
532 # Default number of decimal places 549 # Default number of decimal places
533 # Number of titles in ~V record 550 # Number of titles in ~V record
534 _title_num = len(self.__budget.getTitleList()[1]) 551 _title_num = len(self.__budget.getTitleList()[1])
535 if _title_num == 0: _title_num = 1 552 if _title_num == 0: _title_num = 1
536 # If the field 2 is empty, the field 0 is readed 553 # If the field 2 is empty, the field 0 is readed
537 if _field2 == "": 554 if _field2 == u"":
538 # _____Field 0_____ 555 # _____Field 0_____
539 if _field0[-1] == "\\": 556 if _field0[-1] == u"\\":
540 _field0 = _field0[:-1] 557 _field0 = _field0[:-1]
541 # if there are a \ character at the end it must be erased 558 # if there are a \ character at the end it must be erased
542 _decimal_list = _field0.split("\\") 559 _decimal_list = _field0.split(u"\\")
543 _decimal_index = 0 560 _decimal_index = 0
544 if len(_decimal_list)%9 != 0: 561 if len(_decimal_list)%9 != 0:
545 # if it is not multiple of 9, empty subfield are added 562 # if it is not multiple of 9, empty subfield are added
546 _decimal_list = _decimal_list + [""]*(9 - \ 563 _decimal_list = _decimal_list + [""]*(9 - \
547 len(_decimal_list)%9) 564 len(_decimal_list)%9)
738 if len(field_list) > 7: 755 if len(field_list) > 7:
739 field_list = field_list[:7] 756 field_list = field_list[:7]
740 # If there are no sufficient fields, the fields are added 757 # If there are no sufficient fields, the fields are added
741 # with empty value:"" 758 # with empty value:""
742 else: 759 else:
743 field_list = field_list + [""]*(7-len(field_list)) 760 field_list = field_list + [u""]*(7-len(field_list))
744 # control character are erased: en of line, tab, space 761 # control character are erased: en of line, tab, space
745 # _____Fields_____ 762 # _____Fields_____
746 _record_type = field_list[0] 763 _record_type = field_list[0]
747 _codes = self.delete_control_space(field_list[1]) 764 _codes = self.delete_control_space(field_list[1])
748 _unit = self.delete_control_space(field_list[2]) 765 _unit = self.delete_control_space(field_list[2])
749 _summary = self.delete_control(field_list[3]) 766 _summary = self.delete_control(field_list[3])
750 _prices = self.delete_control_space(field_list[4]) 767 _prices = self.delete_control_space(field_list[4])
751 _dates = self.delete_control_space(field_list[5]) 768 _dates = self.delete_control_space(field_list[5])
752 _type = self.delete_control_space(field_list[6]) 769 _type = self.delete_control_space(field_list[6])
753 # _____Code_____ 770 # _____Code_____
754 _codes = _codes.split("\\") 771 _codes = _codes.split(u"\\")
755 if len(_codes) > 0: 772 if len(_codes) > 0:
756 # parse the hierarchy of the first code 773 # parse the hierarchy of the first code
757 # hierarchy: 0->root, 1->Chapter/subchapter, 2->other 774 # hierarchy: 0->root, 1->Chapter/subchapter, 2->other
758 if len(_codes[0]) > 2 and _codes[0][-2:] == "##": 775 if len(_codes[0]) > 2 and _codes[0][-2:] == u"##":
759 _hierarchy = 0 776 _hierarchy = 0
760 elif len(_codes[0]) > 1 and _codes[0][-1:] == "#": 777 elif len(_codes[0]) > 1 and _codes[0][-1:] == u"#":
761 _hierarchy = 1 778 _hierarchy = 1
762 else: 779 else:
763 _hierarchy = 2 780 _hierarchy = 2
764 # "#" and "##" characters at the end of the code are erased 781 # "#" and "##" characters at the end of the code are erased
765 # invalid characters are also erased 782 # invalid characters are also erased
766 # maximun len 20 characters 783 # maximun len 20 characters
767 _codes = [self.validateCode(_code) for _code in _codes] 784 _codes = [self.validateCode(_code) for _code in _codes]
768 # empty codes are ignored 785 # empty codes are ignored
769 while "" in _codes: 786 while u"" in _codes:
770 _codes.remove("") 787 _codes.remove(u"")
771 if len(_codes) > 0: 788 if len(_codes) > 0:
772 #TODO: test this 789 #TODO: test this
773 _code = _codes[0] 790 _code = _codes[0]
774 _synonyms = _codes 791 _synonyms = [synonym.encode("utf8") for synonym in _codes]
775 else: 792 else:
776 print _("Record C without a valid code") 793 print _("Record C without a valid code")
777 return 794 return
778 # _____Unit_____ 795 # _____Unit_____
779 # nothing to do 796 # nothing to do
780 # _____Summary_____ 797 # _____Summary_____
781 # nothing to do 798 # nothing to do
782 # _____Price_____ and _____Dates_____ 799 # _____Price_____ and _____Dates_____
783 # last \ is erased 800 # last \ is erased
784 if len(_dates) > 0 and _dates[-1] == "\\": 801 if len(_dates) > 0 and _dates[-1] == u"\\":
785 _dates = _dates[:-1] 802 _dates = _dates[:-1]
786 if len(_prices) > 0 and _prices[-1] == "\\": 803 if len(_prices) > 0 and _prices[-1] == u"\\":
787 _prices = _prices[:-1] 804 _prices = _prices[:-1]
788 _dates = _dates.split("\\") 805 _dates = _dates.split(u"\\")
789 _prices = _prices.split("\\") 806 _prices = _prices.split(u"\\")
790 # number of prices = number of titles in "V" line 807 # number of prices = number of titles in "V" line
791 # if there are no sufficient prices it takes the last price defined 808 # if there are no sufficient prices it takes the last price defined
792 _title_num = len(self.__budget.getTitleList()[1]) 809 _title_num = len(self.__budget.getTitleList()[1])
793 if _title_num == 0: _title_num = 1 810 if _title_num == 0: _title_num = 1
794 if len(_prices) > _title_num: _prices = _prices[:_title_num] 811 if len(_prices) > _title_num: _prices = _prices[:_title_num]
840 # 2->Other -> 0 -> None,EA,EU,EC,EF,PA 857 # 2->Other -> 0 -> None,EA,EU,EC,EF,PA
841 # 1 -> None,H 858 # 1 -> None,H
842 # 2 -> None,Q,% 859 # 2 -> None,Q,%
843 # 3 -> None,MC,MCr,MM,MS,ME,MCu,Mal,ML,M 860 # 3 -> None,MC,MCr,MM,MS,ME,MCu,Mal,ML,M
844 if _hierarchy == 0: 861 if _hierarchy == 0:
845 if _type == "OB": 862 if _type == u"OB":
846 _subtype = _type 863 _subtype = _type
847 _type = 0 864 _type = 0
848 elif _type == "0" or _type == "": 865 elif _type == u"0" or _type == u"":
849 _subtype = "" 866 _subtype = u""
850 _type = 0 867 _type = 0
851 else: 868 else:
852 print utils.mapping(_("Incorrect type ($1) in the code $2"), 869 print utils.mapping(_("Incorrect type ($1) in the code $2"),
853 (str(_type), _code)) 870 (_type.encode("utf8"), _code.encode("utf8")))
854 _type = 0 871 _type = 0
855 _subtype = "" 872 _subtype = u""
856 elif _hierarchy == 1: 873 elif _hierarchy == 1:
857 if _type == "PU": 874 if _type == u"PU":
858 _subtype = _type 875 _subtype = _type
859 _type = 0 876 _type = 0
860 elif _type == "0" or _type == "": 877 elif _type == u"0" or _type == u"":
861 _subtype = "" 878 _subtype = u""
862 _type = 0 879 _type = 0
863 else: 880 else:
864 print utils.mapping(_("Incorrect type ($1) in the code $2"), 881 print utils.mapping(_("Incorrect type ($1) in the code $2"),
865 (str(_type), _code)) 882 (_type.encode("utf8"), _code.encode("utf8")))
866 _type = 0 883 _type = 0
867 _subtype = "" 884 _subtype = u""
868 else: 885 else:
869 if _type == "EA" or _type == "EU" or _type == "EC" or \ 886 if _type == u"EA" or _type == u"EU" or _type == u"EC" or \
870 _type == "EF" or _type == "PA": 887 _type == u"EF" or _type == u"PA":
871 _subtype = _type 888 _subtype = _type
872 _type = 0 889 _type = 0
873 elif _type == "H": 890 elif _type == u"H":
874 _subtype = _type 891 _subtype = _type
875 _type = 1 892 _type = 1
876 elif _type == "Q" or _type == "%": 893 elif _type == u"Q" or _type == u"%":
877 _subtype = _type 894 _subtype = _type
878 _type = 2 895 _type = 2
879 elif _type == "MC" or _type == "MCr" or _type == "MM" or \ 896 elif _type == u"MC" or _type == u"MCr" or _type == u"MM" or \
880 _type == "MS" or _type == "ME" or _type == "MCu" or \ 897 _type == u"MS" or _type == u"ME" or _type == u"MCu" or \
881 _type == "Mal" or _type == "ML" or _type == "M": 898 _type == u"Mal" or _type == u"ML" or _type == u"M":
882 _subtype = _type 899 _subtype = _type
883 _type = 3 900 _type = 3
884 elif _type == "0" or _type == "1" or _type == "2" or \ 901 elif _type == u"0" or _type == u"1" or _type == u"2" or \
885 _type == "3": 902 _type == u"3":
886 _subtype = "" 903 _subtype = u""
887 _type = int(_type) 904 _type = int(_type)
888 elif _type == "": 905 elif _type == u"":
889 _subtype = "" 906 _subtype = u""
890 _type = 0 907 _type = 0
891 else: 908 else:
892 print utils.mapping(_("Incorrect type ($1) in the code $2"), 909 print utils.mapping(_("Incorrect type ($1) in the code $2"),
893 (str(_type), _code)) 910 (_type.encode("utf8"), _code.encode("utf8")))
894 _type = 0 911 _type = 0
895 _subtype = "" 912 _subtype = u""
896 self.__budget.setRecord(_code, _synonyms, _hierarchy, 913 self.__budget.setRecord(_code.encode("utf8"), _synonyms, _hierarchy,
897 _unit, _summary, _prices, _dates, _type, _subtype) 914 _unit.encode("utf8"), _summary.encode("utf8"),
915 _prices, _dates, _type, _subtype.encode("utf8"))
898 self.num_valid_record = self.num_valid_record + 1 916 self.num_valid_record = self.num_valid_record + 1
899 917
900 def _parseDY(self, field_list): 918 def _parseDY(self, field_list):
901 """_parseDY(self, field_list) 919 """_parseDY(self, field_list)
902 920
911 if len(field_list) > 3: 929 if len(field_list) > 3:
912 field_list = field_list[:3] 930 field_list = field_list[:3]
913 # If there are no sufficient fields, the fields are added 931 # If there are no sufficient fields, the fields are added
914 # with empty value:"" 932 # with empty value:""
915 else: 933 else:
916 field_list = field_list + [""]*(3-len(field_list)) 934 field_list = field_list + [u""]*(3-len(field_list))
917 # control character are erased: end of line, tab, space 935 # control character are erased: end of line, tab, space
918 # _____Fields_____ 936 # _____Fields_____
919 _record_type = field_list[0] 937 _record_type = field_list[0]
920 _code = self.delete_control_space(field_list[1]) 938 _code = self.delete_control_space(field_list[1])
921 _children = self.delete_control_space(field_list[2]) 939 _children = self.delete_control_space(field_list[2])
922 # _____Code_____ 940 # _____Code_____
923 # "#" and "##" characters at the end of the code are erased 941 # "#" and "##" characters at the end of the code are erased
924 # invalid characters are also erased 942 # invalid characters are also erased
925 _code = self.validateCode(_code) 943 _code = self.validateCode(_code)
926 # _____children_____ 944 # _____children_____
927 # TODO: test the number of decimals in factor an yield values 945 # TODO: test the number of decimals in factor an yield values
928 _children = _children.split( "\\" ) 946 _children = _children.split(u"\\")
929 _children_list = [ ] 947 _children_list = [ ]
930 _child_index = 0 948 _child_index = 0
931 while _child_index < len(_children)-3: 949 while _child_index < len(_children)-3:
932 # _____subfields_____ 950 # _____subfields_____
933 _child_code = _children[_child_index] 951 _child_code = _children[_child_index]
934 _factor = _children[_child_index+1] 952 _factor = _children[_child_index+1]
935 _yield = _children[_child_index+2] 953 _yield = _children[_child_index+2]
936 # _____child_code_____ 954 # _____child_code_____
937 _child_code = self.validateCode(_child_code) 955 _child_code = self.validateCode(_child_code)
938 # _____factor_____ 956 # _____factor_____
939 if _factor != "": 957 if _factor != u"":
940 try: 958 try:
941 _factor = float(_factor) 959 _factor = float(_factor)
942 except ValueError: 960 except ValueError:
943 print utils.mapping(_("ValueError loadig the "\ 961 print utils.mapping(_("ValueError loadig the "\
944 "descomposition of the record $1, the factor "\ 962 "descomposition of the record $1, the factor "\
945 "of the child $2 must be a float number and "\ 963 "of the child $2 must be a float number and "\
946 "can not be $3, seted default value 1.0"), 964 "can not be $3, seted default value 1.0"),
947 (_code, _child_code, _factor)) 965 (_code.encode("utf8"), _child_code.encode("utf8"), _factor.encode("utf8")))
948 _factor = 1.0 966 _factor = 1.0
949 #____yield___ 967 #____yield___
950 if _yield != "": 968 if _yield != u"":
951 try: 969 try:
952 _yield = float(_yield) 970 _yield = float(_yield)
953 except ValueError: 971 except ValueError:
954 print utils.mapping(_("ValueError loading the "\ 972 print utils.mapping(_("ValueError loading the "\
955 "descomposition of the record $1, the yield of "\ 973 "descomposition of the record $1, the yield of "\
956 "the child $2, must be a float number and can"\ 974 "the child $2, must be a float number and can"\
957 "not be $3, seted default value 1.0"), 975 "not be $3, seted default value 1.0"),
958 (_code, _child_code, _factor)) 976 (_code.encode("utf8"), _child_code.encode("utf8"), _factor.encode("utf8")))
959 _yield = 1.0 977 _yield = 1.0
960 if _child_code != "" and _code != "": 978 if _child_code != u"" and _code != u"":
961 _children_list.append([_child_code, _factor, _yield ]) 979 _children_list.append([_child_code, _factor, _yield ])
962 if _record_type == "D": 980 if _record_type == u"D":
963 _position = _child_index / 3 981 _position = _child_index / 3
964 else: #_record_type == "Y" 982 else: #_record_type == "Y"
965 _position = -1 983 _position = -1
966 self.__budget.setTree(_code, _child_code, _position, _factor, 984 self.__budget.setTree(_code.encode("utf8"), _child_code.encode("utf8"), _position, _factor,
967 _yield, "", "", "", "") 985 _yield, "", "", "", "")
968 _child_index = _child_index + 3 986 _child_index = _child_index + 3
969 self.num_valid_record = self.num_valid_record +1 987 self.num_valid_record = self.num_valid_record +1
970 988
971 def _parseT(self, field_list): 989 def _parseT(self, field_list):
991 # _____Code_____ 1009 # _____Code_____
992 # "#" and "##" characters at the end of the code are erased 1010 # "#" and "##" characters at the end of the code are erased
993 # invalid characters are also erased 1011 # invalid characters are also erased
994 _code = self.validateCode(_code) 1012 _code = self.validateCode(_code)
995 # _____Text_____ 1013 # _____Text_____
996 self.__budget.setText(_code, _text) 1014 self.__budget.setText(_code.encode("utf8"), _text.encode("utf8"))
997 self.num_valid_record = self.num_valid_record + 1 1015 self.num_valid_record = self.num_valid_record + 1
998 1016
999 def _parseMN(self, field_list): 1017 def _parseMN(self, field_list):
1000 """_parseMN(self, field_list) 1018 """_parseMN(self, field_list)
1001 1019
1005 2- {Path\} 1023 2- {Path\}
1006 3- TOTAL MEASURE 1024 3- TOTAL MEASURE
1007 4- {Type\Comment\Unit\Length\Width\Height\} 1025 4- {Type\Comment\Unit\Length\Width\Height\}
1008 5- [Label] 1026 5- [Label]
1009 """ 1027 """
1010
1011 # _____Number of fields_____ 1028 # _____Number of fields_____
1012 # Any INFORMATION after last field separator is ignored 1029 # Any INFORMATION after last field separator is ignored
1013 # The record must have 6 fields 1030 # The record must have 6 fields
1014 if len(field_list) > 6: 1031 if len(field_list) > 6:
1015 field_list = field_list[:6] 1032 field_list = field_list[:6]
1016 # If there are no sufficient fields, the fields are added 1033 # If there are no sufficient fields, the fields are added
1017 # with empty value:"" 1034 # with empty value:""
1018 else: 1035 else:
1019 field_list = field_list + [""]*(6-len(field_list)) 1036 field_list = field_list + [u""]*(6-len(field_list))
1020 # control character are erased: end of line, tab, space 1037 # control character are erased: end of line, tab, space
1021 # _____Fields_____ 1038 # _____Fields_____
1022 _record_type = field_list[0] 1039 _record_type = field_list[0]
1023 _codes = self.delete_control_space(field_list[1]) 1040 _codes = self.delete_control_space(field_list[1])
1024 _path = self.delete_control_space(field_list[2]) 1041 _path = self.delete_control_space(field_list[2])
1025 _total = self.delete_control_space(field_list[3]) 1042 _total = self.delete_control_space(field_list[3])
1026 _lines = self.delete_control(field_list[4]) 1043 _lines = self.delete_control(field_list[4])
1027 _label = self.delete_control_space(field_list[5]) 1044 _label = self.delete_control_space(field_list[5])
1028 # _____Codes_____ 1045 # _____Codes_____
1029 _code_list = _codes.split( "\\" ) 1046 _code_list = _codes.split(u"\\")
1030 # "#" and "##" characters at the end of the code are erased 1047 # "#" and "##" characters at the end of the code are erased
1031 # invalid characters are also erased 1048 # invalid characters are also erased
1032 if len(_code_list) == 2: 1049 if len(_code_list) == 2:
1033 _parent_code = self.validateCode(_code_list[0]) 1050 _parent_code = self.validateCode(_code_list[0])
1034 if _parent_code == "": 1051 if _parent_code == u"":
1035 _parent_code = None 1052 _parent_code = None
1053 else:
1054 _parent_code = _parent_code.encode("utf8")
1036 _child_code = self.validateCode(_code_list[1]) 1055 _child_code = self.validateCode(_code_list[1])
1037 elif len(_code_list) == 1: 1056 elif len(_code_list) == 1:
1038 _child_code = self.validateCode(_code_list[0]) 1057 _child_code = self.validateCode(_code_list[0])
1039 _parent_code = None 1058 _parent_code = None
1040 else: 1059 else:
1041 print utils.mapping(_("Invalid codes in $1 record, codes $2"), 1060 print utils.mapping(_("Invalid codes in $1 record, codes $2"),
1042 (_record_type, _codes)) 1061 (_record_type.encode("utf8"), _codes.encode("utf8")))
1043 return 1062 return
1044 if _child_code == "": 1063 if _child_code == u"":
1045 print utils.mapping(_("Empty child code in $1 record, codes: "\ 1064 print utils.mapping(_("Empty child code in $1 record, codes: "\
1046 "$2"), (_record_type, _codes)) 1065 "$2"), (_record_type.encode("utf8"), _codes.encode("utf8")))
1047 return 1066 return
1067 if _parent_code == None:
1068 # Empty parent code. No-estructured measures.
1069 pass
1070
1048 # _____Path_____ 1071 # _____Path_____
1049 # TODO: path=0, no-estructured measures 1072 _path_list = _path.split( u"\\" )
1050 _path_list = _path.split( "\\" )
1051 if len(_path_list) > 0: 1073 if len(_path_list) > 0:
1052 while _path_list[-1] == "": 1074 while len(_path_list) > 0 and _path_list[-1] == u"":
1053 _path_list = _path_list[:-1] 1075 _path_list = _path_list[:-1]
1054 _path = _path_list[-1] 1076 if len(_path_list) == 0:
1077 # Empty path. No-estructured measures. Path fixed to -2
1078 _path = -2
1079 else:
1080 _path = _path_list[-1]
1055 try: 1081 try:
1056 _path = int(_path) 1082 _path = int(_path)
1057 except ValueError: 1083 except ValueError:
1058 print utils.mapping(_("Invalid path in $1 record, "\ 1084 print utils.mapping(_("Invalid path in $1 record, "\
1059 "codes $2"), (_record_type, _codes)) 1085 "codes $2"), (_record_type.encode("utf8"), _codes.encode("utf8")))
1060 return 1086 return
1061 if _path > 0: 1087 if _path > 0:
1062 _path -= 1 1088 _path -= 1
1063 else: 1089 else:
1064 _path = 0 1090 _path = -2
1065 # _____Total_____ 1091 # _____Total_____
1066 try: 1092 try:
1067 _total = float(_total) 1093 _total = float(_total)
1068 except ValueError: 1094 except ValueError:
1069 print utils.mapping(_("Invalid Total Measure value in $1 "\ 1095 print utils.mapping(_("Invalid Total Measure value in $1 "\
1070 "record, codes $2"), (_record_type, _codes)) 1096 "record, codes $2. Total fixed to 0."),
1071 return 1097 (_record_type.encode("utf8"), _codes.encode("utf8")))
1098 _total = 0
1072 # _____Measure lines_____ 1099 # _____Measure lines_____
1073 _lines = _lines.split( "\\" ) 1100 _lines = _lines.split(u"\\")
1074 _line_index = 0 1101 _line_index = 0
1075 _line_list = [ ] 1102 _line_list = [ ]
1076 while _line_index < len(_lines)-6: 1103 while _line_index < len(_lines)-6:
1077 _linetype = _lines[_line_index] 1104 _linetype = _lines[_line_index]
1078 if _linetype == "": 1105 if _linetype == u"":
1079 _linetype = 0 1106 _linetype = 0
1080 elif _linetype == "1" or _linetype == "2" or \ 1107 elif _linetype == u"1" or _linetype == u"2" or \
1081 _linetype == "3": 1108 _linetype == u"3":
1082 _linetype = int(_linetype) 1109 _linetype = int(_linetype)
1083 else: 1110 else:
1084 _linetype = 0 1111 _linetype = 0
1085 _comment= _lines[_line_index + 1] 1112 _comment= _lines[_line_index + 1]
1086 if _linetype == 3: 1113 if _linetype == 3:
1087 # "formula": ".*[^0123456789\.()\+\-\*/\^abcdp ].*" 1114 # "formula": ".*[^0123456789\.()\+\-\*/\^abcdp ].*"
1088 if self.__pattern["formula"].match(_comment): 1115 if self.__pattern["formula"].match(_comment):
1089 print utils.mapping(_("The comment is not a formula or "\ 1116 print utils.mapping(_("The comment is not a formula or "\
1090 "its have invalid characters, in the $1 record, "\ 1117 "its have invalid characters, in the $1 record, "\
1091 "codes $2"), (_record_type, _codes)) 1118 "codes $2"), (_record_type.encode("utf8"), _codes.encode("utf8")))
1092 return 1119 return
1093 else: 1120 else:
1094 _formula = _comment 1121 _formula = _comment.encode("utf8")
1095 _comment = "" 1122 _comment = ""
1096 else: 1123 else:
1097 _formula = "" 1124 _formula = ""
1125 _comment = _comment.encode("utf8")
1098 _units = _lines[_line_index + 2] 1126 _units = _lines[_line_index + 2]
1127 _units = self.__pattern["no_float"].sub(u"", _units)
1099 _length = _lines[_line_index + 3] 1128 _length = _lines[_line_index + 3]
1129 _length = self.__pattern["no_float"].sub(u"", _length)
1100 _width = _lines[_line_index + 4] 1130 _width = _lines[_line_index + 4]
1131 _width = self.__pattern["no_float"].sub(u"", _width)
1101 _height = _lines[_line_index + 5] 1132 _height = _lines[_line_index + 5]
1133 _height = self.__pattern["no_float"].sub(u"", _height)
1134
1102 try: 1135 try:
1103 if _units != "": _units = float(_units) 1136 if _units != u"":
1104 if _length != "": _length = float(_length) 1137 _units = float(_units)
1105 if _width != "": _width = float(_width) 1138 if _length != u"": _length = float(_length)
1106 if _height != "": _height = float(_height) 1139 if _width != u"": _width = float(_width)
1140 if _height != u"": _height = float(_height)
1107 except ValueError: 1141 except ValueError:
1108 print utils.mapping("The measure values are not float "\ 1142 print utils.mapping(_("The measure values are not float "\
1109 "numbers, code $1", (_codes,)) 1143 "numbers, code $1"), (_codes.encode("utf8"),))
1110 return 1144 return
1111 _line_list.append([_linetype, _comment, _units, 1145 _line_list.append([_linetype, _comment, _units,
1112 _length, _width, _height, _formula]) 1146 _length, _width, _height, _formula])
1113 _line_index = _line_index + 6 1147 _line_index = _line_index + 6
1114 self.__budget.setTree(_parent_code, _child_code, _path, "", "", 1148 self.__budget.setTree(_parent_code, _child_code.encode("utf8"), _path, "", "",
1115 _total, _line_list, _label, _record_type) 1149 _total, _line_list, _label.encode("utf8"), _record_type.encode("utf8"))
1116 self.num_valid_record = self.num_valid_record + 1 1150 self.num_valid_record = self.num_valid_record + 1
1117 1151
1118 def _parseW(self, field_list): 1152 def _parseW(self, field_list):
1119 """_parseW(self, field_list) 1153 """_parseW(self, field_list)
1120 1154
1132 return 1166 return
1133 # control character are erased: end of line, tab, space 1167 # control character are erased: end of line, tab, space
1134 # _____Fields_____ 1168 # _____Fields_____
1135 _code_fields = field_list[0] 1169 _code_fields = field_list[0]
1136 # last \ is erased 1170 # last \ is erased
1137 if len(_code_fields) and _code_fields[-1] == "\\": 1171 if len(_code_fields) and _code_fields[-1] == u"\\":
1138 _code_fields = _code_fields[:-1] 1172 _code_fields = _code_fields[:-1]
1139 _code_fields = _code_fields.split("\\") 1173 _code_fields = _code_fields.split(u"\\")
1140 _field_dict = {} 1174 _field_dict = {}
1141 _field_index = 0 1175 _field_index = 0
1142 while _field_index < len(_code_fields)-1: 1176 while _field_index < len(_code_fields)-1:
1143 # _____subfields_____ 1177 # _____subfields_____
1144 _field_code = _code_fields[_field_index] 1178 _field_code = _code_fields[_field_index]
1146 # control character are erased: end of line, tab, space 1180 # control character are erased: end of line, tab, space
1147 # _____section_code_____ 1181 # _____section_code_____
1148 #"control": "[\t \n\r]" 1182 #"control": "[\t \n\r]"
1149 _field_code = self.delete_control_space(_field_code) 1183 _field_code = self.delete_control_space(_field_code)
1150 # _____section_title_____ 1184 # _____section_title_____
1151 if _field_code != "": 1185 if _field_code != u"":
1152 _field_dict[_field_code] = _field_title 1186 _field_dict[_field_code.encode("utf8")] = _field_title.encode("utf8")
1153 _field_index = _field_index + 2 1187 _field_index = _field_index + 2
1154 self.__budget.setSheetFields(_field_dict) 1188 self.__budget.setSheetFields(_field_dict)
1155 self.num_valid_record = self.num_valid_record +1 1189 self.num_valid_record = self.num_valid_record +1
1156 1190
1157 def _parseL(self, field_list): 1191 def _parseL(self, field_list):
1171 # _____Number of fields_____ 1205 # _____Number of fields_____
1172 # The record must have at least 3 fields 1206 # The record must have at least 3 fields
1173 if len(field_list) < 3: 1207 if len(field_list) < 3:
1174 return 1208 return
1175 _code = field_list[1] 1209 _code = field_list[1]
1176 if _code == "": 1210 if _code == u"":
1177 # A: Section Titles 1211 # A: Section Titles
1178 # Any INFORMATION after last field separator is ignored 1212 # Any INFORMATION after last field separator is ignored
1179 # The record must have 3 fields 1213 # The record must have 3 fields
1180 if len(field_list) > 3: 1214 if len(field_list) > 3:
1181 field_list = field_list[0:3] 1215 field_list = field_list[0:3]
1182 field_list = field_list[1:3] 1216 field_list = field_list[1:3]
1183 # _____Fields_____ 1217 # _____Fields_____
1184 _section_codes = field_list[1] 1218 _section_codes = field_list[1]
1185 # last \ is erased 1219 # last \ is erased
1186 if len(_section_codes) and _section_codes[-1] == "\\": 1220 if len(_section_codes) and _section_codes[-1] == u"\\":
1187 _section_codes = _section_codes[:-1] 1221 _section_codes = _section_codes[:-1]
1188 _section_codes = _section_codes.split("\\") 1222 _section_codes = _section_codes.split(u"\\")
1189 _section_dict = {} 1223 _section_dict = {}
1190 _section_index = 0 1224 _section_index = 0
1191 while _section_index < len(_section_codes)-1: 1225 while _section_index < len(_section_codes)-1:
1192 # _____subfields_____ 1226 # _____subfields_____
1193 _section_code = _section_codes[_section_index] 1227 _section_code = _section_codes[_section_index]
1196 # control character are erased: end of line, tab, space 1230 # control character are erased: end of line, tab, space
1197 # _____section_code_____ 1231 # _____section_code_____
1198 _section_code = self.delete_control_space(_section_code) 1232 _section_code = self.delete_control_space(_section_code)
1199 # _____section_title_____ 1233 # _____section_title_____
1200 _section_title = self.delete_control_space(_section_title) 1234 _section_title = self.delete_control_space(_section_title)
1201 if _section_code != "": 1235 if _section_code != u"":
1202 _section_dict[_section_code] = _section_title 1236 _section_dict[_section_code.encode("utf8")] = _section_title.encode("utf8")
1203 _section_index = _section_index + 2 1237 _section_index = _section_index + 2
1204 self.__budget.setSheetSections(_section_dict) 1238 self.__budget.setSheetSections(_section_dict)
1205 self.num_valid_record = self.num_valid_record +1 1239 self.num_valid_record = self.num_valid_record +1
1206 1240
1207 else: 1241 else:
1215 _record_code = self.delete_control_space(field_list[0]) 1249 _record_code = self.delete_control_space(field_list[0])
1216 # "#" and "##" characters at the end of the code are erased 1250 # "#" and "##" characters at the end of the code are erased
1217 # invalid characters are also erased 1251 # invalid characters are also erased
1218 _record_code = self.validateCode(_record_code) 1252 _record_code = self.validateCode(_record_code)
1219 _scodes_text = field_list[1] 1253 _scodes_text = field_list[1]
1220 if _scodes_text == "": 1254 if _scodes_text == u"":
1221 # TODO: rtf and html files 1255 # TODO: rtf and html files
1222 print "Html and rtf files not implemented in ~L record" 1256 print "Html and rtf files not yet implemented in ~L record"
1223 else: 1257 else:
1224 # _____Section-code_Section-text_____ 1258 # _____Section-code_Section-text_____
1225 # last \ is erased 1259 # last \ is erased
1226 if len(_scodes_text) and _scodes_text[-1] == "\\": 1260 if len(_scodes_text) and _scodes_text[-1] == u"\\":
1227 _scodes_text = _scodes_text[:-1] 1261 _scodes_text = _scodes_text[:-1]
1228 _scodes_text = _scodes_text.split("\\") 1262 _scodes_text = _scodes_text.split(u"\\")
1229 _paragraph_dict = {} 1263 _paragraph_dict = {}
1230 _section_dict = {} 1264 _section_dict = {}
1231 _section_index = 0 1265 _section_index = 0
1232 while _section_index < len(_scodes_text)-1: 1266 while _section_index < len(_scodes_text)-1:
1233 # _____subfields_____ 1267 # _____subfields_____
1235 _section_text = _scodes_text[_section_index+1] 1269 _section_text = _scodes_text[_section_index+1]
1236 # control character are erased: end of line, tab, space 1270 # control character are erased: end of line, tab, space
1237 # _____section_code_____ 1271 # _____section_code_____
1238 _section_code = self.delete_control_space(_section_code) 1272 _section_code = self.delete_control_space(_section_code)
1239 # _____section_text_____ 1273 # _____section_text_____
1240 if _section_code != "" and _section_text != "": 1274 if _section_code != u"" and _section_text != u"":
1241 #-# paragraph #-# 1275 #-# paragraph #-#
1242 _paragraph_code = _record_code + _section_code + "*" 1276 _paragraph_code = _record_code + _section_code + u"*"
1243 _paragraph_dict[ _paragraph_code ] = _section_text 1277 _paragraph_dict[ _paragraph_code.encode("utf8") ] = _section_text.encode("utf8")
1244 _section_dict[_section_code] = _paragraph_code 1278 _section_dict[_section_code.encode("utf8")] = _paragraph_code.encode("utf8")
1245 _section_index = _section_index + 2 1279 _section_index = _section_index + 2
1246 self.__budget.setSheetParagraphs(_paragraph_dict) 1280 self.__budget.setSheetParagraphs(_paragraph_dict)
1247 self.__budget.setSheetRecord(_record_code, "*", _section_dict) 1281 self.__budget.setSheetRecord(_record_code.encode("utf8"), "*", _section_dict)
1248 self.num_valid_record = self.num_valid_record +1 1282 self.num_valid_record = self.num_valid_record +1
1249 1283
1250 def _parseQ(self, field_list): 1284 def _parseQ(self, field_list):
1251 """_parseQ(self, field_list) 1285 """_parseQ(self, field_list)
1252 1286
1271 # "#" and "##" characters at the end of the code are erased 1305 # "#" and "##" characters at the end of the code are erased
1272 # invalid characters are also erased 1306 # invalid characters are also erased
1273 _record_code = self.validateCode(_record_code) 1307 _record_code = self.validateCode(_record_code)
1274 _scodes_pkey = field_list[1] 1308 _scodes_pkey = field_list[1]
1275 # last \ is erased 1309 # last \ is erased
1276 if len(_scodes_pkey) and _scodes_pkey[-1] == "\\": 1310 if len(_scodes_pkey) and _scodes_pkey[-1] == u"\\":
1277 _scodes_pkey = _scodes_pkey[:-1] 1311 _scodes_pkey = _scodes_pkey[:-1]
1278 _scodes_pkey = _scodes_pkey.split("\\") 1312 _scodes_pkey = _scodes_pkey.split(u"\\")
1279 _field_dict = {} 1313 _field_dict = {}
1280 _section_index = 0 1314 _section_index = 0
1281 while _section_index < len(_scodes_pkey) -1: 1315 while _section_index < len(_scodes_pkey) -1:
1282 # _____subfields_____ 1316 # _____subfields_____
1283 _section_code = _scodes_pkey[_section_index] 1317 _section_code = _scodes_pkey[_section_index]
1289 # _____section_text_____ 1323 # _____section_text_____
1290 _paragraph_key = self.delete_control_space(_paragraph_key) 1324 _paragraph_key = self.delete_control_space(_paragraph_key)
1291 # _____Fields keys_____ 1325 # _____Fields keys_____
1292 _field_keys = self.delete_control_space(_field_keys) 1326 _field_keys = self.delete_control_space(_field_keys)
1293 # last ; is erased 1327 # last ; is erased
1294 if len(_field_keys) and _field_keys[-1] == ";": 1328 if len(_field_keys) and _field_keys[-1] == u";":
1295 _field_keys = _field_keys[:-1] 1329 _field_keys = _field_keys[:-1]
1296 _field_keys_list = _scodes_pkey.split(";") 1330 _field_keys_list = _scodes_pkey.split(u";")
1297 for _field_key in _field_keys_list: 1331 for _field_key in _field_keys_list:
1298 if _field_key != "" and _section_code != "" and \ 1332 if _field_key != u"" and _section_code != u"" and \
1299 _paragraph_key != "": 1333 _paragraph_key != u"":
1300 if _field_key in _field_dict: 1334 if _field_key in _field_dict:
1301 _section_dict = _field_dict[_field_key] 1335 _section_dict = _field_dict[_field_key]
1302 else: 1336 else:
1303 _section_dict = {} 1337 _section_dict = {}
1304 _field_dict[_field_key] = _section_dict 1338 _field_dict[_field_key] = _section_dict
1305 _section_dict[_section_code] = _paragraph_code 1339 _section_dict[_section_code.encode("utf8")] = _paragraph_code.encode("utf8")
1306 _section_index = _section_index + 3 1340 _section_index = _section_index + 3
1307 for _field, _section_dict in _field_dict.iteritems(): 1341 for _field, _section_dict in _field_dict.iteritems():
1308 self.__budget.setSheetRecord(_record_code, _field, _section_dict) 1342 self.__budget.setSheetRecord(_record_code.encode("utf8"), _field.encode("utf8"), _section_dict)
1309 self.num_valid_record = self.num_valid_record +1 1343 self.num_valid_record = self.num_valid_record +1
1310 1344
1311 def _parseJ(self, field_list): 1345 def _parseJ(self, field_list):
1312 """_parseJ(self, field_list) 1346 """_parseJ(self, field_list)
1313 1347
1330 # _____Fields_____ 1364 # _____Fields_____
1331 # _____Paragraph code_____ 1365 # _____Paragraph code_____
1332 _paragraph_code = self.delete_control_space(field_list[0]) 1366 _paragraph_code = self.delete_control_space(field_list[0])
1333 # _____Paragraph text_____ 1367 # _____Paragraph text_____
1334 _paragraph_text = field_list[1] 1368 _paragraph_text = field_list[1]
1335 if _paragraph_text == "": 1369 if _paragraph_text == u"":
1336 # TODO: rtf and html files 1370 # TODO: rtf and html files
1337 print "Html and rtf files not implemented in ~J record" 1371 print "Html and rtf files not yet implemented in ~J record"
1338 else: 1372 else:
1339 self.__budget.setSheetParagraph(paragraph_code, paragraph_text) 1373 self.__budget.setSheetParagraph(paragraph_code.encode("utf8"), paragraph_text.encode("utf8"))
1340 self.num_valid_record = self.num_valid_record +1 1374 self.num_valid_record = self.num_valid_record +1
1341 1375
1342 def _parseG(self, field_list): 1376 def _parseG(self, field_list):
1343 """_parseG(self, field_list) 1377 """_parseG(self, field_list)
1344 1378
1364 _record_code = self.validateCode(_record_code) 1398 _record_code = self.validateCode(_record_code)
1365 # _____Grafic files_____ 1399 # _____Grafic files_____
1366 _grafic_files = self.delete_control(field_list[1]) 1400 _grafic_files = self.delete_control(field_list[1])
1367 # _____subfields_____ 1401 # _____subfields_____
1368 # last \ is erased 1402 # last \ is erased
1369 if len(_grafic_files) and _grafic_files[-1] == "\\": 1403 if len(_grafic_files) and _grafic_files[-1] == u"\\":
1370 _grafic_files = _grafic_files[:-1] 1404 _grafic_files = _grafic_files[:-1]
1371 _grafic_file_list = _grafic_files.split("\\") 1405 _grafic_file_list = _grafic_files.split(u"\\")
1372 _tested_grafic_file_list = [] 1406 _tested_grafic_file_list = []
1373 for _grafic_file in _grafic_file_list: 1407 for _grafic_file in _grafic_file_list:
1408 _str_grafic_file = _grafic_file.encode("utf8")
1374 _path = os.path.dirname(self.__filename) 1409 _path = os.path.dirname(self.__filename)
1375 _grafic_file_path = os.path.join(_path, _grafic_file) 1410 _grafic_file_path = os.path.join(_path, _str_grafic_file)
1376 if os.path.exists(_grafic_file_path): 1411 if os.path.exists(_grafic_file_path):
1377 _tested_grafic_file_list.append(_grafic_file_path) 1412 _tested_grafic_file_list.append(_grafic_file_path)
1378 else: 1413 else:
1379 _name_ext = os.path.splitext(_grafic_file) 1414 _name_ext = os.path.splitext(_str_grafic_file)
1380 _grafic_file_name = _name_ext[0] 1415 _grafic_file_name = _name_ext[0]
1381 _grafic_file_ext = _name_ext[1] 1416 _grafic_file_ext = _name_ext[1]
1382 _grafic_file_name_u = _grafic_file_name.upper() 1417 _grafic_file_name_u = _grafic_file_name.upper()
1383 _grafic_file_name_l = _grafic_file_name.lower() 1418 _grafic_file_name_l = _grafic_file_name.lower()
1384 _grafic_file_ext_u = _grafic_file_ext.upper() 1419 _grafic_file_ext_u = _grafic_file_ext.upper()
1402 else: 1437 else:
1403 print utils.mapping(_("The file $1 do not exist"), 1438 print utils.mapping(_("The file $1 do not exist"),
1404 (_grafic_file_path,)) 1439 (_grafic_file_path,))
1405 if len(_grafic_file_list) > 0: 1440 if len(_grafic_file_list) > 0:
1406 for _grafic_file in _tested_grafic_file_list: 1441 for _grafic_file in _tested_grafic_file_list:
1407 self.__budget.addFile(_record_code, _grafic_file, "img", "") 1442 self.__budget.addFile(_record_code.encode("utf8"), _grafic_file, "img", "")
1408 self.num_valid_record = self.num_valid_record +1 1443 self.num_valid_record = self.num_valid_record +1
1409 1444
1410 def _parseE(self, field_list): 1445 def _parseE(self, field_list):
1411 """_parseE(self, field_list) 1446 """_parseE(self, field_list)
1412 1447
1427 if len(field_list) > 6: 1462 if len(field_list) > 6:
1428 field_list = field_list[1:6] 1463 field_list = field_list[1:6]
1429 # If there are no sufficient fields, the fields are added 1464 # If there are no sufficient fields, the fields are added
1430 # with empty value:"" 1465 # with empty value:""
1431 else: 1466 else:
1432 field_list = field_list[1:] + [""]*(6-len(field_list)) 1467 field_list = field_list[1:] + [u""]*(6-len(field_list))
1433 # _____Fields_____ 1468 # _____Fields_____
1434 # _____company Code_____ 1469 # _____company Code_____
1435 _company_code = self.delete_control_space(field_list[0]) 1470 _company_code = self.delete_control_space(field_list[0])
1436 if _company_code == "": 1471 if _company_code == u"":
1437 return 1472 return
1438 # _____Summary_____ 1473 # _____Summary_____
1439 1474
1440 _sumamary = self.delete_control(field_list[1]) 1475 _sumamary = self.delete_control(field_list[1])
1441 # _____Name_____ 1476 # _____Name_____
1442 _name = self.delete_control(field_list[2]) 1477 _name = self.delete_control(field_list[2])
1443 # _____local_offices_____ 1478 # _____local_offices_____
1444 _local_offices = self.delete_control(field_list[3]) 1479 _local_offices = self.delete_control(field_list[3])
1445 # _____subfields of local_offices_____ 1480 # _____subfields of local_offices_____
1446 # last \ is erased 1481 # last \ is erased
1447 if len(_local_offices) and _local_offices[-1] == "\\": 1482 if len(_local_offices) and _local_offices[-1] == u"\\":
1448 _local_offices = _local_offices[:-1] 1483 _local_offices = _local_offices[:-1]
1449 _local_offices_list = _local_offices.split("\\") 1484 _local_offices_list = _local_offices.split(u"\\")
1450 # If there are no sufficent subfields, the subfields are added 1485 # If there are no sufficent subfields, the subfields are added
1451 # whith empty value 1486 # whith empty value
1452 _nsub = len(_local_offices_list) % 10 1487 _nsub = len(_local_offices_list) % 10
1453 if _nsub != 0: 1488 if _nsub != 0:
1454 _local_offices_list = _local_offices_list + \ 1489 _local_offices_list = _local_offices_list + \
1455 [""]*(10-len(field_list)) 1490 [u""]*(10-len(field_list))
1456 _local_offices = [] 1491 _local_offices = []
1457 _local_offices_index = 0 1492 _local_offices_index = 0
1458 while _local_offices_index < len(_local_offices_list)-9: 1493 while _local_offices_index < len(_local_offices_list)-9:
1459 # _____subfields_____ 1494 # _____subfields_____
1460 _type = _local_offices_list[_local_offices_index] 1495 _type = _local_offices_list[_local_offices_index]
1464 _town = _local_offices_list[_local_offices_index+4] 1499 _town = _local_offices_list[_local_offices_index+4]
1465 _province = _local_offices_list[_local_offices_index+5] 1500 _province = _local_offices_list[_local_offices_index+5]
1466 _country = _local_offices_list[_local_offices_index+6] 1501 _country = _local_offices_list[_local_offices_index+6]
1467 _phone = _local_offices_list[_local_offices_index+7] 1502 _phone = _local_offices_list[_local_offices_index+7]
1468 # last ; is erased 1503 # last ; is erased
1469 if len(_phone) and _phone[-1] == ";": 1504 if len(_phone) and _phone[-1] == u";":
1470 _phone = _phone[:-1] 1505 _phone = _phone[:-1]
1471 _phone_list = _phone.split(";") 1506 _phone_list = _phone.split(u";")
1507 _phone_list = [_phone.encode("utf8") for _phone in _phone_list]
1472 _fax = _local_offices_list[_local_offices_index+8] 1508 _fax = _local_offices_list[_local_offices_index+8]
1473 # last ; is erased 1509 # last ; is erased
1474 if len(_fax) and _fax[-1] == ";": 1510 if len(_fax) and _fax[-1] == u";":
1475 _fax = _fax[:-1] 1511 _fax = _fax[:-1]
1476 _fax_list = _fax.split(";") 1512 _fax_list = _fax.split(u";")
1513 _fax_list = [_fax.encode("utf8") for _fax in _fax_list]
1477 _contact_person = _local_offices_list[_local_offices_index+9] 1514 _contact_person = _local_offices_list[_local_offices_index+9]
1478 if _type != "" or _subname != "" or _address != "" or \ 1515 if _type != u"" or _subname != u"" or _address != u"" or \
1479 _postal_code != "" or _town != "" or _province != "" or \ 1516 _postal_code != u"" or _town != u"" or _province != u"" or \
1480 _country != "" or _phone != "" or _fax != "" or \ 1517 _country != u"" or _phone != u"" or _fax != u"" or \
1481 _contact_person != "": 1518 _contact_person != u"":
1482 _local_offices.append([_type, _subname, _address, 1519 _local_offices.append([_type.encode("utf8"), _subname.encode("utf8"),
1483 _postal_code, _town, _province, 1520 _address.encode("utf8"), _postal_code.encode("utf8"),
1484 _country, _phone_list, _fax_list, 1521 _town.encode("utf8"), _province.encode("utf8"),
1485 _contact_person]) 1522 _country.encode("utf8"), _phone_list,
1523 _fax_list, _contact_person.encode("utf8")])
1486 _local_offices_index = _local_offices_index + 10 1524 _local_offices_index = _local_offices_index + 10
1487 # _____cif web email_____ 1525 # _____cif web email_____
1488 _c_w_e = self.delete_control_space(field_list[4]) 1526 _c_w_e = self.delete_control_space(field_list[4])
1489 # last \ is erased 1527 # last \ is erased
1490 if len(_c_w_e) and _c_w_e[-1] == "\\": 1528 if len(_c_w_e) and _c_w_e[-1] == u"\\":
1491 _c_w_e = _c_w_e[:-1] 1529 _c_w_e = _c_w_e[:-1]
1492 _c_w_e_list = _c_w_e.split("\\") 1530 _c_w_e_list = _c_w_e.split(u"\\")
1493 # _____subfields_____ 1531 # _____subfields_____
1494 # If there are no sufficient fields, the fields are added 1532 # If there are no sufficient fields, the fields are added
1495 # with empty value:"" 1533 # with empty value:""
1496 _c_w_e_list = _c_w_e_list + [""]*(3-len(_c_w_e_list)) 1534 _c_w_e_list = _c_w_e_list + [u""]*(3-len(_c_w_e_list))
1497 _cif = _c_w_e_list[0] 1535 _cif = _c_w_e_list[0]
1498 _web = _c_w_e_list[1] 1536 _web = _c_w_e_list[1]
1499 _email = _c_w_e_list[2] 1537 _email = _c_w_e_list[2]
1500 self.__budget.setCompany(_company_code, _sumamary, _name, 1538 self.__budget.setCompany(_company_code.encode("utf8"),
1501 _local_offices, _cif, _web, _email) 1539 _sumamary.encode("utf8"), _name.encode("utf8"),
1540 _local_offices, _cif.encode("utf8"),
1541 _web.encode("utf8"), _email.encode("utf8"))
1502 self.num_valid_record = self.num_valid_record +1 1542 self.num_valid_record = self.num_valid_record +1
1503 1543
1504 def _parseX(self, field_list): 1544 def _parseX(self, field_list):
1505 """_parseX(self, field_list) 1545 """_parseX(self, field_list)
1506 1546
1525 field_list = field_list[1:] 1565 field_list = field_list[1:]
1526 # _____Fields_____ 1566 # _____Fields_____
1527 # "control": "[\t \n\r]" 1567 # "control": "[\t \n\r]"
1528 _field_1 = self.delete_control_space(field_list[0]) 1568 _field_1 = self.delete_control_space(field_list[0])
1529 _field_2 = self.delete_control_space(field_list[1]) 1569 _field_2 = self.delete_control_space(field_list[1])
1530 if _field_1 == "": 1570 if _field_1 == u"":
1531 # A) 1571 # A)
1532 _field_2_list = _field_2.split("\\") 1572 _field_2_list = _field_2.split(u"\\")
1533 _ti_index = 0 1573 _ti_index = 0
1534 while _ti_index < len(_field_2_list)-3: 1574 while _ti_index < len(_field_2_list)-3:
1535 _ti_code = _field_2_list[_ti_index] 1575 _ti_code = _field_2_list[_ti_index]
1536 _ti_description = _field_2_list[_ti_index+1] 1576 _ti_description = _field_2_list[_ti_index+1]
1537 _ti_unit = _field_2_list[_ti_index+2] 1577 _ti_unit = _field_2_list[_ti_index+2]
1538 if _ti_code != "": 1578 if _ti_code != "":
1539 self.__budget.addTecInfo(_ti_code, _ti_description, 1579 self.__budget.addTecInfo(_ti_code.encode("utf8"), _ti_description.encode("utf8"),
1540 _ti_unit) 1580 _ti_unit.encode("utf8"))
1541 _ti_index = _ti_index + 3 1581 _ti_index = _ti_index + 3
1542 else: 1582 else:
1543 # B) 1583 # B)
1544 # "#" and "##" characters at the end of the code are erased 1584 # "#" and "##" characters at the end of the code are erased
1545 # invalid characters are also erased 1585 # invalid characters are also erased
1546 _record_code = self.validateCode(_field_1) 1586 _record_code = self.validateCode(_field_1)
1547 _field_2_list = _field_2.split("\\") 1587 _field_2_list = _field_2.split(u"\\")
1548 _ti_index = 0 1588 _ti_index = 0
1549 _ti_dict = {} 1589 _ti_dict = {}
1550 while _ti_index < len(_field_2_list)-2: 1590 while _ti_index < len(_field_2_list)-2:
1551 _ti_code = _field_2_list[_ti_index] 1591 _ti_code = _field_2_list[_ti_index]
1552 _ti_value = _field_2_list[_ti_index+1] 1592 _ti_value = _field_2_list[_ti_index+1]
1553 if _ti_code != "" and _ty_value != "": 1593 if _ti_code != u"" and _ty_value != u"":
1554 _ti_dict[_ti_code] = _ty_value 1594 _ti_dict[_ti_code.encode("utf8")] = _ty_value.encode("utf8")
1555 _ti_index = _ti_index + 2 1595 _ti_index = _ti_index + 2
1556 self.__budget.setTecnicalInformation(_record_code, _ti_dict) 1596 self.__budget.setTecnicalInformation(_record_code.encode("utf8"), _ti_dict)
1557 self.num_valid_record = self.num_valid_record +1 1597 self.num_valid_record = self.num_valid_record +1
1558 1598
1559 def _parseF(self, field_list): 1599 def _parseF(self, field_list):
1560 """_parseF(self, field_list) 1600 """_parseF(self, field_list)
1561 1601
1582 _record_code = self.validateCode(_record_code) 1622 _record_code = self.validateCode(_record_code)
1583 # _____Grafic files_____ 1623 # _____Grafic files_____
1584 _files = self.delete_control(field_list[1]) 1624 _files = self.delete_control(field_list[1])
1585 # _____subfields_____ 1625 # _____subfields_____
1586 # last \ is erased 1626 # last \ is erased
1587 if len(_files) and _files[-1] == "\\": 1627 if len(_files) and _files[-1] == u"\\":
1588 _files = _files[:-1] 1628 _files = _files[:-1]
1589 _files_list = _files.split("\\") 1629 _files_list = _files.split(u"\\")
1590 # adding empty subfiels if necesary 1630 # adding empty subfiels if necesary
1591 if len(_files_list)%3 > 0: 1631 if len(_files_list)%3 > 0:
1592 _files_list.extend[""]*(3 - len(_files_list)%3) 1632 _files_list.extend[u""]*(3 - len(_files_list)%3)
1593 _file_index = 0 1633 _file_index = 0
1594 _tested_files_list = [] 1634 _tested_files_list = []
1595 while _file_index < len(_files_list)-3: 1635 while _file_index < len(_files_list)-3:
1596 _type = _files_list[_file_index].replace(" ","") 1636 _type = _files_list[_file_index].replace(u" ",u"")
1597 ## _types = { 1637 ## _types = {
1598 ## "0": _("others"), 1638 ## "0": _("others"),
1599 ## "1": _("características técnicas y de fabricación"), 1639 ## "1": _("características técnicas y de fabricación"),
1600 ## "2": _("manual de colocación, uso y mantenimiento"), 1640 ## "2": _("manual de colocación, uso y mantenimiento"),
1601 ## "3": _("certificado/s de elementos y sistemas"), 1641 ## "3": _("certificado/s de elementos y sistemas"),
1607 ## "9": _("cálculo de elementos y sistemas"), 1647 ## "9": _("cálculo de elementos y sistemas"),
1608 ## "10": _("presentación, datos generales, objetivos, etc. de "\ 1648 ## "10": _("presentación, datos generales, objetivos, etc. de "\
1609 ## "empresa"), 1649 ## "empresa"),
1610 ## "11": _("certificado/s de empresa"), 1650 ## "11": _("certificado/s de empresa"),
1611 ## "12": _("obras realizadas")} 1651 ## "12": _("obras realizadas")}
1612 _types = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", 1652 _types = [u"0", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"10",
1613 "11", "12"] 1653 u"11", u"12"]
1614 if not _type in _types: 1654 if not _type in _types:
1615 _type = "0" 1655 _type = u"0"
1616 _filenames = _files_list[_file_index + 1] 1656 _filenames = _files_list[_file_index + 1]
1617 _description = _files_list[_file_index + 2] 1657 _description = _files_list[_file_index + 2]
1618 _file_index += 3 1658 _file_index += 3
1619 if len(_filenames) and _filenames[-1] == ";": 1659 if len(_filenames) and _filenames[-1] == u";":
1620 _files = _files[:-1] 1660 _files = _files[:-1]
1621 _filenames_list = _files.split(";") 1661 _filenames_list = _files.split(u";")
1622 _path = os.path.dirname(self.__filename) 1662 _path = os.path.dirname(self.__filename)
1623 for _filename in filenames_list: 1663 for _filename in filenames_list:
1624 _file_path = os.path.join(_path, _filename) 1664 _file_path = os.path.join(_path, _filename.encode("utf8"))
1625 if os.path.exists(_file_path): 1665 if os.path.exists(_file_path):
1626 _tested_files_list.append([_file_path, _type, 1666 _tested_files_list.append([_file_path, _type.encode("utf8"),
1627 _description]) 1667 _description.encode("utf8")])
1628 else: 1668 else:
1629 _name_ext = os.path.splitext(_filename) 1669 _name_ext = os.path.splitext(_filename)
1630 _file_name = _name_ext[0] 1670 _file_name = _name_ext[0]
1631 _file_ext = _name_ext[1] 1671 _file_ext = _name_ext[1]
1632 _file_name_u = _file_name.upper() 1672 _file_name_u = _file_name.upper()
1640 _file_path_uu = os.path.join(_path, _uu) 1680 _file_path_uu = os.path.join(_path, _uu)
1641 _file_path_ul = os.path.join(_path, _ul) 1681 _file_path_ul = os.path.join(_path, _ul)
1642 _file_path_lu = os.path.join(_path, _lu) 1682 _file_path_lu = os.path.join(_path, _lu)
1643 _file_path_ll = os.path.join(_path, _ll) 1683 _file_path_ll = os.path.join(_path, _ll)
1644 if os.path.exists(_file_path_uu): 1684 if os.path.exists(_file_path_uu):
1645 _tested_files_list.append([_file_path_uu, _type, 1685 _tested_files_list.append([_file_path_uu, _type.encode("utf8"),
1646 _description]) 1686 _description.encode("utf8")])
1647 elif os.path.exists(_grafic_file_path_ul): 1687 elif os.path.exists(_grafic_file_path_ul):
1648 _tested_files_list.append([_file_path_ul, _type, 1688 _tested_files_list.append([_file_path_ul, _type.encode("utf8"),
1649 _description]) 1689 _description.encode("utf8")])
1650 elif os.path.exists(_grafic_file_path_lu): 1690 elif os.path.exists(_grafic_file_path_lu):
1651 _tested_files_list.append([_file_path_lu, _type, 1691 _tested_files_list.append([_file_path_lu, _type.encode("utf8"),
1652 _description]) 1692 _description.encode("utf8")])
1653 elif os.path.exists(_grafic_file_path_ll): 1693 elif os.path.exists(_grafic_file_path_ll):
1654 _tested_files_list.append([_file_path_ll, _type, 1694 _tested_files_list.append([_file_path_ll, _type.encode("utf8"),
1655 _description]) 1695 _description.encode("utf8")])
1656 else: 1696 else:
1657 print utils.mapping(_("The file $1 do not exist"), 1697 print utils.mapping(_("The file $1 do not exist"),
1658 (_file_path,)) 1698 (_file_path,))
1659 if len(_tested_files_list) > 0: 1699 if len(_tested_files_list) > 0:
1660 for _file in _tested_file_list: 1700 for _file in _tested_file_list:
1661 self.__budget.addFile(_record_code, _file[0], file[1], file[2]) 1701 self.__budget.addFile(_record_code.encode("utf8"), _file[0], file[1], file[2])
1662 self.num_valid_record = self.num_valid_record +1 1702 self.num_valid_record = self.num_valid_record +1
1663 1703
1664 def _parseB(self, field_list): 1704 def _parseB(self, field_list):
1665 """_parseB(self, field_list) 1705 """_parseB(self, field_list)
1666 1706
1716 # invalid characters are also erased 1756 # invalid characters are also erased
1717 _code = self.validateCode(_code) 1757 _code = self.validateCode(_code)
1718 # _____Labels_____ 1758 # _____Labels_____
1719 # last \ is erased 1759 # last \ is erased
1720 # TODO: change the others parsers to this: 1760 # TODO: change the others parsers to this:
1721 while len(_labels) > 0 and _labels[-1] == "\\": 1761 while len(_labels) > 0 and _labels[-1] == u"\\":
1722 _labels = _labels[:-1] 1762 _labels = _labels[:-1]
1723 # replace "_" to " " 1763 # replace "_" to " "
1724 _labels = _labels.replace("_"," ") 1764 _labels = _labels.replace(u"_",u" ")
1725 _label_list = _labels.split("\\") 1765 _label_list = _labels.split(u"\\")
1726 for _label in _label_list: 1766 for _label in _label_list:
1727 self.__budget.addLabel(_code, _label) 1767 self.__budget.addLabel(_code.encode("utf8"), _label.encode("utf8"))
1728 self.num_valid_record = self.num_valid_record + 1 1768 self.num_valid_record = self.num_valid_record + 1
1729 1769
1730 def _parseP(self, field_list): 1770 def _parseP(self, field_list):
1731 """_parseP(self, field_list) 1771 """_parseP(self, field_list)
1732 1772
1743 """ 1783 """
1744 # TODO: Use global parametric record 1784 # TODO: Use global parametric record
1745 if len(field_list) > 2: 1785 if len(field_list) > 2:
1746 # delete control caracters and spaces 1786 # delete control caracters and spaces
1747 _family_code = self.delete_control_space(field_list[1]) 1787 _family_code = self.delete_control_space(field_list[1])
1748 if _family_code == "": # A)Global paremetric record 1788 if _family_code == u"": # A)Global paremetric record
1749 # The record must have 3 or 4 fields 1789 # The record must have 3 or 4 fields
1750 if len(field_list) > 4: 1790 if len(field_list) > 4:
1751 field_list = field_list[0:4] 1791 field_list = field_list[0:4]
1752 field_list = field_list[1:] 1792 field_list = field_list[1:]
1753 if len(field_list) == 2: 1793 if len(field_list) == 2:
1754 field_list.append("") 1794 field_list.append(u"")
1755 if len(field_list) != 3: 1795 if len(field_list) != 3:
1756 return 1796 return
1757 else: # B)Family Parametric record 1797 else: # B)Family Parametric record
1758 # The record must have 3 fields 1798 # The record must have 3 fields
1759 if len(field_list) > 3: 1799 if len(field_list) > 3:
1764 return 1804 return
1765 else: 1805 else:
1766 return 1806 return
1767 # _____Description_____ 1807 # _____Description_____
1768 _description = field_list[1] 1808 _description = field_list[1]
1769 if _description == "": 1809 if _description == u"":
1770 print _("PyArq hates parametric DLLs") 1810 print _("PyArq hates parametric DLLs")
1771 return 1811 return
1772 # Adding last end of line 1812 # Adding last end of line
1773 _description = _description + "\r\n" 1813 _description = _description + u"\r\n"
1774 # Delete comments 1814 # Delete comments
1775 # "comment" : "#.*\r\n" 1815 # "comment" : "#.*\r\n"
1776 _description = self.__pattern["comment"].sub("\r\n",_description) 1816 _description = self.__pattern["comment"].sub(u"\r\n",_description)
1777 # Tabs to spaces 1817 # Tabs to spaces
1778 _description = _description.replace("\t"," ") 1818 _description = _description.replace(u"\t",u" ")
1779 # Delete empty lines 1819 # Delete empty lines
1780 # "empty_line": r"(\r\n) *\r\n" 1820 # "empty_line": r"(\r\n) *\r\n"
1781 while self.__pattern["empty_line"].search(_description): 1821 while self.__pattern["empty_line"].search(_description):
1782 _description = self.__pattern["empty_line"].sub( 1822 _description = self.__pattern["empty_line"].sub(
1783 lambda x: x.groups()[0], _description) 1823 lambda x: x.groups()[0], _description)
1784 # Delete spaces before and after / 1824 # Delete spaces before and after /
1785 # "space_before_backslash" : r"( )+\\" 1825 # "space_before_backslash" : r"( )+\\"
1786 _description = self.__pattern["space_before_backslash"].sub( 1826 _description = self.__pattern["space_before_backslash"].sub(
1787 r"\\",_description) 1827 ur"\\",_description)
1788 # "space_after_backslash" : r"\\( )+" 1828 # "space_after_backslash" : r"\\( )+"
1789 _description = self.__pattern["space_after_backslash"].sub( 1829 _description = self.__pattern["space_after_backslash"].sub(
1790 r"\\",_description) 1830 ur"\\",_description)
1791 # Join lines that start but not end with / 1831 # Join lines that start but not end with /
1792 _description = "\r\n" + _description # add leading end of line 1832 _description = u"\r\n" + _description # add leading end of line
1793 # "start_noend_backslash": "(\r\n\\\.*[^\\\])\r\n" 1833 # "start_noend_backslash": "(\r\n\\\.*[^\\\])\r\n"
1794 while self.__pattern["start_noend_backslash"].search(_description): 1834 while self.__pattern["start_noend_backslash"].search(_description):
1795 _description = self.__pattern["start_noend_backslash"].sub( 1835 _description = self.__pattern["start_noend_backslash"].sub(
1796 lambda x: x.groups()[0], _description) 1836 lambda x: x.groups()[0], _description)
1797 # Join lines that end with a + - * / ^ and @ & < > <= >= = <> ! 1837 # Join lines that end with a + - * / ^ and @ & < > <= >= = <> !
1803 while self.__pattern["matricial_var"].search(_description): 1843 while self.__pattern["matricial_var"].search(_description):
1804 _description = self.__pattern["matricial_var"].sub( 1844 _description = self.__pattern["matricial_var"].sub(
1805 lambda x: x.groups()[0], _description) 1845 lambda x: x.groups()[0], _description)
1806 _description = _description[2:] # remove leading end of line 1846 _description = _description[2:] # remove leading end of line
1807 #_description = re.sub(r"\\( )+",r"\\",_description) 1847 #_description = re.sub(r"\\( )+",r"\\",_description)
1808 _lines = _description.split("\r\n") 1848 _lines = _description.split(u"\r\n")
1809 _final_description = "" 1849 _final_description = u""
1810 _pass_line = 0 1850 _pass_line = 0
1811 for index in range(len(_lines)): 1851 for index in range(len(_lines)):
1812 _line = _lines[index] 1852 _line = _lines[index]
1813 # Parse lines 1853 # Parse lines
1814 if len(_line) != 0: # Delete empty lines 1854 if len(_line) != 0: # Delete empty lines
1815 if _pass_line > 0: 1855 if _pass_line > 0:
1816 _pass_line = _pass_line -1 1856 _pass_line = _pass_line -1
1817 _line = "" 1857 _line = u""
1818 elif _line.isspace(): 1858 elif _line.isspace():
1819 _line = "" 1859 _line = u""
1820 elif _line[0] != "\\": 1860 elif _line[0] != u"\\":
1821 # Delete spaces out "" delimiter 1861 # Delete spaces out "" delimiter
1822 _list = _line.split('"') 1862 _list = _line.split(u'"')
1823 _final_line = "" 1863 _final_line = u""
1824 for index1 in range(len(_list)): 1864 for index1 in range(len(_list)):
1825 if index1 % 2 != 0: 1865 if index1 % 2 != 0:
1826 _parcial_line = '"' + _list[index1] 1866 _parcial_line = u'"' + _list[index1]
1827 else: 1867 else:
1828 _parcial_line = '"' + _list[index1].replace(" ","") 1868 _parcial_line = u'"' + _list[index1].replace(u" ",u"")
1829 _final_line = _final_line + _parcial_line 1869 _final_line = _final_line + _parcial_line
1830 _line = _final_line[1:] 1870 _line = _final_line[1:]
1831 _lines[index] = _line 1871 _lines[index] = _line
1832 # parse data 1872 # parse data
1833 if len(_line) > 2 and _line[:2] == "::": 1873 if len(_line) > 2 and _line[:2] == u"::":
1834 # Delete spaces out " delimiter 1874 # Delete spaces out " delimiter
1835 #print "__PRECIO__" + _line[2:] 1875 #print "__PRECIO__" + _line[2:]
1836 pass 1876 pass
1837 elif len(_line) > 2 and _line[:2] == "%:": 1877 elif len(_line) > 2 and _line[:2] == u"%:":
1838 # Delete spaces out " delimiter 1878 # Delete spaces out " delimiter
1839 #print "__%AUX__" + _line[2:] 1879 #print "__%AUX__" + _line[2:]
1840 pass 1880 pass
1841 elif len(_line) > 3 and _line[:2] == "%%:": 1881 elif len(_line) > 3 and _line[:2] == u"%%:":
1842 # Delete spaces out " delimiter 1882 # Delete spaces out " delimiter
1843 #print "__%%AUX__" + _line[2:] 1883 #print "__%%AUX__" + _line[2:]
1844 pass 1884 pass
1845 elif self.__pattern["var"].search(_line): 1885 elif self.__pattern["var"].search(_line):
1846 # Delete spaces out " delimiter 1886 # Delete spaces out " delimiter
1847 #print "line =", _line 1887 #print "line =", _line
1848 while _line.count('"') % 2 == 1 and \ 1888 while _line.count(u'"') % 2 == 1 and \
1849 index + _pass_line + 1 < len(_lines) -1: 1889 index + _pass_line + 1 < len(_lines) -1:
1850 _line = _line + _lines[index + _pass_line + 1] 1890 _line = _line + _lines[index + _pass_line + 1]
1851 _pass_line = _pass_line + 1 1891 _pass_line = _pass_line + 1
1852 _search = self.__pattern["var"].search(_line) 1892 _search = self.__pattern["var"].search(_line)
1853 if _search is not None: 1893 if _search is not None:
1854 _var = _search.groups()[0] + " = " + _search.groups()[1] 1894 _var = _search.groups()[0] + u" = " + _search.groups()[1]
1855 #print "__VAR__" + str(_var) 1895 #print "__VAR__" + str(_var)
1856 pass 1896 pass
1857 else: 1897 else:
1858 #print "no __VAR__", _line 1898 #print "no __VAR__", _line
1859 pass 1899 pass
1860 elif self.__pattern["descomposition"].search(_line): 1900 elif self.__pattern["descomposition"].search(_line):
1861 # Delete spaces out " delimiter 1901 # Delete spaces out " delimiter
1862 #_patern = "(^[^:]*):(.*)$" 1902 #_patern = "(^[^:]*):(.*)$"
1863 _search = self.__pattern["descomposition"].search(_line) 1903 _search = self.__pattern["descomposition"].search(_line)
1864 if _search is not None: 1904 if _search is not None:
1865 _var = _search.groups()[0] + ":" + _search.groups()[1] 1905 _var = _search.groups()[0] + u":" + _search.groups()[1]
1866 #print "__Descomposición__" + str(_var) 1906 #print "__Descomposición__" + str(_var)
1867 pass 1907 pass
1868 else: 1908 else:
1869 #print "no __Descomposición__", _line 1909 #print "no __Descomposición__", _line
1870 pass 1910 pass
1871 else: 1911 else:
1872 print "Parametric: code: " + _family_code 1912 print "Parametric: code: " + _family_code.encode("utf8")
1873 print "******* Desconocido *** : " + _line 1913 print "******* Desconocido *** : " + _line
1874 if index-10 > 0: print "-11 :", _lines[index-11] 1914 if index-10 > 0: print "-11 :", _lines[index-11].encode("utf8")
1875 if index-10 > 0: print "-10 :", _lines[index-10] 1915 if index-10 > 0: print "-10 :", _lines[index-10].encode("utf8")
1876 if index-9 > 0: print "-9 :", _lines[index-9] 1916 if index-9 > 0: print "-9 :", _lines[index-9].encode("utf8")
1877 if index-8 > 0: print "-8 :", _lines[index-8] 1917 if index-8 > 0: print "-8 :", _lines[index-8].encode("utf8")
1878 if index-7 > 0: print "-7 :", _lines[index-7] 1918 if index-7 > 0: print "-7 :", _lines[index-7].encode("utf8")
1879 if index-6 > 0: print "-6 :", _lines[index-6] 1919 if index-6 > 0: print "-6 :", _lines[index-6].encode("utf8")
1880 if index-5 > 0: print "-5 :", _lines[index-5] 1920 if index-5 > 0: print "-5 :", _lines[index-5].encode("utf8")
1881 if index-4 > 0: print "-4 :", _lines[index-4] 1921 if index-4 > 0: print "-4 :", _lines[index-4].encode("utf8")
1882 if index-3 > 0: print "-3 :", _lines[index-3] 1922 if index-3 > 0: print "-3 :", _lines[index-3].encode("utf8")
1883 if index-2 > 0: print "-2 :", _lines[index-2] 1923 if index-2 > 0: print "-2 :", _lines[index-2].encode("utf8")
1884 if index-1 > 0: print "-1 :", _lines[index-1] 1924 if index-1 > 0: print "-1 :", _lines[index-1].encode("utf8")
1885 print "-0 :", _lines[index-0] 1925 print "-0 :", _lines[index-0]
1886 pass 1926 pass
1887 else: 1927 else:
1888 _parameter_list = _line.split("\\")[1:-1] 1928 _parameter_list = _line.split(u"\\")[1:-1]
1889 if len(_parameter_list) >= 2: 1929 if len(_parameter_list) >= 2:
1890 if _parameter_list[0] == "C" or \ 1930 if _parameter_list[0] == u"C" or \
1891 _parameter_list[0] == "COMENTARIO": 1931 _parameter_list[0] == u"COMENTARIO":
1892 #print "__COMENTARIO__" + _parameter_list[1] 1932 #print "__COMENTARIO__" + _parameter_list[1]
1893 self.__budget.setParametricSelectComment( 1933 self.__budget.setParametricSelectComment(
1894 _family_code, _parameter_list[1]) 1934 _family_code.encode("utf8"), _parameter_list[1].encode("utf8"))
1895 elif _parameter_list[0] == "R" or \ 1935 elif _parameter_list[0] == u"R" or \
1896 _parameter_list[0] == "RESUMEN": 1936 _parameter_list[0] == u"RESUMEN":
1897 #print "__RESUMEN__" + _parameter_list[1] 1937 #print "__RESUMEN__" + _parameter_list[1]
1898 self.__budget.setParametricSummary(_family_code, 1938 self.__budget.setParametricSummary(_family_code.encode("utf8"),
1899 _parameter_list[1]) 1939 _parameter_list[1].encode("utf8"))
1900 elif _parameter_list[0] == "T" or \ 1940 elif _parameter_list[0] == u"T" or \
1901 _parameter_list[0] == "TEXTO": 1941 _parameter_list[0] == u"TEXTO":
1902 #print "__TEXTO__" + _parameter_list[1] 1942 #print "__TEXTO__" + _parameter_list[1]
1903 self.__budget.setParametricText(_family_code, 1943 self.__budget.setParametricText(_family_code.encode("utf8"),
1904 _parameter_list[1]) 1944 _parameter_list[1].encode("utf8"))
1905 elif _parameter_list[0] == "P" or \ 1945 elif _parameter_list[0] == u"P" or \
1906 _parameter_list[0] == "PLIEGO": 1946 _parameter_list[0] == u"PLIEGO":
1907 #print "__PLIEGO__" + str(_parameter_list[1:]) 1947 #print "__PLIEGO__" + str(_parameter_list[1:])
1908 pass 1948 pass
1909 elif _parameter_list[0] == "K" or \ 1949 elif _parameter_list[0] == u"K" or \
1910 _parameter_list[0] == "CLAVES": 1950 _parameter_list[0] == u"CLAVES":
1911 #print "__CLAVES__" + str(_parameter_list[1:]) 1951 #print "__CLAVES__" + str(_parameter_list[1:])
1912 pass 1952 pass
1913 elif _parameter_list[0] == "F" or \ 1953 elif _parameter_list[0] == u"F" or \
1914 _parameter_list[0] == "COMERCIAL": 1954 _parameter_list[0] == u"COMERCIAL":
1915 #print "__COMERCIAL__" + str(_parameter_list[1:]) 1955 #print "__COMERCIAL__" + str(_parameter_list[1:])
1916 pass 1956 pass
1917 else: 1957 else:
1918 #print "==PARAMETRO==" + str(_parameter_list[:]) 1958 #print "==PARAMETRO==" + str(_parameter_list[:])
1919 pass 1959 pass
1920 _final_description = _final_description + _line + "\r\n" 1960 _final_description = _final_description + _line + u"\r\n"
1921 1961
1922 #print _line 1962 #print _line
1923 # Delete last empty line 1963 # Delete last empty line
1924 _description = _final_description[:-2] 1964 _description = _final_description[:-2]
1925 _lines = _description.split("\r\n") 1965 _lines = _description.split(u"\r\n")
1926 for _line in _lines: 1966 for _line in _lines:
1927 pass 1967 pass
1928 #print _line 1968 #print _line
1929 self.num_valid_record = self.num_valid_record + 1 1969 self.num_valid_record = self.num_valid_record + 1
1930 1970
1993 if len(registro_V) > 5: 2033 if len(registro_V) > 5:
1994 _version = registro_V[5].strip() 2034 _version = registro_V[5].strip()
1995 # remove leading spaces 2035 # remove leading spaces
1996 if _version in self.__character_sets_dict: 2036 if _version in self.__character_sets_dict:
1997 self.__character_set = self.__character_sets_dict[_version] 2037 self.__character_set = self.__character_sets_dict[_version]
2038 print utils.mapping(_("FIEBDC character encoding: $1"),(self.__character_set,))
1998 else: 2039 else:
1999 print utils.mapping(_("This codepage do not exist in "\ 2040 print utils.mapping(_("This Character encoding do not exist in "\
2000 "FIEBDC3! Default codepage: $1"), 2041 "FIEBDC3! Default Character encoding: $1"),
2001 (self.__character_set,)) 2042 (self.__character_set,))
2002 else: 2043 else:
2003 print utils.mapping(_("This V record dot have a codepage! "\ 2044 print utils.mapping(_("This V record dot have a character encoding! "\
2004 "Default codepage: $1"), 2045 "Default character encoding: $1"),
2005 (self.__character_set,)) 2046 (self.__character_set,))
2006 else: 2047 else:
2007 print utils.mapping(_("Not 'V' record in File! Default codepage: "\ 2048 print utils.mapping(_("Not 'V' record in File! Default character encoding: "\
2008 "$1"), (self.__character_set,)) 2049 "$1"), (self.__character_set,))
2009 if self.__character_set != "utf8": 2050 _buffer = unicode(_buffer, self.__character_set)
2010 _buffer = unicode(_buffer, self.__character_set)
2011 _buffer = _buffer.encode("utf8")
2012 # Any INFORMATION between the beginning of the file and the 2051 # Any INFORMATION between the beginning of the file and the
2013 # beginning of the first registry “~” is ignored 2052 # beginning of the first registry “~” is ignored
2014 #"after_first_tilde" : "^[^~]*~" 2053 #"after_first_tilde" : "^[^~]*~"
2015 _buffer = self.__pattern["after_first_tilde"].sub("",_buffer) 2054 _buffer = self.__pattern["after_first_tilde"].sub("",_buffer)
2016 while _buffer != "" and not self.__cancel: 2055 while _buffer != u"" and not self.__cancel:
2017 #-# the blank characters (32), tabs (9) and end of line (13 and 10) 2056 #-# the blank characters (32), tabs (9) and end of line (13 and 10)
2018 # before the separators '~', '|' are erased. 2057 # before the separators '~', '|' are erased.
2019 # Before separator \ not deleted because it affects the reading of 2058 # Before separator \ not deleted because it affects the reading of
2020 # the record ~P 2059 # the record ~P
2021 _buffer = self.eraseControlCharacters(_buffer) 2060 _buffer = self.eraseControlCharacters(_buffer)
2022 _record_list = _buffer.split("~") 2061 _record_list = _buffer.split(u"~")
2023 # The last record can be incomplete unless it is the last one of 2062 # The last record can be incomplete unless it is the last one of
2024 # the file 2063 # the file
2025 if len(_record_list) > 1: 2064 if len(_record_list) > 1:
2026 # not the end 2065 # not the end
2027 _last_record = _record_list.pop() 2066 _last_record = _record_list.pop()
2028 else: 2067 else:
2029 # the end record 2068 # the end record
2030 # The blank characters (32), tabs (9) and end of line 2069 # The blank characters (32), tabs (9) and end of line
2031 # (13 and 10) at the end of the file are ignored. 2070 # (13 and 10) at the end of the file are ignored.
2032 #"end_control" : "((\r\n)| |\t)+$" 2071 #"end_control" : "((\r\n)| |\t)+$"
2033 _record_list[-1] = self.__pattern["end_control"].sub("", 2072 _record_list[-1] = self.__pattern["end_control"].sub(u"",
2034 _record_list[-1]) 2073 _record_list[-1])
2035 _last_record = "" 2074 _last_record = u""
2036 for record in _record_list: 2075 for record in _record_list:
2037 if self.__cancel: 2076 if self.__cancel:
2038 break 2077 break
2039 self.parseRecord(record) 2078 self.parseRecord(record)
2040 interface.progress(_file.tell() / _filesize) 2079 interface.progress(_file.tell() / _filesize)
2041 _buffer2 = _file.read(100000) 2080 _buffer2 = _file.read(100000)
2042 if self.__character_set != "utf8": 2081 _buffer2 = unicode(_buffer2, self.__character_set)
2043 _buffer2 = unicode(_buffer2, self.__character_set)
2044 _buffer2 = _buffer2.encode("utf8")
2045 _buffer = _last_record + _buffer2 2082 _buffer = _last_record + _buffer2
2046 _file.close() 2083 _file.close()
2047 if self.__cancel: 2084 if self.__cancel:
2048 print _("Process terminated") 2085 print _("Process terminated")
2049 return None 2086 return None
2113 budget.addPriceToRecord(_price,_record) 2150 budget.addPriceToRecord(_price,_record)
2114 print _("End Test") 2151 print _("End Test")
2115 2152
2116 def delete_control_space(self, text): 2153 def delete_control_space(self, text):
2117 text = self.delete_control(text) 2154 text = self.delete_control(text)
2118 text = text.replace(" ", "") 2155 text = text.replace(u" ", u"")
2119 return text 2156 return text
2120 2157
2121 def delete_control(self, text): 2158 def delete_control(self, text):
2122 text = text.replace("\t", "") 2159 text = text.replace(u"\t", u"")
2123 text = text.replace("\r", "") 2160 text = text.replace(u"\r", u"")
2124 text = text.replace("\n", "") 2161 text = text.replace(u"\n", u"")
2125 return text 2162 return text