示例#1
0
def ineffectiveArcs(baseSetModelLinks, arcrole, arcqname=None):
    relationships = defaultdict(list)
    for modelLink in baseSetModelLinks:
        arcs = []
        for linkChild in modelLink.element.childNodes:
            if (
                linkChild.nodeType == 1
                and linkChild.getAttributeNS(XbrlConst.xlink, "type") == "arc"
                and arcrole == linkChild.getAttributeNS(XbrlConst.xlink, "arcrole")
                and (arcqname is None or arcqname == linkChild)
            ):
                arcs.append(linkChild)

        # build network
        for arcElement in arcs:
            arcrole = arcElement.getAttributeNS(XbrlConst.xlink, "arcrole")
            fromLabel = arcElement.getAttributeNS(XbrlConst.xlink, "from")
            toLabel = arcElement.getAttributeNS(XbrlConst.xlink, "to")
            for fromResource in modelLink.labeledResources[fromLabel]:
                for toResource in modelLink.labeledResources[toLabel]:
                    modelRel = ModelObject.createRelationship(
                        modelLink.modelDocument, arcElement, fromResource.dereference(), toResource.dereference()
                    )
                    relationships[modelRel.equivalenceKey].append(modelRel)
    # determine ineffective relationships
    ineffectives = []
    for equivalenceKey, relationship in relationships.items():
        # sort by priority, prohibited
        equivalentRels = []
        i = 0
        for modelRel in relationship:
            equivalentRels.append((modelRel.priority, modelRel.prohibitedUseSortKey, i))
            i += 1
        equivalentRels.sort()
        priorRel = None
        for rel in equivalentRels:
            if rel[1] == 2:  # this rel is prohibited
                if priorRel is None:
                    ineffectives.append(relationship[rel[2]])  # this rel ineffective
                elif priorRel[1] == 2:  # prior rel is prohibited
                    ineffectives.append(priorRel[2])
            else:
                if priorRel is not None and priorRel[1] != 2:
                    ineffectives.append(relationship[priorRel[2]])  # prior ineffective
            priorRel = rel
    return ineffectives
示例#2
0
def ineffectiveArcs(baseSetModelLinks, arcrole, arcqname=None):
    relationships = defaultdict(list)
    for modelLink in baseSetModelLinks:
        arcs = []
        for linkChild in modelLink.element.childNodes:
            if linkChild.nodeType == 1 and \
               linkChild.getAttributeNS(XbrlConst.xlink, "type") == "arc" and \
               arcrole == linkChild.getAttributeNS(XbrlConst.xlink, "arcrole") and \
               (arcqname is None or arcqname == linkChild):
                arcs.append(linkChild)
                    
        # build network
        for arcElement in arcs:
            arcrole = arcElement.getAttributeNS(XbrlConst.xlink, "arcrole")
            fromLabel = arcElement.getAttributeNS(XbrlConst.xlink, "from")
            toLabel = arcElement.getAttributeNS(XbrlConst.xlink, "to")
            for fromResource in modelLink.labeledResources[fromLabel]:
                for toResource in modelLink.labeledResources[toLabel]:
                    modelRel = ModelObject.createRelationship(modelLink.modelDocument, arcElement, fromResource.dereference(), toResource.dereference())
                    relationships[modelRel.equivalenceKey].append(modelRel)
    # determine ineffective relationships
    ineffectives = []
    for equivalenceKey, relationship in relationships.items():
        #sort by priority, prohibited
        equivalentRels = []
        i = 0
        for modelRel in relationship:
            equivalentRels.append((modelRel.priority,modelRel.prohibitedUseSortKey,i))
            i += 1
        equivalentRels.sort()
        priorRel = None
        for rel in equivalentRels:
            if rel[1] == 2: # this rel is prohibited
                if priorRel is None:
                    ineffectives.append(relationship[rel[2]]) # this rel ineffective
                elif priorRel[1] == 2: # prior rel is prohibited
                    ineffectives.append(priorRel[2])
            else:
                if priorRel is not None and \
                   priorRel[1] != 2:
                    ineffectives.append(relationship[priorRel[2]]) # prior ineffective
            priorRel = rel
    return ineffectives
示例#3
0
    def __init__(self, modelXbrl, arcrole, linkrole=None, linkqname=None, arcqname=None, includeProhibits=False):
        self.isChanged = False
        self.modelXbrl = modelXbrl
        self.arcrole = arcrole
        self.linkrole = linkrole
        self.linkqname = linkqname
        self.arcqname = arcqname

        baseSetKey = (arcrole, linkrole, linkqname, arcqname)
        relationshipSetKey = (arcrole, linkrole, linkqname, arcqname, includeProhibits)

        # base sets does not care about the #includeProhibits
        if baseSetKey in self.modelXbrl.baseSets:
            modelLinks = self.modelXbrl.baseSets[baseSetKey]
        else:
            modelLinks = []

        # gather arcs
        relationships = {}
        isDimensionRel = self.arcrole == "XBRL-dimensions"  # all dimensional relationship arcroles
        isFormulaRel = self.arcrole == "XBRL-formulae"  # all formula relationship arcroles
        isEuRenderingRel = self.arcrole == "EU-rendering"
        isFootnoteRel = self.arcrole == "XBRL-footnotes"  # all footnote relationship arcroles

        for modelLink in modelLinks:
            arcs = []
            linkEltQname = modelLink.qname
            for linkChild in modelLink.element.childNodes:
                if (
                    linkChild.nodeType == 1
                    and linkChild.getAttributeNS(XbrlConst.xlink, "type") == "arc"
                    and linkChild.hasAttributeNS(XbrlConst.xlink, "arcrole")
                ):
                    linkChildArcrole = linkChild.getAttributeNS(XbrlConst.xlink, "arcrole")
                    linkChildQname = linkChild
                    if isFootnoteRel:
                        arcs.append(linkChild)
                    elif isDimensionRel:
                        if XbrlConst.isDimensionArcrole(linkChildArcrole):
                            arcs.append(linkChild)
                    elif isFormulaRel:
                        if XbrlConst.isFormulaArcrole(linkChildArcrole):
                            arcs.append(linkChild)
                    elif isEuRenderingRel:
                        if XbrlConst.isEuRenderingArcrole(linkChildArcrole):
                            arcs.append(linkChild)
                    elif (
                        arcrole == linkChildArcrole
                        and (arcqname is None or arcqname == linkChildQname)
                        and (linkqname is None or linkqname == linkEltQname)
                    ):
                        arcs.append(linkChild)

            # build network
            for arcElement in arcs:
                arcrole = arcElement.getAttributeNS(XbrlConst.xlink, "arcrole")
                fromLabel = arcElement.getAttributeNS(XbrlConst.xlink, "from")
                toLabel = arcElement.getAttributeNS(XbrlConst.xlink, "to")
                for fromResource in modelLink.labeledResources[fromLabel]:
                    for toResource in modelLink.labeledResources[toLabel]:
                        modelRel = ModelObject.createRelationship(
                            modelLink.modelDocument, arcElement, fromResource.dereference(), toResource.dereference()
                        )
                        modelRelEquivalenceKey = (
                            modelRel.equivalenceKey
                        )  # this is a complex tuple to compute, get once for below
                        if modelRelEquivalenceKey not in relationships or modelRel.priorityOver(
                            relationships[modelRelEquivalenceKey]
                        ):
                            relationships[modelRelEquivalenceKey] = modelRel

        # reduce effective arcs and order relationships...
        self.modelRelationships = []
        self.modelRelationshipsFrom = None
        self.modelRelationshipsTo = None
        self.modelConceptRoots = None
        self.modellinkRoleUris = None
        orderRels = defaultdict(list)
        for modelRel in relationships.values():
            if includeProhibits or not modelRel.isProhibited:
                orderRels[modelRel.order].append(modelRel)
        for order in sorted(orderRels.keys()):
            for modelRel in orderRels[order]:
                self.modelRelationships.append(modelRel)
        modelXbrl.relationshipSets[relationshipSetKey] = self
示例#4
0
    def __init__(self, modelXbrl, arcrole, linkrole=None, linkqname=None, arcqname=None, includeProhibits=False):
        self.isChanged = False
        self.modelXbrl = modelXbrl
        self.arcrole = arcrole
        self.linkrole = linkrole
        self.linkqname = linkqname
        self.arcqname = arcqname

        baseSetKey = (arcrole, linkrole, linkqname, arcqname) 
        relationshipSetKey = (arcrole, linkrole, linkqname, arcqname, includeProhibits) 
            
        # base sets does not care about the #includeProhibits
        if baseSetKey in self.modelXbrl.baseSets:
            modelLinks = self.modelXbrl.baseSets[baseSetKey]
        else:
            modelLinks = []
        
        # gather arcs
        relationships = {}
        isDimensionRel =  self.arcrole == "XBRL-dimensions" # all dimensional relationship arcroles
        isFormulaRel =  self.arcrole == "XBRL-formulae" # all formula relationship arcroles
        isEuRenderingRel = self.arcrole == "EU-rendering"
        isFootnoteRel =  self.arcrole == "XBRL-footnotes" # all footnote relationship arcroles
        
        for modelLink in modelLinks:
            arcs = []
            linkEltQname = modelLink.qname
            for linkChild in modelLink.element.childNodes:
                if linkChild.nodeType == 1 and \
                   linkChild.getAttributeNS(XbrlConst.xlink, "type") == "arc" and \
                   linkChild.hasAttributeNS(XbrlConst.xlink, "arcrole"):
                    linkChildArcrole = linkChild.getAttributeNS(XbrlConst.xlink, "arcrole")
                    linkChildQname = linkChild
                    if isFootnoteRel:
                        arcs.append(linkChild)
                    elif isDimensionRel: 
                        if XbrlConst.isDimensionArcrole(linkChildArcrole):
                            arcs.append(linkChild)
                    elif isFormulaRel:
                        if XbrlConst.isFormulaArcrole(linkChildArcrole):
                            arcs.append(linkChild)
                    elif isEuRenderingRel:
                        if XbrlConst.isEuRenderingArcrole(linkChildArcrole):
                            arcs.append(linkChild)
                    elif arcrole == linkChildArcrole and \
                         (arcqname is None or arcqname == linkChildQname) and \
                         (linkqname is None or linkqname == linkEltQname):
                        arcs.append(linkChild)
                        
            # build network
            for arcElement in arcs:
                arcrole = arcElement.getAttributeNS(XbrlConst.xlink, "arcrole")
                fromLabel = arcElement.getAttributeNS(XbrlConst.xlink, "from")
                toLabel = arcElement.getAttributeNS(XbrlConst.xlink, "to")
                for fromResource in modelLink.labeledResources[fromLabel]:
                    for toResource in modelLink.labeledResources[toLabel]:
                        modelRel = ModelObject.createRelationship(modelLink.modelDocument, arcElement, fromResource.dereference(), toResource.dereference())
                        modelRelEquivalenceKey = modelRel.equivalenceKey    # this is a complex tuple to compute, get once for below
                        if modelRelEquivalenceKey not in relationships or \
                           modelRel.priorityOver(relationships[modelRelEquivalenceKey]):
                            relationships[modelRelEquivalenceKey] = modelRel

        #reduce effective arcs and order relationships...
        self.modelRelationships = []
        self.modelRelationshipsFrom = None
        self.modelRelationshipsTo = None
        self.modelConceptRoots = None
        self.modellinkRoleUris = None
        orderRels = defaultdict(list)
        for modelRel in relationships.values():
            if includeProhibits or not modelRel.isProhibited:
                orderRels[modelRel.order].append(modelRel)
        for order in sorted(orderRels.keys()):
            for modelRel in orderRels[order]:
                self.modelRelationships.append(modelRel)
        modelXbrl.relationshipSets[relationshipSetKey] = self