Exemple #1
0
def XmlFile2Dict(XMLFileName_):
    """
    Функция конвертации файлов Excel в xml формате в словарь Python.
    @param XMLFileName_: Имя xml файла. 
    @return: Функция возвращает заполненный словарь, 
        или None в случае ошибки.
    """
    xml_file = None
    try:
        xml_file = open(XMLFileName_, 'r')

        input_source = xmlreader.InputSource()
        input_source.setByteStream(xml_file)
        xml_reader = xml.sax.make_parser()
        xml_parser = icXML2DICTReader()
        xml_reader.setContentHandler(xml_parser)
        # включаем опцию namespaces
        xml_reader.setFeature(xml.sax.handler.feature_namespaces, 1)
        xml_reader.parse(input_source)
        xml_file.close()

        return xml_parser.getData()
    except:
        if xml_file:
            xml_file.close()
        info = sys.exc_info()[1]
        log.fatal(u'Ошибка чтения файла <%s> : <%s>.' % (XMLFileName_, info))
        return None
    def _getReportParameters(self, Rep_=None):
        """
        Запустить генератор отчета.
        @param Rep_: Шаблон отчета.
        @return: Возвращает словарь параметров. {'Имя параметра отчета':Значение параметра отчета}.
        """
        try:
            if Rep_ is not None:
                self._Rep = Rep_
            else:
                Rep_ = self._Rep

            # 1. Получить параметры запроса отчета
            query = Rep_['query']
            if query is not None:
                if self._isQueryFunc(query):
                    query = self._execQueryFunc(query)
                else:
                    query = ic_exec.ExecuteMethod(query, self)
                
            return query
        except:
            # Вывести сообщение об ошибке в лог
            log.fatal(u'Ошибка определения параметров отчета %s.' % Rep_['name'])
            return None
Exemple #3
0
 def _initSumCell(self, cell):
     """
     Инициализация суммарной ячейки.
     @param cell: Описание ячейки.
     @return: Возвращает скоррекстированное описание ячейки.
         В случае ошибки возвращает старое описание ячейки.
     """
     try:
         cell = cell
         # Проверка на преобразование типов
         cell_val = cell['value']
         if cell_val is not None and not isinstance(cell_val, str):
             cell_val = str(cell_val)
         parsed_fmt = self.funcStrParse(cell_val, [REP_SYS_PATT])
         # Перебрать строки функционала
         for cur_func in parsed_fmt['func']:
             # Системная функция
             if re.search(REP_SYS_PATT, cur_func):
                 # Функция суммирования
                 if cur_func[2:6].lower() in ('sum(', 'avg('):
                     # Если данные суммирующей ячейки не инициализированы, то
                     if cell['sum'] is None:
                         cell['sum'] = []
                     # Проинициализировать данные суммарной ячейки
                     cell['sum'].append(copy.deepcopy(IC_REP_SUM))
                     cell['sum'][-1]['formul'] = cur_func[6:-3].replace(
                         REP_SUM_FIELD_START,
                         'record[\'').replace(REP_SUM_FIELD_STOP, '\']')
         return cell
     except:
         # Вывести сообщение об ошибке в лог
         log.fatal(u'Ошибка инициализации ячейки <%s>.' % cell)
         return cell
Exemple #4
0
def icBitmapType(filename):
    """
    Get the type of an image from the file's extension ( .jpg, etc. )
    """
    if filename == '':
        return None

    try:
        name, ext = os.path.splitext(filename)
        ext = ext[1:].upper()
        if ext == 'BMP':
            return wx.BITMAP_TYPE_BMP
        elif ext == 'GIF':
            return wx.BITMAP_TYPE_GIF
        elif ext == 'JPG' or ext == 'JPEG':
            return wx.BITMAP_TYPE_JPEG
        elif ext == 'PCX':
            return wx.BITMAP_TYPE_PCX
        elif ext == 'PNG':
            return wx.BITMAP_TYPE_PNG
        elif ext == 'PNM':
            return wx.BITMAP_TYPE_PNM
        elif ext == 'TIF' or ext == 'TIFF':
            return wx.BITMAP_TYPE_TIF
        elif ext == 'XBM':
            return wx.BITMAP_TYPE_XBM
        elif ext == 'XPM':
            return wx.BITMAP_TYPE_XPM

    except:
        log.fatal(u'FILE ERROR:')

    return None
