93 lines
4.0 KiB
Python
93 lines
4.0 KiB
Python
# Copyright (C) 2020 NTT DATA
|
|
# All Rights Reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
|
|
from tacker.api.common import attribute_filter
|
|
from tacker.common import exceptions as exception
|
|
|
|
|
|
class BaseViewBuilder(object):
|
|
|
|
@classmethod
|
|
def validate_filter(cls, filters=None):
|
|
if not filters:
|
|
return
|
|
|
|
return attribute_filter.parse_filter_rule(filters,
|
|
target=cls.FLATTEN_ATTRIBUTES)
|
|
|
|
@classmethod
|
|
def validate_attribute_fields(cls, all_fields=None, fields=None,
|
|
exclude_fields=None, exclude_default=None):
|
|
|
|
if all_fields and (fields or exclude_fields or exclude_default):
|
|
msg = ("Invalid query parameter combination: 'all_fields' "
|
|
"cannot be combined with 'fields' or 'exclude_fields' "
|
|
"or 'exclude_default'")
|
|
raise exception.ValidationError(msg)
|
|
|
|
if fields and (all_fields or exclude_fields):
|
|
msg = ("Invalid query parameter combination: 'fields' "
|
|
"cannot be combined with 'all_fields' or 'exclude_fields' ")
|
|
raise exception.ValidationError(msg)
|
|
|
|
if exclude_fields and (all_fields or fields or exclude_default):
|
|
msg = ("Invalid query parameter combination: 'exclude_fields' "
|
|
"cannot be combined with 'all_fields' or 'fields' "
|
|
"or 'exclude_default'")
|
|
raise exception.ValidationError(msg)
|
|
|
|
if exclude_default and (all_fields or exclude_fields):
|
|
msg = ("Invalid query parameter combination: 'exclude_default' "
|
|
"cannot be combined with 'all_fields' or 'exclude_fields' ")
|
|
raise exception.ValidationError(msg)
|
|
|
|
def _validate_complex_attributes(query_parameter, fields):
|
|
msg = ("Invalid query parameter '%(query_parameter)s'. "
|
|
"Value: %(field)s")
|
|
for field in fields:
|
|
if field in cls.COMPLEX_ATTRIBUTES:
|
|
continue
|
|
elif '*' in field:
|
|
# Field should never contain '*' as it's reserved for
|
|
# special purpose for handling key-value pairs.
|
|
raise exception.ValidationError(msg %
|
|
{"query_parameter": query_parameter,
|
|
"field": field})
|
|
elif field not in cls.FLATTEN_COMPLEX_ATTRIBUTES:
|
|
# Special case for field with key-value pairs.
|
|
# In this particular case, key will act as an attribute
|
|
# in structure so you need to treat it differently than
|
|
# other fields. All key-value pair field will be post-fix
|
|
# with '*' in FLATTEN_COMPLEX_ATTRIBUTES. Request
|
|
# with field which contains '*' will be treated as an
|
|
# error.
|
|
special_field = False
|
|
for attribute in cls.FLATTEN_COMPLEX_ATTRIBUTES:
|
|
if '*' in attribute and field.startswith(
|
|
attribute.split('*')[0]):
|
|
special_field = True
|
|
|
|
if not special_field:
|
|
raise exception.ValidationError(msg %
|
|
{"query_parameter": query_parameter,
|
|
"field": field})
|
|
|
|
if fields:
|
|
_validate_complex_attributes("fields", fields.split(','))
|
|
elif exclude_fields:
|
|
_validate_complex_attributes("exclude_fields",
|
|
exclude_fields.split(","))
|