From 03eac0c4d2f63c123e886b2e3434cd98b575eb0d Mon Sep 17 00:00:00 2001 From: pycook Date: Fri, 29 Mar 2024 11:46:50 +0800 Subject: [PATCH] pref(api): error tips for out of range value (#453) --- .../lib/cmdb/auto_discovery/auto_discovery.py | 4 ++-- cmdb-api/api/lib/cmdb/resp_format.py | 2 +- cmdb-api/api/lib/cmdb/utils.py | 11 ++++++++++- cmdb-api/api/lib/cmdb/value.py | 13 ++++++++++--- .../translations/zh/LC_MESSAGES/messages.mo | Bin 16553 -> 16670 bytes .../translations/zh/LC_MESSAGES/messages.po | 8 ++++++-- 6 files changed, 29 insertions(+), 9 deletions(-) diff --git a/cmdb-api/api/lib/cmdb/auto_discovery/auto_discovery.py b/cmdb-api/api/lib/cmdb/auto_discovery/auto_discovery.py index 276eb3a..a0323fb 100644 --- a/cmdb-api/api/lib/cmdb/auto_discovery/auto_discovery.py +++ b/cmdb-api/api/lib/cmdb/auto_discovery/auto_discovery.py @@ -331,14 +331,14 @@ class AutoDiscoveryCICRUD(DBMixin): @staticmethod def get_attributes_by_type_id(type_id): from api.lib.cmdb.ci_type import CITypeAttributeManager - attributes = [i[1] for i in CITypeAttributeManager.get_all_attributes(type_id) or []] + attributes = [i for i in CITypeAttributeManager.get_attributes_by_type_id(type_id) or []] attr_names = set() adts = AutoDiscoveryCITypeCRUD.get_by_type_id(type_id) for adt in adts: attr_names |= set((adt.attributes or {}).values()) - return [attr.to_dict() for attr in attributes if attr.name in attr_names] + return [attr for attr in attributes if attr['name'] in attr_names] @classmethod def search(cls, page, page_size, fl=None, **kwargs): diff --git a/cmdb-api/api/lib/cmdb/resp_format.py b/cmdb-api/api/lib/cmdb/resp_format.py index b9f6b37..7e89cbe 100644 --- a/cmdb-api/api/lib/cmdb/resp_format.py +++ b/cmdb-api/api/lib/cmdb/resp_format.py @@ -96,7 +96,7 @@ class ErrFormat(CommonErrFormat): # 属性 {} 的值必须是唯一的, 当前值 {} 已存在 attribute_value_unique_required = _l("The value of attribute {} must be unique, {} already exists") attribute_value_required = _l("Attribute {} value must exist") # 属性 {} 值必须存在 - + attribute_value_out_of_range = _l("Out of range value, the maximum value is 2147483647") # 新增或者修改属性值未知错误: {} attribute_value_unknown_error = _l("Unknown error when adding or modifying attribute value: {}") diff --git a/cmdb-api/api/lib/cmdb/utils.py b/cmdb-api/api/lib/cmdb/utils.py index 1239b1c..9358d23 100644 --- a/cmdb-api/api/lib/cmdb/utils.py +++ b/cmdb-api/api/lib/cmdb/utils.py @@ -11,12 +11,21 @@ import six import api.models.cmdb as model from api.lib.cmdb.cache import AttributeCache from api.lib.cmdb.const import ValueTypeEnum +from api.lib.cmdb.resp_format import ErrFormat TIME_RE = re.compile(r'(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d') +class ValueDeserializeError(Exception): + pass + + def string2int(x): - return int(float(x)) + v = int(float(x)) + if v > 2147483647: + raise ValueDeserializeError(ErrFormat.attribute_value_out_of_range) + + return v def str2datetime(x): diff --git a/cmdb-api/api/lib/cmdb/value.py b/cmdb-api/api/lib/cmdb/value.py index bf988bd..66594ce 100644 --- a/cmdb-api/api/lib/cmdb/value.py +++ b/cmdb-api/api/lib/cmdb/value.py @@ -5,14 +5,16 @@ from __future__ import unicode_literals import copy import imp -import jinja2 import os import re import tempfile + +import jinja2 from flask import abort from flask import current_app from jinja2schema import infer from jinja2schema import to_json_schema +from werkzeug.exceptions import BadRequest from api.extensions import db from api.lib.cmdb.attribute import AttributeManager @@ -23,6 +25,7 @@ from api.lib.cmdb.const import ValueTypeEnum from api.lib.cmdb.history import AttributeHistoryManger from api.lib.cmdb.resp_format import ErrFormat from api.lib.cmdb.utils import TableMap +from api.lib.cmdb.utils import ValueDeserializeError from api.lib.cmdb.utils import ValueTypeMap from api.lib.utils import handle_arg_list from api.models.cmdb import CI @@ -80,7 +83,7 @@ class AttributeValueManager(object): return res @staticmethod - def _deserialize_value(value_type, value): + def _deserialize_value(alias, value_type, value): if not value: return value @@ -88,6 +91,8 @@ class AttributeValueManager(object): try: v = deserialize(value) return v + except ValueDeserializeError as e: + return abort(400, ErrFormat.attribute_value_invalid2.format(alias, e)) except ValueError: return abort(400, ErrFormat.attribute_value_invalid.format(value)) @@ -124,7 +129,7 @@ class AttributeValueManager(object): def _validate(self, attr, value, value_table, ci=None, type_id=None, ci_id=None, type_attr=None): ci = ci or {} - v = self._deserialize_value(attr.value_type, value) + v = self._deserialize_value(attr.alias, attr.value_type, value) attr.is_choice and value and self._check_is_choice(attr, attr.value_type, v) attr.is_unique and self._check_is_unique( @@ -240,6 +245,8 @@ class AttributeValueManager(object): value = self._validate(attr, value, value_table, ci=None, type_id=type_id, ci_id=ci_id, type_attr=ci_attr2type_attr.get(attr.id)) ci_dict[key] = value + except BadRequest as e: + raise except Exception as e: current_app.logger.warning(str(e)) diff --git a/cmdb-api/api/translations/zh/LC_MESSAGES/messages.mo b/cmdb-api/api/translations/zh/LC_MESSAGES/messages.mo index 09b8c79317278441998c927e21c614870c2d290d..c7426371d0da420d96f05a79876684b173afef4f 100644 GIT binary patch delta 3377 zcmYk;3ryBk7{~F4R21W)f`AC}iloR*czFc`5p7o z{6F^SxWV{3&QCl)PXw#<-`A>8vlxo2ojWj*@`o6U=TPspV;n|?nI&T;_Qc0g^|SB+ zT#5JOn(`5p3Yzws*ygNRz?Xryl& z=*oqt0LoCQpMlZ17}Kx`mDywH*9_WtP{Uw)RUmzlNm~(;Z7V|sFcB4b9qPT+&Rs}$ z?Q<-_v#5;4^O92SL-kvM3bYQ@&$6E6Umd+lg(5oa8eVYTbH)<>BtG|{GPBP4E^4!# zLJjzbGn9e`OvVB%!8~llLD-BmwaYQ&pJ43{6&hNFV=h*R%1AjDW4)h;5j^ZeZIaulO&3Ei*;tHvp%!y+J*MCZ zR3>hsCJ@1NwYie92!|tGnIDzmCd|SEs6BSg=?~*AHOxj0G#a%=b5Ju}=zI-5l#e=F zkv=S#C}a|9#>0?g+B8(Zjjp@_m4V$j5WXK^elJxW*G9yHJ{)aLjKb-sg0hdLO5 z8ek&o#U>nvN0BkD1Nkh*emEMZVJYrK&GZh^)Jhmc0Z+pbxC-MK-%jzMRQ;?9?8xY3 z#}biutq3(hB^KZ|)SCZ*TB@6S}5V>Q;I56_`ro2mzS$;5|{ zI%_~>Vl!soNz^@X2X#6^n1)VE9CB;h03>NP7&Tx8YR0p1MUdIcsENgrKAD4>SXnCh zSH(OkJh<95*nGi0CH4Obt=M&U$R3TmdqQ3H-g#;_VJ#f_-9=_WZkN%&xR z27Ch}@GvTnFHr&eFS?3b&Q4i@2C=A)(@-6ca`jV?{bqHj3^btvddHPdIM1U7YR7IE z!fmGZaj1Z@kxlNmQ9Ni5RH0s2h+bTWx>7$y1@b+rgLaI-FdAuX6HxVesHG`$_0_0; zm$~v*97*{DR6DJ6FP;B{e;()n)loS{;!M=c7N9oMdekO6h#L4O?16tdyZZv=WM>{~ zpi)%(8L0jjx%y4mN9TV(4@%M3s7=?3n&BPIuDx35$73X*{l_#F*+}Bb!MP8;W*UH>QRBLb-s-~ zDIY^k=qzdpe#IEIsffb4?t^8h`mN3b?(@^A0a{U~;x1}wQklMH zUXEN9R*QVwW`4!uw^)qVk$rB13IhLQPA(w-dT}Eada(s{elKDX-d`9<<-@2ec{VD5 zm8eW?MV;>>uKpr&N!o4fg^8>WSBDKjy0q!2ezu{O=!l<(NFFYs)~X#@c1vP(_LWs2 zLEB5H4v%3xo=29~?qM8y`HQ5b8iUH*Q<#7YP#Jgym9b{jIG0dM?hhv~TC2XO7rm%} zN>NKP2{q$7)TVq9$6ymCVjJov>s%7ZNE#}TQuJUYDnpA=7u$B!X5JGh_p^hp;u!Yf zgEOcAZlWUZG`x9!XxH$ZM;q!rPfz#EtDG~V%JWR+?1rjzPyNg)Pfg{svuYY@0#%+_ zbslfFFVB~slk3ZCUJ{oU-o-n_lbu!I^ES7nOb*Mq+Oq8Gk>yu5FKpeuvvuL2YfWof dSG1&i{;jyOY486!h{~<*+M)4z&pLle>fa%>bd3N2 delta 3263 zcmYM#drX&A9LMo5(vTP+`uia_;fG0qC^r?6i-M-*jWU&0tH>sQgjQN&ZBF-?m!($b z=Ey9qENyd%Hd$U016x$&EVr1**wBTS&AiNTTBzCk({r|*@;c}6oO8b4?>W!o$E(72 zzZvFr54x}3`11q*hVXA@gnIw~SsrbcKzD_+9z*mSFcD9n=3T&K439C(z%-1Tm>+~~&lpi21@^4Gfg5yb1RA3^l2X-TNx zk3a=50af}ZaWKAyBXB*cvR|X83_57&!JDW+2C_OyTMklXn}7)VvkWZAf+P z2v*>6RK=p1q*7;~)_oKe=zP>VOXI1(7J82XMYPvFc+z><8A&LMex!4F)MJ8f7)_61~(b$Q)Bo|Sau0N|3U><713z&s#P!(uE z1%4cLsm|hfyo)ShrKGRQR$)HYq3+f$XB+A{?+OiV(4SRwHrc4m%AD1hPJg9y2QtOJ zb9SRL?L&%ZA)?d5MX3H0sLX3|3VNtST9M1>*;N|F3?vh-Dlr$e;1-;PO{h}EP@W2` zL@lrpOYtCTelJ#GPP+g4uEuQohfx(h=laoPr-~F|hTi`dY3NeCi+Zn*Vj=dRHb|m8 zTBr&q;7VjKYsPXsgEKHheW&9>RHg@zU)dd0z#+1lgj11IvbQmb{p|}k(1H}hx{x{c zH)?}aqAJ1XP-p%D>Zlq}C2mGt!VcHJih3@B&z+u2!G)NEV{j{u#$V9OrO}W2(6$0p zC7!|@T!(u951`(PR@7T^3i(=F4^kw%j@mFln#wo}*M(6PRHp62eXpSsi=vzw&&{U( z=`^Offd!~Q)*|=G_PFsjbY{%-Kj;b`w8lkd<^v# zw4*9;2{k`f_18ce-j9<|M=%rlYs>k;3t(TO&iZFmCcmRz!&|7z1em1$Nas}4hBY_< zm!SgLfC_lK>w9}$!r}S;#39JNvOH7;s!##F`x*c^|dmejI>psI%>K)C1M14VEAm-PWUyjfW%V261k}Nx)L?M z2vw=In1l_;C&GS2rrHhEI(eLz)~&<E8jl9YX\n" "Language: zh\n" @@ -322,7 +322,7 @@ msgstr "无效的属性值: {}" #: api/lib/cmdb/resp_format.py:94 msgid "{} Invalid value: {}" -msgstr "无效的值: {}" +msgstr "{} 无效的值: {}" #: api/lib/cmdb/resp_format.py:95 msgid "{} is not in the predefined values" @@ -336,6 +336,10 @@ msgstr "属性 {} 的值必须是唯一的, 当前值 {} 已存在" msgid "Attribute {} value must exist" msgstr "属性 {} 值必须存在" +#: api/lib/cmdb/resp_format.py:99 +msgid "Out of range value, the maximum value is 2147483647" +msgstr "超过最大值限制, 最大值是2147483647" + #: api/lib/cmdb/resp_format.py:101 msgid "Unknown error when adding or modifying attribute value: {}" msgstr "新增或者修改属性值未知错误: {}"