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