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
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')
def __init__(self, QueryName_): """ Конструктор. @param QueryName_: Имя запроса. """ icQueryPrototype.__init__( self, resource.icGetRes(QueryName_, 'mtd', nameRes=QueryName_))
def __init__(self, Name_=None): """ Конструктор. """ from ic.utils import resource res = resource.icGetRes(Name_, 'src', nameRes=Name_) icObjectStorageSource.__init__(self, res)
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
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)
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
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
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)
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')
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()
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
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
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
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 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