def update_row_values( request: http.HttpRequest, action: models.Action, row_data: Tuple[List, List, str, Any], ): """Serve a request for action in. Function that given a request, and an action IN, it performs the lookup and data input of values. :param request: HTTP request :param action: Action In :param row_data: Tuple containing keys, values, where_field, where_value. Keys and values are the values in the row. Where field, and where value is pair find the given row :return: """ keys, values, where_field, where_value = row_data # Execute the query sql.update_row( action.workflow.get_data_frame_table_name(), keys, values, filter_dict={where_field: where_value}, ) # Recompute all the values of the conditions in each of the actions # TODO: Explore how to do this asynchronously (or lazy) for act in action.workflow.actions.all(): act.update_n_rows_selected() # Log the event and update its content in the action log_item = action.log( request.user, models.Log.ACTION_SURVEY_INPUT, action_id=action.id, action=action.name, new_values=json.dumps(dict(zip(keys, values)))) # Modify the time of execution for the action action.last_executed_log = log_item action.save(update_fields=['last_executed_log'])
def serve_survey_row( request: HttpRequest, action: Action, user_attribute_name: str, ) -> HttpResponse: """Serve a request for action in. Function that given a request, and an action IN, it performs the lookup and data input of values. :param request: HTTP request :param action: Action In :param user_attribute_name: The column name used to check for email :return: """ # Get the attribute value depending if the user is managing the workflow # User is instructor, and either owns the workflow or is allowed to access # it as shared manager = has_access(request.user, action.workflow) user_attribute_value = None if manager: user_attribute_value = request.GET.get('uatv') if not user_attribute_value: user_attribute_value = request.user.email # Get the dictionary containing column names, attributes and condition # valuations: context = get_action_evaluation_context( action, get_row_values( action, (user_attribute_name, user_attribute_value), ), ) if not context: # If the data has not been found, flag if not manager: return ontask_handler404(request, None) messages.error(request, _('Data not found in the table')) return redirect(reverse('action:run', kwargs={'pk': action.id})) # Get the active columns attached to the action colcon_items = extract_survey_questions(action, request.user) # Bind the form with the existing data form = EnterActionIn( request.POST or None, tuples=colcon_items, context=context, values=[context[colcon.column.name] for colcon in colcon_items], show_key=manager) keep_processing = (request.method == 'POST' and form.is_valid() and not request.POST.get('lti_version')) if keep_processing: # Update the content in the DB row_keys, row_values = survey_update_row_values( action, colcon_items, manager, form.cleaned_data, 'email', request.user.email, context) # Log the event and update its content in the action log_item = action.log(request.user, Log.ACTION_SURVEY_INPUT, new_values=json.dumps( dict(zip(row_keys, row_values)))) # Modify the time of execution for the action action.last_executed_log = log_item action.save() # If not instructor, just thank the user! if not manager: return render(request, 'thanks.html', {}) # Back to running the action return redirect(reverse('action:run', kwargs={'pk': action.id})) return render( request, 'action/run_survey_row.html', { 'form': form, 'action': action, 'cancel_url': reverse( 'action:run', kwargs={'pk': action.id}, ) if manager else None, }, )