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
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
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
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