Esempio n. 1
0
def write_conditional_blank_color_if_dependency_fails(
    worksheet: Worksheet,
    row_index: int,
    column_index: int,
    question: Dict[str, Any],
    full_question_path: Tuple[str, ...],
    question_to_cell: Dict[Tuple[str, ...], str],
    bool_options: Dict[str, str],
    black_format: Format,
) -> None:
    index = -1
    criterias = []
    q = question
    while "dependsOn" in q:
        compare, value = q["dependsOn"]["compare"], q["dependsOn"]["value"]
        new_question_path = full_question_path[:index]
        dependent_cell_name = question_to_cell[(
            new_question_path[0],
            *list(map(lambda x: x[0], list(new_question_path[1:-1]))),
            new_question_path[-1][1],
        )]
        comparison_value = (f'"{bool_options["Yes"]}"' if value is True else
                            '"{boolOptions["No"]}"' if value is False else
                            f"{value}" if isinstance(value, int)
                            or isinstance(value, float) else f'"{value}"')
        opposite_compare = ("<>" if compare == "=" else "=" if compare == "<>"
                            else ">" if compare == "<=" else "<=" if compare ==
                            ">" else ">=" if compare == "<" else "<")
        criterias.append('AND(${0}{1}{2},${0}<>"")'.format(
            dependent_cell_name, opposite_compare, comparison_value))
        index = index - 1
        q = q["dependsOn"]
    if len(criterias) > 1:
        final_criteria = "=OR("
        for i, criteria in enumerate(criterias):
            if i == 0:
                final_criteria = final_criteria + criteria
            else:
                final_criteria = final_criteria + "," + criteria
        final_criteria = final_criteria + ")"
    else:
        final_criteria = "=" + criterias[0]
    worksheet.conditional_format(
        row_index,
        column_index,
        row_index,
        column_index,
        {
            "type": "formula",
            "criteria": final_criteria,
            "format": black_format
        },
    )