Example #1
0
def icOctHexString(String_, Code_):
    """
    Закодировать строку в восьмеричном/шестнадцатеричном виде.
        Символы с кодом < 128 не кодируются.
    @param String_:
    @param Code_: Кодировка 'OCT'-восьмеричное представление.
                            'HEX'-шестнадцатеричное представление.
    @return: Возвращает закодированную строку.
    """
    try:
        if Code_.upper() == 'OCT':
            fmt = '\\%o'
        elif Code_.upper() == 'HEX':
            fmt = '\\x%x'
        else:
            # Ошибка аргументов
            log.warning(u'Функция icOctHexString: Ошибка аргументов.')
            return None
        # Перебор строки по символам
        ret_str = ''
        for char in String_:
            code_char = ord(char)
            # Символы с кодом < 128 не кодируются.
            if code_char > 128:
                ret_str += fmt % code_char
            else:
                ret_str += char
        return ret_str
    except:
        log.fatal()
        return None
Example #2
0
def getFilesByMask(file_mask):
    """
    Список файлов по маске.
    @param file_mask: Маска файлов. Например C:\Temp\*.dbf.
    @return: Возвращает список строк-полных путей к файлам.
        В случае ошибки None.
    """
    try:
        if isinstance(file_mask, str):
            dir_path = os.path.dirname(file_mask)
            if os.path.exists(dir_path):
                filenames = glob.glob(pathname=file_mask, recursive=False)
                return [os.path.abspath(file_name) for file_name in filenames]
            else:
                log.warning(u'Не найден путь <%s> для определения списка файлов по маске <%s>' % (dir_path, file_mask))
        elif isinstance(file_mask, tuple) or isinstance(file_mask, list):
            filenames = list()
            for file_mask in file_mask:
                filenames = glob.glob(pathname=file_mask, recursive=False)
                filenames += [os.path.abspath(file_name) for file_name in filenames]
            return filenames
        else:
            log.warning(u'Не поддерживаемый тип аргумента в функции getFilesByMask')
    except:
        log.fatal(u'Ошибка определения списка файлов по маске <%s>' % str(file_mask))
    return []
Example #3
0
def getReportResourceFilename(report_filename='', report_dir=''):
    """
    Получить полное имя файла шаблона отчета.
    @param report_filename: Имя файла отчета в кратком виде.
    @param report_dir: Папка отчетов.
    @return: Полное имя файла отчета.
    """
    # Проверить расширение
    rprt_filename = report_filename
    if not rprt_filename.endswith(DEFAULT_REPORT_FILE_EXT):
        rprt_filename = os.path.splitext(
            rprt_filename)[0] + DEFAULT_REPORT_FILE_EXT

    # Проверить актуальность шаблона
    full_src_filename = getPathFilename(report_filename, report_dir)
    full_rprt_filename = getPathFilename(rprt_filename, report_dir)
    if isNewReportTemplateFile(full_src_filename, full_rprt_filename):
        # Если исходный шаблон изменен позже чем рабочий файл шаблона <rprt>
        # то необходимо сделать изменения
        updateReportTemplateFile(full_src_filename, full_rprt_filename)

    if os.path.exists(rprt_filename):
        # Проверить может быть задано абсолютное имя файла
        filename = rprt_filename
    else:
        # Задано скорее всего относительное имя файла
        # относительно папки отчетов
        filename = full_rprt_filename
        if not os.path.exists(filename):
            # Нет такого файла
            log.warning(u'Файл шаблона отчета <%s> не найден' %
                        textfunc.toUnicode(filename))
            filename = createReportResourceFile(filename)
    log.debug(u'Полное имя файла шаблона <%s>' % textfunc.toUnicode(filename))
    return filename
