def _create_row_preview_response( action: Action, idx: int, page_context: Dict, prelude: str = None, ): """Create the elements to render a sigle row preview. :param action: Action being previewed. :param idx: :param page_context: :return: page_context is modified to include the appropriate items """ # Get the total number of items filter_obj = action.get_filter() if filter_obj: n_items = filter_obj.n_rows_selected else: n_items = action.workflow.nrows # Set the correct values to the indeces prv, idx, nxt = _get_navigation_index(idx, n_items) row_values = get_row_values(action, idx) # Obtain the dictionary with the condition evaluation condition_evaluation = action_condition_evaluation(action, row_values) # Get the dictionary containing column names, attributes and condition # valuations: eval_context = get_action_evaluation_context(action, row_values, condition_evaluation) all_false = False if action.conditions.filter(is_filter=False).count(): # If there are conditions, check if they are all false all_false = all(not bool_val for __, bool_val in condition_evaluation.items()) # Evaluate the action content. show_values = '' incorrect_json = False if action.is_out: action_content = evaluate_row_action_out(action, eval_context) if action.action_type == Action.personalized_json: incorrect_json = not _check_json_is_correct(action_content) else: action_content = evaluate_row_action_in(action, eval_context) if action_content is None: action_content = _( 'Error while retrieving content for student {0}', ).format(idx) else: # Get the conditions used in the action content act_cond = action.get_used_conditions() # Get the variables/columns from the conditions act_vars = set().union( *[ cond.columns.all() for cond in action.conditions.filter(name__in=act_cond) ], ) # Sort the variables/columns by position and get the name show_values = ', '.join([ '{0} = {1}'.format(col.name, row_values[col.name]) for col in act_vars ], ) uses_plain_text = (action.action_type == Action.personalized_canvas_email or action.action_type == Action.personalized_json) if uses_plain_text: action_content = escape(action_content) if prelude: prelude = evaluate_row_action_out(action, eval_context, prelude) # Update the context page_context.update({ 'n_items': n_items, 'nxt': nxt, 'prv': prv, 'incorrect_json': incorrect_json, 'show_values': show_values, 'all_false': all_false, 'prelude': prelude, 'action_content': action_content, 'show_navigation': True }) return
def create_row_preview_context( action: models.Action, idx: int, context: Dict, prelude: Optional[str] = None, ): """Create the elements to render a single row preview. :param action: Action being previewed. :param idx: :param context: :param prelude: Optional additional text to include in the preview. :return: context is modified to include the appropriate items """ # Get the total number of items filter_obj = action.get_filter() if filter_obj: n_items = filter_obj.n_rows_selected else: n_items = action.workflow.nrows # Set the correct values to the indeces prv, idx, nxt = _get_navigation_index(idx, n_items) row_values = get_row_values(action, idx) # Obtain the dictionary with the condition evaluation condition_evaluation = action_condition_evaluation(action, row_values) # Get the dictionary containing column names, attributes and condition # valuations: eval_context = get_action_evaluation_context(action, row_values, condition_evaluation) all_false = False if action.conditions.filter(is_filter=False).count(): # If there are conditions, check if they are all false all_false = all(not bool_val for __, bool_val in condition_evaluation.items()) # Evaluate the action content. show_values = '' incorrect_json = False if action.is_out: action_content = evaluate_row_action_out(action, eval_context) if action.action_type == models.Action.PERSONALIZED_JSON: incorrect_json = not _check_json_is_correct(action_content) else: action_content = _evaluate_row_action_in(action, eval_context) if action_content is None: action_content = _( 'Error while retrieving content (index: {0})', ).format(idx) else: # Get the conditions used in the action content act_cond = action.get_used_conditions() # Get the variables/columns from the conditions act_vars = set().union(*[ cond.columns.all() for cond in action.conditions.filter(name__in=act_cond) ]) act_vars = act_vars.union( {triplet.column for triplet in action.column_condition_pair.all()}) # Sort the variables/columns by position and get the name show_values = ', '.join([ '"{0}" = {1}'.format(col.name, row_values[col.name]) for col in act_vars ]) uses_plain_text = ( action.action_type == models.Action.PERSONALIZED_CANVAS_EMAIL or action.action_type == models.Action.PERSONALIZED_JSON) if uses_plain_text: action_content = escape(action_content) if prelude: prelude = evaluate_row_action_out(action, eval_context, prelude) # Update the context context.update({ 'n_items': n_items, 'nxt': nxt, 'prv': prv, 'incorrect_json': incorrect_json, 'show_values': show_values, 'show_conditions': ', '.join([ '"{0}" = {1}'.format(cond_name, str(cond_value)) for cond_name, cond_value in condition_evaluation.items() ]), 'all_false': all_false, 'prelude': prelude, 'action_content': action_content, 'show_navigation': True })