Example #1
0
def data_area(id):
    # Поолучение данных о предметной области
    data_area = db_app.data_area(id)

    # Путь к файлу
    filename = 'olap_' + id + '.xls'

    # Получение описания параметров
    measures = db_app.select_measures_of_the_data_area(id)

    # Получение последнй операции загрузки данных
    log = db_app.select_data_log(id)

    if len(log) == 0:
        log_status = '1'
        last_log = None
    else:
        log_status = log[0][5]
        last_log = log[0]

    return render_template(
        'data_area.html',
        data_area=data_area[0],
        measures=measures,
        last_log=last_log,
        log_status=log_status,
        filename=filename
    )
Example #2
0
def edit_data_area(id):

    # Достаётся предметная область из базы по идентификатору
    data_area = db_app.data_area(id)[0]

    # Форма заполняется данными из базы
    form = DataAreaForm(request.form)
    form.title.data = data_area[1]
    form.description.data = data_area[2]
    form.partition_limit.data = data_area[7]

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

        # Если данные из формы валидные
        if form.validate():

            # Обновление базе данных
            db_app.update_data_area(
                form.title.data,
                form.description.data,
                data_area[4],
                id,
                form.partition_limit.data
            )

            flash('Данные обновлены', 'success')
            return redirect(url_for('data_areas.data_area', id=id))
    return render_template('edit_data_area.html', form=form)
Example #3
0
def measure_freqs(data_area_id, log_id):
    # Измерения
    measures = db_app.select_measures_to_simple_stats(data_area_id)
    data_area = db_app.data_area(data_area_id)

    olap = data_area[0][5]

    # Вычисление и запись данных о частотах и "вариантах"
    for i in measures:
        if i[3] == 1:
            db_data.agr_freq_table_for_numeric_measure(olap, i[0], log_id,
                                                       i[2])
        elif i[3] == 2:
            db_data.agr_freq_table_for_quantitative_measure(
                olap, i[0], log_id, i[2])
        elif i[3] == 3:
            db_data.agr_freq_table_for_ref_quantitative_measure(
                olap, i[0], log_id, i[2])
        # TODO сделать расчеты для времени

    # Расчет накопленных частот
    '''
    Select sum(p.val) as sm
    from test p, test v
    where p.id<=v.id
    GROUP BY v.id;
    '''
    pass
Example #4
0
def upload_data_area_from_file(id):
    global id_to_da

    id_to_da = id
    # Достаётся предметная область из базы по идентификатору
    data_area = db_app.data_area(id)[0]

    form = DataFile(request.form)

    if request.method == 'POST' and form.validate():

        # Проверка наличия файла
        if 'file' not in request.files:
            flash('Вы не указали файл для загрузки', 'danger')
            return redirect(request.url)

        file = request.files['file']
        type_of = form.type_of.data

        if file and allowed_file(file.filename):
            # Генерируется имя из идентификатора пользователя и врамени загрузки файла
            # Текущее время в сточку только цифрами
            filename = 'olap_'+ id + '.xls'

            # Загружается файл
            file.save(os.path.join(constants.UPLOAD_FOLDER, filename))

            # Изменение статуса предметной области
            status = '2'
            log_id = db_app.insert_data_log(id, status)

            # Создание задачи в очереди на обработку
            db_queue.create_task(id, filename, type_of, session['user_id'], log_id[0][0])
            flash('Данные добавлены и ожидают обработки', 'success')
            return redirect(url_for('data_areas.data_area', id=id))

        else:
            flash('Неверный формат файла. Справочник должен быть в формате .xlsx', 'danger')

    return render_template('upload_data_area_from_file.html', form=form, data_area=data_area)
Example #5
0
def add_measure(data_area_id, type):

    data_area = db_app.data_area(data_area_id)

    # Список единиц измерений
    unit_list = db_app.unit_of_measurement_list()

    if type == '3':
        # Список справочников пользователя
        user_id = str(session['user_id'])
        result = db_app.user_ref_list(user_id)
        dif = [(str(i[0]), str(i[1])) for i in result]
        form = RefMeasureForm(request.form)
        form.ref.choices = dif
    elif type == '1':
        form = QualMeasureForm(request.form)
        unit = [(str(i[0]), str(i[1])) for i in unit_list]
        form.unit_of_measurement.choices = unit
    else:
        form = MeasureForm(request.form)

    if request.method == 'POST' and form.validate():
        column_name = form.column_name.data
        description = form.description.data
        status = '1'

        # Проверка уникальности имени колонки
        check = db_app.measures_for_check(column_name, data_area_id)

        if len(check) >= 1:
            flash(
                'Колонка с таким именем уже существует. Придумайте, пожалуйста новое',
                'danger')
            return redirect(request.url)
        else:

            if type == '3':
                ref = form.ref.data

                # Сохранение данных
                meg_id = db_app.insetr_measure_ref(column_name, description,
                                                   data_area_id, type, status,
                                                   ref)

                ref_name = db_app.ref_name(ref)

                # Сооздание колонки
                db_data.add_ref_column(data_area[0][5], column_name,
                                       constants.TYPE_OF_MEASURE[int(type)],
                                       ref_name)

            elif type == '1':
                uom = form.unit_of_measurement.data

                # Сохранение данных
                meg_id = db_app.insetr_measure_qualitative(
                    column_name, description, data_area_id, type, status, uom)

                # Сооздание колонки
                db_data.add_column(data_area[0][5], column_name,
                                   constants.TYPE_OF_MEASURE[int(type)])
            else:
                # Сохранение данных
                meg_id = db_app.insetr_measure(column_name, description,
                                               data_area_id, type, status)

                # Сооздание колонки
                db_data.add_column(data_area[0][5], column_name,
                                   constants.TYPE_OF_MEASURE[int(type)])

            # Измерения для форимрования пар с новым параметром
            megs_a = db_app.select_measures_for_models(str(meg_id[0][0]),
                                                       data_area_id)
            megs = [i[0] for i in megs_a]

            types = ['1', '4', '5', '6']

            if type in types and len(megs) != 0:
                # Получить список идентификаторов гипотез
                hypotheses_id_a = db_app.select_id_from_hypotheses()
                hypotheses_id = [i[0] for i in hypotheses_id_a]

                # Создать записи для каждой новой пары и каждой гипотезы)
                arrays = [
                    hypotheses_id, megs, [meg_id[0][0]], [int(data_area_id)]
                ]
                tup = list(itertools.product(*arrays))
                args_str = str(tup).strip('[]')

                # Записать данные
                db_app.insert_math_models(args_str)

            flash('Параметр добавлен', 'success')
            return redirect(url_for('data_areas.data_area', id=data_area_id))
    return render_template('add_measure.html',
                           form=form,
                           data_area=data_area[0],
                           title=db_app.types[int(type)])
