예제 #1
0
파일: json.py 프로젝트: oleglpts/reporter
def json(report_config):
    """

    Output report on json-format

    :param report_config: report configuration
    :type report_config: dict
    :return: True if no error
    :rtype: bool

    """
    data_list = []
    connect = database_connect(report_config['connection'].replace('~', os.getenv('HOME')), logger)
    cursor = connect.cursor()
    logger.info('%s json-%s' % (_('working'), _('generator')))
    with open('%s.json' % cmd_args.output, 'w') as f:
        for sql in report_config['sql']:
            parameters_list = {}
            for parm in cmd_args.parameters:
                p = parm.split('=')
                if p[1].endswith(','):
                    p[1] = p[1][:-1]
                parameters_list[p[0]] = p[1]
            for parameter in parameters_list:
                sql = sql.replace('{{%s}}' % parameter, parameters_list[parameter])
            cursor.execute(sql)
            columns = [col[0] for col in cursor.description]
            data = [dict(zip(columns, (str(y) if y is not None else '' for y in rw))) for rw in cursor.fetchall()]
            data_list.append(data)
        f.write(json_lib.dumps(data_list, ensure_ascii=False, indent=4))
    return True
예제 #2
0
def callback_terminate(code, parameters):
    """

    Terminate program

    :param code: exit code
    :type code: int
    :param parameters: post parameters for callback
    :type parameters: dict

    """
    parameters['status'] = code
    if cmd_args.token:
        response = callback(parameters)
        logger.debug('%s: %s' %
                     (_('callback response'), response.get('result', 'None')))
    if server.is_alive():
        server.terminate()
        server.join()
    logger.debug('%s: %s' % (_('reporter result'), json.dumps(parameters)))
    logger.info(_('reporter ended'))
    exit(code)
예제 #3
0
def bottle_callback():
    """

    Callback handler

    :return: response
    :rtype: str

    """
    logger.debug(
        '%s: \'%s\'' %
        (_('callback received data'), unquote(request.body.read().decode())))
    return '{"result": "Ok"}'
예제 #4
0
def tab(report_config):
    """

    Output report for jquery.dataTables

    :param report_config: report configuration
    :type report_config: dict
    :return: True if no error
    :rtype: bool

    """
    data_list, columns_list, suppress = [], [], report_config.get(
        'suppress', 0)
    connect = database_connect(
        report_config['connection'].replace('~', os.getenv('HOME')), logger)
    cursor = connect.cursor()
    logger.info('%s tab-%s' % (_('working'), _('generator')))
    with open('%s.tab' % cmd_args.output, 'w') as f:
        for sql in report_config['sql']:
            if sql.startswith('SKIP'):
                data, skip, description = [], [
                    x.strip() for x in sql.split('=')
                ], ()
                for _x in range(int(skip[1]) if len(skip) > 1 else 1):
                    data_list.append([])
            else:
                parameters_list = {}
                for parm in cmd_args.parameters:
                    p = parm.split('=')
                    if p[1].endswith(','):
                        p[1] = p[1][:-1]
                    parameters_list[p[0]] = p[1]
                for parameter in parameters_list:
                    sql = sql.replace('{{%s}}' % parameter,
                                      parameters_list[parameter])
                cursor.execute(sql)
                columns = [col[0] for col in cursor.description]
                data = [
                    dict(zip(columns, (str(y) for y in rw)))
                    for rw in cursor.fetchall()
                ]
                columns_list.append(columns)
                data_list.append(data)
        max_row_len = max([len(x) for x in columns_list])
        data_file = []
        if len(data_list):
            for i, columns in enumerate(columns_list):
                while data_list and not data_list[i]:
                    data_file.append(['' for _x in range(max_row_len)])
                    data_list.pop(i)
                if not data_list:
                    data_file = []
                suppress_list = [None] * max_row_len
                if len(columns_list) > 1:
                    row_data = [
                        '<b><u>%s</u></b>' % report_config['headings'][i]
                    ]
                    while len(row_data) < max_row_len:
                        row_data.append('')
                    data_file.append(row_data)
                    row_data = []
                    for column in columns:
                        row_data.append('<b>%s</b>' % column)
                    while len(row_data) < max_row_len:
                        row_data.append('')
                    data_file.append(row_data)
                if not data_list:
                    break
                data_length = len(data_list[i])
                for j, row in enumerate(data_list[i]):
                    suppress_enable, row_data = True, []
                    for k, column in enumerate(columns_list[i]):
                        if not row[column] or row[column] == 'None':
                            row[column] = ''
                        if row[column] != suppress_list[k]:
                            suppress_list[k] = row[column]
                            suppress_enable = False
                        elif k < suppress and suppress_enable:
                            row[column] = ''
                        row_data.append(row[column].split('/////')[0].strip())
                    while len(row_data) < max_row_len:
                        row_data.append('')
                    data_file.append(row_data)
                    if i == len(columns_list) - 1 and not (j + 1) % int(
                            cmd_args.frequency):
                        callback({
                            'status': -1,
                            'progress_data': j + 1,
                            'message': 'In progress',
                            'length_data': data_length
                        })
                if i == len(columns_list) - 1:
                    callback({
                        'status': -1,
                        'progress_data': data_length,
                        'message': 'In progress',
                        'length_data': data_length
                    })
                if len(columns_list) > 1:
                    row_data = []
                    while len(row_data) < max_row_len:
                        row_data.append('')
                    data_file.append(row_data)
            if len(columns_list) > 1:
                data_file = data_file[:-1]
        f.write(json.dumps({"data": data_file}, indent=4))
        return True
