def SetFilter(dataset, flt=None): """ Устанавливаем фильтр на нужный объект данных. @type dataset: C{icSQLObjDataset} @param dataset: Объект индексного доступа к классу данных. @type flt: C{string | dictionary} @param flt: Фильтр, накладываемый на класс данных. """ try: real_name = dataset.name # Если буфер заполнен, то необходимо запросить потверждение на # обновление данных и обновить данные. В противном случае изменения # будут потеряны if dataset.isChangeRowBuff() and ic_dlg.icAskBox( None, _('Save changes?'), 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 delFilter(self, filter_name=None): """ Удалить фильтр. @param filter_name: Имя фильтра. @return: True/False. """ if filter_name is None: # Если имя не определено удалить выбранный фильтр i = self.filterCheckList.GetSelection() if i >= 0: do_del = ic_dlg.icAskBox(u'Удаление', u'Удалить фильтр?') if do_del: del self._filters[i] self.filterCheckList.Delete(i) return True return False else: filters_id = [filter_dict['id'] for filter_dict in self._filters] try: i = filters_id.index(filter_name) except IndexError: io_prnt.outWarning(u'Не найден фильтр <%s> среди <%s>' % (filter_name, filters_id)) return False del self._filters[i] self.filterCheckList.Delete(i+1) return True
def genYear(self, Year_): """ Генерация календарного графика на год с опросом пользователя. """ if ic_dlg.icAskBox( u'ВНИМАНИЕ!', u'Создать календарный график на %s год?' % (str(Year_))): if self._delYearRec(Year_): self.generateYear(Year_)
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 Clear(self, Ask_=False): """ Очистить справочник от данных. @param Ask_: Спросить о подтверждении очистки справочника? """ storage = self.getStorage() if storage: if Ask_: if ic_dlg.icAskBox( u'ВНИМАНИЕ!', u'Очистить справочник <%s> от всех данных?' % self.getName()): return storage.clear() else: # Подтверждения не требуется - просто удалтиь return storage.clear()
def extend(self): """ Дополнительные инструменты узла. """ # Данном случае проверка связи с БД res = self.getMyRes() name = res.keys()[0] spc = res.get(name, dict()) yes = ic_dlg.icAskBox( u'Проверка связи с БД', u'Поверить связь с БД <%s : %s>?' % (spc['name'], spc['type'])) if yes: from ic.db import icsqlalchemy db_url = icsqlalchemy.createDBUrl(spc) 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 _delYearRec(self, Year_): """ Удалить год. """ if self.isYear(Year_) == True: if ic_dlg.icAskBox( u'ВНИМАНИЕ!', u'Календарный график на %s год уже существует. Удалить?' % (str(Year_))): storage = self.getStorage() if storage: cod = self.ListCode2StrCode((str(Year_), )) return storage.delRecByCod(cod) return True else: return False return True
def onDelToolClicked(self, event): """ Обработчик инструмента удаления записи справочника. """ rec_idx = self.recs_listCtrl.GetFirstSelected() if rec_idx != -1: record = self._list_ctrl_dataset[rec_idx] del_code = record['cod'] if ic_dlg.icAskBox( u'УДАЛЕНИЕ', u'Удаление записи справочника <%s>. Вы уверены?' % record['name']): self.sprav.delRec(del_code) self.del_sprav_tree_item(self.sprav_treeCtrl.GetSelection(), del_code) self.del_sprav_list_item(del_code) 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 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 findWordInRecordsListCtrl(self, start_row=None): """ Процедура поиска слова в списке текущих записей. @param start_row: Начальная строка поиска. Если не определено, то поиск производится с текущей выбранной строки. """ cur_row = start_row if cur_row is None: cur_row = self.getItemSelectedIdx(self.recs_listCtrl) # log.debug(u'Текущая выбранная строка <%d>' % cur_row) find_word = self.find_textCtrl.GetValue() find_result = self.find_word_in_records(find_word, start_row=cur_row + 1) do_find = find_result is not None if do_find: find_row, find_col = find_result self.selectItem_list_ctrl(self.recs_listCtrl, find_row) else: msg = u'Не найдено поисковое слово. Начать поиск с начала?' if ic_dlg.icAskBox(u'ВНИМАНИЕ', msg): self.findWordInRecordsListCtrl(-1)
def parse_cf_file(cf_filename, cf_dirname=None, txt_ctrl=None): """ Парсинг файла конфигурации 1с. @param cf_filename: Полное имя CF файла конфигурации 1c. @param cf_dirname: Директория, в которую будет происходить парсинг. @param txt_ctrl: Объект wxTxtCtrl для вывода результатов выполнения комманды парсинга. """ try: if not os.path.exists(cf_filename): log.warning(u'ERROR! CF file <%s> not exists!' % cf_filename) ic_dlg.icWarningBox(u'ОШИБКА', u'CF файл <%s> не найден!' % cf_filename) return else: if cf_dirname is None: global CUR_CF_DIR CUR_CF_DIR = gen_cf_dir(cf_filename) cf_dirname = CUR_CF_DIR if os.path.exists(cf_dirname): if not ic_dlg.icAskBox(Title_=u'ВНИМАНИЕ', Text_=u'Папка <%s> распарсенного файла конфигурации уже существует. Заменить?' % cf_dirname): return # Удалить папку конфигурации, если она существует shutil.rmtree(cf_dirname, True) log.info(u'DELETE DIRECTORY: <%s>' % cf_dirname) v8unpack_filename = os.path.join(os.path.dirname(__file__), DEFAULT_V8UNPACK_PATH) v8unpack_filename = os.path.abspath(v8unpack_filename) if not os.path.exists(v8unpack_filename): log.warning(u'ERROR! V8Unpack file <%s> not exists!' % v8unpack_filename) ic_dlg.icWarningBox(u'ОШИБКА', u'V8Unpack файл <%s> не найден!' % v8unpack_filename) return run_parser(v8unpack_filename, cf_filename, cf_dirname, txt_ctrl) except: log.fatal(u'ERROR! Error in parse_cf_file function')
def login(self, User_=None, Password_=None, prj_filename=None): """ Открыть регистрацию программиста в режиме редактирования. @param User_: Имя пользователя. @param Password_: Пароль. Если имя или пароль не указаны, то выводится окно входа в систему. @param prj_filename: Имя файла проекта, который пытаемся открыть. Необходимо для снятия блокировки пользователя. """ # ВНИМАНИЕ! # Меняется проект, меняется и файл ресурса ограничения доступа # поэтому объект управления правами пользователей необходимо # создавать каждый раз заново при открытии проекта result = False try: result = ic_user.getKernel().Login(User_, Password_) except icexceptions.LoginInvalidException: ic_dlg.icMsgBox( u'Вход в систему', u'Неправильный пользователь или пароль. Доступ запрещен.') except icexceptions.LoginErrorException: if ic_dlg.icAskBox( u'Вход в систему', u'Пользователь уже зарегистрирован в системе. Снять регистрацию пользователя?' ): from ic.engine import icusermanager user_mngr = icusermanager.icUserManager() tree_ctrl = self.getParent() pro_file_name = prj_filename if not os.path.exists(pro_file_name): pro_file_name = ic_dlg.icFileDlg( tree_ctrl, u'Удаление регистрационной информации о пользователе из проекта', _('Project file (*.pro)|*.pro')) if pro_file_name: prj_dir = os.path.dirname(os.path.dirname(pro_file_name)) if os.path.exists(prj_dir): user_mngr.unregisterUser(prj_dir) except icexceptions.LoginDBExclusiveException: ic_dlg.icMsgBox( u'Вход в систему', u'БД открыта в монопольном режиме другим пользователем. Вход в систему запрещен.' ) except icexceptions.LoginWorkTimeException: ic_dlg.icMsgBox( u'Вход в систему', u'Попытка входа в систему в не регламентированное время пользователем. Вход в систему запрещен.' ) except: log.fatal(u'Ошибка регистрации пользователя') if result: from ic.kernel import icsettings icsettings.setProjectSettingsToEnvironment(self.name, ReDefine_=True) if result: self._prj_user = ic_user.getKernel().getUser() else: self._prj_user = None return result