|
|
|
@ -523,6 +523,8 @@ class xmlDoc:
|
|
|
|
|
self.tmpFields = False
|
|
|
|
|
# Разделитель областей - по умолчанию перевод строки "\n"
|
|
|
|
|
self.sepAreas = False
|
|
|
|
|
# Разделитель разделенных списков - по умолчанию перевод строки "\n"
|
|
|
|
|
#self.sepSplitFields = False
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def createDoc(self, typeDoc, version):
|
|
|
|
@ -536,6 +538,8 @@ class xmlDoc:
|
|
|
|
|
self.body = xpath.Evaluate('child::body',self.root)[0]
|
|
|
|
|
# установка разделителя областей
|
|
|
|
|
self.sepAreas = self.createField("br",[],"",[],False,False)
|
|
|
|
|
# установка разделителя областей разделенных списков
|
|
|
|
|
#self.sepSplitFields = self.createField("br",[],"",[],False,False)
|
|
|
|
|
return self.doc
|
|
|
|
|
|
|
|
|
|
def addField(self, field):
|
|
|
|
@ -621,13 +625,17 @@ class xmlDoc:
|
|
|
|
|
xmlCaptions[0].appendChild(newNode)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def joinField(self, xmlArea, xmlNewField):
|
|
|
|
|
def joinField1(self, xmlArea, xmlNewField):
|
|
|
|
|
print "----------------------------------------------------"
|
|
|
|
|
#print self.getQuoteField(xmlNewField)
|
|
|
|
|
"""Объединяет XML ноду область и XML ноду поле"""
|
|
|
|
|
fieldNames = xpath.Evaluate('child::field/name',xmlArea)
|
|
|
|
|
newFieldNames = xpath.Evaluate('child::name',xmlNewField)
|
|
|
|
|
newFieldVals = xpath.Evaluate('child::value',xmlNewField)
|
|
|
|
|
newFieldsAction = self.getActionField(xmlNewField)
|
|
|
|
|
flagFindField = False
|
|
|
|
|
flagGlobalCompareFields = False
|
|
|
|
|
appSplLst = []
|
|
|
|
|
if not newFieldNames:
|
|
|
|
|
return False
|
|
|
|
|
newNameField = newFieldNames[0].firstChild.nodeValue
|
|
|
|
@ -657,6 +665,11 @@ class xmlDoc:
|
|
|
|
|
flagNoCompareFields = True
|
|
|
|
|
break
|
|
|
|
|
z += 1
|
|
|
|
|
if not flagNoCompareFields:
|
|
|
|
|
flagGlobalCompareFields = True
|
|
|
|
|
|
|
|
|
|
print "FLAG", flagGlobalCompareFields
|
|
|
|
|
|
|
|
|
|
if flagNoCompareFields or\
|
|
|
|
|
self.getTypeField(xmlNewField) == "seplist":
|
|
|
|
|
#Действия при добавлении распределенного списка
|
|
|
|
@ -664,50 +677,166 @@ class xmlDoc:
|
|
|
|
|
xmlOldField = fn.parentNode
|
|
|
|
|
seplistNewXML = self.getSepListToField(xmlNewField)
|
|
|
|
|
seplistOldXML = self.getSepListToField(xmlOldField)
|
|
|
|
|
#print seplistOldXML
|
|
|
|
|
if not seplistOldXML:
|
|
|
|
|
seplistOldXML = [xmlOldField,]
|
|
|
|
|
xmlAreaOld = xmlOldField.parentNode
|
|
|
|
|
for nodeSeplistRemove in seplistOldXML[:-1]:
|
|
|
|
|
if nodeSeplistRemove.nextSibling and\
|
|
|
|
|
self.getTypeField(\
|
|
|
|
|
nodeSeplistRemove.nextSibling) == "br":
|
|
|
|
|
xmlAreaOld.removeChild(\
|
|
|
|
|
nodeSeplistRemove.nextSibling)
|
|
|
|
|
if self.getTypeField(nodeSeplistRemove) == "var":
|
|
|
|
|
xmlAreaOld.removeChild(nodeSeplistRemove)
|
|
|
|
|
|
|
|
|
|
if nodeSeplistRemove.nextSibling and\
|
|
|
|
|
self.getTypeField(\
|
|
|
|
|
nodeSeplistRemove.nextSibling) == "br":
|
|
|
|
|
xmlAreaOld.removeChild(\
|
|
|
|
|
nodeSeplistRemove.nextSibling)
|
|
|
|
|
for nodeSeplist in seplistNewXML:
|
|
|
|
|
if self.getActionField(nodeSeplist) != "drop":
|
|
|
|
|
#xmlArea.appendChild(nodeSeplist.cloneNode(\
|
|
|
|
|
#True))
|
|
|
|
|
xmlArea.insertBefore(nodeSeplist.cloneNode(\
|
|
|
|
|
True), seplistOldXML[-1])
|
|
|
|
|
if newFieldsAction == "join":
|
|
|
|
|
self.setActionField(nodeSeplist,"append")
|
|
|
|
|
nextNode = seplistOldXML[-1].nextSibling
|
|
|
|
|
newInsNode = nodeSeplist.cloneNode(True)
|
|
|
|
|
if nextNode:
|
|
|
|
|
appSplLst.append((newInsNode,
|
|
|
|
|
nextNode,
|
|
|
|
|
"insert"))
|
|
|
|
|
else:
|
|
|
|
|
appSplLst.append((newInsNode,
|
|
|
|
|
False,
|
|
|
|
|
"append"))
|
|
|
|
|
else:
|
|
|
|
|
xmlArea.insertBefore(\
|
|
|
|
|
nodeSeplist.cloneNode(True),
|
|
|
|
|
seplistOldXML[-1])
|
|
|
|
|
|
|
|
|
|
parentNode = nodeSeplist.parentNode
|
|
|
|
|
parentNode.removeChild(nodeSeplist)
|
|
|
|
|
if seplistNewXML:
|
|
|
|
|
parentNode = seplistOldXML[-1].parentNode
|
|
|
|
|
if parentNode:
|
|
|
|
|
if parentNode and newFieldsAction != "join":
|
|
|
|
|
parentNode.removeChild(seplistOldXML[-1])
|
|
|
|
|
#print "--------------------------------------"
|
|
|
|
|
#print nodeSeplist.toprettyxml()
|
|
|
|
|
#xmlArea.removeChild(fn.parentNode)
|
|
|
|
|
else:
|
|
|
|
|
#print xmlNewField.toprettyxml()
|
|
|
|
|
# Устанавливаем action=replace
|
|
|
|
|
self.setActionField(xmlNewField, "replace")
|
|
|
|
|
# Если параметры поля не сходятся заменяем поле
|
|
|
|
|
xmlArea.replaceChild(xmlNewField.cloneNode(True),
|
|
|
|
|
fn.parentNode)
|
|
|
|
|
# Если поле не найдено добавляем его
|
|
|
|
|
fn.parentNode)
|
|
|
|
|
print "FLAG-FLAG", flagGlobalCompareFields
|
|
|
|
|
if not flagGlobalCompareFields:
|
|
|
|
|
print xmlNewField.toprettyxml()
|
|
|
|
|
for newNode, nxtNode, app in appSplLst:
|
|
|
|
|
if app == "insert":
|
|
|
|
|
pass
|
|
|
|
|
xmlArea.insertBefore(newNode,nxtNode)
|
|
|
|
|
elif app == "append":
|
|
|
|
|
pass
|
|
|
|
|
xmlArea.appendChild(newNode)
|
|
|
|
|
|
|
|
|
|
#print newNode, nextNode, app
|
|
|
|
|
#
|
|
|
|
|
#if newFieldsAction == "join":
|
|
|
|
|
#self.setActionField(xmlNewField,"append")
|
|
|
|
|
#xmlArea.appendChild(xmlNewField)
|
|
|
|
|
#return True
|
|
|
|
|
|
|
|
|
|
# Если поле не найдено добавляем его
|
|
|
|
|
if not flagFindField:
|
|
|
|
|
if self.getActionField(xmlNewField) != "drop":
|
|
|
|
|
self.setActionField(xmlNewField, "append")
|
|
|
|
|
xmlArea.appendChild(xmlNewField)
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def joinField(self, xmlArea, xmlNewField):
|
|
|
|
|
newNameField = self.getNameField(xmlNewField)
|
|
|
|
|
if not newNameField or not newNameField.strip():
|
|
|
|
|
return False
|
|
|
|
|
fieldsOldComp = xpath.Evaluate("child::field[child::name='%s']"\
|
|
|
|
|
%(newNameField), xmlArea)
|
|
|
|
|
|
|
|
|
|
# Если поле не найдено добавляем его
|
|
|
|
|
typeNewField = self.getTypeField(xmlNewField)
|
|
|
|
|
if not fieldsOldComp and typeNewField != "seplist":
|
|
|
|
|
if self.getActionField(xmlNewField) != "drop":
|
|
|
|
|
self.setActionField(xmlNewField, "append")
|
|
|
|
|
xmlArea.appendChild(xmlNewField)
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
newFieldsAction = self.getActionField(xmlNewField)
|
|
|
|
|
newValues = self.getFieldValues(xmlNewField)
|
|
|
|
|
print newValues
|
|
|
|
|
flagCompare = True
|
|
|
|
|
for nodeFieldOld in fieldsOldComp:
|
|
|
|
|
oldValues = self.getFieldValues(nodeFieldOld)
|
|
|
|
|
for newValue in newValues:
|
|
|
|
|
if not (newValue in oldValues):
|
|
|
|
|
flagCompare = False
|
|
|
|
|
break
|
|
|
|
|
|
|
|
|
|
appSplLst = []
|
|
|
|
|
if typeNewField == "seplist":
|
|
|
|
|
xmlOldField = fieldsOldComp[-1]
|
|
|
|
|
seplistNewXML = self.getSepListToField(xmlNewField)
|
|
|
|
|
if seplistNewXML:
|
|
|
|
|
for nodeSeplist in seplistNewXML:
|
|
|
|
|
if self.getActionField(nodeSeplist) != "drop":
|
|
|
|
|
if newFieldsAction == "join":
|
|
|
|
|
self.setActionField(nodeSeplist,"append")
|
|
|
|
|
nextNode = xmlOldField.nextSibling
|
|
|
|
|
newInsNode = nodeSeplist.cloneNode(True)
|
|
|
|
|
if nextNode:
|
|
|
|
|
appSplLst.append((newInsNode,
|
|
|
|
|
nextNode,
|
|
|
|
|
"insert"))
|
|
|
|
|
else:
|
|
|
|
|
appSplLst.append((newInsNode,
|
|
|
|
|
False,
|
|
|
|
|
"append"))
|
|
|
|
|
else:
|
|
|
|
|
xmlArea.insertBefore(\
|
|
|
|
|
nodeSeplist.cloneNode(True),
|
|
|
|
|
xmlOldField)
|
|
|
|
|
|
|
|
|
|
parentNode = nodeSeplist.parentNode
|
|
|
|
|
parentNode.removeChild(nodeSeplist)
|
|
|
|
|
|
|
|
|
|
parentNode = xmlOldField.parentNode
|
|
|
|
|
if parentNode and newFieldsAction != "join":
|
|
|
|
|
parentNode.removeChild(xmlOldField)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for newNode, nxtNode, app in appSplLst:
|
|
|
|
|
print newNode, nxtNode, app
|
|
|
|
|
if app == "insert":
|
|
|
|
|
xmlArea.insertBefore(newNode,nxtNode)
|
|
|
|
|
elif app == "append":
|
|
|
|
|
xmlArea.appendChild(newNode)
|
|
|
|
|
|
|
|
|
|
if not flagCompare and typeNewField != "seplist":
|
|
|
|
|
# Устанавливаем action=replace
|
|
|
|
|
self.setActionField(xmlNewField, "replace")
|
|
|
|
|
# Если параметры поля не сходятся заменяем поле
|
|
|
|
|
xmlArea.replaceChild(xmlNewField.cloneNode(True),
|
|
|
|
|
fieldsOldComp[-1])
|
|
|
|
|
|
|
|
|
|
print "-------------------------------------------------------"
|
|
|
|
|
if newFieldsAction == "join":
|
|
|
|
|
fieldsOldRemove = []
|
|
|
|
|
else:
|
|
|
|
|
fieldsOldRemove = fieldsOldComp[:-1]
|
|
|
|
|
|
|
|
|
|
for nodeFieldOld in fieldsOldRemove:
|
|
|
|
|
print nodeFieldOld.toprettyxml()
|
|
|
|
|
|
|
|
|
|
if self.getActionField(nodeFieldOld) != 'append':
|
|
|
|
|
xmlArea.removeChild(nodeFieldOld)
|
|
|
|
|
if nodeFieldOld.nextSibling and\
|
|
|
|
|
self.getTypeField(nodeFieldOld.nextSibling) == "br":
|
|
|
|
|
xmlArea.removeChild(nodeFieldOld.nextSibling)
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def getSepListToField(self, xmlField):
|
|
|
|
|
"""Выдает элементы распределенного массива
|
|
|
|
|
|
|
|
|
@ -739,9 +868,14 @@ class xmlDoc:
|
|
|
|
|
parentNode.removeChild(fieldNode)
|
|
|
|
|
else:
|
|
|
|
|
print self.getActionField(fieldNode)
|
|
|
|
|
if self.getActionField(fieldNode) != "drop" or\
|
|
|
|
|
self.getActionField(fieldNode) != "join":
|
|
|
|
|
if self.getActionField(fieldNode) == "drop":
|
|
|
|
|
pass
|
|
|
|
|
elif self.getActionField(fieldNode) == "join":
|
|
|
|
|
pass
|
|
|
|
|
else:
|
|
|
|
|
self.setActionField(fieldNode,"append")
|
|
|
|
|
print "#"
|
|
|
|
|
print self.getActionField(fieldNode)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -751,8 +885,17 @@ class xmlDoc:
|
|
|
|
|
xmlNewAreas = xpath.Evaluate('child::area',newBody)
|
|
|
|
|
for xmlNewArea in xmlNewAreas:
|
|
|
|
|
self.joinArea(baseBody,xmlNewArea)
|
|
|
|
|
|
|
|
|
|
removeNodesDict = {}
|
|
|
|
|
notRemoveNodesDict = {}
|
|
|
|
|
joinNewFields = xpath.Evaluate("child::field[child::action='join']"
|
|
|
|
|
,newBody)
|
|
|
|
|
for notRemNode in joinNewFields:
|
|
|
|
|
nameField = self.getNameField(notRemNode)
|
|
|
|
|
if not notRemoveNodesDict.has_key(nameField):
|
|
|
|
|
notRemoveNodesDict[nameField] = []
|
|
|
|
|
notRemoveNodesDict[nameField].append(notRemNode)
|
|
|
|
|
else:
|
|
|
|
|
notRemoveNodesDict[nameField].append(notRemNode)
|
|
|
|
|
notSepListField = []
|
|
|
|
|
sepListField = []
|
|
|
|
|
for nField in newFields:
|
|
|
|
@ -762,7 +905,9 @@ class xmlDoc:
|
|
|
|
|
else:
|
|
|
|
|
if self.getNameField(nField):
|
|
|
|
|
notSepListField.append(nField)
|
|
|
|
|
|
|
|
|
|
for name in notRemoveNodesDict.keys():
|
|
|
|
|
if removeNodesDict.has_key(name):
|
|
|
|
|
removeNodesDict[name] = []
|
|
|
|
|
for removeNodes in removeNodesDict.values():
|
|
|
|
|
if removeNodes:
|
|
|
|
|
if self.getTypeField(removeNodes[-1]) == "seplist":
|
|
|
|
@ -774,9 +919,9 @@ class xmlDoc:
|
|
|
|
|
baseBody.removeChild(removeNode)
|
|
|
|
|
|
|
|
|
|
for node in sepListField:
|
|
|
|
|
#if removeNodes:
|
|
|
|
|
node.setAttribute("type", "seplist")
|
|
|
|
|
self.setActionField(node,"insert")
|
|
|
|
|
if self.getActionField(node) != "join":
|
|
|
|
|
self.setActionField(node,"insert")
|
|
|
|
|
self.joinField(baseBody, node)
|
|
|
|
|
#else:
|
|
|
|
|
#self.setActionField(node, "append")
|
|
|
|
@ -937,7 +1082,6 @@ class xmlDoc:
|
|
|
|
|
# Перед объединение области с документом
|
|
|
|
|
# удаляем комментарии
|
|
|
|
|
self.removeComment(newImportBodyNode)
|
|
|
|
|
#print newImportBodyNode.toprettyxml()
|
|
|
|
|
self.joinBody(self.body, newImportBodyNode)
|
|
|
|
|
# расставляем BR
|
|
|
|
|
self.insertBRtoBody(self.body)
|
|
|
|
@ -1027,6 +1171,15 @@ class xmlDoc:
|
|
|
|
|
else:
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
def getFieldValues(self, xmlField):
|
|
|
|
|
"""Выдает значения XML поля в виде массива"""
|
|
|
|
|
vals = []
|
|
|
|
|
xmlValues = xpath.Evaluate('child::value',xmlField)
|
|
|
|
|
if xmlValues:
|
|
|
|
|
for node in xmlValues:
|
|
|
|
|
vals.append(node.firstChild.nodeValue)
|
|
|
|
|
return vals
|
|
|
|
|
|
|
|
|
|
def getActionArea(self, xmlArea):
|
|
|
|
|
"""Выдает свойство action XML области"""
|
|
|
|
|
xmlActions = xpath.Evaluate('child::caption/action',xmlArea)
|
|
|
|
|