[FIX] script search_class_model: support lambda datetime now and clean code
This commit is contained in:
parent
9769bc83b5
commit
65785c57e5
1 changed files with 25 additions and 70 deletions
|
|
@ -173,7 +173,7 @@ def fill_search_field(ast_obj, var_name="", py_filename=""):
|
||||||
elif ast_obj_type is ast.UnaryOp:
|
elif ast_obj_type is ast.UnaryOp:
|
||||||
if type(ast_obj.op) is ast.USub:
|
if type(ast_obj.op) is ast.USub:
|
||||||
# value is negative
|
# value is negative
|
||||||
result = ast_obj.operand.n * -1
|
result = ast_obj.operand.value * -1
|
||||||
else:
|
else:
|
||||||
_logger.warning(
|
_logger.warning(
|
||||||
f"Cannot support keyword of variable {var_name} type"
|
f"Cannot support keyword of variable {var_name} type"
|
||||||
|
|
@ -186,7 +186,7 @@ def fill_search_field(ast_obj, var_name="", py_filename=""):
|
||||||
# Support -> fields.Date.context_today
|
# Support -> fields.Date.context_today
|
||||||
parent_node = ast_obj
|
parent_node = ast_obj
|
||||||
lst_call_lambda = []
|
lst_call_lambda = []
|
||||||
if hasattr(parent_node, "id"):
|
if hasattr(parent_node, "id") or hasattr(parent_node, "attr"):
|
||||||
while hasattr(parent_node, "value"):
|
while hasattr(parent_node, "value"):
|
||||||
lst_call_lambda.insert(0, parent_node.attr)
|
lst_call_lambda.insert(0, parent_node.attr)
|
||||||
parent_node = parent_node.value
|
parent_node = parent_node.value
|
||||||
|
|
@ -200,16 +200,28 @@ def fill_search_field(ast_obj, var_name="", py_filename=""):
|
||||||
" parent_node is type ast.Call."
|
" parent_node is type ast.Call."
|
||||||
)
|
)
|
||||||
elif ast_obj_type is ast.List:
|
elif ast_obj_type is ast.List:
|
||||||
result = [fill_search_field(a, var_name) for a in ast_obj.elts]
|
result = [
|
||||||
|
fill_search_field(a, var_name=var_name, py_filename=py_filename)
|
||||||
|
for a in ast_obj.elts
|
||||||
|
]
|
||||||
elif ast_obj_type is ast.Dict:
|
elif ast_obj_type is ast.Dict:
|
||||||
result = {
|
result = {
|
||||||
fill_search_field(k, var_name): fill_search_field(
|
fill_search_field(
|
||||||
ast_obj.values[i], var_name
|
k, var_name=var_name, py_filename=py_filename
|
||||||
|
): fill_search_field(
|
||||||
|
ast_obj.values[i], var_name=var_name, py_filename=py_filename
|
||||||
)
|
)
|
||||||
for (i, k) in enumerate(ast_obj.keys)
|
for (i, k) in enumerate(ast_obj.keys)
|
||||||
}
|
}
|
||||||
elif ast_obj_type is ast.Tuple:
|
elif ast_obj_type is ast.Tuple:
|
||||||
result = tuple([fill_search_field(a, var_name) for a in ast_obj.elts])
|
result = tuple(
|
||||||
|
[
|
||||||
|
fill_search_field(
|
||||||
|
a, var_name=var_name, py_filename=py_filename
|
||||||
|
)
|
||||||
|
for a in ast_obj.elts
|
||||||
|
]
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
_logger.warning(
|
_logger.warning(
|
||||||
f"Cannot support keyword of variable {var_name} type"
|
f"Cannot support keyword of variable {var_name} type"
|
||||||
|
|
@ -321,8 +333,10 @@ def main():
|
||||||
dct_fields[var_name] = d
|
dct_fields[var_name] = d
|
||||||
lst_args = []
|
lst_args = []
|
||||||
for keyword in node.value.args:
|
for keyword in node.value.args:
|
||||||
value = _fill_search_field(
|
value = fill_search_field(
|
||||||
keyword, var_name
|
keyword,
|
||||||
|
var_name=var_name,
|
||||||
|
py_filename=str(py_file),
|
||||||
)
|
)
|
||||||
# Waste to stock None value
|
# Waste to stock None value
|
||||||
if value is not None:
|
if value is not None:
|
||||||
|
|
@ -350,7 +364,9 @@ def main():
|
||||||
)
|
)
|
||||||
for keyword in node.value.keywords:
|
for keyword in node.value.keywords:
|
||||||
value = fill_search_field(
|
value = fill_search_field(
|
||||||
keyword.value, var_name
|
keyword.value,
|
||||||
|
var_name=var_name,
|
||||||
|
py_filename=str(py_file),
|
||||||
)
|
)
|
||||||
if value is not None:
|
if value is not None:
|
||||||
d[keyword.arg] = value
|
d[keyword.arg] = value
|
||||||
|
|
@ -411,67 +427,6 @@ def main():
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
|
||||||
def extract_lambda(self, node):
|
|
||||||
result = ast.unparse(node)
|
|
||||||
if result[0] == "(" and result[-1] == ")":
|
|
||||||
result = result[1:-1]
|
|
||||||
return result
|
|
||||||
|
|
||||||
|
|
||||||
def _fill_search_field(ast_obj, var_name=""):
|
|
||||||
ast_obj_type = type(ast_obj)
|
|
||||||
result = None
|
|
||||||
if ast_obj_type is ast.Lambda:
|
|
||||||
result = extract_lambda(ast_obj)
|
|
||||||
elif ast_obj_type is ast.Constant:
|
|
||||||
result = ast_obj.value
|
|
||||||
elif ast_obj_type is ast.UnaryOp:
|
|
||||||
if type(ast_obj.op) is ast.USub:
|
|
||||||
# value is negative
|
|
||||||
result = ast_obj.operand.n * -1
|
|
||||||
else:
|
|
||||||
_logger.warning(
|
|
||||||
f"Cannot support keyword of variable {var_name} type"
|
|
||||||
f" {ast_obj_type} operator {type(ast_obj.op)}."
|
|
||||||
)
|
|
||||||
elif ast_obj_type is ast.Name:
|
|
||||||
result = ast_obj.id
|
|
||||||
elif ast_obj_type is ast.Attribute:
|
|
||||||
# Support -> fields.Date.context_today
|
|
||||||
parent_node = ast_obj
|
|
||||||
lst_call_lambda = []
|
|
||||||
if hasattr(parent_node, "id"):
|
|
||||||
while hasattr(parent_node, "value"):
|
|
||||||
lst_call_lambda.insert(0, parent_node.attr)
|
|
||||||
parent_node = parent_node.value
|
|
||||||
lst_call_lambda.insert(0, parent_node.id)
|
|
||||||
result = ".".join(lst_call_lambda)
|
|
||||||
# else:
|
|
||||||
# # default=uuid.uuid4().hex
|
|
||||||
# _logger.warning(
|
|
||||||
# f"Cannot support keyword of variable {var_name} type"
|
|
||||||
# f" {ast_obj_type} in filename {self.py_filename}, because"
|
|
||||||
# " parent_node is type ast.Call."
|
|
||||||
# )
|
|
||||||
elif ast_obj_type is ast.List:
|
|
||||||
result = [_fill_search_field(a, var_name) for a in ast_obj.elts]
|
|
||||||
elif ast_obj_type is ast.Dict:
|
|
||||||
result = {
|
|
||||||
_fill_search_field(k, var_name): _fill_search_field(
|
|
||||||
ast_obj.values[i], var_name
|
|
||||||
)
|
|
||||||
for (i, k) in enumerate(ast_obj.keys)
|
|
||||||
}
|
|
||||||
elif ast_obj_type is ast.Tuple:
|
|
||||||
result = tuple([_fill_search_field(a, var_name) for a in ast_obj.elts])
|
|
||||||
else:
|
|
||||||
_logger.warning(
|
|
||||||
f"Cannot support keyword of variable {var_name} type"
|
|
||||||
f" {ast_obj_type}."
|
|
||||||
)
|
|
||||||
return result
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
status = main()
|
status = main()
|
||||||
sys.exit(status)
|
sys.exit(status)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue