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
Example #4
0
    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
Example #5
0
 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
Example #6
0
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)
Example #7
0
 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
Example #8
0
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)
Example #9
0
 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)
Example #10
0
 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)
Example #11
0
 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)