def addImg(self, sImgFileName=None): """ Добавить новый образ в библиотеку. """ if self._img_lib_res.isEmpty(): ic_dlg.icMsgBox(u'ОШИБКА', u'Не определена библиотека образов!', self.getObject()) return None dlg = self.GetNameObj('ImgLibDlg') if sImgFileName is None: sImgFileName = ic_dlg.icImageDlg(dlg, self._img_dir) # Сохранить выбранную папку как папку картинок self.setImgDir(ic_file.DirName(sImgFileName)) self.saveImgDir() if sImgFileName: # Серилизовать и добавить образ self._img_lib_res.addImg(sImgFileName) self._img_lib_res.saveImgLib() # Добавить в словарь образов img_name = ic_file.SplitExt(ic_file.BaseName(sImgFileName))[0] # Заменить все минусы на подчеркивание # иначе в генерирумом фалйе будут имена объектов с минусами (SyntaxisError) img_name = img_name.replace('-', '_') img = ic_bmp.createBitmap(sImgFileName) self._img_dict[img_name] = img return img_name return None
def paste(self, Node_): """ Вставить. @param Node_: Вставляемый узел. """ # Можно вставлять толко модули или другие пакеты if issubclass(Node_.__class__, PrjModule) or \ issubclass(Node_.__class__, PrjPackage): prj_node.PrjNode.paste(self, Node_) mod_name = Node_.getModuleName() mod_path = Node_.getPath() # Есть уже модуль с таким именем? if self.getRoot().prj_res_manager.isModByName(mod_name): ic_dlg.icMsgBox(u'ВНИМАНИЕ!', u'Модуль <%s> уже существует!' % mod_name) return False # Добавить модуль в ресурс проекта Node_.getRoot().prj_res_manager.addModule(mod_name, mod_path) module_file_name = os.path.join(mod_path, mod_name + self.ext) copy_module_file_name = Node_.getCopyModuleName() ok = False if os.path.exists(copy_module_file_name): ok = ic_file.icCopyFile(copy_module_file_name, module_file_name) ic_file.Remove(copy_module_file_name) # Для синхронизации дерева проекта Node_.getRoot().save() return ok return False
def runPublicWizard(Parent_, PrjResFileName_): """ Запуск визарда создания пакета публикации. @param Parent_: Родительское окно. @param PrjResFileName_: Имя ресурса проекта. """ public_maker = zipPublicSystem(ic_file.DirName(PrjResFileName_)) wiz = wizard.Wizard(Parent_, -1, u'Создание пакета публикации', imglib.imgInstallWizard) page = PublicPage(wiz, u'Атрибуты пакета публикации', public_maker) wiz.FitToPage(page) if wiz.RunWizard(page): # Сохранить атрибуты проекта public_maker.setPrjName(page.sizer.evalSpace['_dict_obj']['TextPrjName'].GetValue()) public_maker.setAutoVer(page.sizer.evalSpace['_dict_obj']['AutoVerCheckBox'].GetValue()) public_maker.setPrjVersion(page.sizer.evalSpace['_dict_obj']['TextVersion'].GetValue()) public_maker.setArchivator(page.sizer.evalSpace['_dict_obj']['TextArchiveSys'].GetValue()) public_maker.makeInstallPackage() ic_dlg.icMsgBox(u'ВНИМАНИЕ', u'Создан пакет публикации.') else: ic_dlg.icMsgBox(u'ВЫХОД', u'Выход из визарда создания пакета публикации')
def create(self): """ Функция создания ресурса. """ tree_prj = self.getRoot().getParent() res_editor = tree_prj.res_editor if res_editor: res_name = self.getResName() res_path = self.getResPath() ic_file.MakeDirs(res_path) res_file = self.getResFileName() res_ext = self.getResFileExt() # Если ресурс/папка с таким именем уже есть в проекте, то # не создавать ресурс, а вывести сообщение. if self.getRoot().prj_res_manager.isResByNameANDType( res_name, res_ext): ic_dlg.icMsgBox( u'ВНИМАНИЕ!', u'Ресурс/папка <%s> существует в проекте!' % res_name) return None # Добавить ресурс в ресурс проекта self.getRoot().prj_res_manager.addRes(res_name, res_ext, self._Parent.name) self.getRoot().save() return res_editor.CreateResource(res_name, res_path, res_file, res_ext, copy.deepcopy(self.template), bRecreate=True) return False
def Edit(self, parent=None, bRefreshPrj=True, path=None): """ Открыть окно редактирования пользователей. """ # Если ресурс уже не заблокирован rl = ic.resource_loader path = path or ic_user.icGet('PRJ_DIR')+'/users.acc' if not rl.is_lock_res(path): # Заблокировать ресурс # bAdd=False - признак того, что запись о блокировки при отсутствии объекта # добавлять не надо rl.lock_res(path) # Прочитать ресурс users_res = rl.load_res(path, bRefresh=True) result = self._edit(parent or ic_user.getMainWin(), users_res) if result is not None: # Если нажата <ОК>, то сохранить файл ресурсов rl.save_res(path, result) rl.save_file_res(path, result) # Снять блокировку rl.unlock_res(path) # Сохранить проект, для того чтобы дерево проекта обновилось # в режиме редактирования/конфигурирования if bRefreshPrj: self.refreshPrj() else: # Если ресурс заблокировн, то сообщить кем lock_rec = rl.get_lock_rec(path) ic_dlg.icMsgBox(u'ВНИМАНИЕ!', u'Пользователи в настоящее время редактируются пользователем %s на компьютере %s' % (lock_rec['user'], lock_rec['computer']))
def runDemoWizard(Parent_, PrjResFileName_): """ Запуск визарда создания инсталяционного пакета. @param Parent_: Родительское окно. @param PrjResFileName_: Имя ресурса проекта. """ install_maker = py2exeInstallSystem(os.path.dirname(PrjResFileName_)) wiz = wizard.Wizard(Parent_, -1, u'Создание демо-проекта', imglib.imgInstallWizard) page = DemoPage(wiz, u'Атрибуты демо-проекта', install_maker) wiz.FitToPage(page) if wiz.RunWizard(page): # Сохранить атрибуты проекта install_maker.setPrjName(page.sizer.evalSpace['_dict_obj']['TextPrjName'].GetValue()) install_maker.setPrjTitle(page.sizer.evalSpace['_dict_obj']['TextDiscr'].GetValue()) install_maker.setPrjAuthor(page.sizer.evalSpace['_dict_obj']['TextAuthor'].GetValue()) install_maker.setPrjCopyright(page.sizer.evalSpace['_dict_obj']['TextCopyright'].GetValue()) install_maker.setPrjIcon(page.sizer.evalSpace['_dict_obj']['TextIcon'].GetValue()) install_maker.setConsole(page.sizer.evalSpace['_dict_obj']['ConsoleCheckBox'].GetValue()) install_maker.makeInstallPackage() ic_dlg.icMsgBox(u'ВНИМАНИЕ', u'Создан демо-проект.') else: ic_dlg.icMsgBox(u'ВЫХОД', u'Выход из визарда создания демо-проекта')
def _login_loop(self, User_=None, Password_=None, DBMode_='-s'): """ Цикл входа в систему. @param User_: Имя пользователя. @param Password_: Пароль. @param DBMode_: Режим использования БД. """ login_ok = False login_manager = icUser.icLoginManager() User_, Password_ = login_manager._getAutoLogin(User_, Password_) bAuto = login_manager.IsAutoAuth() while not login_ok: user_data = login_manager.Login(User_, Password_, DBMode_) if user_data is None: break user_name = user_data[ic_dlg.LOGIN_USER_IDX] user_password = user_data[ic_dlg.LOGIN_PASSWORD_IDX] user_password_md5 = user_data[ic_dlg.LOGIN_PASSWORD_MD5_IDX] res = login_manager.GetUserResource(user_name) # Если пользователя с таким именем нет, просим пользователя еще раз ввести # логин и пароль if res is None: User_, Password_ = None, None ic_dlg.icMsgBox(u'Вход в систему', u'Неправильный пользователь или пароль. Доступ запрещен.') else: self._User = self.createObjBySpc(None, res) self._User.setLoginManager(login_manager) try: login_ok = self._User.Login(user_name, user_password, DBMode_, bAutoLogin=bAuto) except icexceptions.LoginInvalidException: bAuto = False User_, Password_ = None, None return login_ok
def CanAuthent(self, Permit_, ResName_, ResType_=ACC_NONE, ShowMsg_=True): """ Функция определяет ограничения на запрашиваемый ресурс. @param Permit_: символ или группа символов, определяющий право доступа на действие. 'u' - использование (ACCESS_USE). 'v' - отображение (ACCESS_VIEW). 'r' - чтение (ACCESS_READ). 'w' - редактирование (ACCESS_EDIT). 'a' - добавление (ACCESS_APPEND). 'd' - удаление (ACCESS_DELETE). @param ResName_: имя ресурса. @param ResType_: тип ресурса, необязательный параметр. Если он не определен, ресурс ищется среди всех типов ресурсов. @param ShowMsg_: флаг, описывающий разрешение на отображения сообщения о заблокированном ресурсе для данного пользователя. Параметр необязателен. По умолчанию сообщение показывается. @return: Возвращает True, если ресурс не ограничен, запрашиваемыми правами доступа, False - ресурс ограничен. """ try: can = True # Если определен тип ресурса, ... # Вывести сообщение if (not can) and ShowMsg_: ic_dlg.icMsgBox( u'Ошибка!', u'Доступ к ресурсу <%s> заблокирован.' % ResName_) return can except: log.fatal(u'Ошибка проверки прав доступа для ресурса')
def buildSubSystemsTree(self, SubSystems_): """ Построить дерево подсистемы в дереве проекта. @param SubSystems_: Список указаний подсистем (<*.pro>[1:]). """ for sub_sys in SubSystems_: # Создать и инициализировать узел импортируемой системы imp_sys_node = PrjImportSys(self) imp_sys_node.Default() imp_sys_node.name = sub_sys['name'] # Путь к подсистеме sub_sys_dir = imp_sys_node.getPathInPrj() if os.path.exists(sub_sys_dir): try: self.addChild(imp_sys_node) # Построить дерево-содержание импортируемой подсистемы imp_sys_node._is_build = False except: io_prnt.outErr(u'Ошибка подключения подсистемы <%s>' % sub_sys_dir) ic_dlg.icMsgBox( u'ОШИБКА', u'Ошибка подключения подсистемы <%s>' % sub_sys_dir) else: ic_dlg.icMsgBox( u'ОШИБКА', u'Не корректный путь к подсистеме <%s>' % sub_sys_dir) # Добавить узел не импортированной подсистемы not_imp_sys_node = PrjNotImportSys(self) not_imp_sys_node.name = sub_sys['name'] # Путь к подсистеме not_sub_sys_dir = not_imp_sys_node.getPathInPrj() self.addChild(not_imp_sys_node) not_imp_sys_node._is_build = True
def property_editor_ctrl(attr, value, propEdt, *arg, **kwarg): """ Стандартная функция контроля. """ if attr in ('node', ): ret = str_to_val_user_property(attr, value, propEdt) if ret: parent = propEdt if not ret[0][0] in ('OPCNode', 'MemoryNode'): ic_dlg.icMsgBox( u'ВНИМАНИЕ!', u'Выбранный объект не является узлом/контроллером SCADA.', parent) return coderror.IC_CTRL_FAILED_IGNORE return coderror.IC_CTRL_OK elif ret in (None, ''): return coderror.IC_CTRL_OK elif attr in ('scan_class', ): ret = str_to_val_user_property(attr, value, propEdt) if ret: parent = propEdt if not ret[0][0] in ('ScanClass', ): ic_dlg.icMsgBox( u'ВНИМАНИЕ!', u'Выбранный объект не является КЛАССОМ СКАНИРОВАНИЯ.', parent) return coderror.IC_CTRL_FAILED_IGNORE return coderror.IC_CTRL_OK elif ret in (None, ''): return coderror.IC_CTRL_OK
def createResClass(self): """ Функция создания ресурсного класса. """ try: self.img = imglib.imgEdtModule self.typ = 'py' res_name = self.getResName() mod_path = self.getParent().getPath() # Создать инит файл, если его нет ic_res.CreateInitFile(mod_path) mod_file = self.getResFileName() mod_ext = self.getResFileExt() # Есть уже модуль с таким именем? if self.getRoot().prj_res_manager.isModByName(mod_file): ic_dlg.icMsgBox(u'ВНИМАНИЕ!', u'Модуль <%s> уже существует!' % mod_file) return False # Добавить модуль в ресурс проекта ok = self.getRoot().getParent().res_editor.CreateResource( res_name, mod_path, mod_file, mod_ext, copy.deepcopy(self.template), bRecreate=True) # Для синхронизации дерева проекта self.getRoot().synchroPrj(Refresh_=True) return ok except: io_prnt.outErr(u'Create resource class error <%s>' % self.name) return None
def getEditFormName(self): """ Форма для редактирования данных справочника. """ edit_form=self.getICAttr('edit_form') if edit_form is None: ic_dlg.icMsgBox(u'ВНИМАНИЕ!', u'В справочнике %s не определена форма редактирования.'%(self.name)) return edit_form
def getChoiceFormName(self): """ Форма для выбора данных справочника. """ choice_form=self.getICAttr('choice_form') if choice_form is None: ic_dlg.icMsgBox(u'ВНИМАНИЕ!', u'В справочнике %s не определена форма выбора.'%(self.name)) return choice_form
def onCodControl(evalSpace): """ Контроль кода. """ try: print('onCodControl START!!!!!!!!!!!!!!!!!!') #onCodControl.func_globals['__builtins__']['locals']().update(evalSpace) #Вытащить глобальные переменные из пространства имен, #иначе они не попадут в локальное пространство имен old_value = evalSpace['old_value'] value = evalSpace['value'] #sprav=evalSpace['sprav'] sprav = evalSpace['OBJ'] #GetInterface=evalSpace['GetInterface'] #GetObject=evalSpace['GetObject'] #Проверка уникальности кода try: new_cod = evalSpace.GetObject('spravTree').getSelectionRecord()[0] except: new_cod = None #Проверка, есть ли подкоды if old_value and sprav.isSubCodes(old_value): ic_dlg.icMsgBox(u'ВНИМАНИЕ!', u'Нельзя изменять значение кода. Есть подкоды.') return (3, None) try: grid = evalSpace.GetInterface('spravGrid').get_grid() except: grid = evalSpace.GetObject('spravGrid') buff_codes = map(lambda rec: rec[0], grid.GetDataset().data)[:-1] ctrl_ret = coderror.IC_CTRL_OK if value in buff_codes: ctrl_ret = coderror.IC_CTRL_FAILED_IGNORE if not ctrl_ret in [coderror.IC_CTRL_OK, coderror.IC_CTRL_REPL]: ic_dlg.icMsgBox(u'ВНИМАНИЕ!', u'Такой код есть уже в справочнике!') return (ctrl_ret, None) # Проверяем по связанному справочнику, если он есть if new_cod == None: new_cod = '' #print '*********** NEW_COD=', new_cod ref_sprav = sprav.getLevelRefSpravByCod(new_cod) if ref_sprav: return ref_sprav.Ctrl(value, field='cod') return (ctrl_ret, None) except: ic_log.icLogErr(u'Ошибка контроля кода справочника.') return (coderror.IC_CTRL_FAILED_IGNORE, None)
def onCodControl(evalSpace): """ Контроль кода. """ try: #Вытащить глобальные переменные из пространства имен, #иначе они не попадут в локальное пространство имен sprav = evalSpace[CONTEXT_SPRAV_NAME] value = evalSpace['value'] tree_grid = evalSpace.GetObject(SPR_TREE_NAME) #Проверка уникальности кода new_cod = tree_grid.get_sel_cod() grid = evalSpace.GetObject(SPR_GRID_NAME) dataset = grid.GetDataset() prev_change_code = dataset.getNameValue('cod') #Проверка, есть ли подкоды print('***** ver prev_change_code:', value, prev_change_code, dataset.cursor) if prev_change_code and sprav.isSubCodes(prev_change_code): ic_dlg.icMsgBox( u'ВНИМАНИЕ!', u'Нельзя изменять значение кода %s. Есть подкоды.' % prev_change_code, evalSpace.GetObject(SPR_TREE_NAME)) return (coderror.IC_CTRL_FAILED_IGNORE, None) buff_codes = [rec['cod'] for rec in dataset.getDataDict()] ctrl_ret = coderror.IC_CTRL_OK if value in buff_codes: ctrl_ret = coderror.IC_CTRL_FAILED_IGNORE if not ctrl_ret in [coderror.IC_CTRL_OK, coderror.IC_CTRL_REPL]: ic_dlg.icMsgBox(u'ВНИМАНИЕ!', u'Код %s есть уже в справочнике!' % value) return (ctrl_ret, None) # Проверяем по связанному справочнику, если он есть if new_cod is None: new_cod = '' ref_sprav = sprav.getLevelRefSpravByCod(new_cod) if ref_sprav: # val = value[len(new_cod):] # crtl_ret = ref_sprav.Ctrl(val, field='cod') # print '****** CTRL VAL$$:', value, new_cod, val, ctrl_ret val = value[len(new_cod):] ref_cod = ''.join(sprav._get_refspr_parent_cod(new_cod)) crtl_ret = ref_sprav.Ctrl(ref_cod + val, field='cod', cod=ref_cod) return crtl_ret return (ctrl_ret, None) except: io_prnt.outErr(u'Ошибка контроля кода справочника.') return (coderror.IC_CTRL_FAILED_IGNORE, None)
def property_editor_ctrl(attr, value, propEdt, *arg, **kwarg): """ Стандартная функция контроля. """ if attr in ('db', ): ret = str_to_val_user_property(attr, value, propEdt) if ret: # parent = propEdt.GetPropertyGrid().GetView() parent = propEdt if not ret[0][0] in ('PostgreSQLDB', 'SQLiteDB'): ic_dlg.icMsgBox(u'ВНИМАНИЕ!', u'Выбранный объект не является БД.', parent) return coderror.IC_CTRL_FAILED_IGNORE return coderror.IC_CTRL_OK else: # Не определена БД parent = propEdt ic_dlg.icMsgBox( u'ВНИМАНИЕ!', u'Свойство <%s> обязательно должно быть определено для этого объекта.' % attr, parent) elif attr in ('init_form', 'edit_form', 'view_form', 'search_form', 'choice_form'): ret = str_to_val_user_property(attr, value, propEdt) if ret: parent = propEdt if not ret[0][0] in ('Dialog', 'Frame', 'Panel', 'ScrolledWindow'): ic_dlg.icMsgBox(u'ВНИМАНИЕ!', u'Выбранный объект не является формой.', parent) return coderror.IC_CTRL_FAILED_IGNORE return coderror.IC_CTRL_OK elif attr in ('prototype', ): ret = str_to_val_user_property(attr, value, propEdt) if ret: parent = propEdt if not ret[0][0] in ('BusinessObj', ): ic_dlg.icMsgBox( u'ВНИМАНИЕ!', u'Выбранный объект не является БИЗНЕС-ОБЪЕКТОМ.', parent) return coderror.IC_CTRL_FAILED_IGNORE return coderror.IC_CTRL_OK elif attr in ('history', ): ret = str_to_val_user_property(attr, value, propEdt) if ret: parent = propEdt if not ret[0][0] in ('ObjHistory', ): ic_dlg.icMsgBox( u'ВНИМАНИЕ!', u'Выбранный объект не является ИСТОРИЕЙ БИЗНЕС-ОБЪЕКТА.', parent) return coderror.IC_CTRL_FAILED_IGNORE return coderror.IC_CTRL_OK
def createStorage(self, ShowMsg_=True): """ Создать хранилище справочников. @param ShowMsg_: Признак отображения предупреждения о неправильно определенном хранилище. """ db_name = self.getDBName() self._storage = None if db_name: path_res = None db_subsys = self.getDBResSubSysName() if db_subsys: path_res = resource.getSubsysPath(db_subsys) db_res = resource.icGetRes(db_name, ext='src', pathRes=path_res, nameRes=db_name) if db_res: try: if db_res['type'] != storesrc.OBJ_STORAGE_SRC_TYPE: # SQL-ная БД self._storage = icspravstorage.icSpravSQLStorage( self, db_name, self.getTableName(), DBSubSys_=db_subsys, TabSubSys_=self.getTabResSubSysName()) elif db_res['type'] == storesrc.OBJ_STORAGE_SRC_TYPE: # Объектная БД from . import icodb_spravstorage self._storage = icodb_spravstorage.icSpravODBStorage( self, db_name, self.getTableName()) else: io_prnt.outWarning( u'ОШИБКА! Не определенный тип БД %s СПРАВОЧНИКА %s' % (db_res['type'], self.getName())) except: io_prnt.outErr( u'Ошибка создания хранилища справочников %s %s' % (db_name, self.getTableName())) else: # База данных не указана, поэтому считаем что по умолчанию # это SQL БД и таблица сама определяет в какой БД ей храниться # SQL-ная БД self._storage = icspravstorage.icSpravSQLStorage( self, None, self.getTableName()) if ShowMsg_ and not self._storage: ic_dlg.icMsgBox( u'ВНИМАНИЕ!', u'Не определено хранилище справочника: %s БД: %s Таблица: %s' % (self.getName(), db_name, self.getTableName())) return self._storage
def _login_loop(self, User_=None, Password_=None, DBMode_='-s'): """ Цикл входа в систему. @param User_: Имя пользователя. @param Password_: Пароль. @param DBMode_: Режим использования БД. """ from ic.dlg import ic_dlg from ic.engine import icUser login_ok = False login_manager = icUser.icLoginManager() User_, Password_ = login_manager._getAutoLogin(User_, Password_) bAuto = login_manager.IsAutoAuth() while not login_ok: user_data = login_manager.Login(User_, Password_, DBMode_, RuntimeMode_=False) if user_data is None: break user_name = user_data[ic_dlg.LOGIN_USER_IDX] user_password = user_data[ic_dlg.LOGIN_PASSWORD_IDX] user_password_md5 = user_data[ic_dlg.LOGIN_PASSWORD_MD5_IDX] res = login_manager.GetUserResource(user_name) if res is None: User_, Password_ = None, None ic_dlg.icMsgBox( u'Вход в систему', u'Неправильный пользователь или пароль. Доступ запрещен.') else: self._User = self.createObjBySpc(None, res) self._User.setLoginManager(login_manager) passwd_md5 = self._User._password_md5(user_password) try: login_ok = self._User.login_ok(user_name, user_password, passwd_md5, DBMode_, RuntimeMode_=False) except icexceptions.LoginInvalidException: if bAuto: bAuto = False User_, Password_ = None, None ic_dlg.icMsgBox( u'Вход в систему', u'Неправильный пользователь или пароль. Доступ запрещен.' ) else: raise return login_ok
def onCodControl(obj): """ Контроль кода.""" try: evalSpace = obj.GetView().context sprav = evalSpace[CONTEXT_SPRAV_NAME] value = evalSpace['value'] #Проверка уникальности кода try: new_cod = evalSpace.GetObject( SPR_TREE_NAME).getSelectionRecord()[0] except: new_cod = None grid = evalSpace.GetObject(SPR_GRID_NAME) dataset = grid.GetDataset() prev_change_code = grid.getNameValue( 'cod') #dataset.getNameValue('cod') #Проверка, есть ли подкоды if prev_change_code and sprav.isSubCodes(prev_change_code): ic_dlg.icMsgBox( u'ВНИМАНИЕ!', u'Нельзя изменять значение кода <%s>. Есть подкоды.' % prev_change_code, evalSpace.GetObject(SPR_TREE_NAME)) return (coderror.IC_CTRL_FAILED_IGNORE, None) buff_codes = [rec['cod'] for rec in dataset.getDataDict()] ctrl_ret = coderror.IC_CTRL_OK if value in buff_codes: ctrl_ret = coderror.IC_CTRL_FAILED_IGNORE if not ctrl_ret in [coderror.IC_CTRL_OK, coderror.IC_CTRL_REPL]: ic_dlg.icMsgBox(u'ВНИМАНИЕ!', u'Код %s есть уже в справочнике!' % value) return (ctrl_ret, None) # Проверяем по связанному справочнику, если он есть if new_cod is None: new_cod = '' ref_sprav = sprav.getLevelRefSpravByCod(new_cod) if ref_sprav: val = value[len(new_cod):] ref_cod = ''.join(_get_refspr_parent_cod(sprav, new_cod)) crtl_ret = ref_sprav.Ctrl(ref_cod + val, field='cod', cod=ref_cod) # print '****** CTRL VAL$$1:', val, ref_cod, ctrl_ret # print '****** CTRL VAL$$2:', ctrl_ret, type(ctrl_ret) return crtl_ret return (ctrl_ret, None) except: #ic_log.icLogErr(u'Ошибка контроля кода справочника.') return io_prnt.outErr('Code control Error!') return (coderror.IC_CTRL_FAILED_IGNORE, None)
def edit(self): """ Редактирование модуля. """ # Определяем имя модуля py_name = self.getModuleName() py_dir = self.getModulePath() py_file = os.path.join(py_dir, py_name + self.ext) # Определяем IDE ide = self.getRoot().getParent().ide if ide is None: io_prnt.outWarning( u'Не определен IDE для редактрования модуля <%s>' % py_file) io_prnt.outLog(u'Используется внешний редактор модулей Python') ide = ext_python_editor.icExtPythonEditor() if ide: # Сначала разблокировать все модули self.getRoot().unlockAllPyFilesInIDE() if ide.IsOpenedFile(py_file): ide.CloseFile(py_file) else: parent_pack = os.path.basename(py_dir) # Если модуль заблокирован, # тогда открыть его только для просмотра if ic_res.isLockRes(self.name, parent_pack, 'py', self.getRoot().lock_dir): lock_rec = ic_res.getLockResRecord(self.name, parent_pack, 'py', self.getRoot().lock_dir) ic_dlg.icMsgBox( u'ВНИМАНИЕ!', u'Ресурс <%s> заблокирован пользователем <%s>. Компьютер: <%s>.' % (self.name, lock_rec['user'], lock_rec['computer'])) self.readonly = True else: # Заблокировать файл ic_res.lockRes(self.name, parent_pack, 'py', self.getRoot().lock_dir) # Условие открытия в редакторе ресурса if self.isResClass(py_file): self.getRoot().getParent().res_editor.SetResource(self.name, py_dir, self.name, 'py', bEnable=True) return ide.OpenFile(py_file, True, readonly=self.readonly) return False
def property_editor_ctrl(attr, value, propEdt, *arg, **kwarg): """ Стандартная функция контроля. """ if attr in ('db', ): ret = str_to_val_user_property(attr, value, propEdt) if ret: parent = propEdt if not ret[0][0] in ('PostgreSQLDB', 'SQLiteDB'): ic_dlg.icMsgBox(u'ВНИМАНИЕ!', u'Выбранный объект не является БД.', parent) return coderror.IC_CTRL_FAILED_IGNORE return coderror.IC_CTRL_OK
def extend(self): """ Дополнительные инструменты узла. """ # Данном случае проверка связи с БД yes = ic_dlg.icAskBox(u'Поверить связь с БД?') if yes: from ic.db import icsqlalchemy res = self.getMyRes() db_url = icsqlalchemy.createDBUrl(res) check_connect = icsqlalchemy.checkDBConnect(db_url) msg = u'Связь с БД <%s> успешно установлена' % db_url if check_connect else u'Нет связи с БД <%s>' % db_url ic_dlg.icMsgBox(u'Проверка связи с БД', msg)
def rename(self, OldName_, NewName_): """ Переименование ресурса. @param OldName_: Старое имя ресурса. @param NewName_: Новое имя ресурса. """ new_name = NewName_.lower() old_name = OldName_.lower() if new_name != NewName_ or OldName_ != old_name: ic_dlg.icMsgBox( u'ВНИМАНИЕ!', u'All table, field and link name must be in lower case') return PrjResource.rename(self, old_name, new_name)
def property_editor_ctrl(attr, value, propEdt, *arg, **kwarg): """ Стандартная функция контроля. """ if attr in ('table', ): ret = str_to_val_user_property(attr, value, propEdt) if ret: parent = propEdt.GetPropertyGrid().GetView() if not ret[0][0] in ('Table', ): ic_dlg.icMsgBox(u'ВНИМАНИЕ!', u'Выбранный объект не является ТАБЛИЦЕЙ.', parent) return coderror.IC_CTRL_FAILED_IGNORE return coderror.IC_CTRL_OK
def property_editor_ctrl(attr, value, propEdt, *arg, **kwarg): """ Стандартная функция контроля. """ if attr in ('sprav',): ret = str_to_val_user_property(attr, value, propEdt) if ret: parent = propEdt if not ret[0][0] in ('Sprav',): ic_dlg.icMsgBox(u'ВНИМАНИЕ!', u'Выбранный объект не является Справочником.', parent) return coderror.IC_CTRL_FAILED_IGNORE return coderror.IC_CTRL_OK elif ret in (None, ''): return coderror.IC_CTRL_OK
def property_editor_ctrl(attr, value, propEdt, *arg, **kwarg): """ Стандартная функция контроля. """ if attr in ('content', ): ret = str_to_val_user_property(attr, value, propEdt) if ret: parent = propEdt.GetPropertyGrid().GetView() if not ret[0][0] in ('Panel', 'ScrolledWindow', 'Notebook', 'SplitterWindow'): ic_dlg.icMsgBox( u'ОШИБКА РЕДАКТИРОВАНИЯ', u'Выбранный объект не является главным окном.', parent) return coderror.IC_CTRL_FAILED_IGNORE return coderror.IC_CTRL_OK
def edit(self): """ Запуск ресурса на редактирование. """ tree_prj = self.getRoot().getParent() res_editor = tree_prj.res_editor if res_editor: res_name = self.getResName() res_path = self.getResPath() ic_file.MakeDirs(res_path) res_file = self.getResFileName() res_ext = self.getResFileExt() self.getRoot().unlockResInResEditor(res_editor) if not self.readonly: is_lock = ic_res.isLockRes(res_name, res_file, res_ext, self.getRoot().lock_dir) if not is_lock: # Если ресурс не заблокирован, то заблокировать его # и отдать на редактирование ic_res.lockRes(res_name, res_file, res_ext, self.getRoot().lock_dir) return res_editor.SetResource(res_name, res_path, res_file, res_ext, bEnable=True) else: lock_rec = ic_res.getLockResRecord(res_name, res_file, res_ext, self.getRoot().lock_dir) ic_dlg.icMsgBox( u'ВНИМАНИЕ!', u'Resource <%s> is locked by user <%s>. Computer: <%s>.' % (res_name, lock_rec['user'], lock_rec['computer'])) # Открыть только для чтения self.readonly = True return res_editor.SetResource(res_name, res_path, res_file, res_ext, bEnable=False) else: return res_editor.SetResource(res_name, res_path, res_file, res_ext, bEnable=False) return None
def createUser(self, UserName_='new_user'): """ Создание нового пользователя в структуре. @param UserName_: Имя пользователя. @return: Возвращает результат выполнения операции True/False. """ if self._user_res is None: self._user_res = {} if UserName_ in self._user_res: ic_dlg.icMsgBox(u'ВНИМАНИЕ!', u'Пользователь <%s> уже существует!' % UserName_) return False else: self._user_res[UserName_] = self.newDefaultUser(UserName_) return True
def CopyDefender(self): """ Функция проверки защиты от копирования. """ # Если проверка защиты отключена, тогда все ок и не проверять if not COPY_DEFENDER_ON: return True hdd_sn = ic_util.GetHDDSerialNo() reg_hdd_sn = ic_util.GetRegValue('Software\\DEFIS\\HDD', 'SerialNo') if hdd_sn == reg_hdd_sn: return True ic_dlg.icMsgBox( u'Вход в систему', u'Не зарегестрированная копия. Вход в систему не возможен.') return False
def refreshSubSystems(self): """ Обновление подсистем. """ sub_systems = self.getRoot().prj_res_manager.getImportSystems() prj_dir = os.path.dirname( os.path.dirname(self.getRoot().getPrjFileName())) try: ic_dlg.icOpenProgressDlg(None, u'Обновление подсистем', u'Обновление подсистем', 0, len(sub_systems)) for i_sub_sys in range(len(sub_systems)): sub_sys_dir = os.path.dirname(sub_systems[i_sub_sys]['path']) ic_dlg.icUpdateProgressDlg( i_sub_sys, _('Refreshing') + ': ' + sub_sys_dir) if (not os.path.isdir(sub_sys_dir)) or ( not os.path.exists(sub_sys_dir)): ic_dlg.icMsgBox( u'ОШИБКА', u'Не корректный путь к подсистеме <%s>' % sub_sys_dir) continue if (not os.path.isdir(prj_dir)) or ( not os.path.exists(prj_dir)): ic_dlg.icMsgBox( u'ОШИБКА', u'Не корректный путь к проекту <%s>' % prj_dir) continue self._copySubSysDir(sub_sys_dir, prj_dir) # Обновить дерево пользовательских компонентов io_prnt.outLog(u'<<<Init Objects Info >>>') ic_user.refreshImports() tree_prj = self.getParentRoot().getParent() tree_prj.res_editor.CloseResource() tree_prj.res_editor.InitObjectsInfo(bRefresh=True) ic_dlg.icCloseProgressDlg() except: io_prnt.outErr(u'Ошибка обновления подсистем') ic_dlg.icCloseProgressDlg() return False # Обновить дерево проекта self.getRoot().synchroPrj(True) return True