Example #1
0
def doReport(parent_form=None,
             report_filename='',
             report_dir='',
             db_url='',
             sql='',
             command=None,
             stylelib_filename=None,
             variables=None):
    """
    Функция запускает генератор отчетов.
    @param parent_form: Родительская форма, если не указана,
        то создается новое приложение.
    @param report_filename: Файл отчета.
    @param report_dir: Директорий, где хранятся отчеты.
    @param db_url: Connection string в виде url. Например
        postgresql+psycopg2://postgres:[email protected]:5432/realization.
    @param sql: Запрос SQL.
    @param command: Комманда после генерации. print/preview/export.
    @param stylelib_filename: Файл библиотеки стилей.
    @param variables: Словарь переменных для заполнения отчета.
    @return: Возвращает результат выполнения операции True/False.
    """
    try:
        app = None
        if parent_form is None:
            app = wx.PySimpleApp()

        if not report_filename:
            return ReportViewer(parent_form, report_dir)
        else:
            # Если определен отчет, то запустить на выполнение
            repgen_system = report_generator.getReportGeneratorSystem(
                report_filename, parent_form)
            stylelib = loadStyleLib(stylelib_filename)

            data = repgen_system.generate(
                res.loadResourceFile(report_filename),
                db_url,
                sql,
                stylelib=stylelib,
                vars=variables)

            if command:
                command = command.lower()
                if command == DO_COMMAND_PRINT:
                    repgen_system.PrintResult(data)
                elif command == DO_COMMAND_PREVIEW:
                    repgen_system.PreviewResult(data)
                elif command == DO_COMMAND_EXPORT:
                    repgen_system.ConvertResult(data)
                elif command == DO_COMMAND_SELECT:
                    repgen_system.doSelectAction(data)
                else:
                    log.warning(u'Not define command Report System <%s>' %
                                command)
            else:
                repgen_system.save(data)
        return True
    except:
        log.fatal(u'Do report <%s>' % report_filename)
Example #2
0
    def InitRepTemplate(self, report, QueryTab_=None):
        """
        Прочитать данные о шаблоне отчета.
        @param report: Полное описание шаблона отчета.
        @param QueryTab_: Таблица запроса.
        """
        # 1. Прочитать структру отчета
        self._Rep = report
        # 2. Таблица запроса
        self._QueryTab = QueryTab_

        # 3. Скорректировать шаблон для нормальной обработки генератором
        self._Rep = self.RepSQLObj2SQLite(
            self._Rep, res.loadResourceFile(res.icGetTabResFileName()))
Example #3
0
def getReportGeneratorSystem(RepFileName_, ParentForm_=None, bRefresh=True):
    """
    Получить объект системы генерации отчетов.
    @param RepFileName_: Имя файла шаблона отчета.
    @param ParentForm_: Родительская форма, необходима для вывода сообщений.
    @param bRefresh: Указание обновления данных шаблона отчета в генераторе.
    @return: Функция возвращает объект-наследник класса icReportGeneratorSystem. 
        None - в случае ошибки.
    """
    try:
        # Прочитать шаблон отчета
        rep = res.loadResourceFile(RepFileName_, bRefresh=True)

        global REP_GEN_SYS

        # Создание системы ренерации отчетов
        if REP_GEN_SYS is None:
            REP_GEN_SYS = createReportGeneratorSystem(rep['generator'], rep,
                                                      ParentForm_)
            REP_GEN_SYS.RepTmplFileName = RepFileName_
        elif not REP_GEN_SYS.sameGeneratorType(rep['generator']):
            REP_GEN_SYS = createReportGeneratorSystem(rep['generator'], rep,
                                                      ParentForm_)
            REP_GEN_SYS.RepTmplFileName = RepFileName_
        else:
            if bRefresh:
                # Просто установить обновление
                REP_GEN_SYS.setRepData(rep)
                REP_GEN_SYS.RepTmplFileName = RepFileName_

        # Если родительская форма не определена у системы генерации,
        # то установить ее
        if REP_GEN_SYS and REP_GEN_SYS.getParentForm() is None:
            REP_GEN_SYS.setParentForm(ParentForm_)

        return REP_GEN_SYS
    except:
        log.error(
            u'Ошибка определения объекта системы генерации отчетов. Отчет <%s>.'
            % RepFileName_)
        raise
    return None
