#coding=utf-8 from utils.exceptions import CustomError import re import tablib import datetime from openpyxl.utils.exceptions import InvalidFileException class Formater(): @staticmethod def formatStr(value): res = u'' if value != None: try: res = str(value) except: pass return res @staticmethod def formatCount(value): return int(round(float(value or 0) * 100,0)) @staticmethod def formatPrice(value): return int(round(float(value or 0) * 100,0)) @staticmethod def formatCountShow(value): return '%.2f' % (float(value or 0)/100.0) @staticmethod def formatPriceShow(value): return '%.2f' % (float(value or 0)/100.0) @staticmethod def formatAmount(value): return int(round(float(value or 0) * 10000,0)) @staticmethod def formatAmountShow(value): return '%.2f' % (float(value or 0) / 10000.0 + 0.0000001) class CustomFormaterByUser(): @staticmethod def formatEmptyStr(value,user): return Formater.formatEmptyStr(value) @staticmethod def formatEmptyFloat(value, user): #return round(value or 0, 2) return Formater.formatEmptyFloat(value) @staticmethod def formatTime(value,user): return Formater.formatTime(value) @staticmethod def formatDate(value, user): return Formater.formatDate(value) @staticmethod def formatCountShow(value,user): return Formater.formatCountShow(value) @staticmethod def formatPartAmountShow(value, user): return Formater.formatAmountShow(value) class ExcelImporter(): def getExcelData(self,file): if not file: raise CustomError(u'请上传数据文件') try: data = tablib.import_set(file.read(), format='xlsx').dict if not len(data): raise CustomError(u'上传的文件内没有发现数据') return data except InvalidFileException: raise CustomError(u'请上传xlsx格式的数据文件,老版本的xls格式不被支持!') def validRow(self,row): data = {} for (k,v) in self.fields.items(): is_required = v[0] format_proc = v[1] try: value = row[k] except: raise CustomError(u'缺少[%s]列,请检查模板文件或重新下载' % k) if is_required and value == None: raise CustomError(u'%s:为必填项' % k) if format_proc and value != None: try: value = format_proc(value) except CustomError as e: raise CustomError(u'%s:错误的值[%s]' % (k,e.get_error_msg())) data[k] = value return data @staticmethod def formatUnicode(value): try: return str(value).strip(u' ') except: return '' @staticmethod def formatInt(value): try: return int(float(str(value).strip(u' '))) except: raise CustomError(u'不能转换为整数') @staticmethod def formatFloat(value): try: return round(float(str(value).strip(u' ')) or 0,2) except: raise CustomError(u'不能转换为小数') @staticmethod def formatFloatGtZ(value): v = ExcelImporter.formatFloat(value) if v <= 0: raise CustomError(u'必须大于0') return v @staticmethod def formatFloatGeZ(value): v = ExcelImporter.formatFloat(value) if v < 0: raise CustomError(u'必须大于等于0') return v @staticmethod def formatTel(value): try: value = str(value).strip(u' ') except: value = '' if value == '': return value is_mobile = re.match(r'^0?(13[0-9]|14[0-9]|15[0-9]|17[0-9]|18[0-9]|19[0-9]|166)[0-9]{8}$', value) is_tel = re.match(r'^([0-9]{3,4}-)?[0-9]{7,8}$', value) if not (is_mobile or is_tel): raise CustomError(u'不合法的手机号或者固话号') return value @staticmethod def formatDate(value): try: return datetime.datetime.strptime(value, '%Y-%m-%d').date() except: raise CustomError(u'日期格式错误,格式为:2018-01-01')