Example #4
0
    def GenerateReport(self, Rep_=None):
        """
        Запустить генератор отчета.
        @param Rep_: Шаблон отчета.
        @return: Возвращает сгенерированный отчет или None в случае ошибки.
        """
        try:
            if Rep_ is not None:
                self._Rep = Rep_

            # 1. Получить таблицу запроса
            query_tbl = self.getQueryTbl(self._Rep)
            if not query_tbl or not query_tbl['__data__']:
                if not config.get_glob_var('NO_GUI_MODE'):
                    if dlg.getAskBox(
                            u'Внимание',
                            u'Нет данных, соответствующих запросу: %s. Продолжить генерацию отчета?'
                            % self._Rep['query']):
                        return None
                else:
                    log.warning(
                        u'Пустая таблица запроса. Продолжение генерации.')
                query_tbl = self.createEmptyQueryTbl()

            # 2. Запустить генерацию
            rep = icrepgen.icReportGenerator()
            data_rep = rep.generate(self._Rep, query_tbl)

            return data_rep
        except:
            # Вывести сообщение об ошибке в лог
            log.fatal(u'Ошибка генерации отчета <%s>.' % self._Rep['name'])
        return None
Example #5
0
 def setExtOptions(self, **options):
     """
     Установить дополнительные опции.
     @param options: Словарь опций.
     """
     log.debug(u'Опции сканирования: %s' % options)
     if options:
         if 'scanner' in options:
             self.scanner = options.get('scanner', None)
         if 'source' in options:
             self.scan_source = options.get('source', None)
         if 'mode' in options:
             self.scan_mode = options.get('mode', None)
         if 'is_multi_scan' in options:
             self.is_multi_scan = options.get('is_multi_scan', None)
         if 'is_preview' in options:
             self.is_preview = options.get('is_preview', None)
         if 'page_size' in options:
             self.page_size = options.get('page_size', None)
         if 'area' in options:
             self.scan_area = options.get('area', None)
         if 'scan_dir' in options:
             self.scan_dir = options.get('scan_dir', None)
         if 'file_name' in options:
             self.scan_filename = options.get('file_name', None)
         if 'file_type' in options:
             self.scan_filetype = options.get('file_type', None)
         if 'depth' in options:
             self.depth = options.get('depth', None)
         if 'ext_scan_cmd' in options:
             self.ext_scan_cmd = options.get('ext_scan_cmd', None)
     else:
         log.warning(u'Не определены опции сканирования для установки')
Example #6
0
 def _findWorksheetData(self, XMLFileName_=None, SheetName_=None):
     """
     Найти данные указанного листа.
     @param XMLFileName_: Имя XML файла книги. Если не определено,
     то имеется ввиду активная книга.
     @param SheetName_: Имя листа в указанной книге. Если не указано,
     то имеется ввиду первый лист.
     """
     # Определить книгу
     workbook_data = self._findWorkbookData(XMLFileName_)
     if workbook_data is None:
         return None
     # Определить лист
     worksheet_data = [
         data for data in workbook_data['children']
         if data['name'] == 'Worksheet'
     ]
     if worksheet_data:
         if SheetName_ is None:
             worksheet_data = worksheet_data[0]
         else:
             worksheet_data = [
                 data for data in worksheet_data
                 if data['Name'] == SheetName_
             ]
             if worksheet_data:
                 worksheet_data = worksheet_data[0]
             else:
                 log.warning('Worksheet <%s> not found' % SheetName_)
                 return None
     else:
         log.warning('Worksheets in <%s> not defined' % XMLFileName_)
         return None
     return worksheet_data
Example #7
0
def IniParamNames(INIFileName_, Section_):
    """
    Имена параметров в секции.
    @param INIFileName_: Полное имя файла настроек.
    @param Section_: Имя секции.
    @return: Возвращает список имен параметров в секции или None в случае ошибки.
    """
    ini_file = None
    try:
        if not os.path.isfile(INIFileName_):
            log.warning(u'Файл конфигурации %s не найден.' % INIFileName_)
            return None

        # Создать объект конфигурации
        ini_parser = ConfigParser.ConfigParser()
        ini_file = open(INIFileName_, 'r')
        ini_parser.readfp(ini_file)
        ini_file.close()

        # Если такой секции нет
        if not ini_parser.has_section(Section_):
            return []
        # Количество параметров в секции
        return ini_parser.options(Section_)
    except:
        if ini_file:
            ini_file.close()
        log.fatal()
        return None
