Mercurial > pyarq-presupuestos
view Generic/utils.py @ 18:878159a13494
bug fix: except raise when parses X records importing fiebdc files
author | Miguel Ángel Bárcena Rodríguez <miguelangel@obraencurso.es> |
---|---|
date | Thu, 28 Nov 2013 12:54:42 +0100 |
parents | a7b9f7e7dfa4 |
children | 65e7ae0d0e63 |
line wrap: on
line source
#!/usr/bin/python # -*- coding: utf-8 -*- ## File utils.py ## This file is part of pyArq-Presupuestos. ## ## Copyright (C) 2010-2013 Miguel Ángel Bárcena Rodríguez ## <miguelangel@obraencurso.es> ## ## pyArq-Presupuestos is free software: you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation, either version 3 of the License, or ## (at your option) any later version. ## ## pyArq-Presupuestos is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program. If not, see <http://www.gnu.org/licenses/>. # Modules import re import imghdr # add wmf to imghdr def test_wmf(h, f): """wmf image library""" if h[:6] == "\xd7\xcd\xc6\x9a\x00\x00": return 'wmf' imghdr.tests.append(test_wmf) # add dxf to imghdr def test_dxf(h, f): """AutoCAD DXF: Drawing Interchange Format""" if isinstance(f,file): _pos = f.tell() f.seek(0) _h = f.read(128) f.seek(-32, 2) _l = f.read(32) f.seek(_pos) else: _h = h _l = h[-32:] _h = _h.replace("\r","") _l = _l.replace("\r","") if (" 0\nSECTION\n 2\nHEADER\n" in _h or\ " 0\nSECTION\n 2\nCLASSES\n" in _h or\ " 0\nSECTION\n 2\nTABLES\n" in _h or\ " 0\nSECTION\n 2\nBLOCKS\n" in _h or\ " 0\nSECTION\n 2\nENTITIES\n" in _h or\ " 0\nSECTION\n 2\nOBJECTS\n" in _h or\ " 0\nSECTION\n 2\nTHUMBNAILIMAGE\n" in _h) and \ _l[-19:] == " 0\nENDSEC\n 0\nEOF\n": return 'dxf' imghdr.tests.append(test_dxf) def mapping(string, tuple): """mapping(string, tuple) string: a message string tuple: a truple with string items Return the string replacing the $[n] words whith its corresponding value from the tuple. It is used because the gettext module can not #-#supotr#-# strings as: "Invalid type (%s) in record: %s" %(type, record) """ for _index in range(len(tuple)): string = string.replace("$" + str(_index+1), str(tuple[_index])) return string def eliminate_duplicates(list): """eliminate_duplicates(list) Return a copy of the list without duplicate values """ _result = [ ] for item in list: if item not in _result: _result.append(item) return _result def is_valid_code(code): """is_valid_code(code) code: a string code Funtion to test if a record code is valid A valid code must fulfill: - Be a not empty string - The valid characters are the defined in MSdos 6.0 including .$#%&_ What it means? I am not sure, so I test if all the character are in cp850 - Cannot contain the following characters <~> separator of records if FIEBDC-3 <|> separator of fields if FIEBDC-3 <\> separator of subfield in FIEBDC-3 <\t> tab -> control character < > space -> control character <\n> end of line -> control character <\r> end of line -> control character - Cannot end with <#> or <##>, root and chapter code record It return a tuple (is_valid, code) is_valid (True/False) True: the code is valid False: the code is not valid code(False/code) False: the code is not valid and can not be corrected code: the code or the corrected code """ _is_valid = True if not isinstance(code, str): print "Not a string, code:", code, type(code) return False, False if code == "": return False, False try: _unicode_code = unicode(code, "utf8",'replace') _code_utf8 = _unicode_code.encode("utf8",'replace') _code_cp850 = _unicode_code.encode("cp850",'replace') _unicode_code = unicode(_code_cp850, "cp850",'replace') except UnicodeError: print "Unicode Error, code:", code return False, False if _code_utf8 != code: print "Not in cp950, code:", code _is_valid = False if _code_utf8 == "": return False, False code = _code_utf8 _code2 = re.sub("[\t \n\r~|\\\]","",code) if _code2 != code: print "Control characters in code:", code if _code2 == "": return False, False _is_valid = False code = _code2 if code[-1] == "#": print "# in code:", code _is_valid = False while code[-1] == "#": code = code[:-1] if code == "": print "Empty code" return False, False return _is_valid, code def getFiletype(filename, h=None): """getFiletype(filename, h=None): filename: the filename to test h: raw string, if h is not None the filename is ignored and h is assumed to contain the byte stream to test """ _type = imghdr.what(filename, h) _image_types = ["rgb", "gif", "pbm", "pgm", "ppm", "tiff", "rast", "xbm", "jpeg", "bmp", "png", "wmf"] if _type in _image_types: return "image" elif _type == "dxf": return "dxf" ## _video_types = ["avi", "mpg", "mkv", "ogm"] ## elif _type in _video_types: ## return "video" ## elif _type == "pdf": ## return "pdf" ## elif _type == "ppt" or _type == "odp": ## return "presentation" else: return None