Exemple #5
0
    def NewByOffice(self, dst_path=None):
        """
        Создание нового отчета средствами LibreOffice Calc.
        @param dst_path: Результирующая папка, в которую будет помещен новый файл.
        """
        try:
            src_filename = DEFAULT_REP_TMPL_FILE
            new_filename = dlg.getTextInputDlg(
                self._ParentForm, u'Создание нового файла',
                u'Введите имя файла шаблона отчета')
            if os.path.splitext(new_filename)[1] != '.ods':
                new_filename += '.ods'

            if dst_path is None:
                # Необходимо определить результирующий путь
                dst_path = dlg.getDirDlg(self._ParentForm, u'Папка хранения')
                if not dst_path:
                    dst_path = os.getcwd()

            dst_filename = os.path.join(dst_path, new_filename)
            if os.path.exists(dst_filename):
                if dlg.getAskBox(u'Заменить существующий файл?'):
                    shutil.copyfile(src_filename, dst_filename)
            else:
                shutil.copyfile(src_filename, dst_filename)

            cmd = OFFICE_OPEN_CMD_FORMAT % dst_filename
            log.debug(u'Command <%s>' % textfunc.toUnicode(cmd))
            os.system(cmd)

            return True
        except:
            # Вывести сообщение об ошибке в лог
            log.fatal(u'New report template by LibreOffice Calc')
Exemple #6
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
Exemple #7
0
def SetFilter(dataset, flt=None):
    """
    Устанавливаем фильтр на нужный объект данных.
        
    @type dataset: C{icSQLObjDataset}
    @param dataset: Объект индексного доступа к классу данных.
    @type filter: C{string | dictionary}
    @param filter: Фильтр, накладываемый на класс данных.
    """
    try:
        real_name = dataset.name

        #   Если буфер заполнен, то необходимо запросить потверждение на
        #   обновление данных и обновить данные. В противном случае изменения
        #   будут потеряны
        if dataset.isChangeRowBuff() and MsgBox(
                None, u'Сохранить изменения?',
                style=wx.YES_NO | wx.ICON_QUESTION) == wx.ID_YES:
            dataset.update()

        dataset.FilterFields(flt)

        #   Уведомляем другие компоненты формы о том, что состояние объекта данных могло измениться
        for key, obj in dataset.evalSpace['_has_source'].items():
            try:
                dataset.evalSpace['_has_source'][key].UpdateViewFromDB(
                    real_name)

                #   Обновляем связанные гриды
                dataset.evalSpace['_has_source'][key].UpdateDataView(real_name)
            except:
                pass
    except:
        log.fatal(u'SetFilter Error')
Exemple #8
0
def ReadLockRecord(LockFile_):
    """
    Прочитать запись блокировки из файла блокировки.
    @param LockFile_: Имя файла блокировки.
    @return: Возвращает запись блокировки или None в случае ошибки.
    """
    f = None
    try:
        lock_file = None
        lock_rec = None
        # На всякий случай преобразовать
        lock_file = ic_file.SplitExt(LockFile_)[0] + LOCK_FILE_EXT
        # Если файла не существует, тогда и нечего прочитать
        if not ic_file.Exists(lock_file):
            return None
        # Открыть для чтения
        f = os.open(lock_file, os.O_RDONLY, 0777)
        lock_rec = os.read(f, 65535)
        os.close(f)
        try:
            # Если храниться какая-либо структура,
            # то сразу преобразовать ее
            return eval(lock_rec)
        except:
            return lock_rec
    except:
        if f:
            os.close(f)
        log.fatal(u'Чтение записи блокировки %s' % lock_file)
        return None
Exemple #9
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
Exemple #10
0
def icIniLoadParam(INIFileName_, ParamName_):
    """
    Чтение параметра из файла настроек.
    @param INIFileName_: Полное имя файла настроек.
    @param ParamName_: Имя параметра.
    @return: Возвращает значение параметра или 
        None(если параметра нет или ошибка).
    """
    ini_file = None
    try:
        param = None
        ini_file = open(INIFileName_, 'r')
        row = None  # Текущая считанная из файла строка
        while row != '':
            row = ini_file.readline()
            name_value = re.split(r'=', row)
            if name_value[0] == ParamName_:
                param = name_value[1]
                break
        ini_file.close()
        # Убрать символ перевода каретки
        if param[-1] == '\n':
            param = param[:-1]
        return param
    except:
        if ini_file:
            ini_file.close()
        log.fatal()
        return None
