示例#1
0
    def _getNSIFieldsSpc(self, NSIRes_, NSIType_, FieldNames_):
        """
        Взять спецификацию поля справочника.
        @param NSIRes_: Имя ресурсного файла справочника.
        @param NSIType_: Тип справочника.
        @param FieldNames_: Список имен полей справочника.
        """
        if NSIRes_ is None:
            nsi_res_name = 'nsi_sprav'
            nsi_res_ext = 'mtd'
        else:
            nsi_res = ic_file.SplitExt(ic_file.BaseName(NSIRes_))
            nsi_res_name = nsi_res[0]
            nsi_res_ext = nsi_res[1][1:]  # И стереть первую точку

        # Получить ресурсное описание справочника
        nsi_sprav_manager_res = resource.icGetRes(nsi_res_name,
                                                  nsi_res_ext,
                                                  nameRes=nsi_res_name)
        if nsi_sprav_manager_res['name'] == NSIType_:
            # Справочник определен просто в ресурсе
            nsi_sprav_res = [nsi_sprav_manager_res]
        else:
            # Справочник определен в менеджере справочников
            nsi_sprav_res = [
                sprav for sprav in nsi_sprav_manager_res['child']
                if sprav['name'] == NSIType_
            ]
        if not nsi_sprav_res:
            ic.io_prnt.outWarning(u'Не найден справочник <%s> в ресурсе [%s]' %
                                  (NSIType_, NSIRes_))
            return None
        nsi_sprav_res = nsi_sprav_res[0]
        # Получить ресурсное описание полей
        nsi_tab_psp = nsi_sprav_res['table']
        if nsi_tab_psp:
            nsi_tab_name = nsi_tab_psp[0][1]
        else:
            nsi_tab_name = 'nsi_data'
        nsi_tab_spc = resource.icGetRes(nsi_tab_name,
                                        'tab',
                                        nameRes=nsi_tab_name)
        nsi_fields_spc = [
            util.DeepCopy(field_spc) for field_spc in [
                fld for fld in nsi_tab_spc['child']
                if fld['name'] in FieldNames_
            ]
        ]
        return nsi_fields_spc
示例#2
0
 def testicGetRes(self):
     path, nm = os.path.split(__file__)
     res = resource.icGetRes(None, 'frm', path, nameRes='test_res')
     io_prnt.outLog('>>> read resource name:%s type:%s' %
                    (res['name'], res['type']))
     self.assertEqual(res['type'], 'Panel')
     self.assertEqual(res['name'], 'test1_panel')
示例#3
0
 def __init__(self, QueryName_):
     """
     Конструктор.
     @param QueryName_: Имя запроса.
     """
     icQueryPrototype.__init__(
         self, resource.icGetRes(QueryName_, 'mtd', nameRes=QueryName_))
示例#4
0
 def __init__(self, Name_=None):
     """
     Конструктор.
     """
     from ic.utils import resource
     res = resource.icGetRes(Name_, 'src', nameRes=Name_)
     icObjectStorageSource.__init__(self, res)
示例#5
0
 def getTable(self):
     """
     Таблица хранения.
     """
     if self._table is None:
         tab_name = self.getTableName()
         tab_res = resource.icGetRes(tab_name, 'tab', nameRes=tab_name)
         self._table = self.GetKernel().createObjBySpc(parent=None, res=tab_res)
     return self._table
示例#6
0
def editConnectionPostgreSQL(Parent_, DBResName_):
    """
    Отредактировать ресурс описывающи связь с БД POstgreSQL.
    @param Parent_: Родительское окно диалога.
    @param DBResName_: Имя ресурса БД.
    """
    # Сначала получить ресурс
    db_res = res.icGetRes(DBResName_, 'src', nameRes=DBResName_)
    db_res = icConnectionPostgresDlg(Parent_, db_res)
    return res.icSaveRes(DBResName_, 'src', nameRes=DBResName_, resData=db_res)
示例#7
0
    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
示例#8
0
    def _getREFFieldsSpc(self, RefObjRes_, RefObjName_, FieldNames_):
        """
        Взять спецификацию поля связи с бизнес объектом/документом.
        @param RefObjRes_: Имя ресурсного файла связи с бизнес объектом/документом.
        @param RefObjName_: Имя бизнес объекта/документа.
        @param FieldNames_: Список имен полей.
        """
        if RefObjRes_ is None:
            log.warning(
                u'Не определено имя ресурсного файла связи с бизнес объектом/документом.'
            )
            return None

        obj_res = os.path.splitext(os.path.basename(RefObjRes_))
        obj_res_name = obj_res[0]
        obj_res_ext = obj_res[1][1:]  # И стереть первую точку

        # Получить ресурсное описание
        obj_res = resource.icGetRes(obj_res_name,
                                    obj_res_ext,
                                    nameRes=obj_res_name)

        if not obj_res:
            log.warning(u'Не найден ресурс <%s>' % RefObjName_)
            return None

        # Получить ресурсное описание полей
        obj_tab_name = str(obj_res['name']).lower() + '_tab'
        obj_tab_spc = resource.icGetRes(obj_tab_name,
                                        'tab',
                                        nameRes=obj_tab_name)

        obj_fields_spc = [
            util.DeepCopy(field_spc) for field_spc in [
                fld for fld in obj_tab_spc['child']
                if fld['name'] in FieldNames_
            ]
        ]
        return obj_fields_spc