Example #8
0
    def _getTagBandRow(self, Rows_, Row_):
        """
        Определить тег бенда, к которому принадлежит строка.
        @param Rows_: Список строк.
        @param Row_: Номер строки.
        @return: Строка-тег бэнда или None  в случае ошибки.
        """
        try:
            row = Rows_[Row_]
            # Проверка корректности описания строки
            if 'children' not in row or not row['children']:
                log.warning(u'WARNING. _getTagBandRow function <%s>' % row)
                return self.__cur_band
            i_tag = self._getTagBandIdx(Rows_)

            # ВНИМАНИЕ! Если колонки тегов бендов нет в шаблоне
            # то считаем что весь шаблон это шапка отчета
            # Используется для простого заполнения тегами
            if not self._existTagBand():
                self.__cur_band = HEADER_TAG
            else:
                if i_tag > 0:
                    i_tag, tag_value = self._findTagBandRow(row)
                    if i_tag >= 0:
                        # Если тег найден, то взять его
                        self.__cur_band = tag_value

            return self.__cur_band
        except:
            log.fatal(u'ERROR. _getTagBandRow function')
            return None
Example #9
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 #10
0
def getFilesByExt(path, ext):
    """
    Функция возвращает список всех файлов в директории с указанным расширением.
    @param path: Путь.
    @param ext: Расширение, например '.pro'.
    @return: В случае ошибки возвращает None.
    """
    file_list = None
    try:
        path = getCurDirPrj(path)
        if not os.path.exists(path):
            log.warning(u'Путь <%s> не найден для определения списка файлов директории по расширению' % path)
            return list()

        if ext[0] != '.':
            ext = '.' + ext
        ext = ext.lower()
            
        file_list = [os.path.join(path, file_name) for file_name in os.listdir(path)]
        file_list = [file_name for file_name in file_list if os.path.isfile(file_name) and
                     (os.path.splitext(file_name)[1].lower() == ext)]
        return file_list
    except:
        log.fatal(u'Ошибка чтения списка файлов <ext=%s, path=%s, list=%s>' % (ext, path, file_list))
    return None
Example #11
0
 def isDuplexOption(self):
     """
     Проверка включена ли опция дуплекса.
     @return: True/False.
     """
     options = self.options
     if options:
         try:
             if 'source' in options:
                 # Проверка по выставленным опциям
                 scan_source_opt = options['source']
             else:
                 # Проверка по опциям устройства
                 dev_options = self.getScanOptionsDict()
                 scan_source = dev_options['source']
                 scan_source_opt = scan_source[8][scan_source[4]]
             return 'Duplex' in scan_source_opt
         except:
             log.fatal(
                 u'Ошибка определения вкл. опции сканирования дуплекс')
     else:
         log.warning(
             u'Не определены опции сканирования. Дуплекс отключен по умолчанию'
         )
     return False
Example #12
0
 def _imageDrawCanvas(self,
                      image,
                      canvas,
                      n,
                      page_size=DEFAULT_IMAGE_PAGE_SIZE):
     """
     Вывести отсканированую страницу на PDF холст.
     @param image: Объект образа отсканированной страницы.
     @param canvas: Объект PDF холста.
     @param n: Номер страницы.
     @param page_size: Размер страницы в точках,
         к которому будут приводиться все отсканированные страницы.
     @return: True/False.
     """
     if image:
         img_filename = os.path.join(ic_file.getHomeDir(),
                                     MULTISCAN_PAGE_FILENAME % n)
         width, height = page_size
         image = image.resize((int(width), int(height)))
         image.save(img_filename)
         canvas.drawImage(img_filename, 0, 0)
         canvas.showPage()
         return True
     else:
         log.warning(
             u'Ошибка записи сканированой страницы [%d] в PDF файл' % n)
     return False
Example #13
0
 def setScanOptions(self, **options):
     """
     Установить опции сканирования
     @param options: Значения опций.
     @return: True - все прошло удачно / False - ошибка.
     """
     try:
         global SCAN_OPTIONS_ORDER
         for option_name in SCAN_OPTIONS_ORDER:
             if option_name in options:
                 option_val = options[option_name]
                 try:
                     setattr(self.scan_device_obj, option_name, option_val)
                     log.info(
                         u'Установка опции сканирования <%s>. Значение <%s>'
                         % (option_name, option_val))
                     # Запомнить выставленные значения опций
                     # Может быть так что устанавливаем опции в устройстве
                     # а они по не понятной причине не выставляются:-(
                     self.options[option_name] = option_val
                 except:
                     log.warning(
                         u'Ошибка установки опции сканирования <%s>. Значение <%s>'
                         % (option_name, option_val))
         return True
     except:
         log.fatal(u'Ошибка установки опций сканирования')
     return False
