def create(self, parent=None, *arg, **kwarg): """ Создание выбранного объекта. """ if ic_mode.isDebugMode(): log.debug('CREATE Object <%s>' % self.passport()) kernel = ic_user.getKernel() if kernel: if 'context' in kwarg: if isinstance(kwarg['context'], dict): # В случае если передается контекст в виде словаря # необходимо создать объект контекста context = icwidget.icResObjContext(kernel) context.update(kwarg['context']) else: # Контекст создаваемому объекту передается явно context = kwarg['context'] del kwarg['context'] else: # Надо определить контекст context = icwidget.icResObjContext(kernel) return kernel.Create(self.passport(), parent, context=context, *arg, **kwarg)
def get(self, parent=None, *arg, **kwarg): """ Получить объект. Если не зарегистрирован в ядре, то создать его. """ if ic_mode.isDebugMode(): log.debug('GET Object <%s>' % self.passport()) kernel = ic_user.getKernel() if kernel: # Проверить зарегистрирован ли уже объект в ядре name = self.passport()[0][1] obj = kernel.getObject(name) if obj: # Если уже зарегистрирован, то просто вернуть его return obj if 'context' in kwarg: if isinstance(kwarg['context'], dict): # В случае если передается контекст в виде словаря # необходимо создать объект контекста context = icwidget.icResObjContext(kernel) context.update(kwarg['context']) else: # Контекст создаваемому объекту передается явно context = kwarg['context'] del kwarg['context'] else: # Надо определить контекст context = icwidget.icResObjContext(kernel) return kernel.Create(self.passport(), parent, context=context, *arg, **kwarg)
def __init__(self, parent): """ Конструктор. @param parent: Родительское окно. """ self.evalSpace = icwidget.icResObjContext() self.evalSpace['WrapperObj'] = self self.__obj = prs.icBuildObject(parent, resource, evalSpace=self.evalSpace, bIndicator=False) self.object = self.evalSpace['_root_obj']
def __init__(self, parent, resource, evalSpace=None, bIndicator=False, moduleRes=None, **par): """ Конструктор интерфейса. @type parent: C{wx.Window} @param parent: Указатель на родительское окно, если оно есть. В противном случае None. @type resource: C{dictionary} @param resource: Ресурсное описание, по которому строится компонент. @type evalSpace: C{dictionary} @param evalSpace: Пространство имен, необходимых для вычисления внешних выражений. @type bIndicator: C{bool} @param bIndicator: Признак отображения процесса создания объекта в статусной строке главного окна. @param moduleRes: Полное имя модуля ресурса. @type par: C{dictionary} @param par: Список дополнительных параметров, которые будут добавлены в пространство имен объекта. """ # Инициализация пространства имен объекта if evalSpace: self.evalSpace = evalSpace else: self.evalSpace = icwidget.icResObjContext() # Добавляем дополнительные параметры в пространство имен if par: self.evalSpace['_dict_obj'].update(par) if moduleRes: path, nm = os.path.split(moduleRes) resource['res_module'] = nm.replace('.pyc', '.py') self.evalSpace['__file_res'] = moduleRes # Учтанавливаем ссылку на интерфейс self.evalSpace['WrapperObj'] = self self._resource = resource self.parent = parent # Создаем объект по ресурсному описанию self.__obj = prs.icBuildObject(parent, resource, evalSpace=self.evalSpace, bIndicator=bIndicator) self.object = self.evalSpace['_root_obj'] self.Init()
def icBuildObject(parent, objRes, logType=0, evalSpace=None, bIndicator=False, id=None): """ Функция собирает объект по ресурсному описанию. @type parent: C{wx.Window} @param parent: Указатель на родительское окно, на котором располагаются другие компоненты. @type objRes: C{Dictionary} @param objRes: Словарь с описанием компонента. @type logType: C{int} @param logType: Тип лога (0 - консоль, 1- файл, 2- окно лога). @param evalSpace: Пространство имен, необходимых для вычисления внешних выражений. @type evalSpace: C{dictionary} @type bIndicator: C{bool} @param bIndicator: Признак отображения в ProgressBar-е. Иногда это не нужно - для создания объектов полученных по ссылки. Т. к. они не учтены при подсчете общего количества объектов. @param id: Идентификатор объекта. Если он не определен, то он генерируется автоматически. """ log.info(u'Сборка объекта <%s>' % objRes['name']) # Подготавливае пространство имен if evalSpace in [None, {}]: evalSpace = icwidget.icResObjContext() # Запоминаем указатель на родительское окно объекта evalSpace['_main_parent'] = parent evalSpace['_root_obj'] = None dlg = None # Устанавливаем режим работы формы # Тестовый режим if isTestMode(): evalSpace.setMode(util.IC_RUNTIME_MODE_TEST) # Признак режима графического редактора elif isEditorMode(): evalSpace.setMode(util.IC_RUNTIME_MODE_EDITOR) # Режим runtime else: evalSpace.setMode(util.IC_RUNTIME_MODE_USUAL) if bIndicator: # ---------------------------------------------------------------------- # Создаем индикатор процесса разбора ресурсного описания max_elements = CountResElements([objRes]) if max_elements > 50: max_elements += 10 progress.icOpenProgressBar( _('Create form: <%s>') % objRes['name'], 0, max_elements + 1) else: log.debug(_('Create form: <%s>') % objRes['name']) if parent: try: parent.type except: parent.type = 'ExternalWin' parent.components = {} # Создаем объект. if id: ids = [id] else: ids = None try: if parent and parent.type == 'ResEditor': obj = icResourceParser(None, [objRes], logType=logType, evalSpace=evalSpace, bCounter=bIndicator, ids=ids) # Корневой интерфейс может вернуть None if not obj: obj = evalSpace['_root_obj'] else: icResourceParser(parent, [objRes], logType=logType, evalSpace=evalSpace, bCounter=bIndicator, ids=ids) obj = evalSpace['_root_obj'] # Организуем очередь табуляции for ob in evalSpace['_dict_obj'].values(): if issubclass(ob.__class__, icwidget.icWidget) and ob.moveAfterInTabOrder: try: if ob.moveAfterInTabOrder in evalSpace['_dict_obj']: after = evalSpace['_dict_obj'][ob.moveAfterInTabOrder] ob.MoveAfterInTabOrder(after) except: io_prnt.outErr('CREATE TAB ORDER ERROR') # Посылаем сообщение о том, что форма создана для обычных объектов # Буфер объектов, которым сообщение onInit послано. Создаем буфер, чтобы # не посылать повторно сообщение из интерфейса post_buff_lst = [] for ob in evalSpace['_dict_obj'].values(): try: res = ob.GetResource() if 'onInit' in res and not res['onInit'] in ['', 'None', None]: ob.PostOnInitEvent() post_buff_lst.append(ob) except AttributeError: io_prnt.outWarning( '### PostOnInitEvent() AttributeError <resource> obj: <%s>' % str(ob)) # Для объектов входящих в составной объект if '_interfaces' in evalSpace: for key, ifs in evalSpace['_interfaces'].items(): for ob in ifs.getRegObjDict().values(): try: res = ob.GetResource() if ('onInit' in res and not res['onInit'] in ['', 'None', None] and ob not in post_buff_lst): ob.PostOnInitEvent() post_buff_lst.append(ob) except AttributeError: io_prnt.outWarning( '### PostOnInitEvent() AttributeError <resource> obj: <%s>' % ob) except: log.fatal(u'Создание формы (icBuildObject):') ic_dlg.icFatalBox(u'ОШИБКА', u'Создание формы (icBuildObject):') obj = None # Уничтожаем индикатор процесса if bIndicator: progress.icCloseProgressBar() else: log.debug(_('End create form: <%s>') % objRes['name']) return obj
def ResultForm(formName, fileRes=None, filter={}, logType=0, evalSpace=None, parent=None, bBuff=False, bIndicator=True, key=''): """ Функция создает диалоговое окно. И возвращает введенные данные. @type formName: C{string} @param formName: Имя формы. @type fileRes: C{string} @param fileRes: Путь к ресурсному файлу. Если путь указан отностиельный, то это интерпретируется как имя подсистемы. @type filter: C{dictionary} @param filter: Словарь переопределяемых фильтров. В качестве ключей именна объектов данных (icSQLObjDataSet), в качестве значений фильты. @type logType: C{int} @param logType: Тип лога (0 - консоль, 1- файл, 2- окно лога). @param evalSpace: Словарь дополнительных параметров. @type evalSpace: C{dictionary} @type parent: C{wx.Window} @param parent: Указатель на родительское окно. @type bBuff: C{bool} @param bBuff: Признак буферизации диалоговой формы. @type bIndicator: C{bool} @param bIndicator: Признак индикатора процесса на создание формы. @param key: Дополнительный ключ уникальности формы. @return: Возвращает введенные данные. Введенные данные должны быть сохранены формой в пространстве имен с ключем 'result'. """ # Если родитель не указан, то буферизация работает не стабильно, поэтому # она отключается if not parent: bBuff = False oldSpace = evalSpace # Подготавливает пространство имен if evalSpace in [None, {}]: evalSpace = icwidget.icResObjContext() if bBuff: if key: frm = getFormFromBuffer(formName, fileRes, parent, str(filter) + str(key)) else: frm = getFormFromBuffer(formName, fileRes, parent, filter) else: frm = None isAddToBuff = True st = None if frm: frm.Enable(True) setStateFormInBuffer(formName, fileRes, parent, filter, True) # Обновляем пространство имен, кроме служебных ключей (нач. с '_') if oldSpace: for key in oldSpace: if not frm.evalSpace.isSpecKey(key): frm.evalSpace[key] = oldSpace[key] else: frm = CreateForm(formName, fileRes, filter, evalSpace=evalSpace, parent=parent, bIndicator=bIndicator) if bBuff: # Если bBuff==False, следовательно форма с таким ключом уже # существует и используется в данный момент bBuff = addFormToBuffer(frm, formName, fileRes, parent, str(filter) + str(key), True) if frm is not None and frm.type == 'Dialog': frm.SetFocus() val = frm.ShowModal() try: if bBuff: setStateFormInBuffer(formName, fileRes, parent, str(filter) + str(key), False) else: frm.Destroy() except: pass io_prnt.outLog(u'Dialog return value <%s> ok: %s' % (val, wx.ID_OK)) if val in [0, wx.ID_OK]: if 'result' in frm.evalSpace: return frm.evalSpace['result'] else: return frm.evalSpace['_resultEval'] return None
def ModalForm(formName, fileRes=None, filter={}, logType=0, parent=None, bBuff=False, bIndicator=True, **kwargs): """ Функция создает диалоговое окно. И возвращает введенные данные. Отличается от ResultForm тем, что evalSpace не передается - поскольку в ряде случаев это может (если этим пользоваться не аккуратно, например, передать простанство имен одной формы другой) приводить к печальным последствиям. Параметры формы передаются через **kwargs. @type formName: C{string} @param formName: Имя формы. @type fileRes: C{string} @param fileRes: Путь к ресурсному файлу. Если путь указан отностиельный, то это интерпретируется как имя подсистемы. @type filter: C{dictionary} @param filter: Словарь переопределяемых фильтров. В качестве ключей именна объектов данных (icSQLObjDataSet), в качестве значений фильты. @type logType: C{int} @param logType: Тип лога (0 - консоль, 1- файл, 2- окно лога). @type parent: C{wx.Window} @param parent: Указатель на родительское окно. @type bBuff: C{bool} @param bBuff: Признак буферизации диалоговой формы. @type bIndicator: C{bool} @param bIndicator: Признак индикатора процесса на создание формы. @param kwargs: Дополнительные именованные параметры, которые пропишутся в форме по ключу '_form_param'. @return: Возвращает введенные данные. Введенные данные должны быть сохранены формой в пространстве имен с ключем 'result'. """ # Если родитель не указан, то буферизация работает не стабильно, поэтому # она отключается if not parent: bBuff = False # Подготавливает пространство имен evalSpace = icwidget.icResObjContext() evalSpace['_form_param'] = kwargs if bBuff: frm = getFormFromBuffer(formName, fileRes, parent, filter) else: frm = None isAddToBuff = True st = None if frm: frm.Enable(True) setStateFormInBuffer(formName, fileRes, parent, filter, True) # Обновляем параметры формы frm.evalSpace['_form_param'] = kwargs else: frm = CreateForm(formName, fileRes, filter, evalSpace=evalSpace, parent=parent, bIndicator=bIndicator) if bBuff: # Если bBuff==False, следовательно форма с таким ключом уже # существует и используется в данный момент bBuff = addFormToBuffer(frm, formName, fileRes, parent, filter, True) if frm is not None and frm.type == 'Dialog': frm.SetFocus() val = frm.ShowModal() try: if bBuff: setStateFormInBuffer(formName, fileRes, parent, filter, False) else: frm.Destroy() except: pass if val in [0, wx.ID_OK]: if 'result' in frm.evalSpace: return frm.evalSpace['result'] else: return frm.evalSpace['_resultEval'] return None
def icCreateObject(ResName_, ResExt_, parent=None, context=None, subsys=None, className=None, **kwargs): """ Функция создает объект по имени и типу ресурса. @type ResName_: C{string} @param ResName_: Имя ресурса, по которому создается объект. @type ResExt_: C{string} @param ResExt_: Расширения ресурсного файла для данного ресурса. @param parent: Родитель объекта (если необходим). @return: Возвращает объект или None в случае ошибки. """ try: pathRes = None if subsys: pathRes = resource.getSubsysPath(subsys) if not className: className = ResName_ res = resource.icGetRes(className, ResExt_, pathRes=pathRes, nameRes=ResName_) if res: # Если определен словарь замен используем его for attr_name, value in kwargs.get('replace_dct', {}).items(): if attr_name not in ('type', 'style', 'name') and not attr_name.startswith('_'): if attr_name in res: res[attr_name] = value io_prnt.outLog(u'Замена атрибута [%s] ресурса <%s>' % (attr_name, ResName_)) else: # Если нет такого атрибута, значит это замена атрибутов дочернего объекта if isinstance(value, dict): res = resource.update_child_resource( attr_name, res, value) io_prnt.outLog( u'Замена атрибутов дочернего объекта [%s] ресурса <%s>' % (attr_name, ResName_)) else: io_prnt.outWarning( u'Не поддерживаемый тип %s замены ресурса дочернего объекта <%s>' % (type(value), attr_name)) if not context: context = icwidget.icResObjContext() return icBuildObject(parent, res, evalSpace=context, id=kwargs.get('id', None)) return None except: io_prnt.outErr('CREATE OBJECT ERROR: [%s . %s]' % (ResName_, ResExt_)) return None
def HlpSprav(typSprav, ParentCode=(None, ), field=None, datatime=None, form=None, rec=None, parentForm=None): """ Запуск визуального интерфейса просмотра, поиска и выбора значений поля или группы полей из отмеченной строки указанного справочника. @type typSprav: C{string} @param typSprav: Код типа (номер) справочника. @type ParentCode: C{...} @param ParentCode: Код более верхнего уровня. @param field: Задает поле или группу полей, которые надо вернуть. @type datatime: C{string} @param datatime: Время актуальности кода. @param form: имя формы визуального интерфейса работы со справочником. @param rec: Текущая запись справочника. @param parentForm: Родительская форма. """ result = IC_HLP_OK res_val = None print('Start HlpSprav FIELD:', field) try: if ParentCode is None: ParentCode = (None, ) #Для обработки необходимо преобразовать в список parent_code = list(ParentCode) #Запрашиваемый уровень try: x_level = parent_code.index(None) parent_code_str = ''.join(parent_code[:x_level]) x_level += 1 print('HlpSprav Level:', x_level) except: x_level = None #Весь код заполнен res_val = (ParentCode, get_fields(field, rec)) str_code = get_hlp_code_str(typSprav, ParentCode) print('HlpSprav Resultation: ', field, rec, res_val, str_code) return (result, res_val[0], res_val[1], str_code) #Получить информацию о справочнике _NsiList = tabclass.CreateTabClass(getNsiListClassName()) # Находим описание нужного справочника rs = _NsiList.select(_NsiList.q.type == typSprav) #if len(rs) == 0: if GetRecordCount(rs) == 0: print('Invalid sprav type') return (IC_HLP_FAILED_TYPE_SPRAV, res_val) spr = rs[0] #Если запрашиваемый уровень больше общего количества уровней, то выйти #Нет такого уровня в справочнике if spr.level_num < x_level: print('Invalid level %d' % (x_level)) return (IC_HLP_FAILED_LEVEL, res_val) #определить длину кода уровня _NsiLevel = tabclass.CreateTabClass(getNsiLevelClassName()) rs = _NsiLevel.select(_NsiLevel.q.type == typSprav) level_len = None for rec in rs: if rec.level == x_level: level_len = rec.level_len break if level_len is None: MsgBox(None, 'Не определена длина кода уровня!') return (IC_HLP_FAILED_LEVEL, res_val) parent_len = len(parent_code_str) result = IC_HLP_FAILED #--- Если указана дата актуальности --- if datatime: sprav_t = spr.tab + 'T' sql = '''SELECT id FROM %s WHERE SUBSTR(cod,1,%d) LIKE(\'%s\') AND LENGTH(SUBSTR(cod,%d,LENGTH(cod)-%d))=%d AND time_start<=%s AND time_end>=%s''' % ( sprav_t, parent_len, parent_code_str, parent_len + 1, parent_len, level_len, str(datatime), str(datatime)) #--- Если дата актуальности не указана либо в таблице актуальности нет инф. # за нужный период, то проверяем по справочной таблице if not datatime: sql = '''SELECT id FROM %s WHERE %s.id_nsi_list=%d AND SUBSTR(%s.cod,1,%d) LIKE(\'%s\') AND LENGTH(SUBSTR(%s.cod,%d,LENGTH(%s.cod)-%d))=%d''' % ( spr.tab, spr.tab, spr.id, spr.tab, parent_len, parent_code_str, spr.tab, parent_len + 1, spr.tab, parent_len, level_len) sprav = spr.tab #Завершить транзакцию _NsiList._connection.getConnection().commit() _NsiLevel._connection.getConnection().commit() #Определить форму выбора кода if form is None: form = NsiHlpFormName(typSprav, x_level) #Вывести окно и возвратить выбранный код print('SQL Query: ', sql) #evsp=util.InitEvalSpace({'sprav_type':typSprav, 'sprav_code':parent_code,'sprav_field':field,'parent_form':parentForm}) evsp = icwidget.icResObjContext() evsp.update({ 'sprav_type': typSprav, 'sprav_code': parent_code, 'sprav_field': field, 'parent_form': parentForm }) res_val = ResultForm(form, filter={sprav: sql}, evalSpace=evsp, parent=parentForm, bBuff=True) result = IC_HLP_OK except: LogLastError('HlpSprav ERROR') result = IC_HLP_FAILED_TYPE_SPRAV print('HlpSprav Result: ', result, ' HlpSprav Value: ', res_val) return res_val