예제 #1
0
def report():
    id = request.args.get('id', type=int)

    # Текущая страница
    page = request.args.get('page', default=1, type=int)

    # Номер колонки по которой нужно сортировать
    order_by_column = request.args.get('order_by_column', default=0, type=int)

    # Направление сортировки
    desc = request.args.get('desc', default='True', type=str)

    # Тип отчета
    report_type = str

    report = db_app.report(id)

    # Определение типа отчета
    if report[0][3] == 1:
        report_type = 'reports.simple_report'
    if report[0][3] == 2:
        report_type = 'reports.aggregation_report'

    if report[0][7] not in [0, None, 'None']:
        main_preset = db_app.select_main_preset_to_repotr(report[0][7])
        preset = main_preset[0][3]
        return redirect(url_for(report_type, id=id, page=page) + preset)

    return redirect(
        url_for(report_type,
                id=id,
                page=page,
                order_by_column=order_by_column,
                desc=desc))
예제 #2
0
def simple_report_add_preset():
    # Идентификатор отчета
    report_id = request.args.get('id', type=int)

    # Значение пресета
    preset = request.args

    # Описание отчета
    report = db_app.report(report_id)

    form = AddReportPreset(request.form)

    # Обработка данных из формы
    if request.method == 'POST' and form.validate():
        preset_name = form.name.data
        is_main = form.is_main.data

        # Строка для записи в БД
        preset_to_save = ''
        for num, i in enumerate(preset):
            if num > 1:
                preset_to_save += ('&' + str(i) + '=' + str(preset[i]))

        db_app.create_preset_to_report(report_id, preset_name, preset_to_save,
                                       is_main)
        return redirect(
            url_for('reports.simple_report', id=report_id, page=1) +
            preset_to_save)

    return render_template('add_preset_to_report.html',
                           form=form,
                           report=report)
예제 #3
0
def edit_report(id):
    # Достаётся предметная область из базы по идентификатору
    report = db_app.report(id)[0]

    # Форма заполняется данными из базы
    form = EditReport(request.form)
    form.name.data = report[1]
    form.description.data = report[2]

    if request.method == 'POST':
        # Получение данных из формы
        form.name.data = request.form['name']
        form.description.data = request.form['description']

        # Если данные из формы валидные
        if form.validate():
            # Обновление базе данных
            db_app.update_report(id, form.name.data, form.description.data)

            flash('Данные обновлены', 'success')
            return redirect(url_for('reports.report', id=id))
    return render_template('edit_report.html',
                           form=form,
                           report_id=id,
                           report_name=report[1])
예제 #4
0
def simple_form_filter():
    # Идентификатор отчета
    id = request.args.get('id', type=int)

    # Описание отчета
    report = db_app.report(id)
    data_area_id = report[0][6]

    # Получение списка параметров предметной области
    measure = db_app.select_measures_of_the_data_area(data_area_id)

    # Форма отчищается от лишних полей
    atrr = FilterReportForm.__dict__.keys()
    mix = [i for i in atrr]
    for i in mix:
        if mix.index(i) > 4:
            delattr(FilterReportForm, i)

    # Добавление полей в форму
    columns = db_app.select_measurement_report_list(id)
    columns_orders = order(columns).result_columns
    setattr(
        FilterReportForm, 'order_by_column',
        forrms['SelectField']('Сортировать по колонке',
                              choices=[(num, i[1])
                                       for num, i in enumerate(columns_orders)
                                       ]))
    setattr(
        FilterReportForm, 'desc',
        forrms['SelectField']('Направение сортировки',
                              choices=(('True', 'По убыванию'),
                                       ('False', 'По возрастанию'))))
    for i in measure:
        atrname = str(i[1])
        if i[5] in [1, 4, 5, 6]:
            setattr(FilterReportForm, ('from_value_' + atrname),
                    forrms['IntegerField']((i[2] + " от:")))
            setattr(FilterReportForm, ('to_value_' + atrname),
                    forrms['IntegerField']((i[2] + " до:")))
        elif i[5] == 2:
            setattr(FilterReportForm, atrname, forrms['StringField'](i[2]))
        elif i[5] == 3:
            ref_data = db_data.ref_data(i[6])
            choices = [(i[0], i[1]) for i in ref_data]
            setattr(FilterReportForm, atrname,
                    forrms['SelectMultipleField'](i[2], choices=choices))

    # Форма
    form = FilterReportForm(request.form)

    # Заполнение формы текущими значениями
    fields = [[i, request.args.get(i, type=str)]
              for num, i in enumerate(request.args) if num > 1]
    for i in fields:
        getattr(form, i[0]).default = i[1]
    form.process()

    # Обработка данных из формы
    if request.method == 'POST':
        # Получение данных из формы
        form.process(request.form)
        params = form.data

        part_of_url = ''
        for i in params:
            if params[i] not in [None, []]:
                part_of_url += ('&' + str(i) + '=' + str(params[i]))

        return redirect(
            url_for('reports.simple_report', id=id, page=1) + part_of_url)

    return render_template('simple_report_filter.html',
                           form=form,
                           report=report,
                           measure=measure)