示例#9
0
def editConnectionPostgreSQL(parent, db_res_name):
    """
    Отредактировать ресурс описывающи связь с БД POstgreSQL.

    :param parent: Родительское окно диалога.
    :param db_res_name: Имя ресурса БД.
    """
    # Сначала получить ресурс
    db_res = res.icGetRes(db_res_name, 'src', nameRes=db_res_name)
    db_res = getConnectionPostgresDlg(parent, db_res)
    return res.icSaveRes(db_res_name,
                         'src',
                         nameRes=db_res_name,
                         resData=db_res)
示例#10
0
    def testFindResInRes(self):
        """
        Поиск ресурса.
        """
        path, nm = os.path.split(__file__)
        res = resource.icGetRes(None, 'frm', path, nameRes='test_res')
        io_prnt.outLog('read resource name:%s type:%s' %
                       (res['name'], res['type']))

        r = resource.FindResInRes(res, 'btn2', 'Button')
        self.assertEqual(r['type'], 'Button')
        self.assertEqual(r['name'], 'btn2')

        r = resource.FindResInRes(res, 'btn1')
        self.assertEqual(r['type'], 'Button')
示例#11
0
 def _creat_doc(self, evalSpace):  #, bCounter, progressDlg):
     """
     Функция создает объект документа.
     """
     if not self.doc_type in (None, 'None', ''):
         #print '>>>------------------- Reestr Doc_type=', self.doc_type
         res = resmod.icGetRes(None, 'mtd', nameRes=self.doc_type)
         ifs = prs.icBuildObject(None,
                                 res,
                                 evalSpace=evalSpace,
                                 bIndicator=False)
         if not ifs.GetComponentInterface():
             self.doc = ifs
         else:
             self.doc = ifs.GetComponentInterface()
示例#12
0
 def setStorageByName(self, ObjectStorageName_):
     """
     Установка хранилища данных по имени.
     """
     if self._object_storage_name != ObjectStorageName_:
         # Нужно создать новое хранилище
         object_storage_res = resource.icGetRes(ObjectStorageName_,
                                                'odb',
                                                nameRes=ObjectStorageName_)
         self._storage = None
         if object_storage_res:
             self._storage = objstore.icObjectStorage(object_storage_res)
             self._object_storage_name = ObjectStorageName_
         io_prnt.outLog(u'MetaTree %s STORAGE: %s' %
                        (self.name, self._storage))
         # Убить все дочерние объекты
         self.clearBuffChildren()
     return self._storage
示例#13
0
 def getResByPsp_depricated(self, passport):
     """
     Возвращает ресурса объекта по его паспорту.
     @type passport: C{icObjectPassport}
     @param passport: идентификатор описания (паспорт) объекта.
     """
     objType = passport.getDescrType()
     className = passport.getDescrName()
     resName, extName = passport.getDescrMod().split('.')
     subsys = passport.getDescrSubsys()
     res = resource.icGetRes(resName,
                             extName,
                             pathRes=resource.getSubsysPath(subsys),
                             nameRes=resName)
     if res and objType:
         res_mod = res.get('res_module', None)
         file_res = res.get('__file_res')
         res = resource.FindResInRes(res, className, objType)
         res['res_module'] = res_mod
         res['__file_res'] = file_res
     return res
