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)
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()))
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
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)
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_)