예제 #5
0
def add_measurement_report(report_id, measurement_report_id):
    # Получение имени отчета
    report = db_app.report(report_id)[0]
    report_name = report[1]

    # Получение сведений о параметре
    measure_of_data_area = db_app.select_measure(measurement_report_id)
    type_of_measure = measure_of_data_area[0][4]
    name_of_measure = measure_of_data_area[0][2]

    # Стили колонок
    colors = [(i[0], i[1]) for i in constants.COLORS_IN_OREDERS]

    # Если поле стиля есть в форме, то оно удаляется
    if hasattr(MeasurementReport, 'style') == True:
        # Форма отчищается от лишних полей
        delattr(MeasurementReport, 'style')

    # Если параметр количественный, то добавляется селект для выбора стилей
    if type_of_measure == 1:
        # Добавление полей в форму
        setattr(MeasurementReport, 'style',
                forrms['SelectField']('Стиль', choices=colors))

    # Форма
    form = MeasurementReport(request.form)

    # Если параметр количественный, то полю стилей присваиваются варианты
    if type_of_measure == 1:
        form.style.choices = colors

    # Полуение списка солонок
    columns = db_app.select_measurement_report_list(report_id)
    # Колонки выстраиваются по порядку
    if len(columns) > 1:
        orders = order(columns)
        columns_orders = orders.result_columns
    else:
        columns_orders = columns
    cols = [[str(i[0]), i[1]] for i in columns_orders]

    # Формирование списка измерений в отчете на данный момент
    n_me = [('0', 'Разместить в начале')]
    for i in cols:
        n_me.append(i)
    form.next_measure.choices = n_me

    # Обработка полученных данных формы
    if request.method == 'POST' and form.validate():
        measure_id = measurement_report_id
        next_measure = form.next_measure.data

        # Если параметр количественный, то полью стиля присваиваются значения
        if type_of_measure == 1:
            style = form.style.data
        else:
            style = 0

        # Запись в базу данных
        db_app.create_measurement_report(report_id, measure_id, next_measure,
                                         style)

        flash('Параметр добавлен', 'success')
        return redirect(url_for('reports.report', id=report[0], page=1))

    return render_template('add_measurement_report.html',
                           form=form,
                           report_id=report_id,
                           report_name=report_name,
                           name_of_measure=name_of_measure)
