def GetTypeRoles(self, tp): if IsUri(tp): return self.GetTypeRolesByUri(tp) else: path = tp.split('.') if len(path) > 1: return self.GetTypeRolesByName(path[0], path[1]) return None
def GetResolvableUri(self): value = self.part.get(self.role) if isinstance(value, basestring): if IsUri(value): return value else: path = value.split('.') if len(path) > 1: return appdata.datamodel.GetEntityUri(path[0], path[1])
def CreateEditor(self, tree): roles = set() values = set() for v in self.option['parts']: roles |= v.viewkeys() if 'self' in v: roles.add(v['self']) roles |= self.pattern['signature'].viewkeys() roles |= set(['type', 'uri']) roles -= set(self.part.keys()) roles.discard('self') values = [] tp = None if self.role != 'type': tp = self.part.get('type', None) props = appdata.datamodel.GetAvailableProps(tp) values += props.keys() roles = sorted(roles) values = sorted(values) if self.role: if self.role in roles: roles.remove(self.role) roles.insert(0, self.role) value_names = [] for v in value2list(self.part[self.role]): if IsUri(v): n = appdata.datamodel.GetEntityName(v) if n: value_names.append(n) else: value_names.append(v) else: value_names.append(v) value = '|'.join(value_names) if values in values: values.remove(value) values.insert(0, value) if self.editor_value: if self.editor_value in values: values.remove(self.editor_value) values.insert(0, self.editor_value) self.editor_value = None return PattternRoleEditor(tree, roles, values, GenerateSortedModel(roles), appdata.datamodel.GetModel())
def GetEntityDoc(self, text): uri = None if IsUri(text): uri = text else: path = text.split('.') if len(path) > 1: uri = self.GetEntityUri(path[0], path[1]) if uri: for doc in appdata.documents(GraphDocument): for t in doc.grTriplesForSubj(uri): if t.p in (kb.rdf_type, kb.rdfs_subclassof): return doc
def ViewType(self): value = self.part.get('uri', self.part.get('type')) if isinstance(value, basestring): if IsUri(value): return appdata.environment_manager.FindViewType( self.doc, value) else: path = value.split('.') if len(path) > 1: if path[0] == 'part2': return type('', (Part2TypesView, ), dict(bound_uri='part2:' + path[1])) elif path[0] == 'patterns': if path[1] in self.doc.patterns: return type( '', (PatternsView, ), dict(document=self.doc, bound_uri=path[1])) else: uri = appdata.datamodel.GetEntityUri(path[0], path[1]) if uri: return appdata.environment_manager.FindViewType( self.doc, uri)
def ResolveNameOrUri(self, value, tp = None, force_uri = False): is_uri = IsUri(value) if is_uri and force_uri: return value props = self.GetAvailableProps(tp) for propname, prop in props.iteritems(): if is_uri and 'uri' in prop and prop['uri'] == value: return propname elif not is_uri and value == propname: return propname if is_uri: path = self.GetEntityModuleAndName(value) else: path = value.split('.') if path and len(path) > 1: if path[0] == 'part2': return value doc = self.modules.get(path[0]) if doc: templates = doc.grGetTemplates() if path[1] in templates: if force_uri: return templates[path[1]] else: return '.'.join((path[0], path[1])) else: m = self.entities.get(path[0]) if m: curi = m.get(path[1]) if curi: return expand_uri(curi) return value
def build(self, doc, roles, items=None, current=None, done=None): if self.base: if hasattr(self.base, 'build'): roles = self.base.build(doc, self.prepare_base_props(roles), items, current, done) return self.translate_base(roles, True) else: return if self.value: return {self.ownrole if self.ownrole else name: self.value} if self.function: value = eval(self.function, dict(roles)) return {self.ownrole if self.ownrole else name: value} itemid = None if self.name in roles and not self.ownrole: itemid = roles[self.name] else: if self.uri: if len(self.uri) == 1: itemid = iter(self.uri).next() else: return elif self.ownrole: if self.ownrole in roles: itemid = roles[self.ownrole] if not itemid: return if not itemid: found = self.scan_by_roles(doc, roles) if len(found) == 1: itemid = iter(found).next() # if items != None: # items.add(itemid) # return {self.ownrole if self.ownrole else name: itemid} elif itemid != 'new': if not IsUri(itemid): itemid = doc.basens + itemid else: itemid = doc.infGenerateUri() for k, v in self.roles.iteritems(): if v == 'self': continue value = roles.get(k) if not value and (not itemid or not v.get('is_optional')): return if not itemid: itemid = doc.infGenerateUri() result = {} result[self.ownrole if self.ownrole else self.name] = itemid triples = doc.grTriplesForSubj(itemid) if self.types and len(self.types) == 1: if (itemid, kb.rdf_type) not in done: if (itemid, kb.rdf_type) not in current: for t in triples: if t.p == kb.rdf_type: t.deletefrom(doc) current.add((itemid, kb.rdf_type)) for v in self.types: ObjectTriple.insert(doc, itemid, kb.rdf_type, v) for k, v in self.roles.iteritems(): if v == 'self': continue value = roles.get(k) if not value: continue if (itemid, v['uri']) in done: continue if value == 'new': if not v['is_literal']: value = doc.infGenerateUri() result[k] = value if (itemid, v['uri']) not in current: for t in triples: if t.p == v['uri']: t.deletefrom(doc) current.add((itemid, v['uri'])) if v['is_literal']: LiteralTriple.insert(doc, itemid, v['uri'], value) else: ObjectTriple.insert(doc, itemid, v['uri'], value) doc.AsyncChangeState(doc.state_changed) if items != None: items.add(itemid) return result
def __init__(self, part, index, option, pattern): if not part: raise PatternPartException(pattern, option, index, 'empty part') part = copy.copy(part) tp = part.pop('type', None) self.uri = part.pop('uri', None) self.roles = part self.props = {} self.ownrole = part.pop('self', None) self.option = option self.pattern = pattern self.index = index self.base = None self.typename = None self.types = set() self.name = 'part_%i' % self.index self.value = part.pop('value', None) self.function = part.pop('lambda', None) self.use_classification = False if self.uri: self.uri = set_lift(self.uri) if tp: if isinstance(tp, basestring): if IsUri(tp): self.use_classification = True self.types = set_lift(tp) else: try: tp = eval(tp, {}, self.pattern.env.work_env) except: raise PatternPartException( pattern, option, index, 'type %s not evaluated' % tp) if isinstance(tp, PatternProxy) or isinstance( tp, PatternOption): self.base = tp else: if getattr(tp, 'uri', None) != None: self.types = set_lift(tp.uri) if getattr(tp, 'template', None) != None: self.typename = tp.template['name'] else: self.use_classification = True self.types = set_lift(tp) for k, v in self.roles.iteritems(): if self.base: if v not in self.base.GetRoles(): raise PatternPartException( pattern, option, index, 'role %s not found in base pattern' % v) self.props[v] = k elif isinstance(v, basestring): prop = None if tp and hasattr(tp, 'get_prop'): prop = tp.get_prop(v) if not prop and self.pattern.env.graph: doc = self.pattern.env.graph prop_uri = doc.roles_by_name.get(v) if not prop_uri: prop_uri = doc.annotations_by_name.get(v) if not prop_uri: prop_uri = v prop = doc.props_by_uri.get(prop_uri) if prop: self.props[prop['uri']] = k self.roles[k] = prop elif IsUri(v): self.props[v] = k self.roles[k] = { 'uri': v, 'is_literal': False, 'is_optional': True } else: raise PatternPartException( pattern, option, index, 'property %s not found in environment' % v) else: raise PatternPartException(pattern, option, index, 'property %s not evaluated' % v) if self.ownrole: self.roles[self.ownrole] = 'self'
def GetNameAndIcon(self, value, tp = None): is_uri = IsUri(value) if is_uri: v = kb.uri2name(value) if v: is_uri = False value = v if tp: if tp.startswith('patterns.'): return value, 'iso_literal' v = kb.uri2name(tp) if v: tp = v roles = self.GetTypeRoles(tp) role = None if roles: if is_uri: for v in roles.itervalues(): if value == v.get('uri'): role = v break else: role = roles.get(value) if role: if tp.startswith('part2.'): type_uri = role['type_uri'] if type_uri.startswith('xsd:'): return role['name'], 'iso_syntax' else: return role['name'], kb.icons_map.get(kb.part2_itself[type_uri]['icon'], 'iso_unknown') else: doc = self.GetEntityDoc(tp) type_uri = roles[value]['type_uri'] restricted_by_value = roles[value].get('restricted_by_value', False) type_label, type_icon = doc.infGetRestrictionNameAndIcon(type_uri, restricted_by_value) return role['name'], type_icon else: uri = None if is_uri: uri = value else: path = value.split('.') if path[0] == 'part2': if 'part2:'+path[1] in kb.part2_itself: return path[1], kb.part2_itself['part2:'+path[1]]['icon'] if len(path) > 1: uri = self.GetEntityUri(path[0], path[1]) if uri: doc = self.GetEntityDoc(uri) if doc: name, tp_label, icon = doc.infGetEntityVisual(uri) if isinstance(name, list): name = ', '.join(name) return name, icon for k, v in appdata.project.annotations: if (is_uri and v == value) or (not is_uri and k == value): return k, 'iso_annotation' for k, v in appdata.project.roles: if (is_uri and v == value) or (not is_uri and k == value): return k, 'iso_role' return value, 'iso_unknown'