Exemple #11
0
def icCopyFile(FileName_, NewFileName_, Rewrite_=True):
    """
    Создает копию файла с новым именем.
    @param FileName_: Полное имя файла.
    @param NewFileName_: Новое имя файла.
    @param Rewrite_: True-если новый файл уже существует,
        то переписать его молча. False-если новый файл уже существует,
        то выдать сообщение о подтверждении перезаписи файла.
    @return: Возвращает результат выполнения операции True/False.
    """
    try:
        # --- Проверка существования файла-источника ---
        if not os.path.isfile(FileName_):
            MsgBox(u'Файл %s не существует.' % FileName_,
                   u'Ошибка копирования файла.')
            return False

        # --- Проверка перезаписи уже существуещего файла ---
        # Выводить сообщение что файл уже существует?
        if not Rewrite_:
            MsgBox(u'Файл %s существует.' % NewFileName_,
                   u'Ошибка копирования файла.')
            return False

        # --- Реализация копирования файла ---
        MakeDirs(DirName(NewFileName_))
        shutil.copyfile(FileName_, NewFileName_)
        return True
    except:
        log.fatal(u'Ошибка копирования файла <%s> в <%s>' %
                  (FileName_, NewFileName_))
        return False
Exemple #12
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
Exemple #13
0
def getICObjectResource(path):
    """
    Возвращает ресурсное описание и имя класса системного объекта.
    """
    try:
        #   Импортируем модуль
        mod = util.icLoadSource('modulRes', path)
        res = mod.resource

        #   Читаем имя класса
        try:
            className = mod.ic_class_name
        except:
            className = 'icObjectClass'

        #   Читаем версию
        try:
            version = mod.__version__
        except:
            version = (1, 0, 0, 1)

        del mod

        if isinstance(res, dict):
            return res, className, version
    except:
        log.fatal(u'Import Error modul=<%s>' % path)

    return None, None, None
Exemple #14
0
 def _getData(self, Rows_):
     """
     Получить данные.
     """
     try:
         data = list()
         i_rec = 0
         for row in Rows_:
             rec = list()
             
             # Отслеживание пустых участков
             if 'Index' in row:
                 idx = int(row['Index'])
                 if idx > i_rec:
                     data += [[]]*(idx-i_rec)
             # Заполнение записи
             for cell in row['children']:
                 cell_data = None
                 if 'value' in cell['children'][0]:
                     cell_data = cell['children'][0]['value']
                 rec.append(cell_data)
                 
             data.append(rec)
             i_rec = len(data)
             
         return data
     except:
         # Вывести сообщение об ошибке в лог
         log.fatal(u'Ошибка определения данных отчета.')
         return None
Exemple #15
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
Exemple #16
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
Exemple #17
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)
Exemple #18
0
    def show_scan_error_msg(self, err_msg=u''):
        """
        Функция отображения ошибок сканирования.
        @param err_msg: Сообщение об ошибке.
        """
        log.error(u'ОШИБКА СКАНИРОВАНИЯ. %s' % err_msg)

        try:
            import wx
            from ic.std.dlg import dlg

            app = wx.GetApp()
            if not app:
                app = wx.PySimpleApp()
                dlg.getErrBox(u'ОШИБКА СКАНИРОВАНИЯ', err_msg, parent=None)
                app.MainLoop()
            else:
                dlg.getErrBox(u'ОШИБКА СКАНИРОВАНИЯ',
                              err_msg,
                              parent=app.GetTopWindow())
        except:
            # Если не отобразим сообщение об ошибке, то процесс
            # сканирования не должен остановиться
            log.fatal(
                u'Ошибка в функиции <show_scan_error_msg> менеджера сканирования'
            )
Exemple #19
0
def setKey(evalSpace, key, obj, cod_access=None):
    """
    Функция добавляет объект в пространство имен.
    
    @param evalSpace: Пространство имен формы.
    @type evalSpace: C{dictionary}
    @param key: Ключ в пространстве имен.
    @type key: C{string}
    @param obj: Объект, который надо добавить.
    @param cod_access: Код доступа на изменение значения ключа.
    @rtype: C{bool}
    @return: Возвращает признак успешного добавления.
    """
    if '_access_keys' not in evalSpace:
        evalSpace['_access_keys'] = {}

    akey = evalSpace['_access_keys']
    try:
        if key not in akey.keys() or (key in akey.keys()
                                      and cod_access == akey[key]):
            if cod_access != CODE_NOBODY or (cod_access == CODE_NOBODY
                                             and key not in evalSpace):
                evalSpace[key] = obj

            if cod_access is not None:
                evalSpace['_access_keys'][key] = cod_access

            return True
    except:
        log.fatal(u'ERROR setKey')

    return False
