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
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
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
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')
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
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')
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
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
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
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
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
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
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
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
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
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 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> менеджера сканирования' )
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
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
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
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
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
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
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 []
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
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
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
def makeDirs(path): """ Корректное создание каталогов по цепочке. """ try: if not os.path.exists(path): return os.makedirs(path) except: log.fatal(u'Ошибка создания каталога <%s>' % path)
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