Example #6
0
def data_area_log(id):
    return render_template(
        'data_area_log.html',
        data_area=db_app.data_area(id)[0],
        log=db_app.select_data_area_log(id)
    )
Example #7
0
def start(id, data_area_id, log_id, filename, type):
    # Обновление статуса предметной области и измерений
    status = '3'
    db_app.update_data_area_status(status, log_id)

    # Открывается сохраненный файл
    rb = xlrd.open_workbook(constants.UPLOAD_FOLDER + filename)
    sheet = rb.sheet_by_index(0)

    # Содержание файла
    in_table = range(sheet.nrows)

    # Набор колонок из файла
    row = sheet.row_values(in_table[0])

    # Набор колонок из базы
    measures = db_app.select_columns_from_measures(data_area_id)

    # Проверка структуры в файле
    headcheck = head_check(measures, row)
    if headcheck[0] != True:
        status = '4'
        db_app.update_data_area_status(status, log_id)
        return status

    # Набор справочников требуемых для проверки
    ref_names = {}
    for i in measures:
        if i[3] != None:
            ref_name = db_app.select_ref_name(i[3])
            ref_names.update({i[0]: ref_name})

    # Создание файла для записи ошибок
    style0 = xlwt.easyxf('font: name Times New Roman, color-index red, bold on', num_format_str='#,##0.00')
    style1 = xlwt.easyxf()
    wb = xlwt.Workbook()
    ws = wb.add_sheet('Main')

    # Название таблицы, в которую записывать данные
    db_da = db_app.data_area(data_area_id)
    table_name = db_da[0][5]
    # Максимальное количество хранимых загрузок
    limit = db_da[0][7]

    # Удаление данных из таблицы, если идет операция обновления данных
    if type == '1':
        db_data.delete_data_from_olap(table_name)
    else:
        # Удление лишних данных в оперативном хранилище
        db_data.delete_oldest_partitions(table_name, limit)

    count = 1
    errrors = 0
    done = 0
    # Загрузка данных из файла
    for rownum in in_table:
        # Строка в файле
        row = sheet.row_values(rownum)

        # Получение нужного набора данных из строки
        bdline = []
        for i in headcheck[1]:
            item = []
            # Выбирается значение нужной колонки в исходных данных
            item.append(row[i])
            # Выбирается тип данных
            item.append(measures[headcheck[1].index(i)][2])
            # Первод даты в формат для записи в базу
            if item[1] == 5 and rownum >= 1:
                try:
                    mi = datetime.datetime(*xlrd.xldate_as_tuple(item[0], rb.datemode))
                    bdline.append([mi, '5'])
                except:
                    bdline.append([None, '5'])
            else:
                bdline.append(item)

        # Запись данных
        if rownum == 0:
            ws.write(rownum, 0, 'Номер строки', style0)
            ws.write(rownum, 1, 'Ошибка', style0)
        elif rownum >= 1:
            result = []
            for t in bdline:
                result.append(t[0])
            names_to_record = ', '.join(str(e[1]) for e in measures)
            data_to_record = ', '.join("'" + str(e) + "'" for e in result)
            try:
                db_data.insret_data_to_olap(table_name, names_to_record, data_to_record, log_id)
                done += 1
            except psycopg2.Error as er:
                db_data.conn.rollback()
                ws.write(count, 0, rownum + 1, style1)
                ws.write(count, 1, str(er.diag.message_primary), style1)
                errrors += 1
                count += 1

    # Удаление загруженного файла
    os.remove(constants.UPLOAD_FOLDER + filename)

    # Сохранение и закрытие файла с ошибками
    path_adn_file = constants.ERROR_FOLDER + filename
    wb.save(path_adn_file)

    # TODO нужно записать (обновить) статистические таблицы для измерений

    # Обновление статуса предметной области и измерений
    status = '5'
    db_app.update_data_area_status(status, log_id)

    # Сохранение статистики по результатам обработки данных
    db_app.update_data_log_stats(errrors, done, log_id)

    return status
Example #8
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)