Example #14
0
    def delWorksheet(self, XMLFileName_=None, SheetName_=None):
        """
        Удалить безвозвратно лист.
        @param XMLFileName_: Имя XML файла книги. Если не определено,
        то имеется ввиду активная книга.
        @param SheetName_: Имя листа в указанной книге. Если не указано,
        то имеется ввиду первый лист.
        @return: True-лист удален, False-лист по какойто причине не удален.
        """
        XMLFileName_ = self._unificXMLFileName(XMLFileName_)

        SheetName_ = self._unicode2str(SheetName_)

        # Определить книгу
        workbook_data = self._findWorkbookData(XMLFileName_)
        if workbook_data is None:
            log.warning('Workbook <%s> not found' % XMLFileName_)
            return False
        # Найти и удалить лист
        result = False
        for i, data in enumerate(workbook_data['children']):
            if data['name'] == 'Worksheet':
                if SheetName_ is None:
                    # Если имя листа не определено, то просто удалить первый попавшийся лист
                    del workbook_data['children'][i]
                    result = True
                    break
                else:
                    # Если имя листа определено, то проверить на соответствие имен листов
                    if data['Name'] == SheetName_:
                        log.info('Delete <%s> worksheet' % SheetName_)
                        del workbook_data['children'][i]
                        result = True
                        break
        return result
Example #15
0
 def _findWorkbookData(self, XMLFileName_=None):
     """
     Найти данные указанной книги.
     @param XMLFileName_: Имя XML файла книги. Если не определено,
     то имеется ввиду активная книга.
     """
     # Определить книгу
     if XMLFileName_ is None:
         workbook_data = self._data
     else:
         xml_file_name = os.path.abspath(XMLFileName_)
         try:
             workbook_data = self._workbooks[xml_file_name]
         except KeyError:
             log.error('Workbook <%s> not registered in <%s>' %
                       (xml_file_name, self._workbooks.keys()))
             raise
     workbook_data = [
         data for data in workbook_data['children']
         if 'name' in data and data['name'] == 'Workbook'
     ]
     if workbook_data:
         workbook_data = workbook_data[0]
     else:
         log.warning('Workbook in <%s> not defined' % XMLFileName_)
         return None
     return workbook_data
Example #16
0
    def Edit(self, RepFileName_=None):
        """
        Редактирование отчета.
        @param RepFileName_: Полное имя файла шаблона отчета.
        """
        # Создание связи с ActiveX
        rprt_file_name = os.path.abspath(RepFileName_)
        rep = ic_res.LoadResource(rprt_file_name)
        report_dir = os.path.abspath(ic.engine.ic_user.icGet('REPORT_DIR'))
        rep_file = os.path.abspath(rep['generator'], report_dir)
        
        reportman_designer_key = ic_util.GetRegValue('Software\\Classes\\Report Manager Designer\\shell\\open\\command', None)
        if reportman_designer_key:
            reportman_designer_run = reportman_designer_key.replace('\'%1\'', '\'%s\'') % rep_file
            cmd = 'start %s' % reportman_designer_run
            log.debug(u'Запуск команды ОС: <%s>' % cmd)
            # и запустить Report Manager Designer
            os.system(cmd)
        else:
            msg = u'Не определен дизайнер отчетов Report Manager Designer %s' % reportman_designer_key
            log.warning(msg)
            ic_dlg.icWarningBox(u'ВНИМАНИЕ!', msg)

        # Определить файл *.xml
        xml_file = os.path.normpath(os.path.abspath(os.path.splitext(RepFileName_)[0]+'.xml'))
        cmd = 'start excel.exe \'%s\'' % xml_file
        log.debug(u'Запуск команды ОС: <%s>' % cmd)
        # и запустить MSExcel
        os.system(cmd)