Exemple #20
0
 def _genGrpFooter(self, RepGrp_):
     """
     Генерация примечания группы.
     @param RepGrp_: Словарь IC_REP_GRP, описывающий группу.
     @return: Возвращает результат выполнения операции True/False.
     """
     try:
         band = RepGrp_['footer']
         if not band:
             return False
         # Добавлять будем в конец отчета,
         # поэтому опреелить максимальную строчку
         max_row = len(self._Rep['sheet'])
         i_row = 0  # Счетчик строк бэнда
         cur_height = 0
         # Перебрать все ячейки бэнда
         for row in range(band['row'], band['row'] + band['row_size']):
             for col in range(band['col'], band['col'] + band['col_size']):
                 if self._TemplateSheet[row][col]:
                     self._genCell(self._TemplateSheet, row, col, self._Rep,
                                   max_row + i_row, col, RepGrp_['old_rec'])
                     cur_height = self._TemplateSheet[row][col]['height']
             i_row += 1
             # Увеличить текущую координату Y
             self._cur_top += cur_height
         return True
     except:
         # Вывести сообщение об ошибке в лог
         log.fatal(u'Ошибка генерации примечания группы <%s> отчета <%s>.' %
                   (RepGrp_['field'], self._RepName))
         return False
Exemple #21
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
Exemple #22
0
    def scan(self, scan_filename=None):
        """
        Сканировать документ и сохранить его в файл.
        @param scan_filename: Имя файла скана.
            Если имя файла не указано, то происходит сканирование и
            возвращается объект PIL.Image.
        @return: Имя файла скана или объект PIL.Image.
            None - в случае ошибки.
        """
        try:
            image = self.scan_device_obj.snap()

            if scan_filename:
                # Сохранить в указанный файл
                image.save(scan_filename)
                return scan_filename
            # Не сохраняем в файл. Нам нужен объект образа сканирования.
            return image
        except:
            log.fatal(u'Ошибка сканирования')

            # Так отображаем ошибки сканирования
            trace_txt = traceback.format_exc()
            if DOC_FEEDER_JAMMED_ERR in trace_txt:
                self.show_scan_error_msg(u'Застревание документа в лотке подачи бумаги')

        return None
Exemple #23
0
def glue_pdf_files(out_pdf_filename, *pdf_filenames):
    """
    Процедура склеивания/объединения PDf файлов в один.
    @param out_pdf_filename: Полное наименование результирующего PDF файла.
    @param pdf_filenames: Список имен файлов-источников.
        Объединение происходит в порядке указанном списком pdf_filenames.
        Если какой либо файл отсутствует, то объединение происходит без него.
    @return: True - объединение прошло успешно / False - ошибка по какой-либо причине.
    """
    try:
        merger = PyPDF2.PdfFileMerger()
        filenames = [
            filename for filename in pdf_filenames
            if filename.lower().endswith('.pdf') and os.path.exists(filename)
        ]
        for filename in filenames:
            pdf_file = open(filename, 'rb')
            log.debug(u'Объединение PDF файла <%s> => <%s>' %
                      (filename, out_pdf_filename))
            reader = PyPDF2.PdfFileReader(pdf_file)
            merger.append(reader)

        out_pdf_filename = os.path.abspath(out_pdf_filename)
        if os.path.exists(out_pdf_filename):
            log.info(u'Удаление файла <%s>' % out_pdf_filename)
            try:
                os.remove(out_pdf_filename)
            except:
                log.fatal(u'Ошибка удаления файла <%s>' % out_pdf_filename)
        log.debug(u'Запись результирующего файла <%s>' % out_pdf_filename)
        merger.write(out_pdf_filename)
        return True
    except:
        log.fatal(u'Ошибка склеивания/объединения PDF файлов')
    return False
