def viewConcept(self, concept, modelObject, labelPrefix, preferredLabel, indent, arcrole, relationshipSet, visited): try: if concept is None: return isRelation = isinstance(modelObject, ModelRelationship) childRelationshipSet = relationshipSet if isinstance(concept, ModelDtsObject.ModelConcept): text = labelPrefix + concept.label(preferredLabel,lang=self.lang,linkroleHint=relationshipSet.linkrole) if (self.arcrole in ("XBRL-dimensions", XbrlConst.hypercubeDimension) and concept.isTypedDimension and concept.typedDomainElement is not None): text += " (typedDomain={0})".format(concept.typedDomainElement.qname) xmlRowElementName = "concept" attr = {"name": str(concept.qname)} elif self.arcrole == "Table-rendering": text = concept.localName xmlRowElementName = "element" attr = {"label": concept.xlinkLabel} elif isinstance(concept, ModelDtsObject.ModelResource): if self.showReferences: text = (concept.viewText().strip() or concept.localName) attr = {"text": text, "innerXml": XmlUtil.xmlstring(concept, stripXmlns=True, prettyPrint=False, contentsOnly=True)} else: text = (concept.elementText.strip() or concept.localName) attr = {"text": text} xmlRowElementName = "resource" else: # just a resource text = concept.localName xmlRowElementName = text cols = [text] if arcrole == "XBRL-dimensions" and isRelation: relArcrole = modelObject.arcrole cols.append( os.path.basename( relArcrole ) ) if relArcrole in (XbrlConst.all, XbrlConst.notAll): cols.append( modelObject.contextElement ) cols.append( modelObject.closed ) else: cols.append(None) cols.append(None) if relArcrole in (XbrlConst.dimensionDomain, XbrlConst.domainMember): cols.append( modelObject.usable ) childRelationshipSet = self.modelXbrl.relationshipSet(XbrlConst.consecutiveArcrole.get(relArcrole,"XBRL-dimensions"), modelObject.linkrole) if self.arcrole == XbrlConst.parentChild: # extra columns if isRelation: preferredLabel = modelObject.preferredLabel if preferredLabel.startswith("http://www.xbrl.org/2003/role/"): preferredLabel = os.path.basename(preferredLabel) else: preferredLabel = None cols.append(preferredLabel) cols.append(concept.niceType) cols.append(viewReferences(concept)) elif arcrole == XbrlConst.summationItem: if isRelation: cols.append("{:0g} ".format(modelObject.weight)) else: cols.append("") # no weight on roots cols.append(concept.balance) elif self.isResourceArcrole: # resource columns if isRelation: cols.append(modelObject.arcrole) else: cols.append("") # no weight on roots if isinstance(concept, ModelDtsObject.ModelResource): cols.append(concept.localName) cols.append(concept.role or '') cols.append(concept.xmlLang) self.addRow(cols, treeIndent=indent, xmlRowElementName=xmlRowElementName, xmlRowEltAttr=attr, xmlCol0skipElt=True) if concept not in visited: visited.add(concept) for modelRel in childRelationshipSet.fromModelObject(concept): nestedRelationshipSet = relationshipSet targetRole = modelRel.targetRole if arcrole == XbrlConst.summationItem: childPrefix = "({:+0g}) ".format(modelRel.weight) # format without .0 on integer weights elif targetRole is None or len(targetRole) == 0: targetRole = relationshipSet.linkrole childPrefix = "" else: nestedRelationshipSet = self.modelXbrl.relationshipSet(childRelationshipSet.arcrole, targetRole) childPrefix = "(via targetRole) " toConcept = modelRel.toModelObject if toConcept in visited: childPrefix += "(loop) " self.viewConcept(toConcept, modelRel, childPrefix, (modelRel.preferredLabel or self.labelrole), indent + 1, arcrole, nestedRelationshipSet, visited) visited.remove(concept) except AttributeError: # bad relationship return
def viewConcept(self, concept, modelObject, labelPrefix, preferredLabel, parentnode, n, relationshipSet, visited): if concept is None: return try: isRelation = isinstance(modelObject, ModelDtsObject.ModelRelationship) if isinstance(concept, ModelDtsObject.ModelConcept): text = labelPrefix + concept.label(preferredLabel,lang=self.lang,linkroleHint=relationshipSet.linkrole) if (self.arcrole in ("XBRL-dimensions", XbrlConst.hypercubeDimension) and concept.isTypedDimension and concept.typedDomainElement is not None): text += " (typedDomain={0})".format(concept.typedDomainElement.qname) elif isinstance(concept, ModelInstanceObject.ModelFact): if concept.concept is not None: text = labelPrefix + concept.concept.label(preferredLabel,lang=self.lang,linkroleHint=relationshipSet.linkrole) else: text = str(concept.qname) if concept.contextID: text += " [" + concept.contextID + "] = " + concept.effectiveValue elif self.arcrole == "Table-rendering": text = concept.localName elif isinstance(concept, ModelRenderingObject.ModelTable): text = (concept.genLabel(lang=self.lang, strip=True) or concept.localName) elif isinstance(concept, ModelDtsObject.ModelResource): if self.showReferences: text = (concept.viewText() or concept.localName) else: text = (Locale.rtlString(concept.textValue.strip(), lang=concept.xmlLang) or concept.localName) else: # just a resource text = concept.localName childnode = self.treeView.insert(parentnode, "end", modelObject.objectId(self.id), text=text, tags=("odd" if n & 1 else "even",)) childRelationshipSet = relationshipSet if self.arcrole == XbrlConst.parentChild: # extra columns if isRelation: preferredLabel = modelObject.preferredLabel if preferredLabel and preferredLabel.startswith("http://www.xbrl.org/2003/role/"): preferredLabel = os.path.basename(preferredLabel) self.treeView.set(childnode, "preferredLabel", preferredLabel) self.treeView.set(childnode, "type", concept.niceType) self.treeView.set(childnode, "references", viewReferences(concept)) elif self.arcrole == XbrlConst.summationItem: if isRelation: self.treeView.set(childnode, "weight", "{:+0g} ".format(modelObject.weight)) self.treeView.set(childnode, "balance", concept.balance) elif self.arcrole == "XBRL-dimensions" and isRelation: # extra columns relArcrole = modelObject.arcrole self.treeView.set(childnode, "arcrole", os.path.basename(relArcrole)) if relArcrole in (XbrlConst.all, XbrlConst.notAll): self.treeView.set(childnode, "contextElement", modelObject.contextElement) self.treeView.set(childnode, "closed", modelObject.closed) elif relArcrole in (XbrlConst.dimensionDomain, XbrlConst.domainMember): self.treeView.set(childnode, "usable", modelObject.usable) childRelationshipSet = self.modelXbrl.relationshipSet(XbrlConst.consecutiveArcrole.get(relArcrole,"XBRL-dimensions"), modelObject.consecutiveLinkrole) elif self.arcrole == "Table-rendering": # extra columns try: header = concept.header(lang=self.lang,strip=True,evaluate=False) except AttributeError: header = None # could be a filter if isRelation and header is None: header = "{0} {1}".format(os.path.basename(modelObject.arcrole), concept.xlinkLabel) self.treeView.set(childnode, "header", header) if concept.get("abstract") == "true": self.treeView.set(childnode, "abstract", '\u2713') # checkmark unicode character if concept.get("merge") == "true": self.treeView.set(childnode, "merge", '\u2713') # checkmark unicode character if isRelation: self.treeView.set(childnode, "axis", modelObject.axisDisposition) if isinstance(concept, (ModelEuAxisCoord,ModelRuleDefinitionNode)): self.treeView.set(childnode, "priItem", concept.aspectValue(None, Aspect.CONCEPT)) self.treeView.set(childnode, "dims", ' '.join(("{0},{1}".format(dim, concept.aspectValue(None, dim)) for dim in (concept.aspectValue(None, Aspect.DIMENSIONS, inherit=False) or [])))) elif self.isResourceArcrole: # resource columns if isRelation: self.treeView.set(childnode, "arcrole", os.path.basename(modelObject.arcrole)) if isinstance(concept, ModelDtsObject.ModelResource): self.treeView.set(childnode, "resource", concept.localName) self.treeView.set(childnode, "resourcerole", os.path.basename(concept.role or '')) self.treeView.set(childnode, "lang", concept.xmlLang) self.id += 1 self.tag_has[modelObject.objectId()].append(childnode) if isRelation: self.tag_has[modelObject.toModelObject.objectId()].append(childnode) if concept not in visited: visited.add(concept) for modelRel in childRelationshipSet.fromModelObject(concept): nestedRelationshipSet = childRelationshipSet targetRole = modelRel.targetRole if self.arcrole == XbrlConst.summationItem: childPrefix = "({:0g}) ".format(modelRel.weight) # format without .0 on integer weights elif targetRole is None or len(targetRole) == 0: targetRole = relationshipSet.linkrole childPrefix = "" else: nestedRelationshipSet = self.modelXbrl.relationshipSet(childRelationshipSet.arcrole, targetRole) childPrefix = "(via targetRole) " toConcept = modelRel.toModelObject if toConcept in visited: childPrefix += "(loop)" labelrole = modelRel.preferredLabel if not labelrole: labelrole = self.labelrole n += 1 # child has opposite row style of parent self.viewConcept(toConcept, modelRel, childPrefix, labelrole, childnode, n, nestedRelationshipSet, visited) visited.remove(concept) except AttributeError: return # bad object, don't try to display
def viewConcept(self, concept, modelObject, labelPrefix, preferredLabel, indent, arcrole, relationshipSet, visited): try: if concept is None: return isRelation = isinstance(modelObject, ModelRelationship) childRelationshipSet = relationshipSet if isinstance(concept, ModelDtsObject.ModelConcept): text = labelPrefix + concept.label(preferredLabel,lang=self.lang,linkroleHint=relationshipSet.linkrole) if (self.arcrole in ("XBRL-dimensions", XbrlConst.hypercubeDimension) and concept.isTypedDimension and concept.typedDomainElement is not None): text += " (typedDomain={0})".format(concept.typedDomainElement.qname) xmlRowElementName = "concept" #[email protected]: 15-Feb-2017 - start # added "id", "name", "abstract", "substitutionGroup", # "dataType", "nillable", "perioType", "balanceType" and "preferredLabel" so that can be imported to database namespace = "" if (str(concept.id) is not None): splitted = str(concept.id).split("_") if (len(splitted) > 1): namespace = splitted[0] attr = { "namespace": namespace, "name": str(concept.name), "abstract": str(concept.abstract), "substitutionGroup": str(concept.substitutionGroupQname), "dataType": str(concept.typeQname), "nillable": str(concept.nillable), "periodType": str(concept.periodType), "balanceType": str(concept.balance)} if preferredLabel != XbrlConst.conceptNameLabelRole and concept.label != None: attr["standardLabel"] = str(concept.label(XbrlConst.standardLabel,lang=self.lang,linkroleHint=relationshipSet.linkrole)) if preferredLabel != None: attr["preferredLabel"] = os.path.basename(preferredLabel) if preferredLabel == XbrlConst.periodStartLabel and concept.label != None: attr["periodStartLabel"] = str(concept.label(XbrlConst.periodStartLabel,lang=self.lang,linkroleHint=relationshipSet.linkrole)) if preferredLabel == XbrlConst.periodEndLabel and concept.label != None: attr["periodEndLabel"] = str(concept.label(XbrlConst.periodEndLabel,lang=self.lang,linkroleHint=relationshipSet.linkrole)) if preferredLabel != None and os.path.basename(preferredLabel) == "totalLabel": attr["totalLabel"] = text if concept.label != None: attr["documentation"] = str(concept.label(XbrlConst.documentationLabel,lang=self.lang,linkroleHint=relationshipSet.linkrole)) if viewReferences(concept) != None and len(viewReferences(concept)) > 0: attr["references"] = viewReferences(concept) #[email protected]: 15-Feb-2017 - end elif self.arcrole == "Table-rendering": text = concept.localName xmlRowElementName = "element" attr = {"label": concept.xlinkLabel} elif isinstance(concept, ModelDtsObject.ModelResource): if self.showReferences: text = (concept.viewText().strip() or concept.localName) attr = {"text": text, "innerXml": XmlUtil.xmlstring(concept, stripXmlns=True, prettyPrint=False, contentsOnly=True)} else: text = (concept.textValue.strip() or concept.localName) attr = {"text": text} xmlRowElementName = "resource" else: # just a resource text = concept.localName xmlRowElementName = text #[email protected]: 15-Feb-2017 cols = [text, str(concept.name), str(concept.typeQname)] if arcrole == "XBRL-dimensions" and isRelation: relArcrole = modelObject.arcrole cols.append( os.path.basename( relArcrole ) ) if relArcrole in (XbrlConst.all, XbrlConst.notAll): cols.append( modelObject.contextElement ) cols.append( modelObject.closed ) else: cols.append(None) cols.append(None) if relArcrole in (XbrlConst.dimensionDomain, XbrlConst.domainMember): cols.append( modelObject.usable ) childRelationshipSet = self.modelXbrl.relationshipSet(XbrlConst.consecutiveArcrole.get(relArcrole,"XBRL-dimensions"), modelObject.consecutiveLinkrole) if self.arcrole == XbrlConst.parentChild: # extra columns if isRelation: preferredLabel = modelObject.preferredLabel if preferredLabel and preferredLabel.startswith("http://"): preferredLabel = os.path.basename(preferredLabel) else: preferredLabel = None #[email protected]: 15-Feb-2017 commented below 2 lines to avoid loading preferredLabel & type again #cols.append(preferredLabel) #cols.append(concept.niceType) #cols.append(viewReferences(concept)) elif arcrole == XbrlConst.summationItem: if isRelation: cols.append("{:0g} ".format(modelObject.weight)) else: cols.append("") # no weight on roots cols.append(concept.balance) elif self.isResourceArcrole: # resource columns if isRelation: cols.append(modelObject.arcrole) else: cols.append("") # no weight on roots if isinstance(concept, ModelDtsObject.ModelResource): cols.append(concept.localName) cols.append(concept.role or '') cols.append(concept.xmlLang) #[email protected]: 31-Jul-2018 - remove extra columns del cols[1:3] self.addRow(cols, treeIndent=indent, xmlRowElementName=xmlRowElementName, xmlRowEltAttr=attr, xmlCol0skipElt=True) if concept not in visited: visited.add(concept) for modelRel in childRelationshipSet.fromModelObject(concept): nestedRelationshipSet = relationshipSet targetRole = modelRel.targetRole if arcrole == XbrlConst.summationItem: childPrefix = "({:+0g}) ".format(modelRel.weight) # format without .0 on integer weights elif targetRole is None or len(targetRole) == 0: targetRole = relationshipSet.linkrole childPrefix = "" else: nestedRelationshipSet = self.modelXbrl.relationshipSet(childRelationshipSet.arcrole, targetRole) childPrefix = "(via targetRole) " toConcept = modelRel.toModelObject if toConcept in visited: childPrefix += "(loop) " labelrole = modelRel.preferredLabel if not labelrole or self.labelrole == conceptNameLabelRole: labelrole = self.labelrole self.viewConcept(toConcept, modelRel, childPrefix, labelrole, indent + 1, arcrole, nestedRelationshipSet, visited) visited.remove(concept) except AttributeError: # bad relationship return
def viewConcept(self, concept, modelObject, labelPrefix, preferredLabel, parentnode, n, relationshipSet, visited): if concept is None: return try: isRelation = isinstance(modelObject, ModelDtsObject.ModelRelationship) isModelTable = False filingIndicatorCode = "" if isinstance(concept, ModelDtsObject.ModelConcept): text = labelPrefix + concept.label( preferredLabel, lang=self.lang, linkroleHint=relationshipSet.linkrole) if (self.arcrole in ("XBRL-dimensions", XbrlConst.hypercubeDimension) and concept.isTypedDimension and concept.typedDomainElement is not None): text += " (typedDomain={0})".format( concept.typedDomainElement.qname) elif isinstance(concept, ModelInstanceObject.ModelFact): if concept.concept is not None: text = labelPrefix + concept.concept.label( preferredLabel, lang=self.lang, linkroleHint=relationshipSet.linkrole) else: text = str(concept.qname) if concept.contextID: text += " [" + concept.contextID + "] = " + concept.effectiveValue elif self.arcrole == "Table-rendering": text = concept.localName elif isinstance(concept, ModelRenderingObject.ModelTable): text = (concept.genLabel(lang=self.lang, strip=True) or concept.localName) isModelTable = True elif isinstance(concept, ModelDtsObject.ModelResource): if self.showReferences: text = (concept.viewText() or concept.localName) else: text = (Locale.rtlString(concept.textValue.strip(), lang=concept.xmlLang) or concept.localName) else: # just a resource text = concept.localName childnode = self.treeView.insert(parentnode, "end", modelObject.objectId(self.id), text=text, tags=("odd" if n & 1 else "even", )) # Check if we need special rendering of this item for pluginXbrlMethod in pluginClassMethods( "CntlrWinMain.Rendering.RenderConcept"): stopPlugin = pluginXbrlMethod(isModelTable, concept, text, self, self.modelXbrl, childnode) if stopPlugin == True: break childRelationshipSet = relationshipSet if self.arcrole == XbrlConst.parentChild: # extra columns if isRelation: preferredLabel = modelObject.preferredLabel if preferredLabel and preferredLabel.startswith( "http://www.xbrl.org/2003/role/"): preferredLabel = os.path.basename(preferredLabel) self.treeView.set(childnode, "preferredLabel", preferredLabel) self.treeView.set(childnode, "type", concept.niceType) self.treeView.set(childnode, "references", viewReferences(concept)) elif self.arcrole == XbrlConst.summationItem: if isRelation: self.treeView.set(childnode, "weight", "{:+0g} ".format(modelObject.weight)) self.treeView.set(childnode, "balance", concept.balance) elif self.arcrole == "XBRL-dimensions" and isRelation: # extra columns relArcrole = modelObject.arcrole self.treeView.set(childnode, "arcrole", os.path.basename(relArcrole)) if relArcrole in (XbrlConst.all, XbrlConst.notAll): self.treeView.set(childnode, "contextElement", modelObject.contextElement) self.treeView.set(childnode, "closed", modelObject.closed) elif relArcrole in (XbrlConst.dimensionDomain, XbrlConst.domainMember): self.treeView.set(childnode, "usable", modelObject.usable) childRelationshipSet = self.modelXbrl.relationshipSet( XbrlConst.consecutiveArcrole.get(relArcrole, "XBRL-dimensions"), modelObject.consecutiveLinkrole) elif self.arcrole == "Table-rendering": # extra columns try: header = concept.header(lang=self.lang, strip=True, evaluate=False) except AttributeError: header = None # could be a filter if isRelation and header is None: header = "{0} {1}".format( os.path.basename(modelObject.arcrole), concept.xlinkLabel) self.treeView.set(childnode, "header", header) if concept.get("abstract") == "true": self.treeView.set(childnode, "abstract", '\u2713') # checkmark unicode character if concept.get("merge") == "true": self.treeView.set(childnode, "merge", '\u2713') # checkmark unicode character if isRelation: self.treeView.set(childnode, "axis", modelObject.axisDisposition) if isinstance(concept, (ModelEuAxisCoord, ModelRuleDefinitionNode)): self.treeView.set( childnode, "priItem", concept.aspectValue(None, Aspect.CONCEPT)) self.treeView.set( childnode, "dims", ' '.join( ("{0},{1}".format( dim, concept.aspectValue(None, dim)) for dim in (concept.aspectValue( None, Aspect.DIMENSIONS, inherit=False) or [])))) elif self.isResourceArcrole: # resource columns if isRelation: self.treeView.set(childnode, "arcrole", os.path.basename(modelObject.arcrole)) if isinstance(concept, ModelDtsObject.ModelResource): self.treeView.set(childnode, "resource", concept.localName) self.treeView.set(childnode, "resourcerole", os.path.basename(concept.role or '')) self.treeView.set(childnode, "lang", concept.xmlLang) self.id += 1 self.tag_has[modelObject.objectId()].append(childnode) if isRelation: self.tag_has[modelObject.toModelObject.objectId()].append( childnode) if concept not in visited: visited.add(concept) for modelRel in childRelationshipSet.fromModelObject(concept): nestedRelationshipSet = childRelationshipSet targetRole = modelRel.targetRole if self.arcrole == XbrlConst.summationItem: childPrefix = "({:0g}) ".format( modelRel.weight ) # format without .0 on integer weights elif targetRole is None or len(targetRole) == 0: targetRole = relationshipSet.linkrole childPrefix = "" else: nestedRelationshipSet = self.modelXbrl.relationshipSet( childRelationshipSet.arcrole, targetRole) childPrefix = "(via targetRole) " toConcept = modelRel.toModelObject if toConcept in visited: childPrefix += "(loop)" labelrole = modelRel.preferredLabel if not labelrole or self.labelrole == conceptNameLabelRole: labelrole = self.labelrole n += 1 # child has opposite row style of parent self.viewConcept(toConcept, modelRel, childPrefix, labelrole, childnode, n, nestedRelationshipSet, visited) visited.remove(concept) except AttributeError: return # bad object, don't try to display
def viewConcept(self, concept, modelObject, labelPrefix, preferredLabel, indent, arcrole, relationshipSet, visited): try: if concept is None: return isRelation = isinstance(modelObject, ModelRelationship) childRelationshipSet = relationshipSet if isinstance(concept, ModelDtsObject.ModelConcept): text = labelPrefix + concept.label( preferredLabel, lang=self.lang, linkroleHint=relationshipSet.linkrole) if (self.arcrole in ("XBRL-dimensions", XbrlConst.hypercubeDimension) and concept.isTypedDimension and concept.typedDomainElement is not None): text += " (typedDomain={0})".format( concept.typedDomainElement.qname) xmlRowElementName = "concept" attr = {"name": str(concept.qname)} if preferredLabel != XbrlConst.conceptNameLabelRole: attr["label"] = text elif self.arcrole == "Table-rendering": text = concept.localName xmlRowElementName = "element" attr = {"label": concept.xlinkLabel} elif isinstance(concept, ModelDtsObject.ModelResource): if self.showReferences: text = (concept.viewText().strip() or concept.localName) attr = { "text": text, "innerXml": XmlUtil.xmlstring(concept, stripXmlns=True, prettyPrint=False, contentsOnly=True) } else: text = (concept.textValue.strip() or concept.localName) attr = {"text": text} xmlRowElementName = "resource" else: # just a resource text = concept.localName xmlRowElementName = text cols = [text] if arcrole == "XBRL-dimensions" and isRelation: relArcrole = modelObject.arcrole cols.append(os.path.basename(relArcrole)) if relArcrole in (XbrlConst.all, XbrlConst.notAll): cols.append(modelObject.contextElement) cols.append(modelObject.closed) else: cols.append(None) cols.append(None) if relArcrole in (XbrlConst.dimensionDomain, XbrlConst.domainMember): cols.append(modelObject.usable) childRelationshipSet = self.modelXbrl.relationshipSet( XbrlConst.consecutiveArcrole.get(relArcrole, "XBRL-dimensions"), modelObject.consecutiveLinkrole) if self.arcrole == XbrlConst.parentChild: # extra columns if isRelation: preferredLabel = modelObject.preferredLabel if preferredLabel and preferredLabel.startswith("http://"): preferredLabel = os.path.basename(preferredLabel) else: preferredLabel = None cols.append(preferredLabel) cols.append(concept.niceType) cols.append(viewReferences(concept)) elif arcrole == XbrlConst.summationItem: if isRelation: cols.append("{:0g} ".format(modelObject.weight)) else: cols.append("") # no weight on roots cols.append(concept.balance) elif self.isResourceArcrole: # resource columns if isRelation: cols.append(modelObject.arcrole) else: cols.append("") # no weight on roots if isinstance(concept, ModelDtsObject.ModelResource): cols.append(concept.localName) cols.append(concept.role or '') cols.append(concept.xmlLang) elif self.arcrole == "Table-rendering": try: header = concept.header(lang=self.lang, strip=True, evaluate=False) except AttributeError: header = None # could be a filter if isRelation: cols.append(modelObject.axisDisposition) else: cols.append('') if isRelation and header is None: header = "{0} {1}".format( os.path.basename(modelObject.arcrole), concept.xlinkLabel) if concept.get("abstract") == "true": cols.append('\u2713') else: cols.append('') if concept.get("merge") == "true": cols.append('\u2713') else: cols.append('') cols.append(header) if isRelation and isinstance( concept, (ModelEuAxisCoord, ModelRuleDefinitionNode)): cols.append(concept.aspectValue(None, Aspect.CONCEPT)) if self.type in (CSV, XML, JSON): # separate dimension fields for dim in (concept.aspectValue( None, Aspect.DIMENSIONS, inherit=False) or ()): cols.append(dim) cols.append(concept.aspectValue(None, dim)) else: # combined dimension fields cols.append(' '.join( ("{0},{1}".format(dim, concept.aspectValue(None, dim)) for dim in (concept.aspectValue( None, Aspect.DIMENSIONS, inherit=False) or ()) ))) else: cols.append('') elif self.arcrole == widerNarrower: if isRelation: otherWider = [ modelRel.fromModelObject for modelRel in childRelationshipSet.toModelObject( concept) if modelRel.fromModelObject != modelObject.fromModelObject ] cols.append(", ".join( w.label(preferredLabel, lang=self.lang, linkroleHint=relationshipSet.linkrole, fallbackToQname=False) for w in otherWider)) else: cols.append("") if self.cols and len(self.cols) > 1: for col in self.cols: if col == "Name": cols.append((concept.qname or concept.prefixedName)) elif col == "Documentation": cols.append( concept.label( documentationLabel, lang=self.lang, linkroleHint=relationshipSet.linkrole)) elif col == "References": cols.append(viewReferences(concept)) self.addRow(cols, treeIndent=indent, xmlRowElementName=xmlRowElementName, xmlRowEltAttr=attr, xmlCol0skipElt=True, arcRole=self.arcrole) if concept not in visited: visited.add(concept) for modelRel in childRelationshipSet.fromModelObject(concept): nestedRelationshipSet = relationshipSet targetRole = modelRel.targetRole if arcrole == XbrlConst.summationItem: childPrefix = "({:+0g}) ".format( modelRel.weight ) # format without .0 on integer weights elif targetRole is None or len(targetRole) == 0: targetRole = relationshipSet.linkrole childPrefix = "" else: nestedRelationshipSet = self.modelXbrl.relationshipSet( childRelationshipSet.arcrole, targetRole) childPrefix = "(via targetRole) " toConcept = modelRel.toModelObject if toConcept in visited: childPrefix += "(loop) " labelrole = modelRel.preferredLabel if not labelrole or self.labelrole == conceptNameLabelRole: labelrole = self.labelrole self.viewConcept(toConcept, modelRel, childPrefix, labelrole, indent + 1, arcrole, nestedRelationshipSet, visited) visited.remove(concept) except AttributeError: # bad relationship return
def generateSkos(dts, skosFile): try: import os, io from arelle import XmlUtil, XbrlConst from arelle.ViewUtil import viewReferences, referenceURI skosNs = "http://www.w3.org/2004/02/skos/core#" rdfNs = "http://www.w3.org/1999/02/22-rdf-syntax-ns#" dts.modelManager.showStatus("initializing SKOS document") file = io.StringIO(''' <!DOCTYPE rdf:RDF> <nsmap> <rdf:RDF xmlns="urn:cgi:classifier:CGI:XBRL:201204#" xml:base="urn:cgi:classifierScheme:CGI:XBRL:201204" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:owl2xml="http://www.w3.org/2006/12/owl2-xml#" xmlns:p1="#" xmlns:owl="http://www.w3.org/2002/07/owl#" xmlns:xsd="http://www.w3.org/2001/XMLSchema#" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:xbrl-201204="urn:cgi:classifier:CGI:XBRL:201204#" xmlns:skos="http://www.w3.org/2004/02/skos/core#"> <owl:Ontology rdf:about="" /> <!-- Annotation properties --> <owl:AnnotationProperty rdf:about="http://purl.org/dc/elements/1.1/date" /> <owl:AnnotationProperty rdf:about="http://purl.org/dc/elements/1.1/source" /> <owl:AnnotationProperty rdf:about="http://purl.org/dc/elements/1.1/title" /> <owl:AnnotationProperty rdf:about="http://purl.org/dc/elements/1.1/description" /> <owl:AnnotationProperty rdf:about="http://purl.org/dc/elements/1.1/contributor" /> <owl:AnnotationProperty rdf:about="http://purl.org/dc/elements/1.1/creator" /> <owl:AnnotationProperty rdf:about="http://purl.org/dc/elements/1.1/format" /> <owl:AnnotationProperty rdf:about="http://www.w3.org/2002/07/owl#versionInfo" /> <!-- Object Properties --> <!-- http://www.w3.org/2004/02/skos/core#broader --> <owl:ObjectProperty rdf:about="http://www.w3.org/2004/02/skos/core#broader" /> <!-- http://www.w3.org/2004/02/skos/core#changeNote --> <owl:ObjectProperty rdf:about="http://www.w3.org/2004/02/skos/core#changeNote" /> <!-- http://www.w3.org/2004/02/skos/core#hasTopConcept --> <owl:ObjectProperty rdf:about="http://www.w3.org/2004/02/skos/core#hasTopConcept" /> <!-- http://www.w3.org/2004/02/skos/core#inScheme --> <owl:ObjectProperty rdf:about="http://www.w3.org/2004/02/skos/core#inScheme" /> <!-- http://www.w3.org/2004/02/skos/core#topConceptOf --> <owl:ObjectProperty rdf:about="http://www.w3.org/2004/02/skos/core#topConceptOf" /> <!-- Data properties --> <!-- http://www.w3.org/2004/02/skos/core#definition --> <owl:DatatypeProperty rdf:about="http://www.w3.org/2004/02/skos/core#definition" /> <!-- http://www.w3.org/2004/02/skos/core#editorialNote --> <owl:DatatypeProperty rdf:about="http://www.w3.org/2004/02/skos/core#editorialNote" /> <!-- http://www.w3.org/2004/02/skos/core#historyNote --> <owl:DatatypeProperty rdf:about="http://www.w3.org/2004/02/skos/core#historyNote" /> <!-- http://www.w3.org/2004/02/skos/core#notation --> <owl:DatatypeProperty rdf:about="http://www.w3.org/2004/02/skos/core#notation" /> <!-- http://www.w3.org/2004/02/skos/core#prefLabel --> <owl:DatatypeProperty rdf:about="http://www.w3.org/2004/02/skos/core#prefLabel" /> <!-- Classes --> <!-- http://www.w3.org/2002/07/owl#Thing --> <owl:Class rdf:about="http://www.w3.org/2002/07/owl#Thing" /> <!-- http://www.w3.org/2004/02/skos/core#Concept --> <owl:Class rdf:about="http://www.w3.org/2004/02/skos/core#Concept" /> <!-- http://www.w3.org/2004/02/skos/core#ConceptScheme --> <owl:Class rdf:about="http://www.w3.org/2004/02/skos/core#ConceptScheme" /> <!-- Individuals --> </rdf:RDF></nsmap> <!-- Generated by the Arelle(r) http://arelle.org --> ''' ) from arelle.ModelObjectFactory import parser parser, parserLookupName, parserLookupClass = parser(dts,None) from lxml import etree xmlDocument = etree.parse(file,parser=parser,base_url=skosFile) file.close() xmlRootElement = xmlDocument.getroot() #xmlDocument.getroot().init(self) ## is this needed ?? for rdfElement in xmlDocument.iter(tag="{http://www.w3.org/1999/02/22-rdf-syntax-ns#}RDF"): break numSchemes = 0 numConcepts = 0 # use presentation relationships for broader and narrower concepts relationshipSet = dts.relationshipSet(XbrlConst.parentChild) def conceptUri(concept): return concept.qname.namespaceURI + "#" + concept.qname.localName def namespaceUri(qname): return qname.namespaceURI + "#" + qname.prefix priorSchemeSibling = None schemeNamespaces = set() dts.modelManager.showStatus("setting SKOS concepts from XBRL concepts") for qn, concept in sorted(dts.qnameConcepts.items(), key=lambda item:str(item[0])): if concept.modelDocument.targetNamespace not in ( XbrlConst.xbrli, XbrlConst.link, XbrlConst.xlink, XbrlConst.xl, XbrlConst.xbrldt): if qn.namespaceURI not in schemeNamespaces: # add conceptScheme numSchemes += 1 skosElt = etree.Element("{http://www.w3.org/2004/02/skos/core#}ConceptScheme") skosElt.set("{http://www.w3.org/1999/02/22-rdf-syntax-ns#}about", namespaceUri(qn)) elt = etree.SubElement(skosElt, "{http://www.w3.org/1999/02/22-rdf-syntax-ns#}type") elt.set("{http://www.w3.org/1999/02/22-rdf-syntax-ns#}resource", "http://www.w3.org/2002/07/owl#Thing") elt = etree.SubElement(skosElt, "{http://www.w3.org/2004/02/skos/core#}notation") elt.text = str(qn.prefix) schemeNamespaces.add(qn.namespaceURI) if priorSchemeSibling is not None: priorSchemeSibling.addnext(skosElt) else: rdfElement.append(skosElt) priorSchemeSibling = skosElt numConcepts += 1 skosElt = etree.SubElement(rdfElement, "{http://www.w3.org/2004/02/skos/core#}Concept") skosElt.set("{http://www.w3.org/1999/02/22-rdf-syntax-ns#}about", conceptUri(concept)) elt = etree.SubElement(skosElt, "{http://www.w3.org/1999/02/22-rdf-syntax-ns#}type") elt.set("{http://www.w3.org/1999/02/22-rdf-syntax-ns#}resource", "http://www.w3.org/2002/07/owl#Thing") elt = etree.SubElement(skosElt, "{http://www.w3.org/2004/02/skos/core#}notation") elt.text = str(concept.qname) definition = concept.label(preferredLabel=XbrlConst.documentationLabel, lang="en", strip=True, fallbackToQname=False) if definition: elt = etree.SubElement(skosElt, "{http://www.w3.org/2004/02/skos/core#}definition") elt.text = definition else: # if no definition, look for any references references = viewReferences(concept) if references: elt = etree.SubElement(skosElt, "{http://www.w3.org/2004/02/skos/core#}definition") elt.text = references linkedReferenceURI = referenceURI(concept) if linkedReferenceURI: # link to reference elt = etree.SubElement(skosElt, "{http://www.w3.org/2004/02/skos/core#}definition") elt.text = linkedReferenceURI labelsRelationshipSet = dts.relationshipSet(XbrlConst.conceptLabel) if labelsRelationshipSet: for modelLabelRel in labelsRelationshipSet.fromModelObject(concept): label = modelLabelRel.toModelObject if label.role == XbrlConst.standardLabel: elt = etree.SubElement(skosElt, "{http://www.w3.org/2004/02/skos/core#}prefLabel") elt.set("{http://www.w3.org/XML/1998/namespace}lang", label.xmlLang) elt.text = label.text.strip() for rel in relationshipSet.fromModelObject(concept): # narrower elt = etree.SubElement(skosElt, "{http://www.w3.org/2004/02/skos/core#}narrower") elt.set("{http://www.w3.org/1999/02/22-rdf-syntax-ns#}resource", conceptUri(rel.toModelObject)) for rel in relationshipSet.toModelObject(concept): # broader elt = etree.SubElement(skosElt, "{http://www.w3.org/2004/02/skos/core#}broader") elt.set("{http://www.w3.org/1999/02/22-rdf-syntax-ns#}resource", conceptUri(rel.fromModelObject)) elt = etree.SubElement(skosElt, "{http://www.w3.org/2004/02/skos/core#}inScheme") elt.set("{http://www.w3.org/1999/02/22-rdf-syntax-ns#}resource", namespaceUri(qn)) dts.modelManager.showStatus("saving SKOS file") fh = open(skosFile, "w", encoding="utf-8") XmlUtil.writexml(fh, xmlDocument, encoding="utf-8") fh.close() dts.info("info:saveSKOS", _("SKOS of %(entryFile)s has %(numberOfConcepts)s concepts in SKOS RDF file %(skosOutputFile)s."), modelObject=dts, entryFile=dts.uri, numberOfConcepts=numConcepts, skosOutputFile=skosFile) dts.modelManager.showStatus("ready", 3000) except Exception as ex: dts.error("exception", _("SKOS generation exception: %(error)s"), error=ex, modelXbrl=dts, exc_info=True)
def viewConcept(self, concept, modelObject, labelPrefix, preferredLabel, indent, arcrole, relationshipSet, visited): try: if concept is None: return isRelation = isinstance(modelObject, ModelRelationship) childRelationshipSet = relationshipSet if isinstance(concept, ModelDtsObject.ModelConcept): text = labelPrefix + concept.label(preferredLabel,lang=self.lang,linkroleHint=relationshipSet.linkrole) if (self.arcrole in ("XBRL-dimensions", XbrlConst.hypercubeDimension) and concept.isTypedDimension and concept.typedDomainElement is not None): text += " (typedDomain={0})".format(concept.typedDomainElement.qname) xmlRowElementName = "concept" attr = {"name": str(concept.qname)} if preferredLabel != XbrlConst.conceptNameLabelRole: attr["label"] = text elif self.arcrole == "Table-rendering": text = concept.localName xmlRowElementName = "element" attr = {"label": concept.xlinkLabel} elif isinstance(concept, ModelDtsObject.ModelResource): if self.showReferences: text = (concept.viewText().strip() or concept.localName) attr = {"text": text, "innerXml": XmlUtil.xmlstring(concept, stripXmlns=True, prettyPrint=False, contentsOnly=True)} else: text = (concept.textValue.strip() or concept.localName) attr = {"text": text} xmlRowElementName = "resource" else: # just a resource text = concept.localName xmlRowElementName = text cols = [text] if arcrole == "XBRL-dimensions" and isRelation: relArcrole = modelObject.arcrole cols.append( os.path.basename( relArcrole ) ) if relArcrole in (XbrlConst.all, XbrlConst.notAll): cols.append( modelObject.contextElement ) cols.append( modelObject.closed ) else: cols.append(None) cols.append(None) if relArcrole in (XbrlConst.dimensionDomain, XbrlConst.domainMember): cols.append( modelObject.usable ) childRelationshipSet = self.modelXbrl.relationshipSet(XbrlConst.consecutiveArcrole.get(relArcrole,"XBRL-dimensions"), modelObject.consecutiveLinkrole) if self.arcrole == XbrlConst.parentChild: # extra columns if isRelation: preferredLabel = modelObject.preferredLabel if preferredLabel and preferredLabel.startswith("http://"): preferredLabel = os.path.basename(preferredLabel) else: preferredLabel = None cols.append(preferredLabel) cols.append(concept.niceType) cols.append(viewReferences(concept)) elif arcrole == XbrlConst.summationItem: if isRelation: cols.append("{:0g} ".format(modelObject.weight)) else: cols.append("") # no weight on roots cols.append(concept.balance) elif self.isResourceArcrole: # resource columns if isRelation: cols.append(modelObject.arcrole) else: cols.append("") # no weight on roots if isinstance(concept, ModelDtsObject.ModelResource): cols.append(concept.localName) cols.append(concept.role or '') cols.append(concept.xmlLang) self.addRow(cols, treeIndent=indent, xmlRowElementName=xmlRowElementName, xmlRowEltAttr=attr, xmlCol0skipElt=True) if concept not in visited: visited.add(concept) for modelRel in childRelationshipSet.fromModelObject(concept): nestedRelationshipSet = relationshipSet targetRole = modelRel.targetRole if arcrole == XbrlConst.summationItem: childPrefix = "({:+0g}) ".format(modelRel.weight) # format without .0 on integer weights elif targetRole is None or len(targetRole) == 0: targetRole = relationshipSet.linkrole childPrefix = "" else: nestedRelationshipSet = self.modelXbrl.relationshipSet(childRelationshipSet.arcrole, targetRole) childPrefix = "(via targetRole) " toConcept = modelRel.toModelObject if toConcept in visited: childPrefix += "(loop) " labelrole = modelRel.preferredLabel if not labelrole or self.labelrole == conceptNameLabelRole: labelrole = self.labelrole self.viewConcept(toConcept, modelRel, childPrefix, labelrole, indent + 1, arcrole, nestedRelationshipSet, visited) visited.remove(concept) except AttributeError: # bad relationship return
def generateSkos(dts, skosFile): try: import os, io from arelle import XmlUtil, XbrlConst from arelle.ViewUtil import viewReferences, referenceURI skosNs = "http://www.w3.org/2004/02/skos/core#" rdfNs = "http://www.w3.org/1999/02/22-rdf-syntax-ns#" dts.modelManager.showStatus("initializing SKOS document") file = io.StringIO(''' <!DOCTYPE rdf:RDF> <nsmap> <rdf:RDF xmlns="urn:cgi:classifier:CGI:XBRL:201204#" xml:base="urn:cgi:classifierScheme:CGI:XBRL:201204" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:owl2xml="http://www.w3.org/2006/12/owl2-xml#" xmlns:p1="#" xmlns:owl="http://www.w3.org/2002/07/owl#" xmlns:xsd="http://www.w3.org/2001/XMLSchema#" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:xbrl-201204="urn:cgi:classifier:CGI:XBRL:201204#" xmlns:skos="http://www.w3.org/2004/02/skos/core#"> <owl:Ontology rdf:about="" /> <!-- Annotation properties --> <owl:AnnotationProperty rdf:about="http://purl.org/dc/elements/1.1/date" /> <owl:AnnotationProperty rdf:about="http://purl.org/dc/elements/1.1/source" /> <owl:AnnotationProperty rdf:about="http://purl.org/dc/elements/1.1/title" /> <owl:AnnotationProperty rdf:about="http://purl.org/dc/elements/1.1/description" /> <owl:AnnotationProperty rdf:about="http://purl.org/dc/elements/1.1/contributor" /> <owl:AnnotationProperty rdf:about="http://purl.org/dc/elements/1.1/creator" /> <owl:AnnotationProperty rdf:about="http://purl.org/dc/elements/1.1/format" /> <owl:AnnotationProperty rdf:about="http://www.w3.org/2002/07/owl#versionInfo" /> <!-- Object Properties --> <!-- http://www.w3.org/2004/02/skos/core#broader --> <owl:ObjectProperty rdf:about="http://www.w3.org/2004/02/skos/core#broader" /> <!-- http://www.w3.org/2004/02/skos/core#changeNote --> <owl:ObjectProperty rdf:about="http://www.w3.org/2004/02/skos/core#changeNote" /> <!-- http://www.w3.org/2004/02/skos/core#hasTopConcept --> <owl:ObjectProperty rdf:about="http://www.w3.org/2004/02/skos/core#hasTopConcept" /> <!-- http://www.w3.org/2004/02/skos/core#inScheme --> <owl:ObjectProperty rdf:about="http://www.w3.org/2004/02/skos/core#inScheme" /> <!-- http://www.w3.org/2004/02/skos/core#topConceptOf --> <owl:ObjectProperty rdf:about="http://www.w3.org/2004/02/skos/core#topConceptOf" /> <!-- Data properties --> <!-- http://www.w3.org/2004/02/skos/core#definition --> <owl:DatatypeProperty rdf:about="http://www.w3.org/2004/02/skos/core#definition" /> <!-- http://www.w3.org/2004/02/skos/core#editorialNote --> <owl:DatatypeProperty rdf:about="http://www.w3.org/2004/02/skos/core#editorialNote" /> <!-- http://www.w3.org/2004/02/skos/core#historyNote --> <owl:DatatypeProperty rdf:about="http://www.w3.org/2004/02/skos/core#historyNote" /> <!-- http://www.w3.org/2004/02/skos/core#notation --> <owl:DatatypeProperty rdf:about="http://www.w3.org/2004/02/skos/core#notation" /> <!-- http://www.w3.org/2004/02/skos/core#prefLabel --> <owl:DatatypeProperty rdf:about="http://www.w3.org/2004/02/skos/core#prefLabel" /> <!-- Classes --> <!-- http://www.w3.org/2002/07/owl#Thing --> <owl:Class rdf:about="http://www.w3.org/2002/07/owl#Thing" /> <!-- http://www.w3.org/2004/02/skos/core#Concept --> <owl:Class rdf:about="http://www.w3.org/2004/02/skos/core#Concept" /> <!-- http://www.w3.org/2004/02/skos/core#ConceptScheme --> <owl:Class rdf:about="http://www.w3.org/2004/02/skos/core#ConceptScheme" /> <!-- Individuals --> </rdf:RDF></nsmap> <!-- Generated by the Arelle(r) http://arelle.org --> ''') from arelle.ModelObjectFactory import parser parser, parserLookupName, parserLookupClass = parser(dts, None) from lxml import etree xmlDocument = etree.parse(file, parser=parser, base_url=skosFile) file.close() xmlRootElement = xmlDocument.getroot() #xmlDocument.getroot().init(self) ## is this needed ?? for rdfElement in xmlDocument.iter( tag="{http://www.w3.org/1999/02/22-rdf-syntax-ns#}RDF"): break numSchemes = 0 numConcepts = 0 # use presentation relationships for broader and narrower concepts relationshipSet = dts.relationshipSet(XbrlConst.parentChild) def conceptUri(concept): return concept.qname.namespaceURI + "#" + concept.qname.localName def namespaceUri(qname): return qname.namespaceURI + "#" + qname.prefix priorSchemeSibling = None schemeNamespaces = set() dts.modelManager.showStatus("setting SKOS concepts from XBRL concepts") for qn, concept in sorted(dts.qnameConcepts.items(), key=lambda item: str(item[0])): if concept.modelDocument.targetNamespace not in (XbrlConst.xbrli, XbrlConst.link, XbrlConst.xlink, XbrlConst.xl, XbrlConst.xbrldt): if qn.namespaceURI not in schemeNamespaces: # add conceptScheme numSchemes += 1 skosElt = etree.Element( "{http://www.w3.org/2004/02/skos/core#}ConceptScheme") skosElt.set( "{http://www.w3.org/1999/02/22-rdf-syntax-ns#}about", namespaceUri(qn)) elt = etree.SubElement( skosElt, "{http://www.w3.org/1999/02/22-rdf-syntax-ns#}type") elt.set( "{http://www.w3.org/1999/02/22-rdf-syntax-ns#}resource", "http://www.w3.org/2002/07/owl#Thing") elt = etree.SubElement( skosElt, "{http://www.w3.org/2004/02/skos/core#}notation") elt.text = str(qn.prefix) schemeNamespaces.add(qn.namespaceURI) if priorSchemeSibling is not None: priorSchemeSibling.addnext(skosElt) else: rdfElement.append(skosElt) priorSchemeSibling = skosElt numConcepts += 1 skosElt = etree.SubElement( rdfElement, "{http://www.w3.org/2004/02/skos/core#}Concept") skosElt.set( "{http://www.w3.org/1999/02/22-rdf-syntax-ns#}about", conceptUri(concept)) elt = etree.SubElement( skosElt, "{http://www.w3.org/1999/02/22-rdf-syntax-ns#}type") elt.set( "{http://www.w3.org/1999/02/22-rdf-syntax-ns#}resource", "http://www.w3.org/2002/07/owl#Thing") elt = etree.SubElement( skosElt, "{http://www.w3.org/2004/02/skos/core#}notation") elt.text = str(concept.qname) definition = concept.label( preferredLabel=XbrlConst.documentationLabel, lang="en", strip=True, fallbackToQname=False) if definition: elt = etree.SubElement( skosElt, "{http://www.w3.org/2004/02/skos/core#}definition") elt.text = definition else: # if no definition, look for any references references = viewReferences(concept) if references: elt = etree.SubElement( skosElt, "{http://www.w3.org/2004/02/skos/core#}definition") elt.text = references linkedReferenceURI = referenceURI(concept) if linkedReferenceURI: # link to reference elt = etree.SubElement( skosElt, "{http://www.w3.org/2004/02/skos/core#}definition") elt.text = linkedReferenceURI labelsRelationshipSet = dts.relationshipSet( XbrlConst.conceptLabel) if labelsRelationshipSet: for modelLabelRel in labelsRelationshipSet.fromModelObject( concept): label = modelLabelRel.toModelObject if label.role == XbrlConst.standardLabel: elt = etree.SubElement( skosElt, "{http://www.w3.org/2004/02/skos/core#}prefLabel" ) elt.set( "{http://www.w3.org/XML/1998/namespace}lang", label.xmlLang) elt.text = label.text.strip() for rel in relationshipSet.fromModelObject( concept): # narrower elt = etree.SubElement( skosElt, "{http://www.w3.org/2004/02/skos/core#}narrower") elt.set( "{http://www.w3.org/1999/02/22-rdf-syntax-ns#}resource", conceptUri(rel.toModelObject)) for rel in relationshipSet.toModelObject(concept): # broader elt = etree.SubElement( skosElt, "{http://www.w3.org/2004/02/skos/core#}broader") elt.set( "{http://www.w3.org/1999/02/22-rdf-syntax-ns#}resource", conceptUri(rel.fromModelObject)) elt = etree.SubElement( skosElt, "{http://www.w3.org/2004/02/skos/core#}inScheme") elt.set( "{http://www.w3.org/1999/02/22-rdf-syntax-ns#}resource", namespaceUri(qn)) dts.modelManager.showStatus("saving SKOS file") fh = open(skosFile, "w", encoding="utf-8") XmlUtil.writexml(fh, xmlDocument, encoding="utf-8") fh.close() dts.info( "info:saveSKOS", _("SKOS of %(entryFile)s has %(numberOfConcepts)s concepts in SKOS RDF file %(skosOutputFile)s." ), modelObject=dts, entryFile=dts.uri, numberOfConcepts=numConcepts, skosOutputFile=skosFile) dts.modelManager.showStatus("ready", 3000) except Exception as ex: dts.error("exception", _("SKOS generation exception: %(error)s"), error=ex, modelXbrl=dts, exc_info=True)
def viewConcept(self, concept, modelObject, labelPrefix, preferredLabel, parentnode, n, relationshipSet, visited): if concept is None: return isRelation = isinstance(modelObject, ModelDtsObject.ModelRelationship) if isinstance(concept, ModelDtsObject.ModelConcept): text = labelPrefix + concept.label(preferredLabel, lang=self.lang) if (self.arcrole in ("XBRL-dimensions", XbrlConst.hypercubeDimension) and concept.isTypedDimension and concept.typedDomainElement is not None): text += " (typedDomain={0})".format( concept.typedDomainElement.qname) elif self.arcrole == "Table-rendering": text = concept.localName elif isinstance(concept, ModelDtsObject.ModelResource): text = (concept.text or concept.localName) else: # just a resource text = concept.localName childnode = self.treeView.insert(parentnode, "end", modelObject.objectId(self.id), text=text, tags=("odd" if n & 1 else "even", )) if self.arcrole == XbrlConst.parentChild: # extra columns self.treeView.set(childnode, "type", concept.niceType) self.treeView.set(childnode, "references", viewReferences(concept)) elif self.arcrole == XbrlConst.summationItem: if isRelation: self.treeView.set(childnode, "weight", "{:0g} ".format(modelObject.weight)) self.treeView.set(childnode, "balance", concept.balance) elif self.arcrole == "XBRL-dimensions" and isRelation: # extra columns relArcrole = modelObject.arcrole self.treeView.set(childnode, "arcrole", os.path.basename(relArcrole)) if relArcrole in (XbrlConst.all, XbrlConst.notAll): self.treeView.set(childnode, "contextElement", modelObject.contextElement) self.treeView.set(childnode, "closed", modelObject.closed) elif relArcrole in (XbrlConst.dimensionDomain, XbrlConst.domainMember): self.treeView.set(childnode, "usable", modelObject.usable) elif self.arcrole == "Table-rendering": # extra columns header = concept.genLabel(lang=self.lang, strip=True) if isRelation and header is None: header = "{0} {1}".format( os.path.basename(modelObject.arcrole), concept.xlinkLabel) self.treeView.set(childnode, "header", header) if concept.get("abstract") == "true": self.treeView.set(childnode, "abstract", '\u2713') # checkmark unicode character if isRelation: self.treeView.set(childnode, "axis", modelObject.get("axisType")) if isinstance(concept, (ModelAxisCoord, ModelExplicitAxisMember)): self.treeView.set(childnode, "priItem", concept.primaryItemQname) self.treeView.set( childnode, "dims", ' '.join( ("{0},{1}".format(dim[0], dim[1]) for dim in concept.explicitDims))) self.id += 1 self.tag_has[modelObject.objectId()].append(childnode) if isRelation: self.tag_has[modelObject.toModelObject.objectId()].append( childnode) if concept not in visited: visited.add(concept) for modelRel in relationshipSet.fromModelObject(concept): nestedRelationshipSet = relationshipSet targetRole = modelRel.targetRole if self.arcrole == XbrlConst.summationItem: childPrefix = "({:0g}) ".format( modelRel.weight ) # format without .0 on integer weights elif targetRole is None or len(targetRole) == 0: targetRole = relationshipSet.linkrole childPrefix = "" else: nestedRelationshipSet = self.modelXbrl.relationshipSet( self.arcrole, targetRole) childPrefix = "(via targetRole) " toConcept = modelRel.toModelObject if toConcept in visited: childPrefix += "(loop)" labelrole = modelRel.preferredLabel if not labelrole: labelrole = self.labelrole n += 1 # child has opposite row style of parent self.viewConcept(toConcept, modelRel, childPrefix, labelrole, childnode, n, nestedRelationshipSet, visited) visited.remove(concept)
def viewConcept(self, concept, modelObject, labelPrefix, preferredLabel, parentnode, n, relationshipSet, visited): if concept is None: return isRelation = isinstance(modelObject, ModelDtsObject.ModelRelationship) if isinstance(concept, ModelDtsObject.ModelConcept): text = labelPrefix + concept.label(preferredLabel,lang=self.lang) if (self.arcrole in ("XBRL-dimensions", XbrlConst.hypercubeDimension) and concept.isTypedDimension and concept.typedDomainElement is not None): text += " (typedDomain={0})".format(concept.typedDomainElement.qname) elif self.arcrole == "Table-rendering": text = concept.localName elif isinstance(concept, ModelDtsObject.ModelResource): text = concept.text if text is None: text = concept.localName else: # just a resource text = concept.localName childnode = self.treeView.insert(parentnode, "end", modelObject.objectId(self.id), text=text, tags=("odd" if n & 1 else "even",)) if self.arcrole == XbrlConst.parentChild: # extra columns self.treeView.set(childnode, "type", concept.niceType) self.treeView.set(childnode, "references", viewReferences(concept)) elif self.arcrole == XbrlConst.summationItem: if isRelation: self.treeView.set(childnode, "weight", "{:0g} ".format(modelObject.weight)) self.treeView.set(childnode, "balance", concept.balance) elif self.arcrole == "XBRL-dimensions" and isRelation: # extra columns relArcrole = modelObject.arcrole self.treeView.set(childnode, "arcrole", os.path.basename(relArcrole)) if relArcrole in (XbrlConst.all, XbrlConst.notAll): self.treeView.set(childnode, "contextElement", modelObject.contextElement) self.treeView.set(childnode, "closed", modelObject.closed) elif relArcrole in (XbrlConst.dimensionDomain, XbrlConst.domainMember): self.treeView.set(childnode, "usable", modelObject.usable) elif self.arcrole == "Table-rendering": # extra columns header = concept.genLabel(lang=self.lang,strip=True) if isRelation and header is None: header = "{0} {1}".format(os.path.basename(modelObject.arcrole), concept.xlinkLabel) self.treeView.set(childnode, "header", header) if concept.get("abstract") == "true": self.treeView.set(childnode, "abstract", '\u2713') # checkmark unicode character if isRelation: self.treeView.set(childnode, "axis", modelObject.get("axisType")) if isinstance(concept, (ModelAxisCoord,ModelExplicitAxisMember)): self.treeView.set(childnode, "priItem", concept.primaryItemQname) self.treeView.set(childnode, "dims", ' '.join(("{0},{1}".format(dim[0],dim[1]) for dim in concept.explicitDims))) self.id += 1 self.tag_has[modelObject.objectId()].append(childnode) if isRelation: self.tag_has[modelObject.toModelObject.objectId()].append(childnode) if concept not in visited: visited.add(concept) for modelRel in relationshipSet.fromModelObject(concept): nestedRelationshipSet = relationshipSet targetRole = modelRel.targetRole if self.arcrole == XbrlConst.summationItem: childPrefix = "({:0g}) ".format(modelRel.weight) # format without .0 on integer weights elif targetRole is None or len(targetRole) == 0: targetRole = relationshipSet.linkrole childPrefix = "" else: nestedRelationshipSet = self.modelXbrl.relationshipSet(self.arcrole, targetRole) childPrefix = "(via targetRole) " toConcept = modelRel.toModelObject if toConcept in visited: childPrefix += "(loop)" labelrole = modelRel.preferredLabel if not labelrole: labelrole = self.labelrole n += 1 # child has opposite row style of parent self.viewConcept(toConcept, modelRel, childPrefix, labelrole, childnode, n, nestedRelationshipSet, visited) visited.remove(concept)
def viewConcept(self, concept, modelObject, labelPrefix, preferredLabel, parentnode, n, relationshipSet, visited): if concept is None: return isRelation = isinstance(modelObject, ModelObject.ModelRelationship) if isinstance(concept, ModelObject.ModelConcept): text = labelPrefix + concept.label(preferredLabel, lang=self.lang) elif self.arcrole == "EU-rendering" and isRelation: text = concept.genLabel(lang=self.lang) if isRelation: relArcrole = modelObject.arcrole if text is None: text = "{0} {1}".format(os.path.basename(relArcrole), concept.xlinkLabel) elif not text: text = concept.localName elif isinstance(concept, ModelObject.ModelResource): text = concept.text else: # just a resource text = concept.localName childnode = self.treeView.insert(parentnode, "end", modelObject.objectId(self.id), text=text, tags=("odd" if n & 1 else "even", )) if self.arcrole == XbrlConst.parentChild: # extra columns self.treeView.set(childnode, "type", concept.niceType) from arelle.ViewUtil import viewReferences self.treeView.set(childnode, "references", viewReferences(concept)) elif self.arcrole == XbrlConst.summationItem: if isRelation: self.treeView.set(childnode, "weight", "{:0g} ".format(modelObject.weight)) self.treeView.set(childnode, "balance", concept.balance) elif self.arcrole == "XBRL-dimensions" and isRelation: # extra columns relArcrole = modelObject.arcrole self.treeView.set(childnode, "arcrole", os.path.basename(relArcrole)) if relArcrole in (XbrlConst.all, XbrlConst.notAll): self.treeView.set(childnode, "contextElement", modelObject.contextElement) self.treeView.set(childnode, "closed", modelObject.closed) elif relArcrole in (XbrlConst.dimensionDomain, XbrlConst.domainMember): self.treeView.set(childnode, "usable", modelObject.usable) elif self.arcrole == "EU-rendering" and isRelation: # extra columns from arelle.ModelRenderingObject import ModelAxisCoord if relArcrole == XbrlConst.euTableAxis: self.treeView.set(childnode, "axis", modelObject.element.getAttribute("axisType")) if isinstance(concept, ModelAxisCoord): self.treeView.set(childnode, "priItem", concept.primaryItemQname) self.treeView.set( childnode, "dims", ' '.join( ("{0},{1}".format(dim[0], dim[1]) for dim in concept.explicitDims))) self.id += 1 self.tag_has[modelObject.objectId()].append(childnode) if isRelation: self.tag_has[modelObject.toModelObject.objectId()].append( childnode) if concept not in visited: visited.add(concept) for modelRel in relationshipSet.fromModelObject(concept): nestedRelationshipSet = relationshipSet targetRole = modelRel.targetRole if self.arcrole == XbrlConst.summationItem: childPrefix = "({:0g}) ".format( modelRel.weight ) # format without .0 on integer weights elif targetRole is None or len(targetRole) == 0: targetRole = relationshipSet.linkrole childPrefix = "" else: nestedRelationshipSet = self.modelXbrl.relationshipSet( self.arcrole, targetRole) childPrefix = "(via targetRole) " toConcept = modelRel.toModelObject if toConcept in visited: childPrefix += "(loop)" labelrole = modelRel.preferredLabel if not labelrole: labelrole = self.labelrole n += 1 # child has opposite row style of parent self.viewConcept(toConcept, modelRel, childPrefix, labelrole, childnode, n, nestedRelationshipSet, visited) visited.remove(concept)