import csv import html from io import StringIO import requests from flask import Blueprint, request, Response, current_app from inventory_provider.db import ims_data from inventory_provider.db.ims import IMS from inventory_provider.routes import common from inventory_provider.tasks.ims_worker import OTRSFiles, export_data_for_otrs routes = Blueprint("otrs", __name__) @routes.after_request def after_request(resp): return common.after_request(resp) def get_otrs_output(result): with StringIO() as sio: writer = csv.writer(sio, delimiter='^') writer.writerows(result) data = sio.getvalue() return Response( response=data, status=requests.codes.ok, mimetype="text/html") @routes.route('customer-companies') def get_customer_companies_data(): ims_config = current_app.config['INVENTORY_PROVIDER_CONFIG']["ims"] ds = IMS(ims_config['api'], ims_config['username'], ims_config['password']) return get_otrs_output(ims_data.otrs_get_customer_company_rows(ds)) @routes.route('customer-users') def get_customer_users_data(): ims_config = current_app.config['INVENTORY_PROVIDER_CONFIG']["ims"] ds = IMS(ims_config['api'], ims_config['username'], ims_config['password']) return_duplicates = request.args.get('duplicates', 'f').lower() == 'true' return get_otrs_output(ims_data.otrs_get_customer_users_rows( ds, return_duplicates=return_duplicates)) @routes.route('export') def send_exports(): files_value = request.args.get('files', None) duplicates = request.args.get('duplicates', 'f').lower() == 'true' if files_value: try: files_value = int(files_value) except ValueError: return Response( response=html.escape('<files> should be an Integer'), status=requests.codes.bad_request, mimetype="text/html") if files_value < 0 or files_value > sum(OTRSFiles): return Response( response=html.escape(f'Bad value for <files> {files_value}'), status=requests.codes.bad_request, mimetype="text/html") debug_uuid = export_data_for_otrs( files_to_export=files_value, export_duplicates=duplicates) return Response( response=f'Exports sent, search logs for {debug_uuid} for details', status=requests.codes.ok, mimetype="text/html")