Example #17
0
def icCopyFilesByMask(fromMask, toMask, Rewrite_=True, bDelImage=False):
    """
    Копирует файлы по маске. Пример: "C:\WRK\p*.dbf" -> "Y:\WRK\pkt*.dbf"

    @type fromMask: C{string}
    @param fromMask: Маска, задающая файлы, которые надо копировать.
    @type toMask: C{string}
    @param toMask:Маска задает, куда надо копировать файлы.
    @type bDelImage: C{bool}
    @param bDelImage: Признак удаления образа файла. Если True - аналог переноса
    файлов с переименованием.
    """
    fileList = []

    fromMask = util.icUpper(fromMask.replace('\\', '/'))
    toMask = toMask.replace('\\', '/')
    dirName = '/'.join(fromMask.split('/')[:-1])
    #   Регулярное выражение для сравнения
    rm = re.compile(
        fromMask.replace('.', '\\.').replace('*', '.*').replace('$', '\\$'))
    ml1 = fromMask.split('*')
    ml2 = toMask.split('*')

    if os.path.isdir(dirName):
        #   Определяем список файлов
        dir_list = os.listdir(dirName)

        for indx, fl in enumerate(dir_list):
            path, fileName = os.path.split(fl)

            #   Определяем расширение файла
            try:
                ext = fileName.split('.')[1]
            except:
                ext = None

            fn = util.icUpper(dirName + '/' + fl)

            # Если очередное имя не является именем директории и удовлетворяет
            # шаблону, то соответствующий файл копируется в нужное место.
            if not os.path.isdir(fn) and truth(rm.match(fn)):
                #   Определяем новое имя файла
                copyName = fn
                for i, s in enumerate(ml2):
                    if i < len(ml1):
                        if ml1[i] and s:
                            copyName = copyName.replace(ml1[i], s)
                    else:
                        break

                log.info(u'Copy file %s -> %s' % (fn, copyName))
                if icCopyFile(fn, copyName, Rewrite_) and bDelImage:
                    Remove(fn)
                    log.info(u'Delete file <%s>' % fn)
    else:
        log.warning(u'Dir <%> didn\'t find' % dirName)
Example #18
0
 def selectAction(self, report=None, *args, **kwargs):
     """
     Запуск генерации отчета с последующим выбором действия.
     @param report: Полное описание шаблона отчета.
     """
     ods_rep_file_name = self._genODSReport(report, *args, **kwargs)
     if ods_rep_file_name and os.path.exists(ods_rep_file_name):
         return self.doSelectAction(ods_rep_file_name)
     else:
         log.warning(u'Файл отчета <%s> не существует' % ods_rep_file_name)
Example #19
0
def Dict2Ini(Dict_, INIFileName_):
    """
    Представление/запись словаря в виде INI файла.
    @param Dict_: Исходный словарь.
    @param INIFileName_: Полное имя файла настроек.
    @return: Возвращает результат сохранения True/False.
    """
    ini_file = None
    try:
        if not Dict_:
            log.warning(u'Не верно определен исходный словарь: %s' % Dict_)
            return False

        ini_file_name = ic_file.Split(INIFileName_)
        path = ini_file_name[0]
        filename = ini_file_name[1]
        if not ic_file.IsDir(path):
            ic_file.MakeDirs(path)

        # Если ини-файла нет, то создать его
        if not ic_file.Exists(INIFileName_):
            ini_file = open(INIFileName_, 'w')
            ini_file.write('')
            ini_file.close()

        # Создать объект конфигурации
        ini_parser = ConfigParser.ConfigParser()
        ini_file = open(INIFileName_, 'r')
        ini_parser.readfp(ini_file)
        ini_file.close()

        # Прописать словарь в объекте конфигурации
        for section in Dict_.keys():
            # Вдруг в качестве ключей числа или т.п.
            section_str = str(section)
            # Если нет такой секции, то создать ее
            if not ini_parser.has_section(section_str):
                ini_parser.add_section(section_str)

            for param in Dict_[section].keys():
                ini_parser.set(section_str, str(param),
                               str(Dict_[section][param]))

        # Сохранить и закрыть файл
        ini_file = open(INIFileName_, 'w')
        ini_parser.write(ini_file)
        ini_file.close()

        return True
    except:
        if ini_file:
            ini_file.close()
        log.fatal()
        return False
