async def post(self, request): session = await get_session(request) data = await request.post() user_role = await saml.get_role_id(request) await saml.ensure_logged_in(request) microservice_name = request.match_info['microservice_name'] if 'clear' in microservice_name: microservice_name = microservice_name.replace('clear', '') await clear_stored_search_criteria(request, microservice_name) if microservices_permissions(user_role, microservice_name) == False: request['client_ip'] = request.get('client_ip', "No IP Provided") return await forbidden(request) microservice_title = microservice_name.replace("table", " Table").title() page_number = get_page(request) try: field_classes = await get_fields(microservice_name, request) table_headers = get_table_headers( field_classes) # formatted for table use fields_to_load = get_fields_to_load(field_classes) search_criteria, previous_criteria = load_search_criteria( data, fields_to_load) field_classes = load_cookie_into_fields(field_classes, search_criteria) if search_criteria: await store_search_criteria(request, previous_criteria, fields_to_load) if search_criteria == '' and from_index == 'true': raise HTTPFound( request.app.router['MicroservicesTable:get'].url_for()) elif search_criteria == '' and from_index == 'false': return aiohttp_jinja2.render_template( 'search.html', request, {'no_search_criteria': 'True'}, status=405) search_range, records_per_page = page_bounds(page_number) search_criteria.update(search_range) get_microservice_info = get_microservice_records( microservice_name, user_filter=search_criteria) get_microservice_info_json = get_microservice_info.json() if len(get_microservice_info_json) > 0: microservice_sum = get_microservice_info_json[0].get( 'total_records', 0) max_page = math.ceil(microservice_sum / records_per_page) else: microservice_sum = 0 max_page = 1 except ClientResponseError as ex: return client_response_error(ex, request) if get_microservice_info.status_code == 200: # for 0 response st no_records true table_records = get_table_records( field_classes, get_microservice_info_json ) # database name field ([gsuite_status,... result_message_str = result_message(search_range, microservice_sum, microservice_title) views, current_view_index = get_views(user_role, microservice_name) header_html = get_html(user_role, views) current_view = views[current_view_index] if (current_view.database_name == "search"): current_view.hide_table = False current_view.hide_search_criteria = True return { 'views': views, 'header_html': header_html, 'current_view': current_view, 'called_from_index': False, 'Fields': field_classes, 'result_message': result_message_str, 'page_title': f'{microservice_title} view for: {user_role}', 'page_number': page_number, 'last_page_number': max_page, 'no_records': microservice_sum == 0, 'table_headers': table_headers, 'table_records': table_records, } else: return warn_invalid_login(request)
async def post(self, request): session = await get_session(request) data = await request.post() user_role = await saml.get_role_id(request) await saml.ensure_logged_in(request) if microservices_permissions(user_role, 'customsql') == False: request['client_ip'] = request.get('client_ip', 'No IP Provided') return await forbidden(request) clear = request.match_info['clear'] if clear == 'clear': temp = session.get('custom_sql_previous_filters', {}) final = {} for key in temp: final[key] = '' session['custom_sql_previous_filters'] = final database_names, fields = await get_database_fields(request) page_number = get_page(request) checked_boxes = session.get('custom_sql_previous_checked_fields', []) client_input = {} all_input = {} field_classes = [] for db_name in fields.keys(): current_fieldset = fields.get(db_name) # [Field, Field, Field...] for field in current_fieldset: field_classes.append(field) client_input[db_name] = [] for each_field in current_fieldset: unique_name_no_period = each_field.unique_name.replace('.', '') if unique_name_no_period in all_input: each_field.previous_value = all_input.get( unique_name_no_period) checkbox_present, filter_data = each_field.find_and_extract( data) all_input[unique_name_no_period] = filter_data if (unique_name_no_period in checked_boxes) or checkbox_present: client_input[db_name].append( {unique_name_no_period + '_text_box': filter_data}) checked_boxes.append(unique_name_no_period) each_field.show_as_table_header = True each_field.search_box_visible = True else: each_field.show_as_table_header = False each_field.search_box_visible = False # Load into classes for field in field_classes: unique_name_no_period = field.unique_name.replace('.', '') if unique_name_no_period in all_input: if all_input.get(unique_name_no_period) != '': field.previous_value = all_input.get(unique_name_no_period) if unique_name_no_period in data: field.previous_value = data.get(unique_name_no_period) all_input.update(data) session['custom_sql_previous_filters'] = all_input session['custom_sql_previous_checked_fields'] = checked_boxes all_records = get_customsql_records(all_input) all_records_json = all_records.json() search_criteria = {} search_range, records_per_page = page_bounds(page_number) search_criteria.update(search_range) get_microservice_info_json = all_records_json if len(get_microservice_info_json) > 0: microservice_sum = get_microservice_info_json[0].get( 'total_records', 0) max_page = math.ceil(microservice_sum / records_per_page) else: microservice_sum = 0 max_page = 1 table_records = get_table_records( field_classes, get_microservice_info_json, custom_sql=True, ) result_message_str = result_message(search_range, microservice_sum, 'Custom SQL') table_headers = get_table_headers(field_classes) views, current_view_index = get_views(user_role, 'customsql') header_html = get_html(user_role, views) current_view = views[current_view_index] return { 'views': views, 'header_html': header_html, 'current_view': current_view, 'fields': fields, 'database_names': database_names, 'called_from_index': 'customsql', 'Fields': field_classes, 'result_message': result_message_str, 'page_title': f'Custom SQL view for: {user_role}', 'page_number': page_number, 'last_page_number': max_page, 'table_headers': table_headers, 'table_records': table_records, }
async def get(self, request): microservice_name = request.match_info['microservice_name'] session = await get_session(request) await saml.ensure_logged_in(request) user_role = await saml.get_role_id(request) if not has_download_permission(user_role, microservice_name): return aiohttp_jinja2.render_template('error403.html', request, {'include_nav': True}) try: search_range, records_per_page = page_bounds(1) get_microservice_info = get_microservice_records( microservice_name, user_filter=search_range) get_microservice_info_json = get_microservice_info.json() if len(get_microservice_info_json) > 0: microservice_sum = get_microservice_info_json[0].get( 'total_records', 0) # If there are more than 0 people in Microservice # then get_employee_info is set to everyone (max is total number of employees) search_range = {'rangeHigh': microservice_sum, 'rangeLow': 0} get_microservice_info = get_microservice_records( microservice_name, search_range) get_microservice_info_json = get_microservice_info.json() field_classes = await get_fields(microservice_name, request) html_microservice_records = get_table_records( field_classes, get_microservice_info_json, remove_html=True, ) html_headers = get_table_headers( field_classes, remove_html=True, ) except ClientResponseError as ex: client_response_error(ex, request) if get_microservice_info.status_code == 200: with StringIO(newline='') as csvfile: writer = csv.writer(csvfile, quoting=csv.QUOTE_MINIMAL) writer.writerow(x.get('value') for x in html_headers) for row in html_microservice_records: writer.writerow(x.get('value') for x in row.get('tds')) # Create unique file name today = datetime.today().strftime('%Y-%m-%d') file_name = f'{microservice_name}{today}.csv' return web.Response(headers=MultiDict({ 'Content-Disposition': f'attachment; filename="{file_name}"' }), body=csvfile.getvalue()) else: logger.warn('Database is down', client_ip=request['client_ip']) flash(request, NO_EMPLOYEE_DATA) raise HTTPFound(request.app.router['MainPage:get'].url_for())