Example #1
0
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)
Example #2
0
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')
Example #3
0
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)