Пример #1
0
 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)
Пример #2
0
    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)
Пример #3
0
 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']
Пример #4
0
    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()
Пример #5
0
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
Пример #6
0
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
Пример #7
0
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
Пример #8
0
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
Пример #9
0
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