diff --git a/account_statement_base_import/parser/file_parser.py b/account_statement_base_import/parser/file_parser.py index 139d3721..f3bd76b6 100644 --- a/account_statement_base_import/parser/file_parser.py +++ b/account_statement_base_import/parser/file_parser.py @@ -17,8 +17,8 @@ # along with this program. If not, see . # ############################################################################## - from openerp.tools.translate import _ +from openerp.osv.osv import except_osv import tempfile import datetime from parser import BankStatementImportParser @@ -34,7 +34,8 @@ class FileParser(BankStatementImportParser): Generic abstract class for defining parser for .csv or .xls file format. """ - def __init__(self, parse_name, keys_to_validate=[], ftype='csv', convertion_dict=None, header=None, *args, **kwargs): + def __init__(self, parse_name, keys_to_validate=[], ftype='csv', convertion_dict=None, + header=None, *args, **kwargs): """ :param char: parse_name : The name of the parser :param list: keys_to_validate : contain the key that need to be present in the file @@ -54,7 +55,8 @@ class FileParser(BankStatementImportParser): if ftype in ('csv', 'xls'): self.ftype = ftype else: - raise Exception(_('Invalide file type %s. please use csv or xls') % (ftype)) + raise except_osv(_('User Error'), + _('Invalide file type %s. please use csv or xls') % (ftype)) self.keys_to_validate = keys_to_validate self.convertion_dict = convertion_dict self.fieldnames = header @@ -99,7 +101,8 @@ class FileParser(BankStatementImportParser): parsed_cols = self.result_row_list[0].keys() for col in self.keys_to_validate: if col not in parsed_cols: - raise Exception(_('Column %s not present in file') % (col)) + raise except_osv(_('Invalid data'), + _('Column %s not present in file') % (col)) return True def _post(self, *args, **kwargs): @@ -149,11 +152,27 @@ class FileParser(BankStatementImportParser): for line in result_set: for rule in conversion_rules: if conversion_rules[rule] == datetime.datetime: - date_string = line[rule].split(' ')[0] - line[rule] = datetime.datetime.strptime(date_string, - '%Y-%m-%d') + try: + date_string = line[rule].split(' ')[0] + line[rule] = datetime.datetime.strptime(date_string, + '%Y-%m-%d') + except ValueError, err: + raise except_osv(_('Invalid data'), + _("Date format is not valid." + " It should be YYYY-MM-DD for column: %s" + " value: %s" + " \n line: %s \n Detail: %s") % (rule, line[rule], + line, repr(err))) else: - line[rule] = conversion_rules[rule](line[rule]) + try: + line[rule] = conversion_rules[rule](line[rule]) + except Exception, err: + raise except_osv(_('Invalid data'), + _("Value %s of column % is not valid." + "\n line: %s " + "\n Detail: %s") % (line[rule], rule, + line, repr(err))) + return result_set def _from_xls(self, result_set, conversion_rules): @@ -164,10 +183,26 @@ class FileParser(BankStatementImportParser): for line in result_set: for rule in conversion_rules: if conversion_rules[rule] == datetime.datetime: - t_tuple = xlrd.xldate_as_tuple(line[rule], self._datemode) - line[rule] = datetime.datetime(*t_tuple) + try: + t_tuple = xlrd.xldate_as_tuple(line[rule], self._datemode) + line[rule] = datetime.datetime(*t_tuple) + except Exception, err: + raise except_osv(_('Invalid data'), + _("Date format is not valid. You should modify the cell formatting" + " of your column to be of type date." + " For column: %s" + " value: %s" + " \n line: %s \n Detail: %s") % (rule, line[rule], + line, repr(err))) else: - line[rule] = conversion_rules[rule](line[rule]) + try: + line[rule] = conversion_rules[rule](line[rule]) + except Exception, err: + raise except_osv(_('Invalid data'), + _("Value %s of column % is not valid." + "\n line: %s " + "\n Detail: %s") % (line[rule], rule, + line, repr(err))) return result_set def _cast_rows(self, *args, **kwargs): diff --git a/account_statement_base_import/parser/generic_file_parser.py b/account_statement_base_import/parser/generic_file_parser.py index 84ddc3c6..d2e04e7d 100644 --- a/account_statement_base_import/parser/generic_file_parser.py +++ b/account_statement_base_import/parser/generic_file_parser.py @@ -29,6 +29,11 @@ try: except: raise Exception(_('Please install python lib xlrd')) +def float_or_zero(val): + """ Convertion function used to manage + empty string into float usecase""" + return val and float(val) or 0.0 + class GenericFileParser(FileParser): """ @@ -42,8 +47,8 @@ class GenericFileParser(FileParser): 'ref': unicode, 'label': unicode, 'date': datetime.datetime, - 'amount': float, - 'commission_amount': float + 'amount': float_or_zero, + 'commission_amount': float_or_zero } # Order of cols does not matter but first row of the file has to be header keys_to_validate = ['ref', 'label', 'date', 'amount', 'commission_amount']