Example #20
0
def exec_code(sCode='', bReImport=False, name_space=None, kwargs=None):
    """
    Выполнить блок кода.
    @type sCode: C{string}
    @param sCode: Блок кода.
        Блок кода - строка в формате:
            ИмяПакета.ИмяМодуля.ИмяФункции(аргументы).
    @type bReImport: C{bool}
    @param bReImport: Переимпортировать модуль функции?
    @type name_space: C{dictionary}
    @param name_space: Пространство имен.
    @type kwargs: C{dictionary}
    @param kwargs: Дополнительные аргументы функции.
    """
    result = None

    # Подготовить пространство имен
    if name_space is None or not isinstance(name_space, dict):
        name_space = {}

    func_import = sCode.split('(')[0].split('.')
    func_mod = '.'.join(func_import[:-1])

    if bReImport:
        unLoadSource(func_mod)

    # Импортирование модуля
    if func_mod:
        import_str = 'import ' + func_mod
        try:
            exec import_str
        except:
            log.error(u'Import module error <%s>' % import_str)
            raise

    # Добавить локальное пространство имен
    name_space.update(locals())

    if kwargs:
        if isinstance(kwargs, dict):
            name_space.update(kwargs)
        else:
            log.warning(
                u'Не поддерживаемый тип <%s> дополнительных аргументов функции <%s>'
                % (type(kwargs), sCode))

    # Выполнение функции
    try:
        result = eval(sCode, globals(), name_space)
    except:
        log.error(u'Execute function error <%s>' % sCode)
        raise

    return result
Example #21
0
 def OpenOffice(self, ODSFileName_):
     """
     Открыть.
     @param ODSFileName_: Имя ods файла, содержащего сгенерированный отчет.
     """
     if ODSFileName_ and os.path.exists(ODSFileName_):
         cmd = 'libreoffice %s&' % ODSFileName_
         log.info('Command <%s>' % cmd)
         os.system(cmd)
     else:
         log.warning(u'Открытие. Файл <%s> не найден' % ODSFileName_)
Example #22
0
 def PrintOffice(self, ODSFileName_):
     """
     Печать отчета с помощью CALC.
     @param ODSFileName_: Имя ods файла, содержащего сгенерированный отчет.
     """
     if ODSFileName_ and os.path.exists(ODSFileName_):
         cmd = 'libreoffice -p %s&' % ODSFileName_
         log.info(u'Command <%s>' % cmd)
         os.system(cmd)
     else:
         log.warning(u'Печать. Файл <%s> не найден.' % ODSFileName_)
Example #23
0
 def _parseQueryTag(self, Rep_, ParseRow_):
     """
     Разбор заголовочного тега запроса.
     @param Rep_: Шаблон отчета.
     @param ParseRow_: Разбираемая строка шаблона отчета в виде списка.
     """
     try:
         Rep_['query'] = ParseRow_[0]['children'][0]['value']
     except:
         Rep_['query'] = None
         log.warning(u'Не указан запрос!')
Example #24
0
 def _parseDataSrcTag(self, Rep_, ParseRow_):
     """
     Разбор заголовочного тега источника даных.
     @param Rep_: Шаблон отчета.
     @param ParseRow_: Разбираемая строка шаблона отчета в виде списка.
     """
     try:
         Rep_['data_source'] = ParseRow_[0]['children'][0]['value']
     except:
         Rep_['data_source'] = None
         log.warning(u'Не указан источник данных!')