Example #4
0
def ReportSelect(parent_form=None,
                 report_filename='',
                 report_dir='',
                 db_url=None,
                 sql=None,
                 command=None,
                 stylelib_filename=None,
                 variables=None):
    """
    Функция запускает генератор отчетов с последующим выбором действия.
    @param parent_form: Родительская форма, если не указана,
        то создается новое приложение.
    @param report_filename: Файл отчета.
    @param report_dir: Директорий, где хранятся отчеты.
    @param db_url: Connection string в виде url. Например
        postgresql+psycopg2://postgres:[email protected]:5432/realization.
    @param sql: Запрос SQL.
    @param command: Комманда после генерации. print/preview/export.
    @param stylelib_filename: Файл библиотеки стилей.
    @param variables: Словарь переменных для заполнения отчета.
    @return: Возвращает результат выполнения операции True/False.
    """
    report_filename = getReportResourceFilename(report_filename, report_dir)
    try:
        if not report_filename:
            return ReportViewer(parent_form, report_dir)
        else:
            stylelib = loadStyleLib(stylelib_filename)
            # Если определен отчет, то запустить на выполнение
            repgen_system = report_generator.getReportGeneratorSystem(
                report_filename, parent_form)
            return repgen_system.selectAction(
                res.loadResourceFile(report_filename),
                stylelib=stylelib,
                variables=variables)
        return False
    except:
        log.fatal(u'Report export <%s>' % report_filename)
Example #5
0
def getReportList(ReportDir_, is_sort=True):
    """
    Получить список отчетов.
    @param ReportDir_: Директорий, в котором лежат файлы отчетов.
    @type is_sort: bool.
    @param is_sort: Сортировать список по именам?
    @return: Возвращает список списков следующего формата:
        [
        [полное имя файла/директория отчета,имя отчета/директория,
            описание отчета/директория,None/вложенные объекты,индекс образа],
        .
        .
        .
        ]
        Описание директория берется из файла descript.ion,
        который должен находится в этой же директории.
        Если такой файл не найден, то описание директория - пустое.
        Вложенные объекты список, элементы которого имеют такую же структуру.
    """
    try:
        # Коррекция аргументов
        ReportDir_ = os.path.abspath(os.path.normpath(ReportDir_))

        # Выходой список
        dir_list = list()
        rep_list = list()

        # Сначала обработать под-папки
        sub_dirs = filefunc.getSubDirsFilter(ReportDir_)

        # то записать информацию в выходной список о директории
        img_idx = 0
        for sub_dir in sub_dirs:
            description_file = None
            try:
                description_file = open(sub_dir + '/descript.ion', 'r')
                dir_description = description_file.read()
                description_file.close()
            except:
                if description_file:
                    description_file.close()
                dir_description = sub_dir

            # Для поддиректориев рекурсивно вызвать эту же функцию
            data = [
                sub_dir,
                os.path.basename(sub_dir), dir_description,
                getReportList(sub_dir, is_sort), img_idx
            ]
            dir_list.append(data)
        if is_sort:
            # ВНИМАНИЕ! Сортировка по 3-й колонке
            dir_list.sort(key=lambda i: i[2])

        # Получить список всех файлов
        file_rep_list = [
            filename
            for filename in filefunc.getFilesByExt(ReportDir_, '.rprt')
            if filename[-8:].lower() != '_pkl.rprt'
        ]

        for rep_file_name in file_rep_list:
            # записать данные о этом файле в выходной список
            rep_struct = res.loadResourceFile(rep_file_name, bRefresh=True)
            # Определение образа
            img_idx = 2
            try:
                if rep_struct['generator'][-3:].lower() == 'xml':
                    img_idx = 1
            except:
                log.warning('Error read report type')
            # Данные
            try:
                data = [
                    rep_file_name, rep_struct['name'],
                    rep_struct['description'], None, img_idx
                ]
                rep_list.append(data)
            except:
                log.fatal(u'Ошибка чтения шаблона отчета <%s>' % rep_file_name)
        if is_sort:
            # ВНИМАНИЕ! Сортировка по 3-й колонке
            rep_list.sort(key=lambda i: i[2])

        return dir_list + rep_list
    except:
        # Вывести сообщение об ошибке в лог
        log.fatal(u'Ошибка заполнения информации о файлах отчетов <%s>.' %
                  ReportDir_)