Exemple #24
0
def copyDir(src_directory, dst_directory, bReWrite=False, bAddDir=True):
    """
    Функция папку src_directory в папку dst_directory со всеми внутренними поддиректориями
    и файлами.
    @param src_directory: Папка/директория,  которая копируется.
    @param dst_directory: Папка/директория, в которую копируется src_directory.
    @param bReWrite: Указание перезаписи директории,
        если она уже существует.
    @param bAddDir: Указание производить дополнение папки,
        в случае ко когда копируемые файлы/папки существуют.
    @return: Функция возвращает результат выполнения операции True/False.    
    """
    try:
        to_dir = os.path.join(dst_directory, os.path.basename(src_directory))
        if os.path.exists(to_dir) and bReWrite:
            log.info(u'Удаление папки <%s>' % to_dir)
            shutil.rmtree(to_dir, 1)
        if os.path.exists(to_dir) and bAddDir:
            return addCopyDir(src_directory, to_dir)
        else:
            log.info(u'Копировние папки <%s> в <%s>' % (src_directory, to_dir))
            shutil.copytree(src_directory, to_dir)
        return True
    except:
        log.fatal(u'Ошибка копирования папки из <%s> в <%s>' % (src_directory, dst_directory))
        return False
Exemple #25
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 []
Exemple #26
0
def _addCopyDirWalk(args, cur_dir, cur_names):
    """
    Функция рекурсивного обхода при добавлении папок и файлов в существующую.
    @param cur_dir: Текущая обрабатываемая папка.
    @param CurName_: Имена файлов и папок в текущей обрабатываемой папке.
    """
    from_dir = args[0]
    to_dir = args[1]
    not_copy_filter = args[2]
    
    if _pathFilter(cur_dir, not_copy_filter):
        paths = [os.path.join(cur_dir, name) for name in cur_names if name not in not_copy_filter]
        for path in paths:
            to_path = path.replace(from_dir, to_dir)
            if not os.path.exists(to_path):
                # Копировать если результирующего файла/папки не существует
                if os.path.isfile(path):
                    # Скопировать файл
                    copyFile(path, to_path)
                elif os.path.isdir(path):
                    # Создать директорию
                    try:
                        os.makedirs(to_path)
                    except:
                        log.fatal(u'Ошибка создания папки <%s>' % to_path)
                        raise
Exemple #27
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
Exemple #28
0
def ic_import(dict_names, evalSpace={}, isDebug=False):
    """
    Функция формирует пространство имен выражений.
    
    @param dict_names: Словарь описания пространства имен. Пример: C{"{'ic.dlg.msgbox':['MsgBox','']}"}
    @type dict_names: C{dictionary}
    @param evalSpace: Пространство имен формы.
    @type evalSpace: C{dictionary}
    @param isDebug: Признак режима отладки. В режиме отладки, модули каждый раз
        перегружаются, поскольку они могут измениться - пользователь мог их отредактировать.
    @type isDebug: C{bool}
    @rtype: C{bool}
    @return: Возвращает признак успешного выполнения.
    """
    if not dict_names:
        return False

    for key in dict_names:
        try:
            # --- Загрузка модуля -----------------------------------------------
            #   В режиме отладки, модули каждый раз перегружаем, поскольку они
            #   могут измениться - пользователь мог их отредактировать.
            if isDebug:
                try:
                    if not key[:3] == 'ic.':
                        pass
                except:
                    pass

                exec 'import %s' % str(key)
            else:
                exec 'import %s' % str(key)

            nm = ''

            # -------------------------------------------------------------------
            #   Пытаемся загрузить имена в наше пространство имен
            try:
                evalSpace[key.split('.')[-1]] = sys.modules[key]

                for nm in dict_names[key]:

                    #   Грузим все имена, кроме тех, которые начинаются с '_'
                    if nm == '*':
                        AddAttrSpace(sys.modules[key], evalSpace)
                        break
                    else:
                        evalSpace[nm] = getattr(sys.modules[key], nm)

            except:
                log.fatal(u'Ошибка импортирования имени <%s> в модуле <%s>' %
                          (nm, key))
                return False

        except:
            log.fatal(u'Ошибка импортирования модуля <%s>' % key)
            return False

    return True
Exemple #29
0
def makeDirs(path):
    """
    Корректное создание каталогов по цепочке.
    """
    try:
        if not os.path.exists(path):
            return os.makedirs(path)
    except:
        log.fatal(u'Ошибка создания каталога <%s>' % path)
Exemple #30
0
def setDayDT(DateTime_, Day_=1):
    """
    Установить первой дату объекта dete.
    """
    try:
        return datetime.date(DateTime_.year, DateTime_.month, Day_)
    except:
        log.fatal(u'ERROR in ic_time.setDayDT')
        return None