예제 #5
0
def main():
    sys.path.append('../')
    sys.path.append('/app')
    from db_report.utils.callback import server
    from db_report.utils.helpers import error_handler
    from db_report.utils.callback import callback_terminate
    from db_report.config import translate as _, logger, cmd_args
    if cmd_args.callback_url == 'http://localhost:8080' and cmd_args.token:
        server.start()
        time.sleep(1)
    form = None
    logger.info(
        '%s, %s: %s' %
        (_('reporter started'), _('logging level'), cmd_args.log_level))
    logger.info('%s \'%s\'' % (_('report name'), cmd_args.name))
    try:
        with open('%s%s.json' % (cmd_args.reports, cmd_args.name),
                  'r') as config_file:
            report_config = json.load(config_file)
        form = report_config.get('format', 'csv')
        if cmd_args.database:
            report_config['connection'] = cmd_args.database
        report_config['headings'] = [
            x[1]
            for x in sorted([[int(parm.split('=')[0][5:]),
                              parm.split('=')[1]]
                             for parm in cmd_args.parameters
                             if parm.split('=')[0].startswith('title')])
        ]
        if not report_config['headings'] and cmd_args.headings:
            report_config['headings'] = cmd_args.headings
        if cmd_args.sql:
            report_config['sql'] = cmd_args.sql.split('|||')
        condition_code = getattr(
            importlib.import_module('db_report.formats.%s' % form),
            form)(report_config)
        file_path = '%s.%s' % (cmd_args.output, form)
        logger.info('%s \'%s\'' % (_('output file'), file_path))
        if condition_code:
            callback_terminate(0, {'result': file_path, 'message': 'Success'})
        else:
            callback_terminate(3, {
                'result': 'empty',
                'message': 'Fatal error'
            })
    except FileNotFoundError:
        logger.error("%s \'%s\' %s" %
                     (_('report'), cmd_args.name, _('does not exists')))
        callback_terminate(
            1, {
                'result': 'empty',
                'message': 'Report \'%s\' does not exists' % cmd_args.name
            })
    except ImportError as e:
        logger.error("%s \'%s\' %s" %
                     (_('format'), form, _('not implemented')))
        callback_terminate(2, {
            'result': 'empty',
            'message': 'Format \'%s\' not implemented' % form
        })
    except Exception as e:
        error_handler(logger, e, '', False, True)
        callback_terminate(3, {
            'result': 'empty',
            'message': 'Unexpected error: %s' % str(e)
        })
예제 #6
0
파일: csv.py 프로젝트: oleglpts/reporter
def csv(report_config):
    """

    Output report in csv

    :param report_config: report configuration
    :type report_config: dict
    :return: True if no error
    :rtype: bool

    """

    suppress = report_config.get('suppress', 0)
    connect = database_connect(
        report_config['connection'].replace('~', os.getenv('HOME')), logger)
    cursor = connect.cursor()
    logger.info('%s csv-%s' % (_('working'), _('generator')))
    skips = 0
    with open('%s.csv' % cmd_args.output, 'w') as f:
        for i, sql in enumerate(report_config['sql']):
            if sql.startswith('SKIP'):
                data, skip, description = [], [
                    x.strip() for x in sql.split('=')
                ], ()
                for _x in range(int(skip[1]) if len(skip) > 1 else 1):
                    data.append(('', ))
                skips += 1
            else:
                parameters_list = {}
                for parm in cmd_args.parameters:
                    p = parm.split('=')
                    if p[1].endswith(','):
                        p[1] = p[1][:-1]
                    parameters_list[p[0]] = p[1]
                for parameter in parameters_list:
                    sql = sql.replace('{{%s}}' % parameter,
                                      parameters_list[parameter])
                cursor.execute(sql)
                data, description = cursor.fetchall(), cursor.description
                title_found = False
                title = 'title%s' % (i - skips)
                for parm in cmd_args.parameters:
                    if parm.startswith(title):
                        title_found = True
                        heading = parm.split('=')[1]
                        if heading[-1] == ',':
                            heading = heading[:-1]
                        f.write(heading)
                if not title_found:
                    f.write(report_config['headings'][i - skips])
                f.write('\n\n')
            description_string = ''
            for column_name in description:
                description_string += '%s%s' % (
                    column_name[0], report_config.get('field_delimiter', ';'))
            if description_string:
                f.write(description_string[:-1])
                f.write('\n')
            length_data = len(data)
            suppress_list = [None] * len(description)
            for j, row in enumerate(data):
                suppress_enable, data_string = True, ''
                for k, column in enumerate(row):
                    if not column or column == 'None':
                        column = ''
                    if suppress_list and column != suppress_list[k]:
                        suppress_list[k] = column
                        suppress_enable = False
                    elif k < suppress and suppress_enable:
                        column = ''
                    column = str(column).split('/////')[0].strip()
                    data_string += '%s%s' % (
                        column, report_config.get('field_delimiter', ';'))
                f.write(data_string[:-1])
                f.write('\n')
                if not (j + 1) % int(cmd_args.frequency):
                    callback({
                        'status': -1,
                        'progress_data': j + 1,
                        'message': 'In progress',
                        'length_data': length_data
                    })
            if not sql.startswith('SKIP'):
                callback({
                    'status': -1,
                    'progress_data': length_data,
                    'message': 'In progress',
                    'length_data': length_data
                })
    cursor.close()
    connect.close()
    return True