X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=o2common%2Fviews%2Fview.py;h=57294e2fd7ac3174c9c78cfbaff98aebfe39495c;hb=58994b7d851b47456eed1820d36cc06803777e3b;hp=2b0502794fa29f718ea14c64cc0d049833db59cd;hpb=d71385743dbf345b507a0ad53357910cc81c19cf;p=pti%2Fo2.git diff --git a/o2common/views/view.py b/o2common/views/view.py index 2b05027..57294e2 100644 --- a/o2common/views/view.py +++ b/o2common/views/view.py @@ -12,11 +12,12 @@ # See the License for the specific language governing permissions and # limitations under the License. -import re +# import re from sqlalchemy.sql.elements import ColumnElement from o2common.views.route_exception import BadRequestException -from o2common.domain.filter import gen_orm_filter +from o2common.domain.filter import gen_orm_filter, \ + transfer_filter_attr_name_in_special from o2common.helper import o2logging logger = o2logging.get_logger(__name__) @@ -44,33 +45,49 @@ def gen_filter(obj: ColumnElement, filter_str: str): def check_filter(obj: ColumnElement, filter_str: str): if not filter_str: return - pattern = r'^(\((eq|neq|gt|lt|gte|lte){1},\w+,[\w -\.]+\)\;?|' +\ - r'\((in|nin|cont|ncont){1},\w*(,[\w -\.]*)*\)\;?)+' - result = re.match(pattern, filter_str) - logger.warning('filter: {} match result is {}'.format(filter_str, result)) - if not result: - raise BadRequestException( - 'filter value formater not correct.') + # pattern = r'^(\((eq|neq|gt|lt|gte|lte){1},\w+,[\w -\.]+\)\;?|' +\ + # r'\((in|nin|cont|ncont){1},\w*(,[\w -\.]*)*\)\;?)+' + # result = re.match(pattern, filter_str) + # logger.debug('filter: {} match result is {}'.format(filter_str, result)) + # if not result: + # raise BadRequestException( + # 'filter value format is invalid') check_filter_attribute(obj, filter_str) def check_filter_attribute(obj: ColumnElement, filter_str: str): - filter_without_space = filter_str.replace(" ", "") + filter_without_space = filter_str.strip() + logger.debug( + f"filter_str: {filter_str}, stripped: {filter_without_space}") items = filter_without_space.split(';') for i in items: - if '(' in i: - i = i.replace("(", "") - if ')' in i: - i = i.replace(")", "") - filter_expr = i.split(',') + item = i.strip(' ()') + filter_expr = item.split(',') if len(filter_expr) < 3: raise BadRequestException( - 'Filter {} formater not correct.'.format(i)) + 'invalid filter {}'.format(i)) + filter_op = filter_expr[0].strip() + filter_key = filter_expr[1].strip() + if filter_key == 'objectType': + logger.debug('ignore objectType while checking formatter') continue - # filter_op = filter_expr[0] - filter_key = filter_expr[1] - # filter_vals = filter_expr[2:] - if not hasattr(obj, filter_key): + filter_vals = filter_expr[2:] + if filter_op in ["eq", "neq", "gt", "lt", "gte", "lte"]: + if len(filter_vals) != 1: + raise BadRequestException( + "Found {} values: {} while only single value" + " is allowed for operation {}".format( + len(filter_vals), filter_vals, filter_op) + ) + elif filter_op not in ["in", "nin", "cont", "ncont"]: raise BadRequestException( - 'Filter attrName {} not in the Object'.format(filter_key)) + 'Filter operation {} is invalid'.format(filter_op) + ) + else: + pass + filter_key = transfer_filter_attr_name_in_special(obj, filter_key) + if not hasattr(obj, filter_key) or \ + filter_key in ['hash', 'updatetime', 'createtime', 'events']: + raise BadRequestException( + 'Filter attrName {} is invalid'.format(filter_key))