def convert_xml_file2dict(xml_filename, codepage='utf-8'): """ Простая конвертация XML файла в словарь. @param xml_filename: Полное наименование XML файла @param codepage: Кодовая страница XML файла. @return: Словарь, соотыветствующий XML файлу. """ if not os.path.exists(xml_filename): log.warning(u'XML файл не найден <%s>' % xml_filename) return dict() body_xml = ic_extend.load_file_text(xml_filename, 'utf-8') # Перекодировать текст, если надо src_codepage = ic_str.get_codepage(body_xml) if src_codepage and src_codepage.lower() != codepage: log.info(u'Перекодировка XML файла <%s> из <%s> в <%s> кодировку' % (xml_filename, src_codepage, codepage)) body_xml = ic_str.recode_text(body_xml, src_codepage, codepage) elif not src_codepage: log.warning(u'Не возможно определить кодовую страницу XML файла <%s>' % xml_filename) return dict() return convert_xml_text2dict(body_xml, codepage)
def _runPrjCmd(self, AppDir_, PrjPath_, username=None): """ Запуск проекта на исполнение. @param AppDir_: Папка приложения. @param PrjPath_: Папка проекта. @param username: Имя пользователя, запускающего проект. Если не указано (None), то производиться выбор из списка пользователей, присутствующих в проекте. """ import ic.utils.ic_exec as ic_exec ic_exec.CreateRunApp(AppDir_) # Коммандная строка dbg_mode_cmd = '' if username is None: username = self.choiceUsernameDlg() if username is None: log.warning(u'Не определен пользователь запуска проекта') return if self.debug_mode: dbg_mode_cmd = '-dbg' if ic_util.isOSWindowsPlatform(): cmd = '\"%s/python.exe\" \"%s/run.py\" -run %s \"%s/\" -s %s' % ( sys.prefix, AppDir_, dbg_mode_cmd, PrjPath_, username) else: cmd = '%s %s/run.py -run %s %s/ -s %s' % ( sys.executable, AppDir_, dbg_mode_cmd, PrjPath_, username) log.info(u'RUN PROJECT: <%s>' % cmd) ic_exec.RunTask(cmd)
def CreateInitFile(Path_): """ Создает файл __init__.py в директории Path_ если его там нет. @return: Возвращает True, если файл был создан или уже есть. """ if not Path_: return False try: os.makedirs(Path_) except: pass init_file = os.path.join(Path_, '__init__.py') if os.path.isfile(init_file): return True f = None try: f = open(init_file, 'w') f.write(_InitFileDefault) f.close() log.info(u'Создан файл: <%s>.' % init_file) return True except: if f: f.close() log.fatal(u'Ошибка создания модуля %s/__init__.py %s' % Path_) return False
def icPassportListDlg(Win_=None, Prj_=None, Default_=None): """ Выбор списка паспортов выбранных объектов. @param Win_: Ссылка на окно. @param Prj_: Объект проекта. @return: Возвращает список паспортов выбранных объектов или None в случае ошибки. """ dlg = None win_clear = False try: if Win_ is None: id_ = wx.NewId() Win_ = wx.Frame(None, id_, '') win_clear = True dlg = icPassportListDialog(Win_, Prj_, Default_) if dlg.ShowModal() == wx.ID_OK: result = dlg.getPassports() dlg.Destroy() # Удаляем созданное родительское окно if win_clear: Win_.Destroy() log.info(u'<<<PASSPORTS>> <%s> type <%s>' % (result, type(result))) return result finally: if dlg: dlg.Destroy() # Удаляем созданное родительское окно if win_clear: Win_.Destroy() return None
def RunProgramm(Cmd_, Mode_=os.P_NOWAIT): """ Запуск программы на выполнение. @type Cmd_: C{string} @param Cmd_: Комманда системы. @param Mode_: Режим выполнения комманды. См os режимы выполнения. @return: True/False. """ try: parse_args = Cmd_.strip().split(' ') args = [] i = 0 while i < len(parse_args): parse_arg = parse_args[i] if parse_arg[0] == '"' and parse_arg[-1] != '"': while parse_arg[-1] != '"' and i < len(parse_args): i += 1 parse_arg += ' ' + parse_args[i] # Стереть """ if parse_arg[0] == '"': parse_arg = parse_arg[1:] if parse_arg[-1] == '"': parse_arg = parse_arg[:-1] args.append(parse_arg) i += 1 log.info(u'Run programm: %s' % args) os.spawnve(Mode_, args[0], args, os.environ) return True except: log.fatal(u'Run programm error: %s' % Cmd_) return False
def _debugWinPDB_old(self): """ Отладка в WinPDB. """ import ic.utils.ic_exec as ic_exec import sys python_exe = sys.executable winpdb_module = '%s%sLib%ssite-packages%swinpdb.py' % ( sys.prefix, ic_file.PATH_SEPARATOR, ic_file.PATH_SEPARATOR, ic_file.PATH_SEPARATOR) if os.path.exists(winpdb_module): # Если установлен WinPDB prj_path = os.path.dirname(self.getRoot().getPrjFileName()) defis_dir = os.path.dirname(os.path.dirname(prj_path)) ic_exec.CreateRunApp(defis_dir) # Коммандная строка cmd = '\'%s\' \'%s\' -c -t \'%s/run.py\' -run \'%s/\' -s' % ( python_exe, winpdb_module, defis_dir, prj_path) log.info('DEBUG PROJECT: <%s>' % cmd) ic_exec.RunTaskBAT(cmd)
def init_scan_objects(self): """ Инициализация сканируемых объектов. @return: True/False. """ self._scan_classes = dict() # Теги self._scan_tags = self._init_scan_objects(self.getChildrenTags()) # События self._scan_events = self._init_scan_objects(self.getChildrenEvents()) # Аварии self._scan_alarms = self._init_scan_objects(self.getChildrenAlarms()) log.info(u'Информация о сканируемых объектах в <%s>:' % self.getName()) if not self._scan_classes: log.warning(u'\tНе определены классы сканирования') else: log.info(u'\tКлассы сканирования: %s' % [psp[0][1] for psp in self._scan_classes.keys()]) if not self._scan_tags: log.warning(u'\tНе определены сканируемые теги') else: log.info(u'\tСканируемые теги:') self._log_scan_objects(self._scan_tags) if not self._scan_events: log.warning(u'\tНе определены сканируемые события') else: log.info(u'\tСканируемые события:') self._log_scan_objects(self._scan_events) if not self._scan_alarms: log.warning(u'\tНе определены сканируемые аварии') else: log.info(u'\tСканируемые аварии:') self._log_scan_objects(self._scan_alarms)
def run(self): """ Функция основного цикла обработки. """ log.info(u'Запуск цикла обработки <%s>' % self.getName()) self.is_running = False while not self.exit_run: start_tick = time.time() scan_classes_psp = self.get_active_scan_classes_psp(start_tick) # Подготовка тегов для чтения read_tags = self.get_refreshable_tags(*scan_classes_psp) # Чтение тегов self.read_tags(*read_tags) # События self.do_events(*scan_classes_psp) # Аварии self.do_alarms(*scan_classes_psp) # Движок считается запущенным после удачного первого цикла обработки self.is_running = True self.is_running = False log.info(u'Останов цикла обработки <%s>' % self.getName())
def _log_scan_objects(self, scan_dict): """ """ for psp in scan_dict.keys(): log.info(u'\t\tКласс сканирования <%s>' % psp[0][1]) for obj in scan_dict[psp]: log.info(u'\t\t\tОбъект <%s>' % obj.name)
def run_parser(v8unpack_filename, cf_filename, cf_dirname, txt_ctrl=None): """ Запуск парсера на исполнение. @param v8unpack_filename: Полное имя файла парсера. @param cf_filename: Файл CF конфигурации. @param cf_dirname: Папка в которую будет производиться вывод метаобъектов. @param txt_ctrl: Контрол wxTextCtrl для вывода сообщений утилиты парсера. @return: True/False. """ if not os.path.exists(v8unpack_filename): log.warning(u'Файл парсера конфигурации 1С <%s> не найден' % v8unpack_filename) return False # Перед запуском проверить права доступа на запуск утилиты парсера if not os.access(v8unpack_filename, os.X_OK): os.chmod(v8unpack_filename, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO) log.info(u'Установка прав на исполнение для файла: <%s>' % v8unpack_filename) try: cmd = '%s -PARSE "%s" "%s"' % (v8unpack_filename, cf_filename, cf_dirname) log.info(u'RUN COMMAND: <%s>' % cmd) log_console.log_cmd(cmd, txt_ctrl=txt_ctrl) return True except: log.fatal(u'Ошибка выполнения парсинга конфигурационного файла <%s>' % cf_filename) return False
def getPrjRoot(): """ Корневой объект дерева проекта. """ try: kernel = getKernel() if kernel: kernel_prj_root = kernel.GetContext().getPrjRoot() if kernel_prj_root: log.info(u'KERNEL: <%s>\tPROJECT: <%s>' % (kernel, kernel_prj_root)) return kernel_prj_root else: log.warning( u'Не инициализирован проект в контексте ядра системы') # Берем из глобального контекста prj_root = icGet('PRJ_ROOT') if prj_root: return prj_root else: log.warning( u'Не инициализирован проек в хранилище/окружении системы') return None except: log.fatal(u'Ошибка определения корневого элемента дерева')
def Admin(self, ParentForm_=None, Title_=u'Администрирование справочников', MsgTxt_=u'Выберите справочник для редактирования:'): """ Администрирование справочной системы, описываемой данным менеджером. @param ParentForm_: Родительское окно для формы редактирования справочника. """ if ParentForm_ is None: ParentForm_ = ic_user.icGetMainWin() spravs = self.getContainer().getAll().values() choice_str = [ sprav.name + u' - ' + sprav.description if sprav.description else u'' for sprav in spravs ] idx = ic_dlg.icSingleChoiceIdxDlg(ParentForm_, Title_, MsgTxt_, choice_str) if idx >= 0: edit_sprav = spravs[idx] log.info(u'Редактирование справочника: %d %s' % (idx, edit_sprav.name)) try: edit_sprav.Edit(ParentForm_=ParentForm_) except icexceptions.MethodAccessDeniedException: wx.MessageBox( u'У пользователя [%s] нет прав на редактирвоние справочников.' % ic.getCurUserName())
def SaveResourceText(FileName_, Resource_): """ Сохранить ресурс в файле в текстовом формате. @param FileName_: Полное имя ресурсного файла. @Resource_: Словарно-списковая структура спецификации. @return: Возвращает результат выполнения операции True/False. """ f = None try: # Если необходимые папки не созданы, то создать их dir_name = os.path.dirname(FileName_) try: os.makedirs(dir_name) except: pass f = open(FileName_, 'w') text = ic_util.StructToTxt(Resource_) f.write(text) f.close() log.info(u'Файл <%s> сохранен в текстовом формате.' % FileName_) return True except: if f: f.close() log.fatal(u'Ошибка сохраненения файла <%s> в текстовом формате.' % FileName_) return False
def lockRes(ResName_, ResFileName_, ResFileExt_, LockDir_=None): """ Заблокировать ресурс. Имя файла блокировки гонерируется как ИмяРесурса_ИмяФайлаРесурса_РасширениеФайлаРесурса.lck. В файл блокировки записывается информация о владельце блокировки в виде словаря {'computer':Имя хоста с которого заблокировался ресурс}. @param ResName_: Имя ресурса. Если имя ресурса None, то блокируется файл ресурса целиком. @param ResFileName_: Имя файла ресурса. @param ResFileExt_: Расширение файла ресурса/тип ресурса. @param LockDir_: Папка блокировок. """ if LockDir_ is None: LockDir_ = lock.getLockDir() try: os.makedirs(LockDir_) except: pass if ResName_ is None: ResName_ = ResFileName_ lock_file = LockDir_+'/%s_%s_%s%s' % (ResName_.strip(), ResFileName_.strip(), ResFileExt_.strip(), lock.LOCK_FILE_EXT) comp_name = lock.ComputerName() user_name = ic_user.icGet('UserName') log.info(u'Lock resource <%s>' % lock_file) return lock.LockFile(lock_file, u'{\'computer\':\'%s\',\'user\':\'%s\'}' % (comp_name, user_name))
def CreateInitFile(Path_): """ Создает файл __init__.py в директории Path_ если его там нет. @return: Возвращает True, если файл был создан или уже есть. """ if not Path_: return False try: os.makedirs(Path_) except: pass init_file = Path_+'/__init__.py' if os.path.isfile(init_file): return True try: f = None f = open(init_file, 'w') f.write(_InitFileDefault) f.close() log.info(u'File <%s> is created.' % init_file) return True except: log.fatal(u'Create module error: %s/__init__.py' % Path_) if f: f.close() return False
def SaveResourceText(FileName_, Resource_, ToStruct_=False): """ Сохранить ресурс в файле в текстовом формате. @param FileName_: Полное имя ресурсного файла. @param Resource_: Словарно-списковая структура спецификации. @param ToStruct_: Сохранить в структурном виде ресурс? @return: Возвращает результат выполнения операции True/False. """ FileName_ = ic_file.AbsolutePath(FileName_) f = None try: # Если необходимые папки не созданы, то создать их dir_name = os.path.dirname(FileName_) try: os.makedirs(dir_name) except: pass f = open(FileName_, 'w') if ToStruct_: text = ic_util.StructToTxt(Resource_) else: text = str(Resource_) f.write(text) f.close() log.info(u'Resource file <%s> is saved in text format.' % FileName_) return True except: log.fatal(u'Faild save file in text format: %s.' % FileName_) if f: f.close() return False
def SaveResourcePickle(FileName_, Resource_): """ Сохранить ресурс в файле в формате Pickle. @param FileName_: Полное имя ресурсного файла. @param Resource_: Словарно-списковая структура спецификации. @return: Возвращает результат выполнения операции True/False. """ FileName_ = ic_file.AbsolutePath(FileName_) f = None try: # Если необходимые папки не созданы, то создать их dir_name = os.path.dirname(FileName_) try: os.makedirs(dir_name) except: pass f = open(FileName_, 'w') cPickle.dump(Resource_, f) f.close() log.info(u'File <%s> is saved in pickle format.' % FileName_) return True except: log.fatal(u'Faild save file in pickle format: <%s>.' % FileName_) if f: f.close() return False
def CreatePyFile(PyFileName_, PyFileBody_=None): """ Создать файл питоновского модуля. @param PyFileName_: Имя файла *.py. @param PyFileBody_: Тело файла. Если None, то заполняется по умолчанию. @return: Возвращает True, если файл был создан или уже есть. """ if os.path.isfile(PyFileName_): return True try: f = None try: os.makedirs(os.path.dirname(PyFileName_)) except: pass f = open(PyFileName_, 'w') if PyFileBody_ is None: f.write(_PyFileDefault) else: f.write(str(PyFileBody_)) f.close() log.info(u'Module <%s> is created.' % PyFileName_) return True except: log.fatal(u'Create module error: %s' % PyFileName_) if f: f.close() return False
def do_scan_export(self, scan_filename): """ Запуск сканирования документа с сохранением в определенном файле. @param scan_filename: Имя файла скана документа. @return: True/False. """ if os.path.exists(self._scanner_exec_filename): scan_dir = os.path.dirname(scan_filename) file_name = os.path.splitext(os.path.basename(scan_filename))[0] file_type = os.path.splitext( os.path.basename(scan_filename))[1].replace('.', '').upper() cmd = 'python2 %s --scan_dir=%s --file_name=%s --file_type=%s' % ( self._scanner_exec_filename, scan_dir, file_name, file_type) try: log.info(u'Запуск внешней программы <%s>' % cmd) os.system(cmd) return True except: log.fatal( u'Запуск программы <icScanner> в режиме экспорта: <%s>' % cmd) else: log.warning( u'Запускаемый модуль программы <icScanner> : <%s> не найден' % self._scanner_exec_filename) return False
def _new_prj_init_file(self, PrjPath_): """ Создать новый __init__.py файл проекта. """ log.info(_('__init__.py is created in folder %s') % PrjPath_) return ic_file.icCopyFile( os.path.dirname(__file__) + '/prj__init__prototype.py', PrjPath_ + '/__init__.py', False)
def icCloseLocalStorage(): """ Закрывает и сохраняет локальное хранилище. """ global isUserObjectStorage if isUserObjectStorage: isUserObjectStorage.save() isUserObjectStorage.Close() log.info('*** save and close local storage ***')
def createEditorKernel(): """ Создание и регистрация ядра в режиме радактирования. """ from ic.engine import glob # Определить ядро kernel = glob.set_glob_var('KERNEL', icKernel()) log.info(u'[KERNEL] CREATE EDITOR KERNEL <%s>' % kernel.context.__class__) return kernel
def delMyLocks(self): """ Удалить все блокировки. """ # Удалить за собой все блокировки self.unlockResInResEditor() log.info(u'DELETE ALL PROJECT LOCKS <%s>' % self.lock_dir) if self.lock_dir: ic_res.delAllLockRes(self.lock_dir)
def Create(self, passport, parent=None, context=None, *arg, **kwarg): """ Функция создания объекта системы. Объекты системы делятся на два типа: 1) объекты, создаваемые по ресурсному описанию. 2) объекты, создаваемые на основе Python класса. Если расширение файла ресурса 'py', то объект относится ко второму типу; все файлы с другими расширениями описывают объекты первого типа. @type passport: C{icObjectPassport} @param passport: идентификатор описания (паспорт) объекта. @type parent: C{wx.Window} @param parent: Родительское окно. Расширение задает тип ресурса. @rtype: C{icObject} @return: Возвращает созданный объект. """ objType = passport.getDescrType() className = passport.getDescrName() resName, extName = passport.getDescrMod().split('.') subsys = passport.getDescrSubsys() # Картинки создаются отдельно if extName == 'py' and objType in ('wx.StaticBitmap', 'wxStaticBitmap'): path = resource.icGetSysPath() path = '%s/%s/%s' % (path, subsys, passport.getDescrMod()) # Импортируем модуль mod = self.load_source(resName, path) # Создаем объект if hasattr(mod, className): log.info( u'Изображение <%s> загружено из библиотеке образов <%s>' % (className, passport.getDescrMod())) return getattr(mod, className) else: log.warning( u'Изображение <%s> в библиотеке образов <%s> не найдено' % (className, passport.getDescrMod())) elif extName == 'py': return self.createObjByClass(resName, className, extName, parent, subsys, context=context, **kwarg) # Ставим жесткое условие - объект по куску ресурса можно получить только у метаданных elif objType and className and extName == 'mtd': return self.createResObjByPsp(passport, context, parent) else: return self.createObjByRes(resName, className, extName, parent, subsys, context=context, **kwarg)
def createRuntimeKernel(): """ Создание и регистрация ядра в режиме исполнения. """ from ic.engine import icApp from ic.engine import glob # Определить ядро kernel = glob.set_glob_var('KERNEL', icApp.icApp()) log.info(u'[KERNEL] CREATE RUNTIME KERNEL !') return kernel
def outDevice(msg, Device_=IC_CONSOLE): """ Вывод на устройство регистрации специальных сообщений. @type msg: C{string} @param msg: Сообщение об ошибке. @type Device_: C{int} @param Device_: Указание устройства вывода. """ if Device_ & IC_CONSOLE: try: print(msg) except: return False if Device_ & IC_CONSOLE_INFO: try: log.info(msg) except: return False if Device_ & IC_CONSOLE_ERR: try: log.error(msg) except: return False if Device_ & IC_CONSOLE_WARN: try: log.warning(msg) except: return False if Device_ & IC_CONSOLE_DBG: try: log.debug(msg) except: return False if Device_ & IC_FILE: try: log_file = None log_file = open(IC_LOG_FILE_DEFAULT, 'w+') log_file.write(msg) log_file.close() except: if log_file: log_file.close() return False if Device_ & IC_MSG_INFO: import ic.dlg ic.dlg.ic_dlg.icMsgBox(u'ВНИМАНИЕ', msg) if Device_ & IC_MSG_ERR: import ic.dlg ic.dlg.ic_dlg.icErrBox(u'ОШИБКА', msg) return True
def exit(self): """ Выход из проекта. Вызывается при закрытии IDE. """ # Удалить все блокировки при выходе из редактора log.info('PROJECT EXIT') ic_util.print_defis_logo() kernel = ic_user.getKernel() if kernel: kernel.stop() self.logout() self.delMyLocks()
def showPrintDialog(args): app = wx.PySimpleApp() dlg = icPrintDlg(None) dlg.setPrintOptions(args) result = dlg.ShowModal() log.info('Result: %s OK: %s' % (result, wx.OK)) # app.MainLoop() dlg.Destroy() dlg = None return result == wx.OK
def OnImgGridCellChange(self, event): """ Изменение значения ячейки. """ row = event.GetRow() col = event.GetCol() if col == 1: img_grid = self.GetNameObj('ImgLibGrid') new_img_name = img_grid.GetCellValue(row, 1) log.info(u'IMAGE RENAME <%s> -> <%s>' % (self._edit_img_name, new_img_name)) self.renameImg(self._edit_img_name, new_img_name) event.Skip()
def TestComponentResource(res, context, parent, *arg, **kwarg): import ic.components.icResourceParser as prs log.info(u'Тестирование диалогового окна <%s>' % res['name']) testObj = prs.CreateForm('Test', formRes=res, evalSpace=context, parent=parent, bIndicator=False) # Для оконных компонентов надо вызвать метод Show try: if testObj.context['_root_obj']: testObj.context['_root_obj'].SetFocus() testObj.context['_root_obj'].ShowModal() testObj.context['_root_obj'].Destroy() except: log.fatal(u'Ошибка тестирования диалогового окна')