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 )
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)
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
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)
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)])
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) )
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
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)