def action_index(request, wid=None): """ Render the list of actions attached to a workflow. :param request: Request object :return: HTTP response with the table. """ # Get the appropriate workflow object workflow = get_workflow(request, wid=wid) if not workflow: return redirect('workflow:index') # Reset object to carry action info throughout dialogs request.session[session_dictionary_name] = {} request.session.save() # Get the actions actions = Action.objects.filter(workflow__id=workflow.id) # Context to render the template context = { 'has_table': ops.workflow_has_table(workflow), 'workflow': workflow } # Build the table only if there is anything to show (prevent empty table) qset = [] for action in actions: qset.append({ 'id': action.id, 'name': action.name, 'description_text': action.description_text, 'action_type': action.get_action_type_display(), 'action_tval': action.action_type, 'is_out': action.is_out, 'is_executable': action.is_executable, 'last_executed_log': action.last_executed_log, 'serve_enabled': action.serve_enabled, 'modified': action.modified }) context['table'] = \ ActionTable(qset, orderable=False) context['no_actions'] = len(qset) == 0 context['qset'] = qset return render(request, 'action/md_index.html', context)
def edit_action_out(request, workflow, action): """ View to handle the form to edit an action OUT (editor, conditions, filters, etc). :param request: Request object :param action: Action :return: HTML response """ # Create the form form = EditActionOutForm(request.POST or None, instance=action) # Get the filter or None filter_condition = action.get_filter() # Conditions to show in the page. conditions = Condition.objects.filter(action=action, is_filter=False).order_by('created') # Context to render the form context = { 'filter_condition': filter_condition, 'action': action, 'conditions': conditions, 'query_builder_ops': workflow.get_query_builder_ops_as_str(), 'attribute_names': [x for x in workflow.attributes.keys()], 'column_names': workflow.get_column_names(), 'selected_rows': filter_condition.n_rows_selected if filter_condition else -1, 'has_data': ops.workflow_has_table(action.workflow), 'total_rows': workflow.nrows, 'form': form, 'vis_scripts': PlotlyHandler.get_engine_scripts() } # Template to use template = 'action/md_edit_personalized_text.html' if action.action_type == Action.PERSONALIZED_JSON: template = 'action/edit_personalized_json.html' # Processing the request after receiving the text from the editor if request.method == 'GET' or not form.is_valid(): # Return the same form in the same page return render(request, template, context=context) # Get content content = form.cleaned_data.get('content', None) # Render the content as a template and catch potential problems. # This seems to be only possible if dealing directly with Jinja2 # instead of Django. try: render_template(content, {}, action) except Exception as e: # Pass the django exception to the form (fingers crossed) form.add_error(None, e.message) return render(request, template, context) # Log the event Log.objects.register( request.user, Log.ACTION_UPDATE, action.workflow, { 'id': action.id, 'name': action.name, 'workflow_id': workflow.id, 'workflow_name': workflow.name, 'content': content }) # Text is good. Update the content of the action action.set_content(content) # Update additional fields if action.action_type == Action.PERSONALIZED_JSON: action.target_url = form.cleaned_data['target_url'] action.save() return redirect('action:index')
def edit_action_in(request, workflow, action): """ View to handle the AJAX form to edit an action in (filter + columns). :param request: Request object :param workflow: workflow :param action: Action :return: HTTP response """ # Get filter or None filter_condition = action.get_filter() # Get the number of rows in DF selected by filter. if filter_condition: filter_condition.n_rows_selected = \ pandas_db.num_rows(action.workflow.id, filter_condition.formula) filter_condition.save() # Column names suitable to insert columns_selected = action.columns.filter(is_key=False).order_by('position') columns_to_insert = [ c for c in workflow.columns.all() if not c.is_key and c not in columns_selected ] # Has key column and has no-key column has_no_key = action.columns.filter(is_key=False).exists() has_empty_description = columns_selected.filter( description_text='').exists() # Create the context info. ctx = { 'action': action, 'filter_condition': filter_condition, 'selected_rows': filter_condition.n_rows_selected if filter_condition else -1, 'total_rows': workflow.nrows, 'query_builder_ops': workflow.get_query_builder_ops_as_str(), 'has_data': ops.workflow_has_table(action.workflow), 'key_selected': action.columns.filter(is_key=True).first(), 'columns_to_insert': columns_to_insert, 'column_selected_table': ColumnSelectedTable( columns_selected.values('id', 'name', 'description_text'), orderable=False, extra_columns=[('operations', OperationsColumn( verbose_name='Ops', template_file=ColumnSelectedTable.ops_template, template_context=lambda record: { 'id': record['id'], 'aid': action.id }))]), 'has_no_key': has_no_key, 'has_empty_description': has_empty_description } return render(request, 'action/edit_in.html', ctx)