示例#14
0
def CreateForm(formName,
               fileRes=None,
               filter={},
               bShow=False,
               logType=0,
               evalSpace=None,
               parent=None,
               formRes=None,
               bIndicator=True):
    """
    Функция создает форму по заданому ресурсному описанию.
    @type formName: C{string}
    @param formName: Имя подсистемы и имя формы через '/'. Если имя подсистемы не
         указано, то используется стандартный механизм поиска ресурса.
    @type fileRes: C{string}
    @param fileRes: Путь к ресурсному файлу. Если путь указан отностиельный, то
        это интерпретируется как имя подсистемы.
    @type filter: C{dictionary}
    @param filter: Словарь фильтров на объекты данных. В качестве ключей используются алиасы объектов данных, в качестве занчений
        либо картеж, либо строковое выражение. Если картеж, то фильтрация производится по значению поля, если строка, то по
        SQL  выражению специального вида.
    @type bShow: C{int}
    @param bShow: Признак того, что после создания объекта необходимо выполнить ф-ию Show(True).
    @type logType: C{int}
    @param logType: Тип лога (0 - консоль, 1- файл, 2- окно лога).
    @param evalSpace: Пространство имен, необходимых для вычисления внешних выражений.
    @type evalSpace: C{dictionary}
    @type parent: C{wx.Window}
    @param parent: Указатель на родительское окно.
    @type formRes: C{dictionary}
    @param formRes: Ресурсное описание формы, если оно задано, то форма строится по этому описанию, а параметр fileRes игнорируется.
    @type bIndicator: C{bool}
    @param bIndicator: Признак индикатора процесса на создание формы.
    @rtype: C{wx.Window}
    @return: Возвращает форму.
    """
    log.info(u'Создание формы <%s>' % formName)
    try:
        frm = None
        #   Если ресурсное описание не задано берем его из ресурсного файла
        if formRes is None:
            #   По необходимости вычисляем имя ресурса
            if fileRes:
                fileRes = fileRes.replace('\\', '/')
                #   Если указан абсолютный путь
                if ':' in fileRes:
                    pathRes = fileRes
                #   В противном случае интнрпретируем как относительный путь
                else:
                    #   Определяем текущий системный путь
                    sys_path = resource.icGetSubsysResPaths()[0].replace(
                        '\\', '/')
                    pathRes = '/'.join(
                        sys_path.split('/')[:-1]) + '/' + fileRes

                formRes = resource.icGetRes(formName,
                                            ext='frm',
                                            pathRes=pathRes,
                                            bRefresh=IS_TEST_MODE)
            else:
                formRes = resource.icGetRes(formName,
                                            ext='frm',
                                            bRefresh=IS_TEST_MODE,
                                            nameRes=formName)

        #   Заполняем буфер фильтрами
        setDatasetFilterBuff(filter)
        frm = icBuildObject(parent,
                            formRes,
                            evalSpace=evalSpace,
                            bIndicator=bIndicator)
        #   Чистим буфер фильтров, чтобы он не влиял на работу icResourceParser в дальнейшем
        setDatasetFilterBuff({})
        if bShow and frm is not None:
            frm.Show(True)
            if bShow == 2:
                return frm
            return None
    except KeyError:
        MsgBox(
            None,
            _('Form <%s> is not found in resource: <%s>') %
            (formName, fileRes))
    except:
        io_prnt.outErr(_('Create form error'))

    return frm
示例#15
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
示例#16
0
    def getResourceByFileLink(self, component):
        """
        Собирает ресурсное описание по ссылке.
        Ресурсное описание собирается по ссылке на файл ресурса.
        @type component: C{dictionary}
        @param component: Словарь описания ссылки.
        """
        res = None
        name = component['name']
        source = util.getSpcAttr(component, 'file', self.evalSpace).strip()
        res_query = util.getSpcAttr(component, 'res_query',
                                    self.evalSpace).strip()
        link_expr = component['link_expr']

        #   Если не определен ресурс и определено выражение, которое возвращает
        #   ресурс
        if not source and not res_query and component['link_expr']:
            return self.getResourceByLinkExpr(component)

        _query = res_query.split(':')
        link_key = _query[0]

        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

        # Определяем тип и путь до ресурсного файла ---------------
        path, nameRes, res_ext = self.GetExtAndPathSource(source)

        #   Получаем ресурсное описание, где в общем случае ищется
        #   описание нужного компонента
        if link_key:

            try:
                io_prnt.outLog(u'DATA LINK TO key=%s, path=%s, ext=%s' %
                               (link_key, path, res_ext))
                res = resource.icGetRes(link_key,
                                        res_ext,
                                        path,
                                        nameRes=nameRes)

                #   В описание найденого ресурса добавляем атрибуты, которые
                #   описывают файл ресурса
                res['__subsys_path'] = path
                res['__resource_ext'] = res_ext

            except IOError:
                ic_dlg.icWarningBox(u'ОШИБКА',
                                    u'Ошибка открытия файла %s.' % source)

        # ---- В ресурсе ищем описание нужного компанента
        #   (<key_in_fileres>:type.name)
        if link_name and link_type:
            ret = getRes(res, link_type, link_name)

            if ret:
                res = ret
            else:
                res = None

        #   Если определено выражение, возвращающее ресурсное описание,
        # выполняем его
        if link_expr:

            self.evalSpace['self'] = self
            ret, val = ic_eval(link_expr,
                               0,
                               self.evalSpace,
                               'icDataLink <link_expr>',
                               compileKey=ic_uuid.get_uuid_attr(
                                   self._uuid, 'link_expr'))

            if ret:
                if isinstance(val, dict) and 'name' in val and 'type' in val:
                    res = val
                    io_prnt.outLog(u'ICDATASET RCONSTRUCT RES: <%s>' % val)

        # -------------------------------------------------------------
        #   В полученном ресурсном описании ищем ссылки и заменяем их
        #   на ресурсные описания
        if res:
            res = self.doReplacementRes(res, component)

        #   Если ресурсное описание не найдено и выражение изменений не
        #   определено, то сообщаем об этом пльзователю
        else:
            ic_dlg.icWarningBox(
                u'ОШИБКА',
                u'Описание объект \'%s\' в ресурсном файле \'%s\' не найдено.'
                % (res_query, source))

        return res