예제 #6
0
def simple_report():
    # Идентификатор отчета
    id = request.args.get('id', default=1, type=int)

    # Текущая страница
    page = request.args.get('page', default=1, type=int)

    # Номер колонки по которой нужно сортировать
    order_by_column = request.args.get('order_by_column', default=0, type=int)

    # Направление сортировки
    desc = request.args.get('desc', default='True', type=str)

    # Количество элеменов списка на странице
    filter = request.args.get('filter', default=20, type=int)

    # Список доступных параметров для добавления в отчете
    choises = []

    # URL для фильтра
    preseto = ''

    # SQL для фильтра
    where = ''

    active_preset = 0

    # Данные об отчете
    report = db_app.report(id)
    data_area_id = report[0][6]

    # Получение списка измерений предметной области
    measures_of_the_data_area = db_app.select_measures_of_the_data_area(
        data_area_id)

    # Полуение списка солонок
    columns = db_app.select_measurement_report_list(id)

    # Пресеты
    presets_to_report = []

    # Колонки выстраиваются по порядку
    if len(columns) > 0:
        columns_orders = order(columns).result_columns

        # Название таблицы, в которой хранятся данные
        data_area = db_app.data_area(data_area_id)
        database_table = data_area[0][5]

        # Колонки, из которых нужно данные забирать
        columns_string = ''
        left_join = ''
        columns_names = []
        for num, i in enumerate(columns_orders):
            sep = ''
            if num != 0:
                sep = ', '

            if i[6] == 3:
                left_join += ('LEFT JOIN ' + i[7] + ' ON ' + database_table +
                              '.' + i[2] + ' = ' + i[7] + '.code ')
                columns_string += (sep + i[7] + '.value')
                columns_names.append((i[7] + '.value'))
            else:
                columns_string += (sep + database_table + '.' + i[2])
                columns_names.append((database_table + '.' + i[2]))

        styles = []
        for num, i in enumerate(columns_orders):
            n = i[5]
            styles.append([
                num,
                'right, {0}, {1}'.format(constants.COLORS_IN_OREDERS[n][2],
                                         constants.COLORS_IN_OREDERS[n][3])
            ])

        # Фильтр
        pres = [i for num, i in enumerate(request.args.items()) if num > 3]
        pres2 = [i for num, i in enumerate(request.args.items()) if num > 1]

        midle_pres = ''

        if len(pres) > 0:
            for num, i in enumerate(pres):
                preseto += ('&' + str(i[0]) + '=' + str(i[1]))

            for num, i in enumerate(pres2):
                midle_pres += ('&' + str(i[0]) + '=' + str(i[1]))

            for num, i in enumerate(pres):
                if num == 0:
                    operator = 'WHERE '
                else:
                    operator = ' AND '

                # Определение мультиселекта
                if '[' in i[1]:
                    array = 'ANY(ARRAY'
                    skob = ')'
                else:
                    array = ''
                    skob = ''

                # Определение знака
                if re.match(r'from_value_', str(i[0])) != None:
                    symbol = '>'
                    column = re.sub(r'from_value_', '', str(i[0]))
                elif re.match(r'to_value_', str(i[0])) != None:
                    symbol = '<'
                    column = re.sub(r'to_value_', '', str(i[0]))
                else:
                    symbol = '='
                    column = str(i[0])

                # Строка
                where += operator + column + symbol + array + str(i[1]) + skob

        # Подучение данных
        if desc == 'True':
            order_by = columns_names[order_by_column] + ' DESC'
        else:
            order_by = columns_names[order_by_column]

        limit = filter
        if int(page) == 1:
            offset = 0
        else:
            offset = (int(page) - 1) * limit
        # Подучение данных из базы
        data_to_simple_report = db_data.select_columns_to_simple_report(
            columns_string, database_table, limit, offset, order_by, left_join,
            where)

        # Подучение общего количества записей
        count_data = db_data.select_data_count(columns_string, database_table,
                                               left_join, where)[0][0]

        # Формирование переключателя
        pages = (count_data // limit)
        if count_data % limit > 0:
            pages += 1

        # Список сохраненных пресетов
        presets_to_report = db_app.select_presets_to_report(id)

        # Текущий пресет
        for i in presets_to_report:
            if i[3] == midle_pres:
                active_preset = i[0]

    else:
        columns_orders = []
        data_to_simple_report = []
        pages = 0
        count_data = 0
        styles = ''

    # Формирование списка доступных измерений
    names_in_columns = [i[2] for i in columns_orders]
    for i in measures_of_the_data_area:
        if i[1] not in names_in_columns:
            choises.append(i)

    return render_template('simple_report.html',
                           report=report,
                           choises=choises,
                           columns=columns_orders,
                           data_to_simple_report=data_to_simple_report,
                           pages=pages,
                           current_page=page,
                           count_data=count_data,
                           styles=styles,
                           order_by_column=order_by_column,
                           desc=desc,
                           filter=filter,
                           preset=preseto,
                           presets_to_report=presets_to_report,
                           active_preset=active_preset)
예제 #7
0
def aggregation_report():
    id = request.args.get('id', default=1, type=int)
    report = db_app.report(id)
    return render_template('aggregation_report.html', report=report)