[FIX] script search_class_model: support lambda datetime now and clean code

This commit is contained in:
Mathieu Benoit 2026-01-01 04:35:16 -05:00
parent 9769bc83b5
commit 65785c57e5

View file

@ -173,7 +173,7 @@ def fill_search_field(ast_obj, var_name="", py_filename=""):
elif ast_obj_type is ast.UnaryOp:
if type(ast_obj.op) is ast.USub:
# value is negative
result = ast_obj.operand.n * -1
result = ast_obj.operand.value * -1
else:
_logger.warning(
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
parent_node = ast_obj
lst_call_lambda = []
if hasattr(parent_node, "id"):
if hasattr(parent_node, "id") or hasattr(parent_node, "attr"):
while hasattr(parent_node, "value"):
lst_call_lambda.insert(0, parent_node.attr)
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."
)
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:
result = {
fill_search_field(k, var_name): fill_search_field(
ast_obj.values[i], var_name
fill_search_field(
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)
}
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:
_logger.warning(
f"Cannot support keyword of variable {var_name} type"
@ -321,8 +333,10 @@ def main():
dct_fields[var_name] = d
lst_args = []
for keyword in node.value.args:
value = _fill_search_field(
keyword, var_name
value = fill_search_field(
keyword,
var_name=var_name,
py_filename=str(py_file),
)
# Waste to stock None value
if value is not None:
@ -350,7 +364,9 @@ def main():
)
for keyword in node.value.keywords:
value = fill_search_field(
keyword.value, var_name
keyword.value,
var_name=var_name,
py_filename=str(py_file),
)
if value is not None:
d[keyword.arg] = value
@ -411,67 +427,6 @@ def main():
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__":
status = main()
sys.exit(status)