Example #25
0
    def Update(self, RepTemplateFileName_=None):
        """
        Обновить шаблон отчета в системе генератора отчетов.
        @param RepTemplateFileName_: Имя файла шаблона отчета.
            Если None, то должен производиться запрос на выбор этого файла.
        @return: Имя файла файла шаблона или None в случае ошибки.
        """
        if RepTemplateFileName_ is None:
            filename = dlg.getFileDlg(
                self._ParentForm, u'Выберите шаблон отчета:',
                u'Microsoft Excel 2003 XML (*.xml)|*.xml|Электронные таблицы ODF (*.ods)|*.ods',
                self.getReportDir())
        else:
            filename = os.path.abspath(os.path.normpath(RepTemplateFileName_))

        if os.path.isfile(filename):

            # Конвертация
            log.debug(u'Начало конвертации <%s>' % filename)
            tmpl_filename = None
            template = None
            if os.path.exists(
                    os.path.splitext(filename)[0] + DEFAULT_TEMPLATE_EXT):
                tmpl_filename = os.path.splitext(
                    filename)[0] + DEFAULT_TEMPLATE_EXT
                template = icreptemplate.icODSReportTemplate()
            elif os.path.exists(
                    os.path.splitext(filename)[0] + ODS_TEMPLATE_EXT):
                tmpl_filename = os.path.splitext(
                    filename)[0] + ODS_TEMPLATE_EXT
                template = icreptemplate.icODSReportTemplate()
            elif os.path.exists(
                    os.path.splitext(filename)[0] + XLS_TEMPLATE_EXT):
                tmpl_filename = os.path.splitext(
                    filename)[0] + XLS_TEMPLATE_EXT
                template = icreptemplate.icXLSReportTemplate()
            elif os.path.exists(
                    os.path.splitext(filename)[0] + XML_TEMPLATE_EXT):
                tmpl_filename = os.path.splitext(
                    filename)[0] + XML_TEMPLATE_EXT
                template = icreptemplate.icExcelXMLReportTemplate()
            else:
                log.warning(u'Not find report template for <%s>' % filename)
            if template:
                rep_template = template.read(tmpl_filename)
                new_filename = os.path.splitext(
                    filename)[0] + DEFAULT_REPORT_TEMPLATE_EXT
                res.saveResourcePickle(new_filename, rep_template)
            log.info(u'Конец конвертации')
            return new_filename
        else:
            log.warning(u'Не найден файл источника шаблона <%s>' % filename)
        return None
Example #26
0
    def getReportDir(self):
        """
        Папка отчетов.
        """
        if self._report_dir is None:
            if self._ParentForm:
                self._report_dir = os.path.abspath(
                    self._ParentForm.GetReportDir())
            else:
                log.warning(u'Не определена папка отчетов!')
                self._report_dir = ''

        return self._report_dir
Example #27
0
 def getGeneratorType(self):
     """
     Тип системы генерации отчетов.
     """
     my_generator_type = self._Rep.get('generator',
                                       None) if self._Rep else None
     if my_generator_type is None:
         log.warning(
             u'Не удалось определить тип системы генерации отчетов в <%s>' %
             self.__class__.__name__)
     elif type(my_generator_type) in (str, unicode):
         my_generator_type = my_generator_type.lower()
     return my_generator_type
Example #28
0
def getHomePath():
    """
    Путь к домашней директории.
    @return: Строку-путь до папки пользователя.
    """
    os_platform = platform.uname()[0].lower()
    if os_platform == 'windows':
        home_path = os.environ['HOMEDRIVE'] + os.environ['HOMEPATH']
        home_path = home_path.replace('\\', '/')
    elif os_platform == 'linux':
        home_path = os.environ['HOME']
    else:
        log.warning(u'Not supported OS platform <%s>' % os_platform)
        return None
    return os.path.normpath(home_path)
Example #29
0
def loadResource(FileName_):
    """
    Получить ресурс в ресурсном файле.
    @param FileName_: Полное имя ресурсного файла.
    """
    # Сначала предположим что файл в формате Pickle.
    struct = loadResourcePickle(FileName_)
    if struct is None:
        # Но если он не в формате Pickle, то скорее всего в тексте.
        struct = loadResourceText(FileName_)
    if struct is None:
        # Но если не в тексте но ошибка!
        log.warning(u'Ошибка формата файла %s.' % FileName_)
        return None
    return struct
Example #30
0
    def loadOptions(self, sFileName=None):
        """
        Загрузить параметры сканирования из конфигурационного файла.
        @param sFileName: Имя файла параметров.
        """
        if sFileName is None:
            sFileName = self.genOptFileName()

        ini_dict = ic_ini.Ini2Dict(sFileName)
        if ini_dict:
            self.setExtOptions(**ini_dict['SCAN_OPTIONS'])
        else:
            log.warning(
                u'Параметры сканирования не загружены из конфигурационного файла'
            )