Beispiel #1
0
def distribution_chart(pos: int):
    from .query import Query

    query = Query.from_dict(flask.request.json)
    column = list(query.data_set.columns.values())[pos]
    if not current_user_has_permission(query):
        return flask.make_response(acl.inline_permission_denied_message(), 403)
    elif column.column_name in query.data_set.personal_data_column_names \
            and not acl.current_user_has_permission(personal_data_acl_resource):
        return flask.make_response(
            acl.inline_permission_denied_message('Restricted personal data'), 403)
    else:

        if column.type == 'number':
            data = query.number_distribution(column.column_name)
        elif column.type == 'text':
            data = query.text_distribution(column.column_name)
        elif column.type == 'text[]':
            data = query.text_array_distribution(column.column_name)
        elif column.type == 'date':
            data = query.date_distribution(column.column_name)
        else:
            data = []

        return flask.jsonify({'column': column.to_dict(), 'data': data})
Beispiel #2
0
def preview():
    from .query import Query
    from .data_set import Column

    query = Query.from_dict(flask.request.json['query'])

    def header(column: Column):
        if column.sortable():
            if query.sort_column_name == column.column_name and query.sort_order == 'ASC':
                icon = _.span(class_=('fa fa-sort-amount-asc'))['']
            elif query.sort_column_name == column.column_name and query.sort_order == 'DESC':
                icon = _.span(class_=('fa fa-sort-amount-desc'))['']
            else:
                icon = ''

            return _.a(href="#", name=flask.escape(column.column_name))[
                icon, ' ',
                flask.escape(column.column_name)]
        else:
            return flask.escape(column.column_name)

    if current_user_has_permission(query):
        rows = [_render_preview_row(query, row)
                for row in query.run(limit=flask.request.json['limit'], offset=flask.request.json['offset'],
                                     include_personal_data=acl.current_user_has_permission(personal_data_acl_resource))]
    else:
        rows = _.tr[_.td(colspan=len(query.column_names))[acl.inline_permission_denied_message()]]

    if rows:
        return str(bootstrap.table(headers=[header(query.data_set.columns[c]) for c in query.column_names], rows=rows))
    else:
        return '∅'
def __(task: pipelines.ParallelTask):
    if not acl.current_user_has_permission(views.acl_resource):
        return bootstrap.card(
            header_left=acl.inline_permission_denied_message())
    else:
        return [
            bootstrap.card(header_left='Commands before',
                           fixed_header_height=True,
                           sections=[
                               _render_command(command)
                               for command in task.commands_before
                           ]) if task.commands_before else '',
            bootstrap.card(header_left='Sub task creation',
                           body=bootstrap.table([], [
                               _.tr[_.td[_.div[section]],
                                    _.td(style='width:90%')[content]]
                               for section, content in task.html_doc_items()
                           ])),
            bootstrap.card(header_left='Commands after',
                           fixed_header_height=True,
                           sections=[
                               _render_command(command)
                               for command in task.commands_after
                           ]) if task.commands_after else ''
        ]
Beispiel #4
0
def filter_row_count(filter_pos):
    query = Query.from_dict(flask.request.json)

    if current_user_has_permission(query):
        return flask.jsonify(query.filter_row_count(filter_pos))
    else:
        return flask.make_response(acl.inline_permission_denied_message(), 403)
Beispiel #5
0
def __(task: pipelines.Task):
    if not acl.current_user_has_permission(views.acl_resource):
        return bootstrap.card(header_left='Commands', body=acl.inline_permission_denied_message())
    else:
        return bootstrap.card(
            header_left='Commands',
            fixed_header_height=True,
            sections=[_render_command(command) for command in task.commands])
Beispiel #6
0
def row_count():
    from .query import Query

    query = Query.from_dict(flask.request.json)

    if current_user_has_permission(query):
        return flask.jsonify(query.row_count())
    else:
        return flask.make_response(acl.inline_permission_denied_message(), 403)
Beispiel #7
0
def data_set_preview(data_set_id):
    query = Query(data_set_id=data_set_id)
    if not current_user_has_permission(query):
        return acl.inline_permission_denied_message()
    else:
        if current_user_has_permission(query):
            rows = [
                _render_preview_row(query, row) for row in query.run(
                    limit=7,
                    offset=0,
                    include_personal_data=acl.current_user_has_permission(
                        personal_data_acl_resource))
            ]
        else:
            rows = _.tr[_.td(colspan=len(query.column_names))[
                acl.inline_permission_denied_message()]]

        return str(
            bootstrap.table(headers=[
                flask.escape(column_name) for column_name in query.column_names
            ],
                            rows=rows))
Beispiel #8
0
def _render_preview_row(query, row):
    values = []
    for pos, value in enumerate(row):
        if value == '🔒':
            values.append(acl.inline_permission_denied_message('Restricted personal data'))
        elif query.column_names[pos] in query.data_set.custom_column_renderers:
            values.append(query.data_set.custom_column_renderers[query.column_names[pos]](value))
        elif not value:
            values.append('')
        elif query.data_set.columns[query.column_names[pos]].type == 'text[]':
            values.append(_.ul[[_.li[_.span(class_='preview-value')[str(array_element)]] for array_element in value]])
        elif query.data_set.columns[query.column_names[pos]].type == 'json':
            values.append(_.pre(class_='preview-value')[flask.escape(json.dumps(value, indent=2))])
        else:
            values.append(_.span(class_='preview-value')[str(value)])
    return _.tr[[_.td[value] for value in values]]
Beispiel #9
0
def oauth2_export_to_google_sheet():
    try:
        import google_auth_oauthlib.flow
        import googleapiclient.discovery
    except ImportError:
        return flask.make_response(
            str(_.tt(style='color:red')[
                    "Please install the packages 'google_auth_oauthlib' and 'google-api-python-client'"]),
            500)

    os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1'

    from .query import Query
    query = Query.from_dict(json.loads(flask.request.form['query']))

    if current_user_has_permission(query):
        flask.session['query_for_google_sheet_callback'] = json.loads(flask.request.form['query'])  # flask.request.json

        # Authorization
        flow = google_auth_oauthlib.flow.Flow.from_client_config(
            config.google_sheet_oauth2_client_config(),
            scopes=SCOPES)

        # Indicate where the API server will redirect the user after the user completes
        # the authorization flow. Required.
        flow.redirect_uri = flask.url_for('mara_data_explorer.google_sheet_oauth2callback', _external=True)

        # Generate URL for request to Google's OAuth 2.0 server
        authorization_url, state = flow.authorization_url(
            # Enable offline access so that you can refresh an access token without
            # re-prompting the user for permission. Recommended for web server apps.
            access_type='offline',
            # Enable incremental authorization. Recommended as a best practice
            include_granted_scopes='true')

        # Store the state so the callback can verify the auth server response.
        flask.session['state'] = state
        # Store parameters for callback
        flask.session['decimal_mark'] = flask.request.form['decimal-mark']
        flask.session['array_format'] = flask.request.form['array-format']

        return flask.redirect(authorization_url)
    else:
        return flask.make_response(acl.inline_permission_denied_message(), 403)