Mercurial > libervia-backend
annotate libervia/cli/xml_tools.py @ 4100:810921c33a47
tools (common/template): add filter to get media types:
Add 2 filters to get main type and subtype of media type. Jinja2 and Nunjucks don't handle
slices in the same way (Python way for Jinja2, JS way for Nunjucks), making it difficult
to retrieve main type of a media from media type. Thoses filters work in both cases.
author | Goffi <goffi@goffi.org> |
---|---|
date | Thu, 22 Jun 2023 15:49:06 +0200 |
parents | 47401850dec6 |
children | 0d7bb4df2343 |
rev | line source |
---|---|
3137 | 1 #!/usr/bin/env python3 |
2 | |
2777 | 3 |
4075
47401850dec6
refactoring: rename `libervia.frontends.jp` to `libervia.cli`
Goffi <goffi@goffi.org>
parents:
4074
diff
changeset
|
4 # Libervia CLI |
3479 | 5 # Copyright (C) 2009-2021 Jérôme Poisson (goffi@goffi.org) |
2777 | 6 |
7 # This program is free software: you can redistribute it and/or modify | |
8 # it under the terms of the GNU Affero General Public License as published by | |
9 # the Free Software Foundation, either version 3 of the License, or | |
10 # (at your option) any later version. | |
11 | |
12 # This program is distributed in the hope that it will be useful, | |
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 # GNU Affero General Public License for more details. | |
16 | |
17 # You should have received a copy of the GNU Affero General Public License | |
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
19 | |
4071
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
20 from libervia.backend.core.i18n import _ |
4075
47401850dec6
refactoring: rename `libervia.frontends.jp` to `libervia.cli`
Goffi <goffi@goffi.org>
parents:
4074
diff
changeset
|
21 from libervia.cli.constants import Const as C |
2777 | 22 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
23 def etree_parse(cmd, raw_xml, reraise=False): |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
24 """import lxml and parse raw XML |
2777 | 25 |
26 @param cmd(CommandBase): current command instance | |
27 @param raw_xml(file, str): an XML bytestring, string or file-like object | |
2804
710de41da2f2
jp (pubsub/node): new "import" command, to publish many nodes from an XML file
Goffi <goffi@goffi.org>
parents:
2777
diff
changeset
|
28 @param reraise(bool): if True, re raise exception on parse error instead of doing a |
710de41da2f2
jp (pubsub/node): new "import" command, to publish many nodes from an XML file
Goffi <goffi@goffi.org>
parents:
2777
diff
changeset
|
29 parser.error (which terminate the execution) |
2777 | 30 @return (tuple(etree.Element, module): parsed element, etree module |
31 """ | |
32 try: | |
33 from lxml import etree | |
34 except ImportError: | |
35 cmd.disp( | |
3028 | 36 'lxml module must be installed, please install it with "pip install lxml"', |
2777 | 37 error=True, |
38 ) | |
39 cmd.host.quit(C.EXIT_ERROR) | |
40 try: | |
3028 | 41 if isinstance(raw_xml, str): |
2777 | 42 parser = etree.XMLParser(remove_blank_text=True) |
43 element = etree.fromstring(raw_xml, parser) | |
44 else: | |
45 element = etree.parse(raw_xml).getroot() | |
46 except Exception as e: | |
2804
710de41da2f2
jp (pubsub/node): new "import" command, to publish many nodes from an XML file
Goffi <goffi@goffi.org>
parents:
2777
diff
changeset
|
47 if reraise: |
710de41da2f2
jp (pubsub/node): new "import" command, to publish many nodes from an XML file
Goffi <goffi@goffi.org>
parents:
2777
diff
changeset
|
48 raise e |
2777 | 49 cmd.parser.error( |
3028 | 50 _("Can't parse the payload XML in input: {msg}").format(msg=e) |
2777 | 51 ) |
52 return element, etree | |
53 | |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
54 def get_payload(cmd, element): |
2777 | 55 """Retrieve payload element and exit with and error if not found |
56 | |
57 @param element(etree.Element): root element | |
58 @return element(etree.Element): payload element | |
59 """ | |
60 if element.tag in ("item", "{http://jabber.org/protocol/pubsub}item"): | |
61 if len(element) > 1: | |
3028 | 62 cmd.disp(_("<item> can only have one child element (the payload)"), |
2777 | 63 error=True) |
64 cmd.host.quit(C.EXIT_DATA_ERROR) | |
65 element = element[0] | |
66 return element |