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 (icsqlalchemy.TABLE_TYPE, ): ic_dlg.icWarningBox(u'ОШИБКА', u'Выбранный объект не является таблицей.') return coderror.IC_CTRL_FAILED_IGNORE try: kernel = ic_user.getKernel() res = propEdt.GetResEditor().GetResource() my_db_psp = res['source'] if my_db_psp: my_db_psp = icobject.icObjectPassport(*my_db_psp) res = kernel.getResByPsp(ret) link_db_psp = res['source'] if link_db_psp: link_db_psp = icobject.icObjectPassport(*link_db_psp) if my_db_psp != link_db_psp: ic_dlg.icWarningBox( u'ОШИБКА', u'ВНИМАНИЕ! Связанные таблицы должны находиться в одной БД.' ) return coderror.IC_CTRL_FAILED_IGNORE except: io_prnt.outErr(u'Ошибка контроля вводимого значения %s : %s' % (attr, value)) return ret
def addPage(self, Page_, Title_, Select_=False, Image_=None, not_dublicate=True): """ Добавить страницу. @param Page_: Страница-объект наследник wx.Window. @param Title_: Заголовок страницы. @param Select_: Выбирается по умолчанию эта страница? @param Image_: Файл образа или сам образ в заголовке страницы. @param not_dublicate: Не открывать страницу с таким же именем? """ if Page_ is None: log.warning(u'Не определена страница для добавления в главный нотебук') return if not_dublicate: # Запретить открытие страницы с таким же заголовком page_titles = [page['title'] for page in self.getPages()] if Title_ in page_titles: msg = u'Страница <%s> уже открыта' % Title_ log.warning(msg) Page_.Destroy() ic_dlg.icWarningBox(u'ВНИМАНИЕ!', msg) return None # У объекта страницы поменять хозяина # Чтобы органайзер синхронно переразмеривался с главным окном if Page_.GetParent() != self: log.debug(u'Смена родителя <%s> страницы <%s>' % (Page_.GetParent(), Page_.__class__.__name__)) Page_.Reparent(self) return self.AddPage(Page_, Title_, Select_, Image_)
def OnImport1C(self, event): """ Импорт метаобъектов 1С. """ node = self._Parent prj_filename = node.getPrjFileName() # Проверить открыт ли какой-нибудь проект if not prj_filename: ic_dlg.icWarningBox(u'ВНИМАНИЕ', u'''Импорт можно производить только в определенный проект. Откройте проект для возможности импорта''') return import_system_names = [sub_sys.name for sub_sys in node.getImpSystems().getSubSytems()] # Проверить импортированны ли NSI и work_flow if 'NSI' not in import_system_names or 'work_flow' not in import_system_names: ic_dlg.icWarningBox(u'ВНИМАНИЕ', u'''Импортирование метаобъектов возможно только при подключенных подсистемах <NSI> и <work_flow>''') try: from work_flow.cf_importer import icWizard icWizard.run_wizard() # Обновление дерева проектов self._Parent.getRoot().getParent().Refresh() except: io_prnt.outErr(u'Ошибка запуска визарда импорта метаобъектов 1С')
def onMoveDownToolClicked(self, event): """ Обработчик инструмента перемещения ящика/паллета вниз в списке ящиков. """ selected_idx = self.getItemSelectedIdx(self.box_ListCtrl) if selected_idx == wx.NOT_FOUND: log.warning(u'Не выбран ящик/паллет') ic_dlg.icWarningBox(u'ВНИМАНИЕ!', u'Необходимо выбрать позицию для перемещения!') event.Skip() return data_list = self.getBoxListRecords() is_move = self.moveDownRow_list_ctrl(self.box_ListCtrl, data_list, idx=selected_idx, n_col=0) if is_move: src_cell = self.truck_constructor.truck_load_constructor.getCellByIdx(selected_idx) dst_cell = self.truck_constructor.truck_load_constructor.getCellByIdx(selected_idx+1) self.truck_constructor.truck_load_constructor.replaceCells(src_cell, dst_cell) self.refreshBoxList() # Отключить кнопки если достигнут край списка selected_idx = self.getItemSelectedIdx(self.box_ListCtrl) last_item_idx = len(data_list)-1 self.enableTools_toolbar(self.box_toolBar, moveup_tool=selected_idx != wx.NOT_FOUND and selected_idx > 0, movedown_tool=selected_idx != wx.NOT_FOUND and selected_idx < last_item_idx) event.Skip()
def onSearchToolClicked(self, event): """ Обработчик инструмента поиска по наименованию записи справочника. """ search_txt = self.search_textCtrl.GetValue() if search_txt: do_find = True if self.not_actual_search: search_codes = self.getSearchCodes(search_txt) if not search_codes: ic_dlg.icWarningBox(u'ПРЕДУПРЕЖДЕНИЕ', u'Не найдены записи, соответствующие строке поиска') do_find = False self.not_actual_search = False else: # Если не надо обновлять список найденных кодов, то просто # искать следующий код в списке self.search_code_idx += 1 if self.search_code_idx >= len(self.search_codes): self.search_code_idx = 0 if do_find and self.search_codes: find_code = self.search_codes[self.search_code_idx] self.select_sprav_tree_item(find_code) else: ic_dlg.icWarningBox(u'ПРЕДУПРЕЖДЕНИЕ', u'Не выбрана строка поиска') event.Skip()
def OnSelect(self, evt): """ Обрабатываем установку фокуса на компонент """ if self.editor is None and self.hlp not in (None, 'None', ''): # Блокируем запись для редактирования, если позволяет объект данных try: err = self.dataset.Lock() if err in [1, 2]: ic_dlg.icWarningBox( u'ОШИБКА', u'Запись заблокирована err=%s' % str(err)) except: pass id = wx.NewId() self.editor = wx.Button(self, id, size=(15, 15), label='>') self.Bind(wx.EVT_BUTTON, self.OnHelp, self.editor, id) elif self.editor is not None: self.editor.Destroy() self.editor = None # Разблокируем запись для редактирования, если объект данных поддерживает блокировки try: self.dataset.Unlock() except: pass
def edit(self): """ Редактирование модуля. """ ic_dlg.icWarningBox( u'ПРЕДУПРЕЖДЕНИЕ', u'''Редактирование модуля библиотеки образов запрещено. Модули библиотеки образов генерируются в редакторе библиотеки образов.''')
def edit(self): """ Редактирование модуля. """ ic_dlg.icWarningBox( u'ПРЕДУПРЕЖДЕНИЕ', u'''Редактирование модуля форм wxFormBuilder запрещено. Модули форм генерируются в среде wxFormBuilder.''')
def edit(self): """ Редактирование модуля. """ ic_dlg.icWarningBox( u'ПРЕДУПРЕЖДЕНИЕ', u'''Редактирование модуля форм, сгенерированных утилитой pywxrc (из XRC ресурса), запрещено. Модули форм генерируются средствами дизайнера XRC файла.''')
def _refreshData(self): """ Обновить данные по контролам редактирования. """ # Главное окно и горизонтальное меню наследуются у текущего пользователя default_main_win = ic.getKernel().GetAuthUser().resource['main_win'] default_main_menubars = ic.getKernel().GetAuthUser( ).resource['menubars'] data = util.icSpcDefStruct(icUser.SPC_IC_USER, { 'main_win': default_main_win, 'menubars': default_main_menubars }) name_edit = self.GetNameObj('nameEdit') if name_edit: data['name'] = name_edit.GetValue() description_edit = self.GetNameObj('descriptionEdit') if description_edit: data['description'] = description_edit.GetValue() local_dir_edit = self.GetNameObj('localDirEdit') if local_dir_edit: data['local_dir'] = local_dir_edit.GetValue() role_choice = self.GetNameObj('roleChoice') if role_choice: roles = self._manager.getRoles() selection = role_choice.GetSelection() try: data['roles'] = [roles[selection][0]] except: data['roles'] = [] password_edit1 = self.GetNameObj('passwordEdit1') password_edit2 = self.GetNameObj('passwordEdit2') if password_edit1 and password_edit2: password1_txt = password_edit1.GetValue() password2_txt = password_edit2.GetValue() password1_md5 = md5.new(password1_txt).hexdigest() password2_md5 = md5.new(password2_txt).hexdigest() if password1_md5 == password2_md5: if not password1_txt.strip(): # Выбрана пустая строка data['password'] = md5.new('').hexdigest() else: data['password'] = password1_md5 else: ic_dlg.icWarningBox( u'ВНИМАНИЕ!', u'Введенный пароль и подтверждение на совпадают. Введите еще раз.', ParentWin_=self.getDialog()) return None self._data = data return self._data
def onFindToolClicked(self, event): """ Обработчик инструмента поиска записи справочника по ключевому слову. """ find_txt = self.find_textCtrl.GetValue() if find_txt: self.findWordInRecordsListCtrl() else: ic_dlg.icWarningBox(u'ПРЕДУПРЕЖДЕНИЕ', u'Не выбрана строка поиска') event.Skip()
def property_editor_ctrl(attr, value, propEdt, *arg, **kwarg): """ Стандартная функция контроля. """ if attr in ('object_link',): ret = str_to_val_user_property(attr, value, propEdt) if ret: parent = propEdt if not ret[0][0] in ('GridDataset', ): ic_dlg.icWarningBox(u'ОШИБКА', u'Тип выбранный объект не корректен.', parent) return coderror.IC_CTRL_FAILED_IGNORE return coderror.IC_CTRL_OK
def getResourceByPspLink(self, component): """ Собирает ресурсное описание по ссылке. Ресурсное описание собирается по паспорту объекта. @type component: C{dictionary} @param component: Словарь описания ссылки. """ res = None res_query = util.getSpcAttr(component, 'res_query', self.evalSpace).strip() psp_link = component['psp_link'] _query = res_query.split(':') try: link_type = _query[1].split('.')[0] link_name = _query[1].split('.')[1] io_prnt.outLog( u'ICDATASET: point to object resource: type=<%s>, name=<%s>' % (link_type, link_name)) except: link_type = None link_name = None # Получаем ресурсное описание, где в общем случае ищется # описание нужного компонента io_prnt.outLog(u'Связь с ресурсом по паспорту: %s' % psp_link) res = resource.getResByPsp(psp_link) # ---- В ресурсе ищем описание нужного компoнента # (<key_in_fileres>:type.name) if link_name and link_type: ret = getRes(res, link_type, link_name) if not ret: io_prnt.outWarning(u'Не найден объект [%s : %s] в ресурсе' % (link_type, link_name)) res = None # ------------------------------------------------------------- # В полученном ресурсном описании ищем ссылки и заменяем их # на ресурсные описания if res: res = self.doReplacementRes(res, component) else: # Если ресурсное описание не найдено и выражение изменений не # определено, то сообщаем об этом пльзователю ic_dlg.icWarningBox( u'ОШИБКА', u'Описание объекта <%s> в %s не найдено.' % (res_query, psp_link)) return res
def property_editor_ctrl(attr, value, propEdt, *arg, **kwarg): """ Стандартная функция контроля. """ if attr in ('sourcePsp',): ret = str_to_val_user_property(attr, value, propEdt) if ret: parent = propEdt.GetPropertyGrid().GetView() if not ret[0][0] in ('Table',): ic_dlg.icWarningBox(u'ОШИБКА', u'Выбранный объект не является таблицей.') return coderror.IC_CTRL_FAILED_IGNORE return ret
def property_editor_ctrl(attr, value, propEdt, *arg, **kwarg): """ Стандартная функция контроля. """ if attr in ('source', ): ret = str_to_val_user_property(attr, value, propEdt) if ret: parent = propEdt ctrl_types = icsqlalchemy.DB_TYPES if ret[0][0] not in ctrl_types: ic_dlg.icWarningBox(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 ('bitmap',): ret = str_to_val_user_property(attr, value, propEdt) if ret: parent = propEdt if not ret[0][0] in ('Bitmap',): ic_dlg.icWarningBox(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 ('data_src',): ret = str_to_val_user_property(attr, value, propEdt) if ret: parent = propEdt if not ret[0][0] in ('Document', 'StateObj', 'BusinessObj', 'Table', 'GridDataset', 'Recordset', 'Query'): ic_dlg.icWarningBox(u'ОШИБКА', u'Выбранный объект не является ИСТОЧНИКОМ ДАННЫХ.', parent) return coderror.IC_CTRL_FAILED_IGNORE return coderror.IC_CTRL_OK return coderror.IC_CTRL_OK
def property_editor_ctrl(attr, value, propEdt, *arg, **kwarg): """ Стандартная функция контроля. """ if attr in ('nsi_psp', ): ret = str_to_val_user_property(attr, value, propEdt) if ret: parent = propEdt if ret[0][0] not in ('Sprav', ): ic_dlg.icWarningBox( u'ВНИМАНИЕ!', u'Выбранный объект не является СПРАВОЧНИКОМ NSI.', parent) return coderror.IC_CTRL_FAILED_IGNORE return coderror.IC_CTRL_OK
def onOkButtonClick(self, event): """ Обработчик кнопки <ОК>. """ value = self.masked_textCtrl.GetValue() # Контроль значения на правильное заполнение if self.masked_textCtrl.IsValid(value): self.edit_text = value else: msg = u'Не корректное введеное значение <%s>' % value log.warning(msg) ic_dlg.icWarningBox(u'ОШИБКА', msg) self.edit_text = None self.EndModal(wx.ID_OK) event.Skip()
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.icWarningBox( 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 ('obj_psp', ): ret = str_to_val_user_property(attr, value, propEdt) if ret: parent = propEdt if ret[0][0] not in ('BusinessObj', 'StateObj', 'Document'): ic_dlg.icWarningBox( 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 ('nsi_psp', ): ret = str_to_val_user_property(attr, value, propEdt) if ret: parent = propEdt.GetPropertyGrid().GetView() if not ret[0][0] in ('Sprav', ): ic_dlg.icWarningBox( u'ОШИБКА', u'Выбранный объект не является Справочником.', parent) return coderror.IC_CTRL_FAILED_IGNORE return coderror.IC_CTRL_OK elif ret in (None, ''): return coderror.IC_CTRL_OK
def onAddToolClicked(self, event): """ Обработчик инструмента <Добавить тег> """ tag_name = self.tag_textCtrl.GetValue() tag_address = self.address_textCtrl.GetValue() if tag_name not in self.tags: self.tags[tag_name] = tag_address self.update_tags(**self.tags) else: msg = u'Тег <%s> уже есть в списке' % tag_name log.warning(msg) ic_dlg.icWarningBox(u'ОШИБКА', msg) event.Skip()
def onDelButtonMouseClick(self, event, values=None): """ Обработчик нажатия на кнопку удаления пользователя. """ try: if values: user_name = values['user'] if ic_dlg.icAskBox(u'УДАЛЕНИЕ', u'Удалить пользователя %s?' % user_name): del self._data[user_name] self._init_data(self._data) else: ic_dlg.icWarningBox(u'ВНИМАНИЕ', u'Выберите пользователя, которого надо удалить.') if event: event.Skip() except: io_prnt.outErr(u'Ошибка удаления пользователя.')
def OnHelp(self, event): """ Помощь... """ import ic hlp_file_name = os.path.join(os.path.dirname(ic.__file__), 'doc', 'index.html') if ic_file.Exists(hlp_file_name): if wx.Platform == '__WXMSW__': hlp_file_name = os.path.normpath(hlp_file_name) ic_exec.icSysCmd('start explorer ' + hlp_file_name) elif wx.Platform == '__WXGTK__': try: www_browser = os.environ.get('BROWSER', DEFAULT_WWW_BROWSER) ic_exec.icSysCmd(www_browser + ' ' + hlp_file_name) except: io_prnt.outErr() else: ic_dlg.icWarningBox(u'ПОМОЩЬ', u'Файл помощи <%s> не найден. Запустите генерацию документации :-)' % hlp_file_name)
def onEditButtonMouseClick(self, event, values=None): """ Обработчик нажатия на кнопку редактирования пользователя. """ try: if values: user_name = values['user'] default_res = self._data[user_name] user_res = icuserpropertydlg.icUserPropertyDlg(self.getPanel(), default_res, self._manager) if user_res: self.updateData(user_res) else: ic_dlg.icWarningBox(u'ВНИМАНИЕ', u'Выберите пользователя для редактирования.') if event: event.Skip() except: io_prnt.outErr(u'Ошибка редактирования пользователя.')
def read_tags(self, **tags): """ Прочитать теги из контроллера. @param tags: Словарь тегов в формате: {'имя тега': 'адрес тега', ... } @return: Словарь прочитанных значений: {'имя тега': 'значение тега', ... } Либо None в случае ошибки. """ if self.controller is None: msg = u'Не определен объект контроллера для тестирования' log.warning(msg) ic_dlg.icWarningBox(u'ОШИБКА', msg) return None tag_values = self.controller.read_tags(**tags) if tags and not tag_values: log.warning(u'Ошибка определения значений тегов') return tag_values
def gen_wxfb_prj(parent=None, resource=None, fbp_filename=None): """ Функция запуска генерации форм wxFormBuilder бизнес объекта/документа. @param parent: Родительское окно. @param resource: Ресурс, по которому происходит генерация @param fbp_filename: Файл проекта wxFormBuilder для сохранения. @return: True - генерация прошла успешно. False - Возникла какая-то ошибка. """ if parent is None: app = wx.GetApp() parent = app.GetTopWindow() if resource is None: log.warning(u'Не определен ресурс генерации форм wxFormBuilder') return False if fbp_filename is None: fbp_filename = ic_dlg.icFileDlg(parent, u'Выбор файла проекта wxFormBuilder для генерации', u'wxFormBuilder project (*.fbp)|*.fbp') if not fbp_filename: log.warning(u'Не определен файл проекта wxFormBuilder для генерации форм') return False if os.path.exists(fbp_filename): if not ic_dlg.icAskBox(u'ВНИМАНИЕ', u'Файл <%s> уже существует. Перезаписать его?' % fbp_filename): # Не надо перезаписывать, # тогда нет смысла и генерировать его return False generator = icWxFBPrjGenerator() if not generator.isParsed(resource): ic_dlg.icWarningBox(u'ОШИБКА', u'Тип ресурса не поддерживается генератором форм wxFormBuilder') return False generator.setResource(resource) generator.setGenFilename(fbp_filename) txt = generator.genPrj() return generator.savePrj(txt)
def property_editor_ctrl(attr, value, propEdt, *arg, **kwarg): """ Стандартная функция контроля. """ if attr in ('main_win', ): ret = str_to_val_user_property(attr, value, propEdt) if ret: parent = propEdt if not ret[0][0] in ('MainWindow', 'AUIMainWindow'): ic_dlg.icWarningBox( u'ОШИБКА', u'Выбранный объект не является главным окном.') return coderror.IC_CTRL_FAILED_IGNORE return coderror.IC_CTRL_OK elif attr in ('menubars', ): ret = str_to_val_user_property(attr, value, propEdt) if ret: parent = propEdt first_menubar_type = ret[0][0][0] for cur_psp in ret: if not cur_psp[0][0] in ('MenuBar', 'FlatMenuBar'): ic_dlg.icWarningBox( u'ОШИБКА', u'Выбранный объект [%s] не является главным меню.' % cur_psp) return coderror.IC_CTRL_FAILED_IGNORE # Все горизонтальные меню должны быть одного типа if cur_psp[0][0] != first_menubar_type: ic_dlg.icWarningBox(u'ОШИБКА', u'Ошибка типа. Обект [%s].' % cur_psp) return coderror.IC_CTRL_FAILED_IGNORE return coderror.IC_CTRL_OK elif attr in ('password', ): return passwordEdt.property_editor_ctrl(value, propEdt) elif attr in ('roles', ): return multiChoiceEdt.property_editor_ctrl(value, propEdt)
def LoadSpravTree(self, root): """ Создает дерево со структрурой заданного иерархического справочника. """ if not self.getTypeSprav(): ic_dlg.icWarningBox(u'ОШИБКА', u'Не указан тип справочника <typeSprav>') return False # Получаем ссылку на класс данных cl = self.dataset.dataclass rs = cl.select(cl.q.type == self.getTypeSprav()) rows_dict = {} # Буфферизируем справочник - раскидываем по разным уровням кода for r in rs: cod = getattr(r, self.codfield) row_buff = range(len(self.fields) + 1) row_buff[0] = cod # Читаем значения дополнительных полей for i, fld in enumerate(self.fields): row_buff[i + 1] = getattr(r, fld) cod_len = len(cod) if cod_len > 0: if cod_len in rows_dict: rows_dict[cod_len].append(row_buff) else: rows_dict[cod_len] = [row_buff] # Сортируем по размеру кода keyList = rows_dict.keys() keyList.sort() # Заполняем дерево self.AddCodItem(self.root, self.mask, 0, keyList, rows_dict)