switch to lxml to have a complete XML parser (#78281) #362
|
@ -1,6 +1,7 @@
|
|||
[MASTER]
|
||||
persistent=yes
|
||||
ignore=vendor,Bouncers,ezt.py
|
||||
extension-pkg-allow-list=lxml.etree
|
||||
|
||||
[MESSAGES CONTROL]
|
||||
disable=
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
import os
|
||||
import re
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
import pytest
|
||||
from lxml import etree as ET
|
||||
from webtest import Upload
|
||||
|
||||
from wcs import fields
|
||||
|
|
|
@ -2,11 +2,11 @@ import io
|
|||
import json
|
||||
import os
|
||||
import re
|
||||
import xml.etree.ElementTree as ET
|
||||
from unittest import mock
|
||||
|
||||
import pytest
|
||||
import responses
|
||||
from lxml import etree as ET
|
||||
from webtest import Upload
|
||||
|
||||
from wcs import fields
|
||||
|
|
|
@ -3,11 +3,11 @@ import os
|
|||
import re
|
||||
import time
|
||||
import uuid
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
import pytest
|
||||
import responses
|
||||
from django.utils.timezone import now
|
||||
from lxml import etree as ET
|
||||
from pyquery import PyQuery
|
||||
from webtest import Upload
|
||||
|
||||
|
|
|
@ -2,10 +2,10 @@ import io
|
|||
import os
|
||||
import re
|
||||
import uuid
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
import pytest
|
||||
import responses
|
||||
from lxml import etree as ET
|
||||
from quixote.http_request import Upload as QuixoteUpload
|
||||
from webtest import Radio, Upload
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import io
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
import pytest
|
||||
from lxml import etree as ET
|
||||
from webtest import Upload
|
||||
|
||||
from wcs.qommon.http_request import HTTPRequest
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
import io
|
||||
import os
|
||||
import xml.etree.ElementTree as ET
|
||||
import zipfile
|
||||
|
||||
import pytest
|
||||
from lxml import etree as ET
|
||||
|
||||
from wcs import fields
|
||||
from wcs.carddef import CardDef
|
||||
|
|
|
@ -2,9 +2,9 @@ import io
|
|||
import json
|
||||
import os
|
||||
import tarfile
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
import pytest
|
||||
from lxml import etree as ET
|
||||
|
||||
from wcs.applications import Application, ApplicationElement
|
||||
from wcs.blocks import BlockDef
|
||||
|
|
|
@ -5,11 +5,11 @@ import json
|
|||
import os
|
||||
import re
|
||||
import time
|
||||
import xml.etree.ElementTree as ET
|
||||
import zipfile
|
||||
|
||||
import pytest
|
||||
from django.utils.encoding import force_bytes
|
||||
from lxml import etree as ET
|
||||
from quixote import get_publisher
|
||||
from webtest import Upload
|
||||
|
||||
|
|
|
@ -4,10 +4,10 @@ import json
|
|||
import os
|
||||
import time
|
||||
import urllib.parse
|
||||
import xml.etree.ElementTree as ET
|
||||
import zipfile
|
||||
|
||||
import pytest
|
||||
from lxml import etree as ET
|
||||
|
||||
from wcs import fields
|
||||
from wcs.blocks import BlockDef
|
||||
|
|
|
@ -6,13 +6,13 @@ import os
|
|||
import re
|
||||
import time
|
||||
import urllib.parse
|
||||
import xml.etree.ElementTree as ET
|
||||
import zipfile
|
||||
from unittest import mock
|
||||
|
||||
import pytest
|
||||
import responses
|
||||
from django.utils.encoding import force_bytes, force_str
|
||||
from lxml import etree as ET
|
||||
from webtest import Hidden, Upload
|
||||
|
||||
from wcs import fields
|
||||
|
|
|
@ -3,13 +3,13 @@ import io
|
|||
import json
|
||||
import os
|
||||
import urllib.parse
|
||||
import xml.etree.ElementTree as ET
|
||||
import zipfile
|
||||
from unittest import mock
|
||||
|
||||
import pytest
|
||||
import responses
|
||||
from django.utils.encoding import force_bytes
|
||||
from lxml import etree as ET
|
||||
from quixote.http_request import Upload as QuixoteUpload
|
||||
from webtest import Hidden, Upload
|
||||
|
||||
|
@ -59,7 +59,7 @@ def assert_equal_zip(stream1, stream2):
|
|||
t1, t2 = ET.tostring(ET.XML(z1.read(name))), ET.tostring(ET.XML(z2.read(name)))
|
||||
try:
|
||||
# >= python 3.8: tostring preserves attribute order; use canonicalize to sort them
|
||||
t1, t2 = ET.canonicalize(t1), ET.canonicalize(t2)
|
||||
t1, t2 = ET.canonicalize(t1.decode("utf-8")), ET.canonicalize(t2.decode("utf-8"))
|
||||
|
||||
except AttributeError:
|
||||
pass
|
||||
else:
|
||||
|
|
Binary file not shown.
|
@ -1,6 +1,5 @@
|
|||
import xml.etree.ElementTree as ET
|
||||
|
||||
import pytest
|
||||
from lxml import etree as ET
|
||||
|
||||
from wcs.blocks import BlockDef
|
||||
from wcs.categories import BlockCategory
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import io
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
import pytest
|
||||
from lxml import etree as ET
|
||||
|
||||
from wcs import fields
|
||||
from wcs.blocks import BlockDef, BlockdefImportError
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
import io
|
||||
import json
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
import pytest
|
||||
from lxml import etree as ET
|
||||
|
||||
from wcs.blocks import BlockDef
|
||||
from wcs.carddef import CardDef
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
import io
|
||||
import os
|
||||
import re
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
import pytest
|
||||
from lxml import etree as ET
|
||||
from quixote import cleanup
|
||||
from webtest import Upload
|
||||
|
||||
|
|
|
@ -2,10 +2,10 @@ import codecs
|
|||
import json
|
||||
import os
|
||||
import urllib.parse
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
import pytest
|
||||
import responses
|
||||
from lxml import etree as ET
|
||||
|
||||
from wcs import data_sources, fields
|
||||
from wcs.categories import DataSourceCategory
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
import io
|
||||
import time
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
import pytest
|
||||
from lxml import etree as ET
|
||||
|
||||
from wcs.blocks import BlockDef
|
||||
from wcs.carddef import CardDef
|
||||
|
@ -94,9 +94,9 @@ def test_empty_display_locations_tag(pub):
|
|||
f1 = formdef_xml.findall('fields/field')[0]
|
||||
f2 = formdef_xml.findall('fields/field')[1]
|
||||
f3 = formdef_xml.findall('fields/field')[2]
|
||||
assert '<display_locations />' in str(ET.tostring(f1))
|
||||
assert '<display_locations />' in str(ET.tostring(f2))
|
||||
assert '<display_locations />' in str(ET.tostring(f3))
|
||||
assert '<display_locations/>' in str(ET.tostring(f1))
|
||||
assert '<display_locations/>' in str(ET.tostring(f2))
|
||||
assert '<display_locations/>' in str(ET.tostring(f3))
|
||||
|
||||
formdef2 = assert_xml_import_export_works(formdef)
|
||||
assert formdef2.fields[0].display_locations == []
|
||||
|
@ -106,9 +106,9 @@ def test_empty_display_locations_tag(pub):
|
|||
f1 = formdef2_xml.findall('fields/field')[0]
|
||||
f2 = formdef2_xml.findall('fields/field')[1]
|
||||
f3 = formdef2_xml.findall('fields/field')[2]
|
||||
assert '<display_locations />' in str(ET.tostring(f1))
|
||||
assert '<display_locations />' in str(ET.tostring(f2))
|
||||
assert '<display_locations />' in str(ET.tostring(f3))
|
||||
assert '<display_locations/>' in str(ET.tostring(f1))
|
||||
assert '<display_locations/>' in str(ET.tostring(f2))
|
||||
assert '<display_locations/>' in str(ET.tostring(f3))
|
||||
pducroquet
commented
lxml "compresse" les tags vides. lxml "compresse" les tags vides.
|
||||
|
||||
|
||||
def test_boolean_attributes(pub):
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
import io
|
||||
import os
|
||||
import re
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
import pytest
|
||||
from lxml import etree as ET
|
||||
from quixote import cleanup
|
||||
from webtest import Upload
|
||||
|
||||
|
|
|
@ -8,7 +8,6 @@ import re
|
|||
import shutil
|
||||
import sys
|
||||
import time
|
||||
import xml.etree.ElementTree as ET
|
||||
import zipfile
|
||||
from unittest import mock
|
||||
|
||||
|
@ -17,6 +16,7 @@ from django.core.management import call_command
|
|||
from django.http import Http404
|
||||
from django.test import override_settings
|
||||
from django.utils.timezone import localtime
|
||||
from lxml import etree as ET
|
||||
from quixote import cleanup, get_publisher
|
||||
from quixote.http_request import Upload
|
||||
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
import io
|
||||
import os
|
||||
import shutil
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
import pytest
|
||||
from lxml import etree as ET
|
||||
from quixote.http_request import Upload
|
||||
|
||||
from wcs.blocks import BlockDef
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
import io
|
||||
import re
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
import pytest
|
||||
from lxml import etree as ET
|
||||
from quixote.http_request import Upload
|
||||
|
||||
from wcs.blocks import BlockDef
|
||||
|
|
|
@ -16,9 +16,9 @@
|
|||
|
||||
import difflib
|
||||
import io
|
||||
import xml.etree.ElementTree as ET
|
||||
from collections import defaultdict
|
||||
|
||||
from lxml import etree as ET
|
||||
from quixote import get_publisher, get_request, get_response, get_session, redirect
|
||||
from quixote.directory import AccessControlled, Directory
|
||||
from quixote.html import TemplateIO, htmlescape, htmltext
|
||||
|
|
|
@ -24,10 +24,10 @@ try:
|
|||
import lasso
|
||||
except ImportError:
|
||||
lasso = None
|
||||
import xml.etree.ElementTree as ET
|
||||
import zipfile
|
||||
|
||||
from django.utils.encoding import force_bytes
|
||||
from lxml import etree as ET
|
||||
from quixote import get_publisher, get_request, get_response, get_session, redirect
|
||||
from quixote.directory import AccessControlled, Directory
|
||||
from quixote.html import TemplateIO, htmltext
|
||||
|
|
|
@ -19,10 +19,10 @@ import itertools
|
|||
import json
|
||||
import textwrap
|
||||
import time
|
||||
import xml.etree.ElementTree as ET
|
||||
from subprocess import PIPE, Popen
|
||||
|
||||
from django.utils.encoding import force_bytes
|
||||
from lxml import etree as ET
|
||||
from quixote import get_publisher, get_request, get_response, get_session, redirect
|
||||
from quixote.directory import Directory
|
||||
from quixote.html import TemplateIO, htmltext
|
||||
|
|
|
@ -17,11 +17,11 @@
|
|||
import io
|
||||
import json
|
||||
import tarfile
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
from django.http import Http404, HttpResponse, HttpResponseForbidden, JsonResponse
|
||||
from django.shortcuts import redirect
|
||||
from django.urls import reverse
|
||||
from lxml import etree as ET
|
||||
|
||||
from wcs.api_utils import is_url_signed
|
||||
from wcs.applications import Application, ApplicationElement
|
||||
|
|
|
@ -15,9 +15,9 @@
|
|||
# along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import io
|
||||
import xml.etree.ElementTree as ET
|
||||
import zipfile
|
||||
|
||||
from lxml import etree as ET
|
||||
from quixote import get_publisher, get_request, get_response, redirect
|
||||
from quixote.directory import Directory
|
||||
from quixote.html import TemplateIO, htmltext
|
||||
|
@ -346,7 +346,7 @@ class ExportAfterJob(AfterJob):
|
|||
self.content_type = 'application/vnd.oasis.opendocument.spreadsheet'
|
||||
elif self.file_format == 'xliff':
|
||||
misc.indent_xml(root)
|
||||
output.write(ET.tostring(root, 'utf-8'))
|
||||
output.write(ET.tostring(root, encoding='utf-8'))
|
||||
pducroquet
commented
Différence de signature lxml vs etree: Différence de signature lxml vs etree:
lxml: element_or_tree, *, encoding=, ...
etree: element, encoding, method, *, ...
|
||||
self.file_name = 'catalog.xliff'
|
||||
self.content_type = 'text/xml'
|
||||
|
||||
|
|
|
@ -18,9 +18,9 @@ import collections
|
|||
import itertools
|
||||
import types
|
||||
import uuid
|
||||
import xml.etree.ElementTree as ET
|
||||
from contextlib import contextmanager
|
||||
|
||||
from lxml import etree as ET
|
||||
from quixote import get_publisher, get_request, get_response
|
||||
from quixote.html import htmltag, htmltext
|
||||
|
||||
|
|
|
@ -14,8 +14,8 @@
|
|||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
from lxml import etree as ET
|
||||
from quixote import get_publisher
|
||||
from quixote.html import htmltext
|
||||
|
||||
|
|
|
@ -15,9 +15,9 @@
|
|||
# along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import urllib.parse
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
from django.utils.encoding import force_str
|
||||
from lxml import etree as ET
|
||||
from quixote import get_publisher
|
||||
|
||||
from wcs.backoffice.data_management import CardPage
|
||||
|
|
|
@ -19,11 +19,11 @@ import collections.abc
|
|||
import hashlib
|
||||
import json
|
||||
import urllib.parse
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
from django.core.cache import cache
|
||||
from django.template import TemplateSyntaxError, VariableDoesNotExist
|
||||
from django.utils.encoding import force_bytes, force_str
|
||||
from lxml import etree as ET
|
||||
from quixote import get_publisher, get_request, get_session
|
||||
from quixote.errors import RequestError
|
||||
from quixote.html import TemplateIO
|
||||
|
|
|
@ -24,11 +24,11 @@ import random
|
|||
import re
|
||||
import sys
|
||||
import time
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
from django.utils.encoding import force_bytes, force_str, smart_str
|
||||
from django.utils.formats import date_format as django_date_format
|
||||
from django.utils.html import strip_tags, urlize
|
||||
from lxml import etree as ET
|
||||
from quixote import get_publisher, get_request, get_session
|
||||
fpeters
commented
Ça se joue de remplacer partout l'import actuel par celui-ci, et conserver ET comme nom ? Ça évitera je pense les confusions entre les endroits ET et les endroits LET et quoi utiliser où. Sinon, plutôt faire comme les autres modules et être explicite lors des utilisations, lxml.etree.Element, pour les différencier davantage à la lecture ? Ça se joue de remplacer partout l'import actuel par celui-ci, et conserver ET comme nom ? Ça évitera je pense les confusions entre les endroits ET et les endroits LET et quoi utiliser où.
Sinon, plutôt faire comme les autres modules et être explicite lors des utilisations, lxml.etree.Element, pour les différencier davantage à la lecture ?
|
||||
from quixote.html import TemplateIO, htmlescape, htmltag, htmltext
|
||||
|
||||
|
|
|
@ -28,10 +28,10 @@ import sys
|
|||
import time
|
||||
import types
|
||||
import uuid
|
||||
import xml.etree.ElementTree as ET
|
||||
from operator import itemgetter
|
||||
|
||||
from django.utils.encoding import force_bytes, force_str
|
||||
from lxml import etree as ET
|
||||
from quixote import get_publisher, get_session
|
||||
from quixote.html import htmltext
|
||||
from quixote.http_request import Upload
|
||||
|
|
|
@ -29,7 +29,6 @@ import subprocess
|
|||
import time
|
||||
import unicodedata
|
||||
import urllib.parse
|
||||
import xml.etree.ElementTree as ET
|
||||
from contextlib import contextmanager
|
||||
|
||||
import phonenumbers
|
||||
|
@ -45,6 +44,7 @@ from django.utils.html import strip_tags
|
|||
from django.utils.safestring import mark_safe
|
||||
from django.utils.text import Truncator
|
||||
from django.utils.timezone import is_aware, make_naive
|
||||
from lxml import etree as ET
|
||||
from PIL import Image
|
||||
from quixote import get_publisher, get_request, get_response, redirect
|
||||
from quixote.errors import RequestError
|
||||
|
|
|
@ -15,10 +15,10 @@
|
|||
# along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import re
|
||||
import xml.etree.ElementTree as ET
|
||||
import zipfile
|
||||
|
||||
from django.utils.encoding import force_str
|
||||
from lxml import etree as ET
|
||||
|
||||
from .evalutils import make_date, make_datetime
|
||||
from .misc import date_format, datetime_format, strftime
|
||||
|
@ -149,10 +149,10 @@ class Workbook:
|
|||
return root
|
||||
|
||||
def get_styles(self):
|
||||
return ET.tostring(self.get_styles_node(), 'utf-8')
|
||||
return ET.tostring(self.get_styles_node())
|
||||
pducroquet
commented
Idem, différence de signature Idem, différence de signature
|
||||
|
||||
def get_content(self):
|
||||
return ET.tostring(self.get_content_node(), 'utf-8')
|
||||
return ET.tostring(self.get_content_node())
|
||||
|
||||
def save(self, output):
|
||||
with zipfile.ZipFile(output, 'w') as z:
|
||||
|
|
|
@ -15,9 +15,9 @@
|
|||
# along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import datetime
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
from django.utils.encoding import force_str
|
||||
from lxml import etree as ET
|
||||
from quixote import get_publisher
|
||||
|
||||
from .misc import indent_xml, xml_node_text
|
||||
|
|
|
@ -16,9 +16,9 @@
|
|||
|
||||
import json
|
||||
import urllib.parse
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
from django.utils.encoding import force_str
|
||||
from lxml import etree as ET
|
||||
from quixote import get_publisher
|
||||
from quixote.html import htmltext
|
||||
|
||||
|
|
|
@ -16,9 +16,9 @@
|
|||
|
||||
import difflib
|
||||
import re
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
from django.utils.timezone import now
|
||||
from lxml import etree as ET
|
||||
from quixote import get_publisher, get_response, get_session
|
||||
|
||||
from wcs.qommon import _, misc
|
||||
|
@ -29,43 +29,6 @@ class UnknownUser:
|
|||
return str(_('unknown user'))
|
||||
|
||||
|
||||
def indent(tree, space=" ", level=0):
|
||||
# backport from Lib/xml/etree/ElementTree.py python 3.9
|
||||
pducroquet
commented
backport de python 3.9 => j'ai supprimé, lxml a la fonction requise. Accessoirement, maintenant qu'on est en bullseye minimum, on pourrait la supprimer dans tous les cas. backport de python 3.9 => j'ai supprimé, lxml a la fonction requise. Accessoirement, maintenant qu'on est en bullseye minimum, on pourrait la supprimer dans tous les cas.
|
||||
if isinstance(tree, ET.ElementTree):
|
||||
tree = tree.getroot()
|
||||
if level < 0:
|
||||
raise ValueError(f"Initial indentation level must be >= 0, got {level}")
|
||||
if len(tree) == 0:
|
||||
return
|
||||
|
||||
# Reduce the memory consumption by reusing indentation strings.
|
||||
indentations = ["\n" + level * space]
|
||||
|
||||
def _indent_children(elem, level):
|
||||
# Start a new indentation level for the first child.
|
||||
child_level = level + 1
|
||||
try:
|
||||
child_indentation = indentations[child_level]
|
||||
except IndexError:
|
||||
child_indentation = indentations[level] + space
|
||||
indentations.append(child_indentation)
|
||||
|
||||
if not elem.text or not elem.text.strip():
|
||||
elem.text = child_indentation
|
||||
|
||||
for child in elem:
|
||||
if len(child):
|
||||
_indent_children(child, child_level)
|
||||
if not child.tail or not child.tail.strip():
|
||||
child.tail = child_indentation
|
||||
|
||||
# Dedent after the last child by overwriting the previous indentation.
|
||||
if not child.tail.strip():
|
||||
child.tail = indentations[level]
|
||||
|
||||
_indent_children(tree, 0)
|
||||
|
||||
|
||||
_no_eol = "\\ No newline at end of file"
|
||||
_hdr_pat = re.compile(r"^@@ -(\d+),?(\d+)? \+(\d+),?(\d+)? @@$")
|
||||
|
||||
|
@ -158,8 +121,8 @@ class Snapshot:
|
|||
# get patch beetween latest serialization and current instance
|
||||
# indent xml to minimize patch
|
||||
latest_tree = ET.fromstring(latest_complete.serialization)
|
||||
indent(tree)
|
||||
indent(latest_tree)
|
||||
ET.indent(tree)
|
||||
ET.indent(latest_tree)
|
||||
patch = make_patch(ET.tostring(latest_tree).decode('utf-8'), ET.tostring(tree).decode('utf-8'))
|
||||
# should we store a snapshot ?
|
||||
store_snapshot = True
|
||||
|
@ -217,7 +180,7 @@ class Snapshot:
|
|||
return self.serialization
|
||||
|
||||
tree = ET.fromstring(self.serialization)
|
||||
indent(tree)
|
||||
ET.indent(tree)
|
||||
return ET.tostring(tree).decode('utf-8')
|
||||
|
||||
# get latest version with serialization
|
||||
|
@ -225,7 +188,7 @@ class Snapshot:
|
|||
self.object_type, self.object_id, complete=True, max_timestamp=self.timestamp
|
||||
)
|
||||
latest_tree = ET.fromstring(latest_complete.serialization)
|
||||
indent(latest_tree)
|
||||
ET.indent(latest_tree)
|
||||
serialization = apply_patch(ET.tostring(latest_tree).decode('utf-8'), self.patch or '')
|
||||
return serialization
|
||||
|
||||
|
|
|
@ -16,8 +16,8 @@
|
|||
|
||||
import os
|
||||
import urllib.parse
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
from lxml import etree as ET
|
||||
from quixote import get_request, redirect
|
||||
|
||||
from wcs.forms.common import FileDirectory, FormStatusPage
|
||||
|
|
|
@ -15,8 +15,8 @@
|
|||
# along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import copy
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
from lxml import etree as ET
|
||||
from quixote import get_publisher
|
||||
from quixote.html import htmltext
|
||||
|
||||
|
|
|
@ -15,9 +15,9 @@
|
|||
# along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import html
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
from django.utils.html import strip_tags
|
||||
from lxml import etree as ET
|
||||
from quixote.html import htmltext
|
||||
|
||||
from wcs.qommon import _
|
||||
|
|
|
@ -16,9 +16,9 @@
|
|||
|
||||
import collections
|
||||
import time
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
from django.utils.functional import cached_property
|
||||
from lxml import etree as ET
|
||||
from quixote import get_publisher, get_request, get_session
|
||||
from quixote.html import TemplateIO, htmltext
|
||||
|
||||
|
|
|
@ -15,8 +15,8 @@
|
|||
# along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import collections
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
from lxml import etree as ET
|
||||
from quixote import get_publisher
|
||||
from quixote.html import htmltext
|
||||
|
||||
|
|
|
@ -24,10 +24,10 @@ import subprocess
|
|||
import tempfile
|
||||
import time
|
||||
import zipfile
|
||||
from xml.etree import ElementTree as ET
|
||||
|
||||
from django.template.defaultfilters import filesizeformat
|
||||
from django.utils.encoding import force_bytes, force_str
|
||||
from lxml import etree as ET
|
||||
from quixote import get_publisher, get_request, get_response
|
||||
from quixote.directory import Directory
|
||||
from quixote.errors import PublishError
|
||||
|
@ -144,19 +144,6 @@ def transform_opendocument(instream, outstream, process):
|
|||
root = ET.fromstring(content)
|
||||
process(root, new_images)
|
||||
content = ET.tostring(root)
|
||||
if (
|
||||
root.find(f'{{{OO_OFFICE_NS}}}body/{{{OO_OFFICE_NS}}}spreadsheet')
|
||||
and b'xmlns:of=' not in content
|
||||
):
|
||||
# force xmlns:of namespace inclusion in spreadsheet files, as it may be
|
||||
# required for proper handling of table:formula attributes.
|
||||
# (there is no easy way to have ElementTree include namespace declarations
|
||||
# if there are no elements of that namespace)
|
||||
content = content.replace(
|
||||
b':document-content ',
|
||||
b':document-content xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" ',
|
||||
1,
|
||||
)
|
||||
pducroquet
commented
Suppression de l'ancien hack. Suppression de l'ancien hack.
|
||||
zout.writestr(filename, content)
|
||||
|
||||
for filename in zin.namelist():
|
||||
|
|
|
@ -14,8 +14,8 @@
|
|||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
from lxml import etree as ET
|
||||
from quixote import get_publisher, get_session
|
||||
from quixote.html import TemplateIO, htmltext
|
||||
|
||||
|
|
|
@ -18,8 +18,8 @@ import datetime
|
|||
import json
|
||||
import time
|
||||
import urllib.parse
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
from lxml import etree as ET
|
||||
from quixote import get_publisher, get_request, get_response
|
||||
|
||||
from wcs.api_utils import MissingSecret, get_secret_and_orig, sign_url
|
||||
|
|
|
@ -21,9 +21,9 @@ import io
|
|||
import mimetypes
|
||||
import sys
|
||||
import traceback
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
from django.utils.encoding import force_str
|
||||
from lxml import etree as ET
|
||||
from quixote import get_publisher, get_request
|
||||
from quixote.html import TemplateIO, htmltext
|
||||
|
||||
|
|
|
@ -24,12 +24,12 @@ import os
|
|||
import random
|
||||
import time
|
||||
import uuid
|
||||
import xml.etree.ElementTree as ET
|
||||
from contextlib import contextmanager
|
||||
from importlib import import_module
|
||||
|
||||
from django.utils.encoding import force_str
|
||||
from django.utils.timezone import is_aware, localtime, make_aware, now
|
||||
from lxml import etree as ET
|
||||
from quixote import get_publisher, get_request, get_response
|
||||
from quixote.html import TemplateIO, htmltext
|
||||
|
||||
|
|
|
@ -17,10 +17,10 @@
|
|||
import collections
|
||||
import json
|
||||
import urllib.parse
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
from django.conf import settings
|
||||
from django.utils.encoding import force_str
|
||||
from lxml import etree as ET
|
||||
from quixote import get_publisher, get_request
|
||||
|
||||
from wcs.api_utils import MissingSecret, get_secret_and_orig, sign_url
|
||||
|
|
Loading…
Reference in New Issue
Différence de signature sur canonicalize, il faut des str et non des bytes.