Mercurial > libervia-backend
annotate libervia/backend/tools/xml_tools.py @ 4122:52a89ddf3087
plugin XEP-0338: be sure to add the `<group>` element only once:
rel 424
author | Goffi <goffi@goffi.org> |
---|---|
date | Tue, 03 Oct 2023 15:27:07 +0200 |
parents | b274f0d5c138 |
children | 0d7bb4df2343 |
rev | line source |
---|---|
3028 | 1 #!/usr/bin/env python3 |
3137 | 2 |
609
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
590
diff
changeset
|
3 # SAT: a jabber client |
3479 | 4 # Copyright (C) 2009-2021 Jérôme Poisson (goffi@goffi.org) |
33
b9bb5d8e0cc7
In-band-registration: data form 2 xml conversion
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
5 |
609
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
590
diff
changeset
|
6 # This program is free software: you can redistribute it and/or modify |
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
590
diff
changeset
|
7 # it under the terms of the GNU Affero General Public License as published by |
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
590
diff
changeset
|
8 # the Free Software Foundation, either version 3 of the License, or |
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
590
diff
changeset
|
9 # (at your option) any later version. |
33
b9bb5d8e0cc7
In-band-registration: data form 2 xml conversion
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
10 |
609
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
590
diff
changeset
|
11 # This program is distributed in the hope that it will be useful, |
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
590
diff
changeset
|
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
590
diff
changeset
|
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
590
diff
changeset
|
14 # GNU Affero General Public License for more details. |
33
b9bb5d8e0cc7
In-band-registration: data form 2 xml conversion
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
15 |
609
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
590
diff
changeset
|
16 # You should have received a copy of the GNU Affero General Public License |
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
590
diff
changeset
|
17 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
33
b9bb5d8e0cc7
In-band-registration: data form 2 xml conversion
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
18 |
3491
2bd75fc2555d
tools (xml_tools): new findAncestor method:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
19 |
3955
323017a4e4d2
tools (xml_tools): `domish_elt_2_et_elt` and `et_elt_2_domish_elt` now handle lxml.etree
Goffi <goffi@goffi.org>
parents:
3914
diff
changeset
|
20 from collections import OrderedDict |
3491
2bd75fc2555d
tools (xml_tools): new findAncestor method:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
21 import html.entities |
3955
323017a4e4d2
tools (xml_tools): `domish_elt_2_et_elt` and `et_elt_2_domish_elt` now handle lxml.etree
Goffi <goffi@goffi.org>
parents:
3914
diff
changeset
|
22 import re |
4010
818db4ca3717
tools (xml_tools): accept several namespaces in `findAncestor`
Goffi <goffi@goffi.org>
parents:
3967
diff
changeset
|
23 from typing import Dict, Optional, Tuple, Union, Literal, overload, Iterable |
3955
323017a4e4d2
tools (xml_tools): `domish_elt_2_et_elt` and `et_elt_2_domish_elt` now handle lxml.etree
Goffi <goffi@goffi.org>
parents:
3914
diff
changeset
|
24 from xml.dom import NotFoundErr, minidom |
323017a4e4d2
tools (xml_tools): `domish_elt_2_et_elt` and `et_elt_2_domish_elt` now handle lxml.etree
Goffi <goffi@goffi.org>
parents:
3914
diff
changeset
|
25 import xml.etree.ElementTree as ET |
323017a4e4d2
tools (xml_tools): `domish_elt_2_et_elt` and `et_elt_2_domish_elt` now handle lxml.etree
Goffi <goffi@goffi.org>
parents:
3914
diff
changeset
|
26 from lxml import etree |
323017a4e4d2
tools (xml_tools): `domish_elt_2_et_elt` and `et_elt_2_domish_elt` now handle lxml.etree
Goffi <goffi@goffi.org>
parents:
3914
diff
changeset
|
27 |
323017a4e4d2
tools (xml_tools): `domish_elt_2_et_elt` and `et_elt_2_domish_elt` now handle lxml.etree
Goffi <goffi@goffi.org>
parents:
3914
diff
changeset
|
28 from twisted.internet import defer |
3491
2bd75fc2555d
tools (xml_tools): new findAncestor method:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
29 from twisted.words.protocols.jabber import jid |
3955
323017a4e4d2
tools (xml_tools): `domish_elt_2_et_elt` and `et_elt_2_domish_elt` now handle lxml.etree
Goffi <goffi@goffi.org>
parents:
3914
diff
changeset
|
30 from twisted.words.xish import domish |
3491
2bd75fc2555d
tools (xml_tools): new findAncestor method:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
31 from wokkel import data_form |
3955
323017a4e4d2
tools (xml_tools): `domish_elt_2_et_elt` and `et_elt_2_domish_elt` now handle lxml.etree
Goffi <goffi@goffi.org>
parents:
3914
diff
changeset
|
32 |
4071
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4041
diff
changeset
|
33 from libervia.backend.core import exceptions |
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4041
diff
changeset
|
34 from libervia.backend.core.constants import Const as C |
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4041
diff
changeset
|
35 from libervia.backend.core.i18n import _ |
4b842c1fb686
refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents:
4041
diff
changeset
|
36 from libervia.backend.core.log import getLogger |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
37 |
3491
2bd75fc2555d
tools (xml_tools): new findAncestor method:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
38 |
993
301b342c697a
core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents:
981
diff
changeset
|
39 log = getLogger(__name__) |
1444
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
40 |
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
41 """This library help manage XML used in SàT (parameters, registration, etc)""" |
33
b9bb5d8e0cc7
In-band-registration: data form 2 xml conversion
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
42 |
796
46aa5ada61bf
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
771
diff
changeset
|
43 SAT_FORM_PREFIX = "SAT_FORM_" |
1444
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
44 SAT_PARAM_SEPARATOR = "_XMLUI_PARAM_" # used to have unique elements names |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
45 html_entity_re = re.compile(r"&([a-zA-Z]+?);") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
46 XML_ENTITIES = ("quot", "amp", "apos", "lt", "gt") |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
47 |
2782
b17e6fa1e607
core (XMLUI): new XHTMLBox widget:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
48 # method to clean XHTML, receive raw unsecure XML or HTML, must return cleaned raw XHTML |
b17e6fa1e607
core (XMLUI): new XHTMLBox widget:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
49 # this method must be set during runtime |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
50 clean_xhtml = None |
2782
b17e6fa1e607
core (XMLUI): new XHTMLBox widget:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
51 |
1903
29564cec913f
plugin XEP-0060: service, node and uri are added to metadata when doing a getItems
Goffi <goffi@goffi.org>
parents:
1819
diff
changeset
|
52 # TODO: move XMLUI stuff in a separate module |
2364
918e38622a48
core (xmlui): added method to convert data form result to XMLUI:
Goffi <goffi@goffi.org>
parents:
2361
diff
changeset
|
53 # TODO: rewrite this with lxml or ElementTree or domish.Element: it's complicated and difficult to maintain with current minidom implementation |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
54 |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
55 # Helper functions |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
56 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
57 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
58 def _data_form_field_2_xmlui_data(field, read_only=False): |
1444
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
59 """Get data needed to create an XMLUI's Widget from Wokkel's data_form's Field. |
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
60 |
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
61 The attribute field can be modified (if it's fixed and it has no value). |
2625
a55a14c3cbf4
plugin XEP-0070: use a confirm dialog instead of a form + simplified a bit the code
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
62 @param field (data_form.Field): a field with attributes "value", "fieldType", |
a55a14c3cbf4
plugin XEP-0070: use a confirm dialog instead of a form + simplified a bit the code
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
63 "label" and "var" |
1444
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
64 @param read_only (bool): if True and it makes sense, create a read only input widget |
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
65 @return: a tuple (widget_type, widget_args, widget_kwargs) |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
66 """ |
3716
d33da3fe34a5
tools (xml_tools): implement `list-multi` in `_dataFormField2XMLUIData`:
Goffi <goffi@goffi.org>
parents:
3531
diff
changeset
|
67 widget_args = field.values or [None] |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
68 widget_kwargs = {} |
2782
b17e6fa1e607
core (XMLUI): new XHTMLBox widget:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
69 if field.fieldType is None and field.ext_type is not None: |
b17e6fa1e607
core (XMLUI): new XHTMLBox widget:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
70 # we have an extended field |
3028 | 71 if field.ext_type == "xml": |
2782
b17e6fa1e607
core (XMLUI): new XHTMLBox widget:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
72 element = field.value |
b17e6fa1e607
core (XMLUI): new XHTMLBox widget:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
73 if element.uri == C.NS_XHTML: |
b17e6fa1e607
core (XMLUI): new XHTMLBox widget:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
74 widget_type = "xhtmlbox" |
b17e6fa1e607
core (XMLUI): new XHTMLBox widget:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
75 widget_args[0] = element.toXml() |
b17e6fa1e607
core (XMLUI): new XHTMLBox widget:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
76 widget_kwargs["read_only"] = read_only |
b17e6fa1e607
core (XMLUI): new XHTMLBox widget:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
77 else: |
3028 | 78 log.warning("unknown XML element, falling back to textbox") |
2782
b17e6fa1e607
core (XMLUI): new XHTMLBox widget:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
79 widget_type = "textbox" |
b17e6fa1e607
core (XMLUI): new XHTMLBox widget:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
80 widget_args[0] = element.toXml() |
b17e6fa1e607
core (XMLUI): new XHTMLBox widget:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
81 widget_kwargs["read_only"] = read_only |
b17e6fa1e607
core (XMLUI): new XHTMLBox widget:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
82 else: |
3716
d33da3fe34a5
tools (xml_tools): implement `list-multi` in `_dataFormField2XMLUIData`:
Goffi <goffi@goffi.org>
parents:
3531
diff
changeset
|
83 |
3028 | 84 raise exceptions.DataError("unknown extended type {ext_type}".format( |
2782
b17e6fa1e607
core (XMLUI): new XHTMLBox widget:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
85 ext_type = field.ext_type)) |
b17e6fa1e607
core (XMLUI): new XHTMLBox widget:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
86 |
b17e6fa1e607
core (XMLUI): new XHTMLBox widget:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
87 elif field.fieldType == "fixed" or field.fieldType is None: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
88 widget_type = "text" |
863
97ee7594c788
core (xmlui): fixed types with empty value are now correctly managed in _dataFormField2XMLUIData
Goffi <goffi@goffi.org>
parents:
820
diff
changeset
|
89 if field.value is None: |
97ee7594c788
core (xmlui): fixed types with empty value are now correctly managed in _dataFormField2XMLUIData
Goffi <goffi@goffi.org>
parents:
820
diff
changeset
|
90 if field.label is None: |
3028 | 91 log.warning(_("Fixed field has neither value nor label, ignoring it")) |
863
97ee7594c788
core (xmlui): fixed types with empty value are now correctly managed in _dataFormField2XMLUIData
Goffi <goffi@goffi.org>
parents:
820
diff
changeset
|
92 field.value = "" |
97ee7594c788
core (xmlui): fixed types with empty value are now correctly managed in _dataFormField2XMLUIData
Goffi <goffi@goffi.org>
parents:
820
diff
changeset
|
93 else: |
97ee7594c788
core (xmlui): fixed types with empty value are now correctly managed in _dataFormField2XMLUIData
Goffi <goffi@goffi.org>
parents:
820
diff
changeset
|
94 field.value = field.label |
97ee7594c788
core (xmlui): fixed types with empty value are now correctly managed in _dataFormField2XMLUIData
Goffi <goffi@goffi.org>
parents:
820
diff
changeset
|
95 field.label = None |
3732
0fac164ff2d8
tools (xml_tools): fix `widget_args` modification in `_dataFormField2XMLUIData`:
Goffi <goffi@goffi.org>
parents:
3716
diff
changeset
|
96 widget_args = [field.value] |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
97 elif field.fieldType == "text-single": |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
98 widget_type = "string" |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
99 widget_kwargs["read_only"] = read_only |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
100 elif field.fieldType == "jid-single": |
1473
675e0e9f1653
core , privmitivus (xmlui): add jidInput handling, with a simple String for now
Goffi <goffi@goffi.org>
parents:
1472
diff
changeset
|
101 widget_type = "jid_input" |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
102 widget_kwargs["read_only"] = read_only |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
103 elif field.fieldType == "text-multi": |
1078
bb4517e69957
tools (xmlui): data form 'text-multi' element must be converted to xmlui 'textbox' (not 'text')
souliane <souliane@mailoo.org>
parents:
1070
diff
changeset
|
104 widget_type = "textbox" |
3732
0fac164ff2d8
tools (xml_tools): fix `widget_args` modification in `_dataFormField2XMLUIData`:
Goffi <goffi@goffi.org>
parents:
3716
diff
changeset
|
105 widget_args = ["\n".join(field.values)] |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
106 widget_kwargs["read_only"] = read_only |
2668
c274201cea94
core, frontends (xmlui): added "hidden" widget, to specify a value to be returned unmodified
Goffi <goffi@goffi.org>
parents:
2625
diff
changeset
|
107 elif field.fieldType == "hidden": |
c274201cea94
core, frontends (xmlui): added "hidden" widget, to specify a value to be returned unmodified
Goffi <goffi@goffi.org>
parents:
2625
diff
changeset
|
108 widget_type = "hidden" |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
109 elif field.fieldType == "text-private": |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
110 widget_type = "password" |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
111 widget_kwargs["read_only"] = read_only |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
112 elif field.fieldType == "boolean": |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
113 widget_type = "bool" |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
114 if widget_args[0] is None: |
3732
0fac164ff2d8
tools (xml_tools): fix `widget_args` modification in `_dataFormField2XMLUIData`:
Goffi <goffi@goffi.org>
parents:
3716
diff
changeset
|
115 widget_args = ["false"] |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
116 widget_kwargs["read_only"] = read_only |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
117 elif field.fieldType == "integer": |
1220
f91e7028e2c3
memory (params), tools (xml_tools), plugins, frontends: add "int" parameter type with "min" and "max" attributes
souliane <souliane@mailoo.org>
parents:
1199
diff
changeset
|
118 widget_type = "integer" |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
119 widget_kwargs["read_only"] = read_only |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
120 elif field.fieldType == "list-single": |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
121 widget_type = "list" |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
122 widget_kwargs["options"] = [ |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
123 (option.value, option.label or option.value) for option in field.options |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
124 ] |
1067
f7f15d44fdfa
tools (xml_tools): dataForm2XMLUI handles the default value for "list-single" fields
souliane <souliane@mailoo.org>
parents:
1036
diff
changeset
|
125 widget_kwargs["selected"] = widget_args |
f7f15d44fdfa
tools (xml_tools): dataForm2XMLUI handles the default value for "list-single" fields
souliane <souliane@mailoo.org>
parents:
1036
diff
changeset
|
126 widget_args = [] |
3716
d33da3fe34a5
tools (xml_tools): implement `list-multi` in `_dataFormField2XMLUIData`:
Goffi <goffi@goffi.org>
parents:
3531
diff
changeset
|
127 elif field.fieldType == "list-multi": |
d33da3fe34a5
tools (xml_tools): implement `list-multi` in `_dataFormField2XMLUIData`:
Goffi <goffi@goffi.org>
parents:
3531
diff
changeset
|
128 widget_type = "list" |
d33da3fe34a5
tools (xml_tools): implement `list-multi` in `_dataFormField2XMLUIData`:
Goffi <goffi@goffi.org>
parents:
3531
diff
changeset
|
129 widget_kwargs["options"] = [ |
d33da3fe34a5
tools (xml_tools): implement `list-multi` in `_dataFormField2XMLUIData`:
Goffi <goffi@goffi.org>
parents:
3531
diff
changeset
|
130 (option.value, option.label or option.value) for option in field.options |
d33da3fe34a5
tools (xml_tools): implement `list-multi` in `_dataFormField2XMLUIData`:
Goffi <goffi@goffi.org>
parents:
3531
diff
changeset
|
131 ] |
d33da3fe34a5
tools (xml_tools): implement `list-multi` in `_dataFormField2XMLUIData`:
Goffi <goffi@goffi.org>
parents:
3531
diff
changeset
|
132 widget_kwargs["selected"] = widget_args |
d33da3fe34a5
tools (xml_tools): implement `list-multi` in `_dataFormField2XMLUIData`:
Goffi <goffi@goffi.org>
parents:
3531
diff
changeset
|
133 widget_kwargs["styles"] = ["multi"] |
d33da3fe34a5
tools (xml_tools): implement `list-multi` in `_dataFormField2XMLUIData`:
Goffi <goffi@goffi.org>
parents:
3531
diff
changeset
|
134 widget_args = [] |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
135 else: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
136 log.error( |
3028 | 137 "FIXME FIXME FIXME: Type [%s] is not managed yet by SàT" % field.fieldType |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
138 ) |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
139 widget_type = "string" |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
140 widget_kwargs["read_only"] = read_only |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
141 |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
142 if field.var: |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
143 widget_kwargs["name"] = field.var |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
144 |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
145 return widget_type, widget_args, widget_kwargs |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
146 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
147 def data_form_2_widgets(form_ui, form, read_only=False, prepend=None, filters=None): |
1444
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
148 """Complete an existing XMLUI with widget converted from XEP-0004 data forms. |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
149 |
1444
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
150 @param form_ui (XMLUI): XMLUI instance |
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
151 @param form (data_form.Form): Wokkel's implementation of data form |
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
152 @param read_only (bool): if True and it makes sense, create a read only input widget |
2380
59636c4db2d0
core (xmlui): new "prepend" argument for dataForm2Widgets and dataFormResult2XMLUI:
Goffi <goffi@goffi.org>
parents:
2365
diff
changeset
|
153 @param prepend(iterable, None): widgets to prepend to main LabelContainer |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
154 if not None, must be an iterable of *args for add_widget. Those widgets will |
2380
59636c4db2d0
core (xmlui): new "prepend" argument for dataForm2Widgets and dataFormResult2XMLUI:
Goffi <goffi@goffi.org>
parents:
2365
diff
changeset
|
155 be added first to the container. |
2398
3ff9d7a7fe71
core (XMLUI): filters can now be used when converting data form to XMLUI:
Goffi <goffi@goffi.org>
parents:
2397
diff
changeset
|
156 @param filters(dict, None): if not None, a dictionary of callable: |
3ff9d7a7fe71
core (XMLUI): filters can now be used when converting data form to XMLUI:
Goffi <goffi@goffi.org>
parents:
2397
diff
changeset
|
157 key is the name of the widget to filter |
2429
941fdf81958c
core (XMLUI): form's XMLUI is use as first arguments for filters in dataForm2Widgets
Goffi <goffi@goffi.org>
parents:
2428
diff
changeset
|
158 the value is a callable, it will get form's XMLUI, widget's type, args and kwargs |
941fdf81958c
core (XMLUI): form's XMLUI is use as first arguments for filters in dataForm2Widgets
Goffi <goffi@goffi.org>
parents:
2428
diff
changeset
|
159 and must return widget's type, args and kwargs (which can be modified) |
2398
3ff9d7a7fe71
core (XMLUI): filters can now be used when converting data form to XMLUI:
Goffi <goffi@goffi.org>
parents:
2397
diff
changeset
|
160 This is especially useful to modify well known fields |
1444
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
161 @return: the completed XMLUI instance |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
162 """ |
2405
f4b6176eb65f
core (xmlui): fixed data_form => XMLUI conversion when filters is None
Goffi <goffi@goffi.org>
parents:
2398
diff
changeset
|
163 if filters is None: |
f4b6176eb65f
core (xmlui): fixed data_form => XMLUI conversion when filters is None
Goffi <goffi@goffi.org>
parents:
2398
diff
changeset
|
164 filters = {} |
102 | 165 if form.instructions: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
166 form_ui.addText("\n".join(form.instructions), "instructions") |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
167 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
168 form_ui.change_container("label") |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
169 |
2380
59636c4db2d0
core (xmlui): new "prepend" argument for dataForm2Widgets and dataFormResult2XMLUI:
Goffi <goffi@goffi.org>
parents:
2365
diff
changeset
|
170 if prepend is not None: |
59636c4db2d0
core (xmlui): new "prepend" argument for dataForm2Widgets and dataFormResult2XMLUI:
Goffi <goffi@goffi.org>
parents:
2365
diff
changeset
|
171 for widget_args in prepend: |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
172 form_ui.add_widget(*widget_args) |
2380
59636c4db2d0
core (xmlui): new "prepend" argument for dataForm2Widgets and dataFormResult2XMLUI:
Goffi <goffi@goffi.org>
parents:
2365
diff
changeset
|
173 |
102 | 174 for field in form.fieldList: |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
175 widget_type, widget_args, widget_kwargs = _data_form_field_2_xmlui_data( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
176 field, read_only |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
177 ) |
2398
3ff9d7a7fe71
core (XMLUI): filters can now be used when converting data form to XMLUI:
Goffi <goffi@goffi.org>
parents:
2397
diff
changeset
|
178 try: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
179 widget_filter = filters[widget_kwargs["name"]] |
2398
3ff9d7a7fe71
core (XMLUI): filters can now be used when converting data form to XMLUI:
Goffi <goffi@goffi.org>
parents:
2397
diff
changeset
|
180 except KeyError: |
3ff9d7a7fe71
core (XMLUI): filters can now be used when converting data form to XMLUI:
Goffi <goffi@goffi.org>
parents:
2397
diff
changeset
|
181 pass |
3ff9d7a7fe71
core (XMLUI): filters can now be used when converting data form to XMLUI:
Goffi <goffi@goffi.org>
parents:
2397
diff
changeset
|
182 else: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
183 widget_type, widget_args, widget_kwargs = widget_filter( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
184 form_ui, widget_type, widget_args, widget_kwargs |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
185 ) |
2668
c274201cea94
core, frontends (xmlui): added "hidden" widget, to specify a value to be returned unmodified
Goffi <goffi@goffi.org>
parents:
2625
diff
changeset
|
186 if widget_type != "hidden": |
c274201cea94
core, frontends (xmlui): added "hidden" widget, to specify a value to be returned unmodified
Goffi <goffi@goffi.org>
parents:
2625
diff
changeset
|
187 label = field.label or field.var |
c274201cea94
core, frontends (xmlui): added "hidden" widget, to specify a value to be returned unmodified
Goffi <goffi@goffi.org>
parents:
2625
diff
changeset
|
188 if label: |
c274201cea94
core, frontends (xmlui): added "hidden" widget, to specify a value to be returned unmodified
Goffi <goffi@goffi.org>
parents:
2625
diff
changeset
|
189 form_ui.addLabel(label) |
c274201cea94
core, frontends (xmlui): added "hidden" widget, to specify a value to be returned unmodified
Goffi <goffi@goffi.org>
parents:
2625
diff
changeset
|
190 else: |
c274201cea94
core, frontends (xmlui): added "hidden" widget, to specify a value to be returned unmodified
Goffi <goffi@goffi.org>
parents:
2625
diff
changeset
|
191 form_ui.addEmpty() |
103 | 192 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
193 form_ui.add_widget(widget_type, *widget_args, **widget_kwargs) |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
194 |
761
2f8d72226bc0
core (xml_tools): dataForm*2XML renamed to dataForm*2XMLUI and now return XMLUI instead of raw XML + submit_id is managed, and session_id is returned if present
Goffi <goffi@goffi.org>
parents:
760
diff
changeset
|
195 return form_ui |
37
a61beb21d16d
Gateway registration, unregistration & edition
Goffi <goffi@goffi.org>
parents:
35
diff
changeset
|
196 |
1444
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
197 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
198 def data_form_2_xmlui(form, submit_id, session_id=None, read_only=False): |
1487
0df627d0b4ca
tools (xmlui): changeContainer do not create a new one when the current one already fits
souliane <souliane@mailoo.org>
parents:
1486
diff
changeset
|
199 """Take a data form (Wokkel's XEP-0004 implementation) and convert it to a SàT XMLUI. |
1069
8e1f30aa3975
core (XMLUI): data form result now manage generic data set
Goffi <goffi@goffi.org>
parents:
1067
diff
changeset
|
200 |
1444
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
201 @param form (data_form.Form): a Form instance |
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
202 @param submit_id (unicode): callback id to call when submitting form |
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
203 @param session_id (unicode): session id to return with the data |
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
204 @param read_only (bool): if True and it makes sense, create a read only input widget |
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
205 @return: XMLUI instance |
1069
8e1f30aa3975
core (XMLUI): data form result now manage generic data set
Goffi <goffi@goffi.org>
parents:
1067
diff
changeset
|
206 """ |
8e1f30aa3975
core (XMLUI): data form result now manage generic data set
Goffi <goffi@goffi.org>
parents:
1067
diff
changeset
|
207 form_ui = XMLUI("form", "vertical", submit_id=submit_id, session_id=session_id) |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
208 return data_form_2_widgets(form_ui, form, read_only=read_only) |
1069
8e1f30aa3975
core (XMLUI): data form result now manage generic data set
Goffi <goffi@goffi.org>
parents:
1067
diff
changeset
|
209 |
1444
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
210 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
211 def data_form_2_data_dict(form: data_form.Form) -> dict: |
3472
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
212 """Convert data form to a simple dict, easily serialisable |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
213 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
214 see data_dict_2_data_form for a description of the format |
3472
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
215 """ |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
216 fields = [] |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
217 data_dict = { |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
218 "fields": fields |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
219 } |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
220 if form.formNamespace: |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
221 data_dict["namespace"] = form.formNamespace |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
222 for form_field in form.fieldList: |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
223 field = {"type": form_field.fieldType} |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
224 fields.append(field) |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
225 for src_name, dest_name in ( |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
226 ('var', 'name'), |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
227 ('label', 'label'), |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
228 ('value', 'value'), |
4032
bb211f80c3e6
tools (xml_tools): add fields's `values` when converting data form to dict
Goffi <goffi@goffi.org>
parents:
4010
diff
changeset
|
229 # FIXME: we probably should have only "values" |
bb211f80c3e6
tools (xml_tools): add fields's `values` when converting data form to dict
Goffi <goffi@goffi.org>
parents:
4010
diff
changeset
|
230 ('values', 'values') |
3472
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
231 ): |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
232 value = getattr(form_field, src_name, None) |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
233 if value: |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
234 field[dest_name] = value |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
235 if form_field.options: |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
236 options = field["options"] = [] |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
237 for form_opt in form_field.options: |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
238 opt = {"value": form_opt.value} |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
239 if form_opt.label: |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
240 opt["label"] = form_opt.label |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
241 options.append(opt) |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
242 |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
243 if form_field.fieldType is None and form_field.ext_type == "xml": |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
244 if isinstance(form_field.value, domish.Element): |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
245 if ((form_field.value.uri == C.NS_XHTML |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
246 and form_field.value.name == "div")): |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
247 field["type"] = "xhtml" |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
248 if form_field.value.children: |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
249 log.warning( |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
250 "children are not managed for XHTML fields: " |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
251 f"{form_field.value.toXml()}" |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
252 ) |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
253 return data_dict |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
254 |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
255 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
256 def data_dict_2_data_form(data_dict): |
3472
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
257 """Convert serialisable dict of data to a data form |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
258 |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
259 The format of the dict is as follow: |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
260 - an optional "namespace" key with form namespace |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
261 - a mandatory "fields" key with list of fields as follow: |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
262 - "type" is mostly the same as data_form.Field.fieldType |
3531
a8259a1f89b2
component file sharing (management): add values of `quota` and `used` size on result form
Goffi <goffi@goffi.org>
parents:
3491
diff
changeset
|
263 - "name" is used to set the "var" attribute of data_form.Field |
a8259a1f89b2
component file sharing (management): add values of `quota` and `used` size on result form
Goffi <goffi@goffi.org>
parents:
3491
diff
changeset
|
264 - "label", and "value" follow same attribude in data_form.Field |
3472
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
265 - "xhtml" is used for "xml" fields with child in the C.NS_XHTML namespace |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
266 - "options" are list of dict with optional "label" and mandatory "value" |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
267 following suitable attributes from data_form.Option |
3903
384b7e6c2dbf
tools (xml_tools): handle `required` field in `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3732
diff
changeset
|
268 - "required" is the same as data_form.Field.required |
3472
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
269 """ |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
270 # TODO: describe format |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
271 fields = [] |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
272 for field_data in data_dict["fields"]: |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
273 field_type = field_data.get('type', 'text-single') |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
274 kwargs = { |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
275 "fieldType": field_type, |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
276 "var": field_data["name"], |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
277 "label": field_data.get('label'), |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
278 "value": field_data.get("value"), |
3903
384b7e6c2dbf
tools (xml_tools): handle `required` field in `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3732
diff
changeset
|
279 "required": field_data.get("required") |
3472
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
280 } |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
281 if field_type == "xhtml": |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
282 kwargs.update({ |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
283 "fieldType": None, |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
284 "ext_type": "xml", |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
285 }) |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
286 if kwargs["value"] is None: |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
287 kwargs["value"] = domish.Element((C.NS_XHTML, "div")) |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
288 elif "options" in field_data: |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
289 kwargs["options"] = [ |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
290 data_form.Option(o["value"], o.get("label")) |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
291 for o in field_data["options"] |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
292 ] |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
293 field = data_form.Field(**kwargs) |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
294 fields.append(field) |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
295 return data_form.Form( |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
296 "form", |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
297 formNamespace=data_dict.get("namespace"), |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
298 fields=fields |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
299 ) |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
300 |
e12e9e1535d3
tools (xml_tools): new `dataForm2dataDict` and `dataDict2dataForm`:
Goffi <goffi@goffi.org>
parents:
3466
diff
changeset
|
301 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
302 def data_form_elt_result_2_xmlui_data(form_xml): |
1507
84250128e425
tools (xml_tools): split dataFormResult2AdvancedList in dataFormResult2XMLUIData and XMLUIData2AdvancedList
souliane <souliane@mailoo.org>
parents:
1504
diff
changeset
|
303 """Parse a data form result (not parsed by Wokkel's XEP-0004 implementation). |
1444
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
304 |
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
305 The raw data form is used because Wokkel doesn't manage result items parsing yet. |
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
306 @param form_xml (domish.Element): element of the data form |
1507
84250128e425
tools (xml_tools): split dataFormResult2AdvancedList in dataFormResult2XMLUIData and XMLUIData2AdvancedList
souliane <souliane@mailoo.org>
parents:
1504
diff
changeset
|
307 @return: a couple (headers, result_list): |
84250128e425
tools (xml_tools): split dataFormResult2AdvancedList in dataFormResult2XMLUIData and XMLUIData2AdvancedList
souliane <souliane@mailoo.org>
parents:
1504
diff
changeset
|
308 - headers (dict{unicode: unicode}): form headers (field labels and types) |
84250128e425
tools (xml_tools): split dataFormResult2AdvancedList in dataFormResult2XMLUIData and XMLUIData2AdvancedList
souliane <souliane@mailoo.org>
parents:
1504
diff
changeset
|
309 - xmlui_data (list[tuple]): list of (widget_type, widget_args, widget_kwargs) |
630
0b914394e74f
core: added advanced list to XMLUI (need improvment, very basic so far)
Goffi <goffi@goffi.org>
parents:
615
diff
changeset
|
310 """ |
1500
c7c872a40e56
tools (xml_tools): keeps data form result headers sorted
souliane <souliane@mailoo.org>
parents:
1499
diff
changeset
|
311 headers = OrderedDict() |
630
0b914394e74f
core: added advanced list to XMLUI (need improvment, very basic so far)
Goffi <goffi@goffi.org>
parents:
615
diff
changeset
|
312 try: |
3028 | 313 reported_elt = next(form_xml.elements("jabber:x:data", "reported")) |
630
0b914394e74f
core: added advanced list to XMLUI (need improvment, very basic so far)
Goffi <goffi@goffi.org>
parents:
615
diff
changeset
|
314 except StopIteration: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
315 raise exceptions.DataError( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
316 "Couldn't find expected <reported> tag in %s" % form_xml.toXml() |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
317 ) |
630
0b914394e74f
core: added advanced list to XMLUI (need improvment, very basic so far)
Goffi <goffi@goffi.org>
parents:
615
diff
changeset
|
318 |
660
69a8bfd266a5
core, plugins: fixed bad use of children instead of elements() for domish.Element instances.
Goffi <goffi@goffi.org>
parents:
655
diff
changeset
|
319 for elt in reported_elt.elements(): |
630
0b914394e74f
core: added advanced list to XMLUI (need improvment, very basic so far)
Goffi <goffi@goffi.org>
parents:
615
diff
changeset
|
320 if elt.name != "field": |
0b914394e74f
core: added advanced list to XMLUI (need improvment, very basic so far)
Goffi <goffi@goffi.org>
parents:
615
diff
changeset
|
321 raise exceptions.DataError("Unexpected tag") |
0b914394e74f
core: added advanced list to XMLUI (need improvment, very basic so far)
Goffi <goffi@goffi.org>
parents:
615
diff
changeset
|
322 name = elt["var"] |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
323 label = elt.attributes.get("label", "") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
324 type_ = elt.attributes.get("type") |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
325 headers[name] = (label, type_) |
630
0b914394e74f
core: added advanced list to XMLUI (need improvment, very basic so far)
Goffi <goffi@goffi.org>
parents:
615
diff
changeset
|
326 |
0b914394e74f
core: added advanced list to XMLUI (need improvment, very basic so far)
Goffi <goffi@goffi.org>
parents:
615
diff
changeset
|
327 if not headers: |
684
969562c4761b
core (tools): small fix in using imported methods
souliane <souliane@mailoo.org>
parents:
660
diff
changeset
|
328 raise exceptions.DataError("No reported fields (see XEP-0004 §3.4)") |
630
0b914394e74f
core: added advanced list to XMLUI (need improvment, very basic so far)
Goffi <goffi@goffi.org>
parents:
615
diff
changeset
|
329 |
1507
84250128e425
tools (xml_tools): split dataFormResult2AdvancedList in dataFormResult2XMLUIData and XMLUIData2AdvancedList
souliane <souliane@mailoo.org>
parents:
1504
diff
changeset
|
330 xmlui_data = [] |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
331 item_elts = form_xml.elements("jabber:x:data", "item") |
630
0b914394e74f
core: added advanced list to XMLUI (need improvment, very basic so far)
Goffi <goffi@goffi.org>
parents:
615
diff
changeset
|
332 |
0b914394e74f
core: added advanced list to XMLUI (need improvment, very basic so far)
Goffi <goffi@goffi.org>
parents:
615
diff
changeset
|
333 for item_elt in item_elts: |
660
69a8bfd266a5
core, plugins: fixed bad use of children instead of elements() for domish.Element instances.
Goffi <goffi@goffi.org>
parents:
655
diff
changeset
|
334 for elt in item_elt.elements(): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
335 if elt.name != "field": |
3028 | 336 log.warning("Unexpected tag (%s)" % elt.name) |
630
0b914394e74f
core: added advanced list to XMLUI (need improvment, very basic so far)
Goffi <goffi@goffi.org>
parents:
615
diff
changeset
|
337 continue |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
338 field = data_form.Field.fromElement(elt) |
630
0b914394e74f
core: added advanced list to XMLUI (need improvment, very basic so far)
Goffi <goffi@goffi.org>
parents:
615
diff
changeset
|
339 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
340 xmlui_data.append(_data_form_field_2_xmlui_data(field)) |
1507
84250128e425
tools (xml_tools): split dataFormResult2AdvancedList in dataFormResult2XMLUIData and XMLUIData2AdvancedList
souliane <souliane@mailoo.org>
parents:
1504
diff
changeset
|
341 |
84250128e425
tools (xml_tools): split dataFormResult2AdvancedList in dataFormResult2XMLUIData and XMLUIData2AdvancedList
souliane <souliane@mailoo.org>
parents:
1504
diff
changeset
|
342 return headers, xmlui_data |
84250128e425
tools (xml_tools): split dataFormResult2AdvancedList in dataFormResult2XMLUIData and XMLUIData2AdvancedList
souliane <souliane@mailoo.org>
parents:
1504
diff
changeset
|
343 |
84250128e425
tools (xml_tools): split dataFormResult2AdvancedList in dataFormResult2XMLUIData and XMLUIData2AdvancedList
souliane <souliane@mailoo.org>
parents:
1504
diff
changeset
|
344 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
345 def xmlui_data_2_advanced_list(xmlui, headers, xmlui_data): |
1507
84250128e425
tools (xml_tools): split dataFormResult2AdvancedList in dataFormResult2XMLUIData and XMLUIData2AdvancedList
souliane <souliane@mailoo.org>
parents:
1504
diff
changeset
|
346 """Take a raw data form result (not parsed by Wokkel's XEP-0004 implementation) and convert it to an advanced list. |
84250128e425
tools (xml_tools): split dataFormResult2AdvancedList in dataFormResult2XMLUIData and XMLUIData2AdvancedList
souliane <souliane@mailoo.org>
parents:
1504
diff
changeset
|
347 |
84250128e425
tools (xml_tools): split dataFormResult2AdvancedList in dataFormResult2XMLUIData and XMLUIData2AdvancedList
souliane <souliane@mailoo.org>
parents:
1504
diff
changeset
|
348 The raw data form is used because Wokkel doesn't manage result items parsing yet. |
84250128e425
tools (xml_tools): split dataFormResult2AdvancedList in dataFormResult2XMLUIData and XMLUIData2AdvancedList
souliane <souliane@mailoo.org>
parents:
1504
diff
changeset
|
349 @param xmlui (XMLUI): the XMLUI where the AdvancedList will be added |
84250128e425
tools (xml_tools): split dataFormResult2AdvancedList in dataFormResult2XMLUIData and XMLUIData2AdvancedList
souliane <souliane@mailoo.org>
parents:
1504
diff
changeset
|
350 @param headers (dict{unicode: unicode}): form headers (field labels and types) |
84250128e425
tools (xml_tools): split dataFormResult2AdvancedList in dataFormResult2XMLUIData and XMLUIData2AdvancedList
souliane <souliane@mailoo.org>
parents:
1504
diff
changeset
|
351 @param xmlui_data (list[tuple]): list of (widget_type, widget_args, widget_kwargs) |
84250128e425
tools (xml_tools): split dataFormResult2AdvancedList in dataFormResult2XMLUIData and XMLUIData2AdvancedList
souliane <souliane@mailoo.org>
parents:
1504
diff
changeset
|
352 @return: the completed XMLUI instance |
84250128e425
tools (xml_tools): split dataFormResult2AdvancedList in dataFormResult2XMLUIData and XMLUIData2AdvancedList
souliane <souliane@mailoo.org>
parents:
1504
diff
changeset
|
353 """ |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
354 adv_list = AdvancedListContainer( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
355 xmlui, headers=headers, columns=len(headers), parent=xmlui.current_container |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
356 ) |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
357 xmlui.change_container(adv_list) |
1507
84250128e425
tools (xml_tools): split dataFormResult2AdvancedList in dataFormResult2XMLUIData and XMLUIData2AdvancedList
souliane <souliane@mailoo.org>
parents:
1504
diff
changeset
|
358 |
84250128e425
tools (xml_tools): split dataFormResult2AdvancedList in dataFormResult2XMLUIData and XMLUIData2AdvancedList
souliane <souliane@mailoo.org>
parents:
1504
diff
changeset
|
359 for widget_type, widget_args, widget_kwargs in xmlui_data: |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
360 xmlui.add_widget(widget_type, *widget_args, **widget_kwargs) |
630
0b914394e74f
core: added advanced list to XMLUI (need improvment, very basic so far)
Goffi <goffi@goffi.org>
parents:
615
diff
changeset
|
361 |
803
f100fd8d279f
core, frontends: implementation of AdvancedListContainer first draft + misc:
Goffi <goffi@goffi.org>
parents:
802
diff
changeset
|
362 return xmlui |
630
0b914394e74f
core: added advanced list to XMLUI (need improvment, very basic so far)
Goffi <goffi@goffi.org>
parents:
615
diff
changeset
|
363 |
1444
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
364 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
365 def data_form_result_2_advanced_list(xmlui, form_xml): |
1507
84250128e425
tools (xml_tools): split dataFormResult2AdvancedList in dataFormResult2XMLUIData and XMLUIData2AdvancedList
souliane <souliane@mailoo.org>
parents:
1504
diff
changeset
|
366 """Take a raw data form result (not parsed by Wokkel's XEP-0004 implementation) and convert it to an advanced list. |
84250128e425
tools (xml_tools): split dataFormResult2AdvancedList in dataFormResult2XMLUIData and XMLUIData2AdvancedList
souliane <souliane@mailoo.org>
parents:
1504
diff
changeset
|
367 |
84250128e425
tools (xml_tools): split dataFormResult2AdvancedList in dataFormResult2XMLUIData and XMLUIData2AdvancedList
souliane <souliane@mailoo.org>
parents:
1504
diff
changeset
|
368 The raw data form is used because Wokkel doesn't manage result items parsing yet. |
84250128e425
tools (xml_tools): split dataFormResult2AdvancedList in dataFormResult2XMLUIData and XMLUIData2AdvancedList
souliane <souliane@mailoo.org>
parents:
1504
diff
changeset
|
369 @param xmlui (XMLUI): the XMLUI where the AdvancedList will be added |
84250128e425
tools (xml_tools): split dataFormResult2AdvancedList in dataFormResult2XMLUIData and XMLUIData2AdvancedList
souliane <souliane@mailoo.org>
parents:
1504
diff
changeset
|
370 @param form_xml (domish.Element): element of the data form |
84250128e425
tools (xml_tools): split dataFormResult2AdvancedList in dataFormResult2XMLUIData and XMLUIData2AdvancedList
souliane <souliane@mailoo.org>
parents:
1504
diff
changeset
|
371 @return: the completed XMLUI instance |
84250128e425
tools (xml_tools): split dataFormResult2AdvancedList in dataFormResult2XMLUIData and XMLUIData2AdvancedList
souliane <souliane@mailoo.org>
parents:
1504
diff
changeset
|
372 """ |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
373 headers, xmlui_data = data_form_elt_result_2_xmlui_data(form_xml) |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
374 xmlui_data_2_advanced_list(xmlui, headers, xmlui_data) |
1507
84250128e425
tools (xml_tools): split dataFormResult2AdvancedList in dataFormResult2XMLUIData and XMLUIData2AdvancedList
souliane <souliane@mailoo.org>
parents:
1504
diff
changeset
|
375 |
84250128e425
tools (xml_tools): split dataFormResult2AdvancedList in dataFormResult2XMLUIData and XMLUIData2AdvancedList
souliane <souliane@mailoo.org>
parents:
1504
diff
changeset
|
376 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
377 def data_form_elt_result_2_xmlui(form_elt, session_id=None): |
1444
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
378 """Take a raw data form (not parsed by XEP-0004) and convert it to a SàT XMLUI. |
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
379 |
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
380 The raw data form is used because Wokkel doesn't manage result items parsing yet. |
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
381 @param form_elt (domish.Element): element of the data form |
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
382 @param session_id (unicode): session id to return with the data |
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
383 @return: XMLUI instance |
630
0b914394e74f
core: added advanced list to XMLUI (need improvment, very basic so far)
Goffi <goffi@goffi.org>
parents:
615
diff
changeset
|
384 """ |
1069
8e1f30aa3975
core (XMLUI): data form result now manage generic data set
Goffi <goffi@goffi.org>
parents:
1067
diff
changeset
|
385 xml_ui = XMLUI("window", "vertical", session_id=session_id) |
8e1f30aa3975
core (XMLUI): data form result now manage generic data set
Goffi <goffi@goffi.org>
parents:
1067
diff
changeset
|
386 try: |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
387 data_form_result_2_advanced_list(xml_ui, form_elt) |
1069
8e1f30aa3975
core (XMLUI): data form result now manage generic data set
Goffi <goffi@goffi.org>
parents:
1067
diff
changeset
|
388 except exceptions.DataError: |
8e1f30aa3975
core (XMLUI): data form result now manage generic data set
Goffi <goffi@goffi.org>
parents:
1067
diff
changeset
|
389 parsed_form = data_form.Form.fromElement(form_elt) |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
390 data_form_2_widgets(xml_ui, parsed_form, read_only=True) |
1069
8e1f30aa3975
core (XMLUI): data form result now manage generic data set
Goffi <goffi@goffi.org>
parents:
1067
diff
changeset
|
391 return xml_ui |
590
56531f9e9ac7
Fix pep8 support in src/tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
392 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
393 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
394 def data_form_result_2_xmlui(result_form, base_form, session_id=None, prepend=None, |
2958
e2cb04b381bb
tools (xml_tools): added "read_only" argument in dataFormResult2XMLUI (and use it in plugin pubsub_schema)
Goffi <goffi@goffi.org>
parents:
2938
diff
changeset
|
395 filters=None, read_only=True): |
2364
918e38622a48
core (xmlui): added method to convert data form result to XMLUI:
Goffi <goffi@goffi.org>
parents:
2361
diff
changeset
|
396 """Convert data form result to SàT XMLUI. |
918e38622a48
core (xmlui): added method to convert data form result to XMLUI:
Goffi <goffi@goffi.org>
parents:
2361
diff
changeset
|
397 |
918e38622a48
core (xmlui): added method to convert data form result to XMLUI:
Goffi <goffi@goffi.org>
parents:
2361
diff
changeset
|
398 @param result_form (data_form.Form): result form to convert |
918e38622a48
core (xmlui): added method to convert data form result to XMLUI:
Goffi <goffi@goffi.org>
parents:
2361
diff
changeset
|
399 @param base_form (data_form.Form): initial form (i.e. of form type "form") |
918e38622a48
core (xmlui): added method to convert data form result to XMLUI:
Goffi <goffi@goffi.org>
parents:
2361
diff
changeset
|
400 this one is necessary to reconstruct options when needed (e.g. list elements) |
918e38622a48
core (xmlui): added method to convert data form result to XMLUI:
Goffi <goffi@goffi.org>
parents:
2361
diff
changeset
|
401 @param session_id (unicode): session id to return with the data |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
402 @param prepend: same as for [data_form_2_widgets] |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
403 @param filters: same as for [data_form_2_widgets] |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
404 @param read_only: same as for [data_form_2_widgets] |
2364
918e38622a48
core (xmlui): added method to convert data form result to XMLUI:
Goffi <goffi@goffi.org>
parents:
2361
diff
changeset
|
405 @return: XMLUI instance |
918e38622a48
core (xmlui): added method to convert data form result to XMLUI:
Goffi <goffi@goffi.org>
parents:
2361
diff
changeset
|
406 """ |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
407 # we deepcopy the form because _data_form_field_2_xmlui_data can modify the value |
2762
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
408 # FIXME: check if it's really important, the only modified value seems to be |
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
409 # the replacement of None by "" on fixed fields |
3028 | 410 # form = deepcopy(result_form) |
2762
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
411 form = result_form |
3028 | 412 for name, field in form.fields.items(): |
2364
918e38622a48
core (xmlui): added method to convert data form result to XMLUI:
Goffi <goffi@goffi.org>
parents:
2361
diff
changeset
|
413 try: |
918e38622a48
core (xmlui): added method to convert data form result to XMLUI:
Goffi <goffi@goffi.org>
parents:
2361
diff
changeset
|
414 base_field = base_form.fields[name] |
918e38622a48
core (xmlui): added method to convert data form result to XMLUI:
Goffi <goffi@goffi.org>
parents:
2361
diff
changeset
|
415 except KeyError: |
918e38622a48
core (xmlui): added method to convert data form result to XMLUI:
Goffi <goffi@goffi.org>
parents:
2361
diff
changeset
|
416 continue |
2386
2e05921df16a
plugin schema, core(xmlui): deep copy base form when reused to avoid accidental modification
Goffi <goffi@goffi.org>
parents:
2380
diff
changeset
|
417 field.options = base_field.options[:] |
2364
918e38622a48
core (xmlui): added method to convert data form result to XMLUI:
Goffi <goffi@goffi.org>
parents:
2361
diff
changeset
|
418 xml_ui = XMLUI("window", "vertical", session_id=session_id) |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
419 data_form_2_widgets(xml_ui, form, read_only=read_only, prepend=prepend, filters=filters) |
2364
918e38622a48
core (xmlui): added method to convert data form result to XMLUI:
Goffi <goffi@goffi.org>
parents:
2361
diff
changeset
|
420 return xml_ui |
918e38622a48
core (xmlui): added method to convert data form result to XMLUI:
Goffi <goffi@goffi.org>
parents:
2361
diff
changeset
|
421 |
1444
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
422 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
423 def _clean_value(value): |
1444
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
424 """Workaround method to avoid DBus types with D-Bus bridge. |
981
58a57ce5932a
core (XMLUI): _cleanValue method to avoid issues with DBus types (must be deleted in the future)
Goffi <goffi@goffi.org>
parents:
977
diff
changeset
|
425 |
58a57ce5932a
core (XMLUI): _cleanValue method to avoid issues with DBus types (must be deleted in the future)
Goffi <goffi@goffi.org>
parents:
977
diff
changeset
|
426 @param value: value to clean |
58a57ce5932a
core (XMLUI): _cleanValue method to avoid issues with DBus types (must be deleted in the future)
Goffi <goffi@goffi.org>
parents:
977
diff
changeset
|
427 @return: value in a non DBus type (only clean string yet) |
58a57ce5932a
core (XMLUI): _cleanValue method to avoid issues with DBus types (must be deleted in the future)
Goffi <goffi@goffi.org>
parents:
977
diff
changeset
|
428 """ |
58a57ce5932a
core (XMLUI): _cleanValue method to avoid issues with DBus types (must be deleted in the future)
Goffi <goffi@goffi.org>
parents:
977
diff
changeset
|
429 # XXX: must be removed when DBus types will no cause problems anymore |
58a57ce5932a
core (XMLUI): _cleanValue method to avoid issues with DBus types (must be deleted in the future)
Goffi <goffi@goffi.org>
parents:
977
diff
changeset
|
430 # FIXME: should be cleaned inside D-Bus bridge itself |
3028 | 431 if isinstance(value, str): |
432 return str(value) | |
981
58a57ce5932a
core (XMLUI): _cleanValue method to avoid issues with DBus types (must be deleted in the future)
Goffi <goffi@goffi.org>
parents:
977
diff
changeset
|
433 return value |
58a57ce5932a
core (XMLUI): _cleanValue method to avoid issues with DBus types (must be deleted in the future)
Goffi <goffi@goffi.org>
parents:
977
diff
changeset
|
434 |
1444
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
435 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
436 def xmlui_result_2_data_form_result(xmlui_data): |
1444
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
437 """ Extract form data from a XMLUI return. |
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
438 |
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
439 @param xmlui_data (dict): data returned by frontends for XMLUI form |
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
440 @return: dict of data usable by Wokkel's data form |
762
aed7d99276b8
core (xml_tools), frontends: added a prefix to XMLUI form names in result data, to avoid name conflicts (e.g.: if a form has name "submit", and this name is also used internally by SàT)
Goffi <goffi@goffi.org>
parents:
761
diff
changeset
|
441 """ |
2938
48985ef7682f
tools (xml_tools): split new lines for multi-lines text in XMLUIResult2DataFormResult to be correctly handled in data form
Goffi <goffi@goffi.org>
parents:
2814
diff
changeset
|
442 ret = {} |
3028 | 443 for key, value in xmlui_data.items(): |
2938
48985ef7682f
tools (xml_tools): split new lines for multi-lines text in XMLUIResult2DataFormResult to be correctly handled in data form
Goffi <goffi@goffi.org>
parents:
2814
diff
changeset
|
444 if not key.startswith(SAT_FORM_PREFIX): |
48985ef7682f
tools (xml_tools): split new lines for multi-lines text in XMLUIResult2DataFormResult to be correctly handled in data form
Goffi <goffi@goffi.org>
parents:
2814
diff
changeset
|
445 continue |
3716
d33da3fe34a5
tools (xml_tools): implement `list-multi` in `_dataFormField2XMLUIData`:
Goffi <goffi@goffi.org>
parents:
3531
diff
changeset
|
446 if isinstance(value, str): |
d33da3fe34a5
tools (xml_tools): implement `list-multi` in `_dataFormField2XMLUIData`:
Goffi <goffi@goffi.org>
parents:
3531
diff
changeset
|
447 if "\n" in value: |
d33da3fe34a5
tools (xml_tools): implement `list-multi` in `_dataFormField2XMLUIData`:
Goffi <goffi@goffi.org>
parents:
3531
diff
changeset
|
448 # data form expects multi-lines text to be in separated values |
d33da3fe34a5
tools (xml_tools): implement `list-multi` in `_dataFormField2XMLUIData`:
Goffi <goffi@goffi.org>
parents:
3531
diff
changeset
|
449 value = value.split('\n') |
d33da3fe34a5
tools (xml_tools): implement `list-multi` in `_dataFormField2XMLUIData`:
Goffi <goffi@goffi.org>
parents:
3531
diff
changeset
|
450 elif "\t" in value: |
d33da3fe34a5
tools (xml_tools): implement `list-multi` in `_dataFormField2XMLUIData`:
Goffi <goffi@goffi.org>
parents:
3531
diff
changeset
|
451 # FIXME: workaround to handle multiple values. Proper serialisation must |
d33da3fe34a5
tools (xml_tools): implement `list-multi` in `_dataFormField2XMLUIData`:
Goffi <goffi@goffi.org>
parents:
3531
diff
changeset
|
452 # be done in XMLUI |
d33da3fe34a5
tools (xml_tools): implement `list-multi` in `_dataFormField2XMLUIData`:
Goffi <goffi@goffi.org>
parents:
3531
diff
changeset
|
453 value = value.split("\t") |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
454 ret[key[len(SAT_FORM_PREFIX) :]] = _clean_value(value) |
2938
48985ef7682f
tools (xml_tools): split new lines for multi-lines text in XMLUIResult2DataFormResult to be correctly handled in data form
Goffi <goffi@goffi.org>
parents:
2814
diff
changeset
|
455 return ret |
762
aed7d99276b8
core (xml_tools), frontends: added a prefix to XMLUI form names in result data, to avoid name conflicts (e.g.: if a form has name "submit", and this name is also used internally by SàT)
Goffi <goffi@goffi.org>
parents:
761
diff
changeset
|
456 |
1444
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
457 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
458 def form_escape(name): |
1444
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
459 """Return escaped name for forms. |
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
460 |
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
461 @param name (unicode): form name |
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
462 @return: unicode |
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
463 """ |
3028 | 464 return "%s%s" % (SAT_FORM_PREFIX, name) |
1444
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
465 |
805
7c05c39156a2
core (XMLUI), frontends: advancedListContainer part 2:
Goffi <goffi@goffi.org>
parents:
804
diff
changeset
|
466 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
467 def is_xmlui_cancelled(raw_xmlui): |
2741
1797671827b9
tools (xml_tools): isXMLUICancelled helper function to check if an XMLUI has been cancelled from raw XML.
Goffi <goffi@goffi.org>
parents:
2737
diff
changeset
|
468 """Tell if an XMLUI has been cancelled by checking raw XML""" |
3028 | 469 return C.bool(raw_xmlui.get('cancelled', C.BOOL_FALSE)) |
2741
1797671827b9
tools (xml_tools): isXMLUICancelled helper function to check if an XMLUI has been cancelled from raw XML.
Goffi <goffi@goffi.org>
parents:
2737
diff
changeset
|
470 |
1797671827b9
tools (xml_tools): isXMLUICancelled helper function to check if an XMLUI has been cancelled from raw XML.
Goffi <goffi@goffi.org>
parents:
2737
diff
changeset
|
471 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
472 def xmlui_result_to_elt(xmlui_data): |
1444
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
473 """Construct result domish.Element from XMLUI result. |
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
474 |
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
475 @param xmlui_data (dict): data returned by frontends for XMLUI form |
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
476 @return: domish.Element |
762
aed7d99276b8
core (xml_tools), frontends: added a prefix to XMLUI form names in result data, to avoid name conflicts (e.g.: if a form has name "submit", and this name is also used internally by SàT)
Goffi <goffi@goffi.org>
parents:
761
diff
changeset
|
477 """ |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
478 form = data_form.Form("submit") |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
479 form.makeFields(xmlui_result_2_data_form_result(xmlui_data)) |
762
aed7d99276b8
core (xml_tools), frontends: added a prefix to XMLUI form names in result data, to avoid name conflicts (e.g.: if a form has name "submit", and this name is also used internally by SàT)
Goffi <goffi@goffi.org>
parents:
761
diff
changeset
|
480 return form.toElement() |
aed7d99276b8
core (xml_tools), frontends: added a prefix to XMLUI form names in result data, to avoid name conflicts (e.g.: if a form has name "submit", and this name is also used internally by SàT)
Goffi <goffi@goffi.org>
parents:
761
diff
changeset
|
481 |
1444
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
482 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
483 def tuple_list_2_data_form(values): |
1444
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
484 """Convert a list of tuples (name, value) to a wokkel submit data form. |
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
485 |
1472 | 486 @param values (list): list of tuples |
1444
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
487 @return: data_form.Form |
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
488 """ |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
489 form = data_form.Form("submit") |
102 | 490 for value in values: |
491 field = data_form.Field(var=value[0], value=value[1]) | |
492 form.addField(field) | |
37
a61beb21d16d
Gateway registration, unregistration & edition
Goffi <goffi@goffi.org>
parents:
35
diff
changeset
|
493 |
102 | 494 return form |
103 | 495 |
1444
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
496 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
497 def params_xml_2_xmlui(xml): |
1444
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
498 """Convert the XML for parameter to a SàT XML User Interface. |
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
499 |
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
500 @param xml (unicode) |
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
501 @return: XMLUI |
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
502 """ |
1476
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
503 # TODO: refactor params and use Twisted directly to parse XML |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
504 params_doc = minidom.parseString(xml.encode("utf-8")) |
105 | 505 top = params_doc.documentElement |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
506 if top.nodeName != "params": |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
507 raise exceptions.DataError(_("INTERNAL ERROR: parameters xml not valid")) |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
508 |
105 | 509 param_ui = XMLUI("param", "tabs") |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
510 tabs_cont = param_ui.current_container |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
511 |
105 | 512 for category in top.getElementsByTagName("category"): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
513 category_name = category.getAttribute("name") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
514 label = category.getAttribute("label") |
796
46aa5ada61bf
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
771
diff
changeset
|
515 if not category_name: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
516 raise exceptions.DataError( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
517 _("INTERNAL ERROR: params categories must have a name") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
518 ) |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
519 tabs_cont.add_tab(category_name, label=label, container=LabelContainer) |
105 | 520 for param in category.getElementsByTagName("param"): |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
521 widget_kwargs = {} |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
522 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
523 param_name = param.getAttribute("name") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
524 param_label = param.getAttribute("label") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
525 type_ = param.getAttribute("type") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
526 if not param_name and type_ != "text": |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
527 raise exceptions.DataError(_("INTERNAL ERROR: params must have a name")) |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
528 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
529 value = param.getAttribute("value") or None |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
530 callback_id = param.getAttribute("callback_id") or None |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
531 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
532 if type_ == "list": |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
533 options, selected = _params_get_list_options(param) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
534 widget_kwargs["options"] = options |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
535 widget_kwargs["selected"] = selected |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
536 widget_kwargs["styles"] = ["extensible"] |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
537 elif type_ == "jids_list": |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
538 widget_kwargs["jids"] = _params_get_list_jids(param) |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
539 |
865
3ee2ec7ec010
core (xmlui), frontends: handling of "text" type in params xml + bug fixes
Goffi <goffi@goffi.org>
parents:
863
diff
changeset
|
540 if type_ in ("button", "text"): |
106 | 541 param_ui.addEmpty() |
803
f100fd8d279f
core, frontends: implementation of AdvancedListContainer first draft + misc:
Goffi <goffi@goffi.org>
parents:
802
diff
changeset
|
542 value = param_label |
106 | 543 else: |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
544 param_ui.addLabel(param_label or param_name) |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
545 |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
546 if value: |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
547 widget_kwargs["value"] = value |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
548 |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
549 if callback_id: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
550 widget_kwargs["callback_id"] = callback_id |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
551 others = [ |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
552 "%s%s%s" |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
553 % (category_name, SAT_PARAM_SEPARATOR, other.getAttribute("name")) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
554 for other in category.getElementsByTagName("param") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
555 if other.getAttribute("type") != "button" |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
556 ] |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
557 widget_kwargs["fields_back"] = others |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
558 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
559 widget_kwargs["name"] = "%s%s%s" % ( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
560 category_name, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
561 SAT_PARAM_SEPARATOR, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
562 param_name, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
563 ) |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
564 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
565 param_ui.add_widget(type_, **widget_kwargs) |
105 | 566 |
567 return param_ui.toXml() | |
568 | |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
569 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
570 def _params_get_list_options(param): |
1444
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
571 """Retrieve the options for list element. |
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
572 |
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
573 The <option/> tags must be direct children of <param/>. |
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
574 @param param (domish.Element): element |
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
575 @return: a tuple (options, selected_value) |
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
576 """ |
968
75f3b3b430ff
tools, frontends, memory: param definition and XMLUI handle multi-selection for list widgets:
souliane <souliane@mailoo.org>
parents:
910
diff
changeset
|
577 if len(param.getElementsByTagName("options")) > 0: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
578 raise exceptions.DataError( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
579 _("The 'options' tag is not allowed in parameter of type 'list'!") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
580 ) |
968
75f3b3b430ff
tools, frontends, memory: param definition and XMLUI handle multi-selection for list widgets:
souliane <souliane@mailoo.org>
parents:
910
diff
changeset
|
581 elems = param.getElementsByTagName("option") |
655
56f8a9c99194
core, primitivus: better support for parameter of type list
souliane <souliane@mailoo.org>
parents:
645
diff
changeset
|
582 if len(elems) == 0: |
56f8a9c99194
core, primitivus: better support for parameter of type list
souliane <souliane@mailoo.org>
parents:
645
diff
changeset
|
583 return [] |
3233
8770397f8f82
tools (xl_tools): fixed handling of list options labels
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
584 options = [] |
8770397f8f82
tools (xl_tools): fixed handling of list options labels
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
585 for elem in elems: |
8770397f8f82
tools (xl_tools): fixed handling of list options labels
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
586 value = elem.getAttribute("value") |
8770397f8f82
tools (xl_tools): fixed handling of list options labels
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
587 if not value: |
8770397f8f82
tools (xl_tools): fixed handling of list options labels
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
588 raise exceptions.InternalError("list option must have a value") |
8770397f8f82
tools (xl_tools): fixed handling of list options labels
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
589 label = elem.getAttribute("label") |
8770397f8f82
tools (xl_tools): fixed handling of list options labels
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
590 if label: |
8770397f8f82
tools (xl_tools): fixed handling of list options labels
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
591 options.append((value, label)) |
8770397f8f82
tools (xl_tools): fixed handling of list options labels
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
592 else: |
8770397f8f82
tools (xl_tools): fixed handling of list options labels
Goffi <goffi@goffi.org>
parents:
3137
diff
changeset
|
593 options.append(value) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
594 selected = [ |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
595 elem.getAttribute("value") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
596 for elem in elems |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
597 if elem.getAttribute("selected") == "true" |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
598 ] |
1444
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
599 return (options, selected) |
655
56f8a9c99194
core, primitivus: better support for parameter of type list
souliane <souliane@mailoo.org>
parents:
645
diff
changeset
|
600 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
601 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
602 def _params_get_list_jids(param): |
1476
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
603 """Retrive jids from a jids_list element. |
655
56f8a9c99194
core, primitivus: better support for parameter of type list
souliane <souliane@mailoo.org>
parents:
645
diff
changeset
|
604 |
1476
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
605 the <jid/> tags must be direct children of <param/> |
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
606 @param param (domish.Element): element |
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
607 @return: a list of jids |
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
608 """ |
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
609 elems = param.getElementsByTagName("jid") |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
610 jids = [ |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
611 elem.firstChild.data |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
612 for elem in elems |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
613 if elem.firstChild is not None and elem.firstChild.nodeType == elem.TEXT_NODE |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
614 ] |
1476
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
615 return jids |
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
616 |
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
617 |
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
618 ### XMLUI Elements ### |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
619 |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
620 |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
621 class Element(object): |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
622 """ Base XMLUI element """ |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
623 |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
624 type = None |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
625 |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
626 def __init__(self, xmlui, parent=None): |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
627 """Create a container element |
1444
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
628 |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
629 @param xmlui: XMLUI instance |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
630 @parent: parent element |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
631 """ |
1475
7ac073d2e7e0
core(xmlui): removed useless parenthesis around assert
Goffi <goffi@goffi.org>
parents:
1473
diff
changeset
|
632 assert self.type is not None |
2365
318f0434d830
core (xmlui): container now keep a list of children
Goffi <goffi@goffi.org>
parents:
2364
diff
changeset
|
633 self.children = [] |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
634 if not hasattr(self, "elem"): |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
635 self.elem = parent.xmlui.doc.createElement(self.type) |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
636 self.xmlui = xmlui |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
637 if parent is not None: |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
638 parent.append(self) |
803
f100fd8d279f
core, frontends: implementation of AdvancedListContainer first draft + misc:
Goffi <goffi@goffi.org>
parents:
802
diff
changeset
|
639 self.parent = parent |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
640 |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
641 def append(self, child): |
1487
0df627d0b4ca
tools (xmlui): changeContainer do not create a new one when the current one already fits
souliane <souliane@mailoo.org>
parents:
1486
diff
changeset
|
642 """Append a child to this element. |
1490
55cff13b1f10
core (xmlui): reverted change from 039d96e131be: we should be able to recreate the same container with changeContainer
Goffi <goffi@goffi.org>
parents:
1487
diff
changeset
|
643 |
1487
0df627d0b4ca
tools (xmlui): changeContainer do not create a new one when the current one already fits
souliane <souliane@mailoo.org>
parents:
1486
diff
changeset
|
644 @param child (Element): child element |
0df627d0b4ca
tools (xmlui): changeContainer do not create a new one when the current one already fits
souliane <souliane@mailoo.org>
parents:
1486
diff
changeset
|
645 @return: the added child Element |
0df627d0b4ca
tools (xmlui): changeContainer do not create a new one when the current one already fits
souliane <souliane@mailoo.org>
parents:
1486
diff
changeset
|
646 """ |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
647 self.elem.appendChild(child.elem) |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
648 child.parent = self |
2365
318f0434d830
core (xmlui): container now keep a list of children
Goffi <goffi@goffi.org>
parents:
2364
diff
changeset
|
649 self.children.append(child) |
1487
0df627d0b4ca
tools (xmlui): changeContainer do not create a new one when the current one already fits
souliane <souliane@mailoo.org>
parents:
1486
diff
changeset
|
650 return child |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
651 |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
652 |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
653 class TopElement(Element): |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
654 """ Main XML Element """ |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
655 |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
656 type = "top" |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
657 |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
658 def __init__(self, xmlui): |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
659 self.elem = xmlui.doc.documentElement |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
660 super(TopElement, self).__init__(xmlui) |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
661 |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
662 |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
663 class TabElement(Element): |
1444
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
664 """ Used by TabsContainer to give name and label to tabs.""" |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
665 |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
666 type = "tab" |
630
0b914394e74f
core: added advanced list to XMLUI (need improvment, very basic so far)
Goffi <goffi@goffi.org>
parents:
615
diff
changeset
|
667 |
1486
a77217511afd
tools, frontends (xmlui): allow to select a tab when adding it
souliane <souliane@mailoo.org>
parents:
1476
diff
changeset
|
668 def __init__(self, parent, name, label, selected=False): |
a77217511afd
tools, frontends (xmlui): allow to select a tab when adding it
souliane <souliane@mailoo.org>
parents:
1476
diff
changeset
|
669 """ |
a77217511afd
tools, frontends (xmlui): allow to select a tab when adding it
souliane <souliane@mailoo.org>
parents:
1476
diff
changeset
|
670 |
a77217511afd
tools, frontends (xmlui): allow to select a tab when adding it
souliane <souliane@mailoo.org>
parents:
1476
diff
changeset
|
671 @param parent (TabsContainer): parent container |
a77217511afd
tools, frontends (xmlui): allow to select a tab when adding it
souliane <souliane@mailoo.org>
parents:
1476
diff
changeset
|
672 @param name (unicode): tab name |
a77217511afd
tools, frontends (xmlui): allow to select a tab when adding it
souliane <souliane@mailoo.org>
parents:
1476
diff
changeset
|
673 @param label (unicode): tab label |
a77217511afd
tools, frontends (xmlui): allow to select a tab when adding it
souliane <souliane@mailoo.org>
parents:
1476
diff
changeset
|
674 @param selected (bool): set to True to select this tab |
a77217511afd
tools, frontends (xmlui): allow to select a tab when adding it
souliane <souliane@mailoo.org>
parents:
1476
diff
changeset
|
675 """ |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
676 if not isinstance(parent, TabsContainer): |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
677 raise exceptions.DataError(_("TabElement must be a child of TabsContainer")) |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
678 super(TabElement, self).__init__(parent.xmlui, parent) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
679 self.elem.setAttribute("name", name) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
680 self.elem.setAttribute("label", label) |
1486
a77217511afd
tools, frontends (xmlui): allow to select a tab when adding it
souliane <souliane@mailoo.org>
parents:
1476
diff
changeset
|
681 if selected: |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
682 self.set_selected(selected) |
1486
a77217511afd
tools, frontends (xmlui): allow to select a tab when adding it
souliane <souliane@mailoo.org>
parents:
1476
diff
changeset
|
683 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
684 def set_selected(self, selected=False): |
1486
a77217511afd
tools, frontends (xmlui): allow to select a tab when adding it
souliane <souliane@mailoo.org>
parents:
1476
diff
changeset
|
685 """Set the tab selected. |
a77217511afd
tools, frontends (xmlui): allow to select a tab when adding it
souliane <souliane@mailoo.org>
parents:
1476
diff
changeset
|
686 |
a77217511afd
tools, frontends (xmlui): allow to select a tab when adding it
souliane <souliane@mailoo.org>
parents:
1476
diff
changeset
|
687 @param selected (bool): set to True to select this tab |
a77217511afd
tools, frontends (xmlui): allow to select a tab when adding it
souliane <souliane@mailoo.org>
parents:
1476
diff
changeset
|
688 """ |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
689 self.elem.setAttribute("selected", "true" if selected else "false") |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
690 |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
691 |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
692 class FieldBackElement(Element): |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
693 """ Used by ButtonWidget to indicate which field have to be sent back """ |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
694 |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
695 type = "field_back" |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
696 |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
697 def __init__(self, parent, name): |
1475
7ac073d2e7e0
core(xmlui): removed useless parenthesis around assert
Goffi <goffi@goffi.org>
parents:
1473
diff
changeset
|
698 assert isinstance(parent, ButtonWidget) |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
699 super(FieldBackElement, self).__init__(parent.xmlui, parent) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
700 self.elem.setAttribute("name", name) |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
701 |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
702 |
977
d2e612a45e76
tools, frontends (xmlui): add Widget.setInternalCallback:
souliane <souliane@mailoo.org>
parents:
975
diff
changeset
|
703 class InternalFieldElement(Element): |
d2e612a45e76
tools, frontends (xmlui): add Widget.setInternalCallback:
souliane <souliane@mailoo.org>
parents:
975
diff
changeset
|
704 """ Used by internal callbacks to indicate which fields are manipulated """ |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
705 |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
706 type = "internal_field" |
977
d2e612a45e76
tools, frontends (xmlui): add Widget.setInternalCallback:
souliane <souliane@mailoo.org>
parents:
975
diff
changeset
|
707 |
d2e612a45e76
tools, frontends (xmlui): add Widget.setInternalCallback:
souliane <souliane@mailoo.org>
parents:
975
diff
changeset
|
708 def __init__(self, parent, name): |
d2e612a45e76
tools, frontends (xmlui): add Widget.setInternalCallback:
souliane <souliane@mailoo.org>
parents:
975
diff
changeset
|
709 super(InternalFieldElement, self).__init__(parent.xmlui, parent) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
710 self.elem.setAttribute("name", name) |
977
d2e612a45e76
tools, frontends (xmlui): add Widget.setInternalCallback:
souliane <souliane@mailoo.org>
parents:
975
diff
changeset
|
711 |
d2e612a45e76
tools, frontends (xmlui): add Widget.setInternalCallback:
souliane <souliane@mailoo.org>
parents:
975
diff
changeset
|
712 |
d2e612a45e76
tools, frontends (xmlui): add Widget.setInternalCallback:
souliane <souliane@mailoo.org>
parents:
975
diff
changeset
|
713 class InternalDataElement(Element): |
d2e612a45e76
tools, frontends (xmlui): add Widget.setInternalCallback:
souliane <souliane@mailoo.org>
parents:
975
diff
changeset
|
714 """ Used by internal callbacks to retrieve extra data """ |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
715 |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
716 type = "internal_data" |
977
d2e612a45e76
tools, frontends (xmlui): add Widget.setInternalCallback:
souliane <souliane@mailoo.org>
parents:
975
diff
changeset
|
717 |
d2e612a45e76
tools, frontends (xmlui): add Widget.setInternalCallback:
souliane <souliane@mailoo.org>
parents:
975
diff
changeset
|
718 def __init__(self, parent, children): |
d2e612a45e76
tools, frontends (xmlui): add Widget.setInternalCallback:
souliane <souliane@mailoo.org>
parents:
975
diff
changeset
|
719 super(InternalDataElement, self).__init__(parent.xmlui, parent) |
1475
7ac073d2e7e0
core(xmlui): removed useless parenthesis around assert
Goffi <goffi@goffi.org>
parents:
1473
diff
changeset
|
720 assert isinstance(children, list) |
977
d2e612a45e76
tools, frontends (xmlui): add Widget.setInternalCallback:
souliane <souliane@mailoo.org>
parents:
975
diff
changeset
|
721 for child in children: |
d2e612a45e76
tools, frontends (xmlui): add Widget.setInternalCallback:
souliane <souliane@mailoo.org>
parents:
975
diff
changeset
|
722 self.elem.childNodes.append(child) |
d2e612a45e76
tools, frontends (xmlui): add Widget.setInternalCallback:
souliane <souliane@mailoo.org>
parents:
975
diff
changeset
|
723 |
d2e612a45e76
tools, frontends (xmlui): add Widget.setInternalCallback:
souliane <souliane@mailoo.org>
parents:
975
diff
changeset
|
724 |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
725 class OptionElement(Element): |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
726 """" Used by ListWidget to specify options """ |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
727 |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
728 type = "option" |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
729 |
968
75f3b3b430ff
tools, frontends, memory: param definition and XMLUI handle multi-selection for list widgets:
souliane <souliane@mailoo.org>
parents:
910
diff
changeset
|
730 def __init__(self, parent, option, selected=False): |
75f3b3b430ff
tools, frontends, memory: param definition and XMLUI handle multi-selection for list widgets:
souliane <souliane@mailoo.org>
parents:
910
diff
changeset
|
731 """ |
75f3b3b430ff
tools, frontends, memory: param definition and XMLUI handle multi-selection for list widgets:
souliane <souliane@mailoo.org>
parents:
910
diff
changeset
|
732 |
75f3b3b430ff
tools, frontends, memory: param definition and XMLUI handle multi-selection for list widgets:
souliane <souliane@mailoo.org>
parents:
910
diff
changeset
|
733 @param parent |
75f3b3b430ff
tools, frontends, memory: param definition and XMLUI handle multi-selection for list widgets:
souliane <souliane@mailoo.org>
parents:
910
diff
changeset
|
734 @param option (string, tuple) |
75f3b3b430ff
tools, frontends, memory: param definition and XMLUI handle multi-selection for list widgets:
souliane <souliane@mailoo.org>
parents:
910
diff
changeset
|
735 @param selected (boolean) |
75f3b3b430ff
tools, frontends, memory: param definition and XMLUI handle multi-selection for list widgets:
souliane <souliane@mailoo.org>
parents:
910
diff
changeset
|
736 """ |
1475
7ac073d2e7e0
core(xmlui): removed useless parenthesis around assert
Goffi <goffi@goffi.org>
parents:
1473
diff
changeset
|
737 assert isinstance(parent, ListWidget) |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
738 super(OptionElement, self).__init__(parent.xmlui, parent) |
3028 | 739 if isinstance(option, str): |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
740 value, label = option, option |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
741 elif isinstance(option, tuple): |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
742 value, label = option |
1067
f7f15d44fdfa
tools (xml_tools): dataForm2XMLUI handles the default value for "list-single" fields
souliane <souliane@mailoo.org>
parents:
1036
diff
changeset
|
743 else: |
f7f15d44fdfa
tools (xml_tools): dataForm2XMLUI handles the default value for "list-single" fields
souliane <souliane@mailoo.org>
parents:
1036
diff
changeset
|
744 raise NotImplementedError |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
745 self.elem.setAttribute("value", value) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
746 self.elem.setAttribute("label", label) |
968
75f3b3b430ff
tools, frontends, memory: param definition and XMLUI handle multi-selection for list widgets:
souliane <souliane@mailoo.org>
parents:
910
diff
changeset
|
747 if selected: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
748 self.elem.setAttribute("selected", "true") |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
749 |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
750 |
1476
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
751 class JidElement(Element): |
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
752 """" Used by JidsListWidget to specify jids""" |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
753 |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
754 type = "jid" |
1476
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
755 |
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
756 def __init__(self, parent, jid_): |
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
757 """ |
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
758 @param jid_(jid.JID, unicode): jid to append |
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
759 """ |
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
760 assert isinstance(parent, JidsListWidget) |
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
761 super(JidElement, self).__init__(parent.xmlui, parent) |
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
762 if isinstance(jid_, jid.JID): |
1499
adc72c39f032
tools (xml_tools): fixes JidElement.__init__
souliane <souliane@mailoo.org>
parents:
1490
diff
changeset
|
763 value = jid_.full() |
3028 | 764 elif isinstance(jid_, str): |
765 value = str(jid_) | |
1476
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
766 else: |
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
767 raise NotImplementedError |
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
768 jid_txt = self.xmlui.doc.createTextNode(value) |
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
769 self.elem.appendChild(jid_txt) |
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
770 |
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
771 |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
772 class RowElement(Element): |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
773 """" Used by AdvancedListContainer """ |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
774 |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
775 type = "row" |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
776 |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
777 def __init__(self, parent): |
1475
7ac073d2e7e0
core(xmlui): removed useless parenthesis around assert
Goffi <goffi@goffi.org>
parents:
1473
diff
changeset
|
778 assert isinstance(parent, AdvancedListContainer) |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
779 super(RowElement, self).__init__(parent.xmlui, parent) |
805
7c05c39156a2
core (XMLUI), frontends: advancedListContainer part 2:
Goffi <goffi@goffi.org>
parents:
804
diff
changeset
|
780 if parent.next_row_idx is not None: |
7c05c39156a2
core (XMLUI), frontends: advancedListContainer part 2:
Goffi <goffi@goffi.org>
parents:
804
diff
changeset
|
781 if parent.auto_index: |
7c05c39156a2
core (XMLUI), frontends: advancedListContainer part 2:
Goffi <goffi@goffi.org>
parents:
804
diff
changeset
|
782 raise exceptions.DataError(_("Can't set row index if auto_index is True")) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
783 self.elem.setAttribute("index", parent.next_row_idx) |
805
7c05c39156a2
core (XMLUI), frontends: advancedListContainer part 2:
Goffi <goffi@goffi.org>
parents:
804
diff
changeset
|
784 parent.next_row_idx = None |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
785 |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
786 |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
787 class HeaderElement(Element): |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
788 """" Used by AdvancedListContainer """ |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
789 |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
790 type = "header" |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
791 |
876
65bf1bc70f6b
tools, plugin XEP-0077: small fixes
souliane <souliane@mailoo.org>
parents:
865
diff
changeset
|
792 def __init__(self, parent, name=None, label=None, description=None): |
630
0b914394e74f
core: added advanced list to XMLUI (need improvment, very basic so far)
Goffi <goffi@goffi.org>
parents:
615
diff
changeset
|
793 """ |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
794 @param parent: AdvancedListContainer instance |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
795 @param name: name of the container |
630
0b914394e74f
core: added advanced list to XMLUI (need improvment, very basic so far)
Goffi <goffi@goffi.org>
parents:
615
diff
changeset
|
796 @param label: label to be displayed in columns |
0b914394e74f
core: added advanced list to XMLUI (need improvment, very basic so far)
Goffi <goffi@goffi.org>
parents:
615
diff
changeset
|
797 @param description: long descriptive text |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
798 """ |
1475
7ac073d2e7e0
core(xmlui): removed useless parenthesis around assert
Goffi <goffi@goffi.org>
parents:
1473
diff
changeset
|
799 assert isinstance(parent, AdvancedListContainer) |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
800 super(HeaderElement, self).__init__(parent.xmlui, parent) |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
801 if name: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
802 self.elem.setAttribute("name", name) |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
803 if label: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
804 self.elem.setAttribute("label", label) |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
805 if description: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
806 self.elem.setAttribute("description", description) |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
807 |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
808 |
1476
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
809 ## Containers ## |
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
810 |
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
811 |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
812 class Container(Element): |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
813 """ And Element which contains other ones and has a layout """ |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
814 |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
815 type = None |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
816 |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
817 def __init__(self, xmlui, parent=None): |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
818 """Create a container element |
1472 | 819 |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
820 @param xmlui: XMLUI instance |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
821 @parent: parent element or None |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
822 """ |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
823 self.elem = xmlui.doc.createElement("container") |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
824 super(Container, self).__init__(xmlui, parent) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
825 self.elem.setAttribute("type", self.type) |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
826 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
827 def get_parent_container(self): |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
828 """ Return first parent container |
1472 | 829 |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
830 @return: parent container or None |
630
0b914394e74f
core: added advanced list to XMLUI (need improvment, very basic so far)
Goffi <goffi@goffi.org>
parents:
615
diff
changeset
|
831 """ |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
832 current = self.parent |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
833 while not isinstance(current, (Container)) and current is not None: |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
834 current = current.parent |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
835 return current |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
836 |
1444
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
837 |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
838 class VerticalContainer(Container): |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
839 type = "vertical" |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
840 |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
841 |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
842 class HorizontalContainer(Container): |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
843 type = "horizontal" |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
844 |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
845 |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
846 class PairsContainer(Container): |
2737
5c2ed8a5ae22
frontends (XMLUI): TabsContainer can now be the main container (Primitivus keep the old behaviour and always use VerticalContainer as main container)
Goffi <goffi@goffi.org>
parents:
2668
diff
changeset
|
847 """Container with series of 2 elements""" |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
848 type = "pairs" |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
849 |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
850 |
2361
5defafc8ede6
core, frontends (xmlui): new LabelContainer:
Goffi <goffi@goffi.org>
parents:
2108
diff
changeset
|
851 class LabelContainer(Container): |
2737
5c2ed8a5ae22
frontends (XMLUI): TabsContainer can now be the main container (Primitivus keep the old behaviour and always use VerticalContainer as main container)
Goffi <goffi@goffi.org>
parents:
2668
diff
changeset
|
852 """Like PairsContainer, but first element can only be a label""" |
2361
5defafc8ede6
core, frontends (xmlui): new LabelContainer:
Goffi <goffi@goffi.org>
parents:
2108
diff
changeset
|
853 type = "label" |
5defafc8ede6
core, frontends (xmlui): new LabelContainer:
Goffi <goffi@goffi.org>
parents:
2108
diff
changeset
|
854 |
5defafc8ede6
core, frontends (xmlui): new LabelContainer:
Goffi <goffi@goffi.org>
parents:
2108
diff
changeset
|
855 |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
856 class TabsContainer(Container): |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
857 type = "tabs" |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
858 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
859 def add_tab(self, name, label=None, selected=None, container=VerticalContainer): |
1486
a77217511afd
tools, frontends (xmlui): allow to select a tab when adding it
souliane <souliane@mailoo.org>
parents:
1476
diff
changeset
|
860 """Add a tab. |
a77217511afd
tools, frontends (xmlui): allow to select a tab when adding it
souliane <souliane@mailoo.org>
parents:
1476
diff
changeset
|
861 |
a77217511afd
tools, frontends (xmlui): allow to select a tab when adding it
souliane <souliane@mailoo.org>
parents:
1476
diff
changeset
|
862 @param name (unicode): tab name |
a77217511afd
tools, frontends (xmlui): allow to select a tab when adding it
souliane <souliane@mailoo.org>
parents:
1476
diff
changeset
|
863 @param label (unicode): tab label |
a77217511afd
tools, frontends (xmlui): allow to select a tab when adding it
souliane <souliane@mailoo.org>
parents:
1476
diff
changeset
|
864 @param selected (bool): set to True to select this tab |
1490
55cff13b1f10
core (xmlui): reverted change from 039d96e131be: we should be able to recreate the same container with changeContainer
Goffi <goffi@goffi.org>
parents:
1487
diff
changeset
|
865 @param container (class): container class, inheriting from Container |
1486
a77217511afd
tools, frontends (xmlui): allow to select a tab when adding it
souliane <souliane@mailoo.org>
parents:
1476
diff
changeset
|
866 @return: the container for the new tab |
a77217511afd
tools, frontends (xmlui): allow to select a tab when adding it
souliane <souliane@mailoo.org>
parents:
1476
diff
changeset
|
867 """ |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
868 if not label: |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
869 label = name |
1486
a77217511afd
tools, frontends (xmlui): allow to select a tab when adding it
souliane <souliane@mailoo.org>
parents:
1476
diff
changeset
|
870 tab_elt = TabElement(self, name, label, selected) |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
871 new_container = container(self.xmlui, tab_elt) |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
872 return self.xmlui.change_container(new_container) |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
873 |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
874 def end(self): |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
875 """ Called when we have finished tabs |
1472 | 876 |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
877 change current container to first container parent |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
878 """ |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
879 parent_container = self.get_parent_container() |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
880 self.xmlui.change_container(parent_container) |
630
0b914394e74f
core: added advanced list to XMLUI (need improvment, very basic so far)
Goffi <goffi@goffi.org>
parents:
615
diff
changeset
|
881 |
0b914394e74f
core: added advanced list to XMLUI (need improvment, very basic so far)
Goffi <goffi@goffi.org>
parents:
615
diff
changeset
|
882 |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
883 class AdvancedListContainer(Container): |
1472 | 884 """A list which can contain other widgets, headers, etc""" |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
885 |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
886 type = "advanced_list" |
630
0b914394e74f
core: added advanced list to XMLUI (need improvment, very basic so far)
Goffi <goffi@goffi.org>
parents:
615
diff
changeset
|
887 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
888 def __init__( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
889 self, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
890 xmlui, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
891 callback_id=None, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
892 name=None, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
893 headers=None, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
894 items=None, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
895 columns=None, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
896 selectable="no", |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
897 auto_index=False, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
898 parent=None, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
899 ): |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
900 """Create an advanced list |
1472 | 901 |
1199 | 902 @param headers: optional headers information |
805
7c05c39156a2
core (XMLUI), frontends: advancedListContainer part 2:
Goffi <goffi@goffi.org>
parents:
804
diff
changeset
|
903 @param callback_id: id of the method to call when selection is done |
7c05c39156a2
core (XMLUI), frontends: advancedListContainer part 2:
Goffi <goffi@goffi.org>
parents:
804
diff
changeset
|
904 @param items: list of widgets to add (just the first row) |
7c05c39156a2
core (XMLUI), frontends: advancedListContainer part 2:
Goffi <goffi@goffi.org>
parents:
804
diff
changeset
|
905 @param columns: number of columns in this table, or None to autodetect |
7c05c39156a2
core (XMLUI), frontends: advancedListContainer part 2:
Goffi <goffi@goffi.org>
parents:
804
diff
changeset
|
906 @param selectable: one of: |
7c05c39156a2
core (XMLUI), frontends: advancedListContainer part 2:
Goffi <goffi@goffi.org>
parents:
804
diff
changeset
|
907 'no': nothing is done |
7c05c39156a2
core (XMLUI), frontends: advancedListContainer part 2:
Goffi <goffi@goffi.org>
parents:
804
diff
changeset
|
908 'single': one row can be selected |
2625
a55a14c3cbf4
plugin XEP-0070: use a confirm dialog instead of a form + simplified a bit the code
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
909 @param auto_index: if True, indexes will be generated by frontends, |
a55a14c3cbf4
plugin XEP-0070: use a confirm dialog instead of a form + simplified a bit the code
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
910 starting from 0 |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
911 @return: created element |
630
0b914394e74f
core: added advanced list to XMLUI (need improvment, very basic so far)
Goffi <goffi@goffi.org>
parents:
615
diff
changeset
|
912 """ |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
913 assert selectable in ("no", "single") |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
914 if not items and columns is None: |
876
65bf1bc70f6b
tools, plugin XEP-0077: small fixes
souliane <souliane@mailoo.org>
parents:
865
diff
changeset
|
915 raise exceptions.DataError(_("either items or columns need do be filled")) |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
916 if headers is None: |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
917 headers = [] |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
918 if items is None: |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
919 items = [] |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
920 super(AdvancedListContainer, self).__init__(xmlui, parent) |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
921 if columns is None: |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
922 columns = len(items[0]) |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
923 self._columns = columns |
803
f100fd8d279f
core, frontends: implementation of AdvancedListContainer first draft + misc:
Goffi <goffi@goffi.org>
parents:
802
diff
changeset
|
924 self._item_idx = 0 |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
925 self.current_row = None |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
926 if headers: |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
927 if len(headers) != self._columns: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
928 raise exceptions.DataError( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
929 _("Headers lenght doesn't correspond to columns") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
930 ) |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
931 self.add_headers(headers) |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
932 if items: |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
933 self.add_items(items) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
934 self.elem.setAttribute("columns", str(self._columns)) |
805
7c05c39156a2
core (XMLUI), frontends: advancedListContainer part 2:
Goffi <goffi@goffi.org>
parents:
804
diff
changeset
|
935 if callback_id is not None: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
936 self.elem.setAttribute("callback", callback_id) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
937 self.elem.setAttribute("selectable", selectable) |
805
7c05c39156a2
core (XMLUI), frontends: advancedListContainer part 2:
Goffi <goffi@goffi.org>
parents:
804
diff
changeset
|
938 self.auto_index = auto_index |
7c05c39156a2
core (XMLUI), frontends: advancedListContainer part 2:
Goffi <goffi@goffi.org>
parents:
804
diff
changeset
|
939 if auto_index: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
940 self.elem.setAttribute("auto_index", "true") |
805
7c05c39156a2
core (XMLUI), frontends: advancedListContainer part 2:
Goffi <goffi@goffi.org>
parents:
804
diff
changeset
|
941 self.next_row_idx = None |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
942 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
943 def add_headers(self, headers): |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
944 for header in headers: |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
945 self.addHeader(header) |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
946 |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
947 def addHeader(self, header): |
1444
8ce9924fa92c
tools (xml_tools): better PEP-8 compliance
souliane <souliane@mailoo.org>
parents:
1409
diff
changeset
|
948 pass # TODO |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
949 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
950 def add_items(self, items): |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
951 for item in items: |
803
f100fd8d279f
core, frontends: implementation of AdvancedListContainer first draft + misc:
Goffi <goffi@goffi.org>
parents:
802
diff
changeset
|
952 self.append(item) |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
953 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
954 def set_row_index(self, idx): |
805
7c05c39156a2
core (XMLUI), frontends: advancedListContainer part 2:
Goffi <goffi@goffi.org>
parents:
804
diff
changeset
|
955 """ Set index for next row |
1472 | 956 |
805
7c05c39156a2
core (XMLUI), frontends: advancedListContainer part 2:
Goffi <goffi@goffi.org>
parents:
804
diff
changeset
|
957 index are returned when a row is selected, in data's "index" key |
7c05c39156a2
core (XMLUI), frontends: advancedListContainer part 2:
Goffi <goffi@goffi.org>
parents:
804
diff
changeset
|
958 @param idx: string index to associate to the next row |
7c05c39156a2
core (XMLUI), frontends: advancedListContainer part 2:
Goffi <goffi@goffi.org>
parents:
804
diff
changeset
|
959 """ |
7c05c39156a2
core (XMLUI), frontends: advancedListContainer part 2:
Goffi <goffi@goffi.org>
parents:
804
diff
changeset
|
960 self.next_row_idx = idx |
7c05c39156a2
core (XMLUI), frontends: advancedListContainer part 2:
Goffi <goffi@goffi.org>
parents:
804
diff
changeset
|
961 |
803
f100fd8d279f
core, frontends: implementation of AdvancedListContainer first draft + misc:
Goffi <goffi@goffi.org>
parents:
802
diff
changeset
|
962 def append(self, child): |
f100fd8d279f
core, frontends: implementation of AdvancedListContainer first draft + misc:
Goffi <goffi@goffi.org>
parents:
802
diff
changeset
|
963 if isinstance(child, RowElement): |
f100fd8d279f
core, frontends: implementation of AdvancedListContainer first draft + misc:
Goffi <goffi@goffi.org>
parents:
802
diff
changeset
|
964 return super(AdvancedListContainer, self).append(child) |
f100fd8d279f
core, frontends: implementation of AdvancedListContainer first draft + misc:
Goffi <goffi@goffi.org>
parents:
802
diff
changeset
|
965 if self._item_idx % self._columns == 0: |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
966 self.current_row = RowElement(self) |
803
f100fd8d279f
core, frontends: implementation of AdvancedListContainer first draft + misc:
Goffi <goffi@goffi.org>
parents:
802
diff
changeset
|
967 self.current_row.append(child) |
f100fd8d279f
core, frontends: implementation of AdvancedListContainer first draft + misc:
Goffi <goffi@goffi.org>
parents:
802
diff
changeset
|
968 self._item_idx += 1 |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
969 |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
970 def end(self): |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
971 """ Called when we have finished list |
1472 | 972 |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
973 change current container to first container parent |
630
0b914394e74f
core: added advanced list to XMLUI (need improvment, very basic so far)
Goffi <goffi@goffi.org>
parents:
615
diff
changeset
|
974 """ |
804
5174657b3378
XMLUI (core, frontends): added JidWidget and DividerWidget + popup type + some bugfixes:
Goffi <goffi@goffi.org>
parents:
803
diff
changeset
|
975 if self._item_idx % self._columns != 0: |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
976 raise exceptions.DataError(_("Incorrect number of items in list")) |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
977 parent_container = self.get_parent_container() |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
978 self.xmlui.change_container(parent_container) |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
979 |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
980 |
1476
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
981 ## Widgets ## |
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
982 |
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
983 |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
984 class Widget(Element): |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
985 type = None |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
986 |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
987 def __init__(self, xmlui, name=None, parent=None): |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
988 """Create an element |
1472 | 989 |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
990 @param xmlui: XMLUI instance |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
991 @param name: name of the element or None |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
992 @param parent: parent element or None |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
993 """ |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
994 self.elem = xmlui.doc.createElement("widget") |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
995 super(Widget, self).__init__(xmlui, parent) |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
996 if name: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
997 self.elem.setAttribute("name", name) |
2398
3ff9d7a7fe71
core (XMLUI): filters can now be used when converting data form to XMLUI:
Goffi <goffi@goffi.org>
parents:
2397
diff
changeset
|
998 if name in xmlui.named_widgets: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
999 raise exceptions.ConflictError( |
3028 | 1000 _('A widget with the name "{name}" already exists.').format( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1001 name=name |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1002 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1003 ) |
2398
3ff9d7a7fe71
core (XMLUI): filters can now be used when converting data form to XMLUI:
Goffi <goffi@goffi.org>
parents:
2397
diff
changeset
|
1004 xmlui.named_widgets[name] = self |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1005 self.elem.setAttribute("type", self.type) |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1006 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1007 def set_internal_callback(self, callback, fields, data_elts=None): |
977
d2e612a45e76
tools, frontends (xmlui): add Widget.setInternalCallback:
souliane <souliane@mailoo.org>
parents:
975
diff
changeset
|
1008 """Set an internal UI callback when the widget value is changed. |
d2e612a45e76
tools, frontends (xmlui): add Widget.setInternalCallback:
souliane <souliane@mailoo.org>
parents:
975
diff
changeset
|
1009 |
d2e612a45e76
tools, frontends (xmlui): add Widget.setInternalCallback:
souliane <souliane@mailoo.org>
parents:
975
diff
changeset
|
1010 The internal callbacks are NO callback ids, they are strings from |
d2e612a45e76
tools, frontends (xmlui): add Widget.setInternalCallback:
souliane <souliane@mailoo.org>
parents:
975
diff
changeset
|
1011 a predefined set of actions that are running in the scope of XMLUI. |
d2e612a45e76
tools, frontends (xmlui): add Widget.setInternalCallback:
souliane <souliane@mailoo.org>
parents:
975
diff
changeset
|
1012 @param callback (string): a value from: |
d2e612a45e76
tools, frontends (xmlui): add Widget.setInternalCallback:
souliane <souliane@mailoo.org>
parents:
975
diff
changeset
|
1013 - 'copy': process the widgets given in 'fields' two by two, by |
d2e612a45e76
tools, frontends (xmlui): add Widget.setInternalCallback:
souliane <souliane@mailoo.org>
parents:
975
diff
changeset
|
1014 copying the values of one widget to the other. Target widgets |
d2e612a45e76
tools, frontends (xmlui): add Widget.setInternalCallback:
souliane <souliane@mailoo.org>
parents:
975
diff
changeset
|
1015 of type List do not accept the empty value. |
d2e612a45e76
tools, frontends (xmlui): add Widget.setInternalCallback:
souliane <souliane@mailoo.org>
parents:
975
diff
changeset
|
1016 - 'move': same than copy but moves the values if the source widget |
d2e612a45e76
tools, frontends (xmlui): add Widget.setInternalCallback:
souliane <souliane@mailoo.org>
parents:
975
diff
changeset
|
1017 is not a List. |
d2e612a45e76
tools, frontends (xmlui): add Widget.setInternalCallback:
souliane <souliane@mailoo.org>
parents:
975
diff
changeset
|
1018 - 'groups_of_contact': process the widgets two by two, assume A is |
d2e612a45e76
tools, frontends (xmlui): add Widget.setInternalCallback:
souliane <souliane@mailoo.org>
parents:
975
diff
changeset
|
1019 is a list of JID and B a list of groups, select in B the groups |
d2e612a45e76
tools, frontends (xmlui): add Widget.setInternalCallback:
souliane <souliane@mailoo.org>
parents:
975
diff
changeset
|
1020 to which the JID selected in A belongs. |
d2e612a45e76
tools, frontends (xmlui): add Widget.setInternalCallback:
souliane <souliane@mailoo.org>
parents:
975
diff
changeset
|
1021 - more operation to be added when necessary... |
d2e612a45e76
tools, frontends (xmlui): add Widget.setInternalCallback:
souliane <souliane@mailoo.org>
parents:
975
diff
changeset
|
1022 @param fields (list): a list of widget names (string) |
d2e612a45e76
tools, frontends (xmlui): add Widget.setInternalCallback:
souliane <souliane@mailoo.org>
parents:
975
diff
changeset
|
1023 @param data_elts (list[Element]): extra data elements |
d2e612a45e76
tools, frontends (xmlui): add Widget.setInternalCallback:
souliane <souliane@mailoo.org>
parents:
975
diff
changeset
|
1024 """ |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1025 self.elem.setAttribute("internal_callback", callback) |
977
d2e612a45e76
tools, frontends (xmlui): add Widget.setInternalCallback:
souliane <souliane@mailoo.org>
parents:
975
diff
changeset
|
1026 if fields: |
d2e612a45e76
tools, frontends (xmlui): add Widget.setInternalCallback:
souliane <souliane@mailoo.org>
parents:
975
diff
changeset
|
1027 for field in fields: |
d2e612a45e76
tools, frontends (xmlui): add Widget.setInternalCallback:
souliane <souliane@mailoo.org>
parents:
975
diff
changeset
|
1028 InternalFieldElement(self, field) |
d2e612a45e76
tools, frontends (xmlui): add Widget.setInternalCallback:
souliane <souliane@mailoo.org>
parents:
975
diff
changeset
|
1029 if data_elts: |
d2e612a45e76
tools, frontends (xmlui): add Widget.setInternalCallback:
souliane <souliane@mailoo.org>
parents:
975
diff
changeset
|
1030 InternalDataElement(self, data_elts) |
d2e612a45e76
tools, frontends (xmlui): add Widget.setInternalCallback:
souliane <souliane@mailoo.org>
parents:
975
diff
changeset
|
1031 |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1032 |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1033 class EmptyWidget(Widget): |
1084
03dcb6ca7e49
core (XMLUI): created a read_only attribute for InputWidget + new JidInputWidget
Goffi <goffi@goffi.org>
parents:
1078
diff
changeset
|
1034 """Place holder widget""" |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1035 |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1036 type = "empty" |
630
0b914394e74f
core: added advanced list to XMLUI (need improvment, very basic so far)
Goffi <goffi@goffi.org>
parents:
615
diff
changeset
|
1037 |
0b914394e74f
core: added advanced list to XMLUI (need improvment, very basic so far)
Goffi <goffi@goffi.org>
parents:
615
diff
changeset
|
1038 |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1039 class TextWidget(Widget): |
1084
03dcb6ca7e49
core (XMLUI): created a read_only attribute for InputWidget + new JidInputWidget
Goffi <goffi@goffi.org>
parents:
1078
diff
changeset
|
1040 """Used for blob of text""" |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1041 |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1042 type = "text" |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1043 |
865
3ee2ec7ec010
core (xmlui), frontends: handling of "text" type in params xml + bug fixes
Goffi <goffi@goffi.org>
parents:
863
diff
changeset
|
1044 def __init__(self, xmlui, value, name=None, parent=None): |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1045 super(TextWidget, self).__init__(xmlui, name, parent) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1046 value_elt = self.xmlui.doc.createElement("value") |
865
3ee2ec7ec010
core (xmlui), frontends: handling of "text" type in params xml + bug fixes
Goffi <goffi@goffi.org>
parents:
863
diff
changeset
|
1047 text = self.xmlui.doc.createTextNode(value) |
1086
2cb30f46e560
core/frontends (XMLUI): value can now be inserted as a <value/> element, if not present value attribute is tested, else empty string is used.
Goffi <goffi@goffi.org>
parents:
1084
diff
changeset
|
1048 value_elt.appendChild(text) |
2cb30f46e560
core/frontends (XMLUI): value can now be inserted as a <value/> element, if not present value attribute is tested, else empty string is used.
Goffi <goffi@goffi.org>
parents:
1084
diff
changeset
|
1049 self.elem.appendChild(value_elt) |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1050 |
2428
c2d88fe05303
core (XMLUI): added a "value" property in TextWidget
Goffi <goffi@goffi.org>
parents:
2414
diff
changeset
|
1051 @property |
c2d88fe05303
core (XMLUI): added a "value" property in TextWidget
Goffi <goffi@goffi.org>
parents:
2414
diff
changeset
|
1052 def value(self): |
c2d88fe05303
core (XMLUI): added a "value" property in TextWidget
Goffi <goffi@goffi.org>
parents:
2414
diff
changeset
|
1053 return self.elem.firstChild.firstChild.wholeText |
c2d88fe05303
core (XMLUI): added a "value" property in TextWidget
Goffi <goffi@goffi.org>
parents:
2414
diff
changeset
|
1054 |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1055 |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1056 class LabelWidget(Widget): |
1472 | 1057 """One line blob of text |
1058 | |
1059 used most of time to display the desciption or name of the next widget | |
1084
03dcb6ca7e49
core (XMLUI): created a read_only attribute for InputWidget + new JidInputWidget
Goffi <goffi@goffi.org>
parents:
1078
diff
changeset
|
1060 """ |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1061 type = "label" |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1062 |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1063 def __init__(self, xmlui, label, name=None, parent=None): |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1064 super(LabelWidget, self).__init__(xmlui, name, parent) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1065 self.elem.setAttribute("value", label) |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1066 |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1067 |
2668
c274201cea94
core, frontends (xmlui): added "hidden" widget, to specify a value to be returned unmodified
Goffi <goffi@goffi.org>
parents:
2625
diff
changeset
|
1068 class HiddenWidget(Widget): |
c274201cea94
core, frontends (xmlui): added "hidden" widget, to specify a value to be returned unmodified
Goffi <goffi@goffi.org>
parents:
2625
diff
changeset
|
1069 """Not displayed widget, frontends will just copy the value(s)""" |
c274201cea94
core, frontends (xmlui): added "hidden" widget, to specify a value to be returned unmodified
Goffi <goffi@goffi.org>
parents:
2625
diff
changeset
|
1070 type = "hidden" |
c274201cea94
core, frontends (xmlui): added "hidden" widget, to specify a value to be returned unmodified
Goffi <goffi@goffi.org>
parents:
2625
diff
changeset
|
1071 |
c274201cea94
core, frontends (xmlui): added "hidden" widget, to specify a value to be returned unmodified
Goffi <goffi@goffi.org>
parents:
2625
diff
changeset
|
1072 def __init__(self, xmlui, value, name, parent=None): |
c274201cea94
core, frontends (xmlui): added "hidden" widget, to specify a value to be returned unmodified
Goffi <goffi@goffi.org>
parents:
2625
diff
changeset
|
1073 super(HiddenWidget, self).__init__(xmlui, name, parent) |
c274201cea94
core, frontends (xmlui): added "hidden" widget, to specify a value to be returned unmodified
Goffi <goffi@goffi.org>
parents:
2625
diff
changeset
|
1074 value_elt = self.xmlui.doc.createElement("value") |
c274201cea94
core, frontends (xmlui): added "hidden" widget, to specify a value to be returned unmodified
Goffi <goffi@goffi.org>
parents:
2625
diff
changeset
|
1075 text = self.xmlui.doc.createTextNode(value) |
c274201cea94
core, frontends (xmlui): added "hidden" widget, to specify a value to be returned unmodified
Goffi <goffi@goffi.org>
parents:
2625
diff
changeset
|
1076 value_elt.appendChild(text) |
c274201cea94
core, frontends (xmlui): added "hidden" widget, to specify a value to be returned unmodified
Goffi <goffi@goffi.org>
parents:
2625
diff
changeset
|
1077 self.elem.appendChild(value_elt) |
c274201cea94
core, frontends (xmlui): added "hidden" widget, to specify a value to be returned unmodified
Goffi <goffi@goffi.org>
parents:
2625
diff
changeset
|
1078 |
c274201cea94
core, frontends (xmlui): added "hidden" widget, to specify a value to be returned unmodified
Goffi <goffi@goffi.org>
parents:
2625
diff
changeset
|
1079 @property |
c274201cea94
core, frontends (xmlui): added "hidden" widget, to specify a value to be returned unmodified
Goffi <goffi@goffi.org>
parents:
2625
diff
changeset
|
1080 def value(self): |
c274201cea94
core, frontends (xmlui): added "hidden" widget, to specify a value to be returned unmodified
Goffi <goffi@goffi.org>
parents:
2625
diff
changeset
|
1081 return self.elem.firstChild.firstChild.wholeText |
c274201cea94
core, frontends (xmlui): added "hidden" widget, to specify a value to be returned unmodified
Goffi <goffi@goffi.org>
parents:
2625
diff
changeset
|
1082 |
c274201cea94
core, frontends (xmlui): added "hidden" widget, to specify a value to be returned unmodified
Goffi <goffi@goffi.org>
parents:
2625
diff
changeset
|
1083 |
804
5174657b3378
XMLUI (core, frontends): added JidWidget and DividerWidget + popup type + some bugfixes:
Goffi <goffi@goffi.org>
parents:
803
diff
changeset
|
1084 class JidWidget(Widget): |
1084
03dcb6ca7e49
core (XMLUI): created a read_only attribute for InputWidget + new JidInputWidget
Goffi <goffi@goffi.org>
parents:
1078
diff
changeset
|
1085 """Used to display a Jabber ID, some specific methods can be added""" |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1086 |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1087 type = "jid" |
804
5174657b3378
XMLUI (core, frontends): added JidWidget and DividerWidget + popup type + some bugfixes:
Goffi <goffi@goffi.org>
parents:
803
diff
changeset
|
1088 |
5174657b3378
XMLUI (core, frontends): added JidWidget and DividerWidget + popup type + some bugfixes:
Goffi <goffi@goffi.org>
parents:
803
diff
changeset
|
1089 def __init__(self, xmlui, jid, name=None, parent=None): |
5174657b3378
XMLUI (core, frontends): added JidWidget and DividerWidget + popup type + some bugfixes:
Goffi <goffi@goffi.org>
parents:
803
diff
changeset
|
1090 super(JidWidget, self).__init__(xmlui, name, parent) |
5174657b3378
XMLUI (core, frontends): added JidWidget and DividerWidget + popup type + some bugfixes:
Goffi <goffi@goffi.org>
parents:
803
diff
changeset
|
1091 try: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1092 self.elem.setAttribute("value", jid.full()) |
804
5174657b3378
XMLUI (core, frontends): added JidWidget and DividerWidget + popup type + some bugfixes:
Goffi <goffi@goffi.org>
parents:
803
diff
changeset
|
1093 except AttributeError: |
3028 | 1094 self.elem.setAttribute("value", str(jid)) |
804
5174657b3378
XMLUI (core, frontends): added JidWidget and DividerWidget + popup type + some bugfixes:
Goffi <goffi@goffi.org>
parents:
803
diff
changeset
|
1095 |
3448
987198910e56
tools (xml_tools): add missing `value` property to JidWidget
Goffi <goffi@goffi.org>
parents:
3396
diff
changeset
|
1096 @property |
987198910e56
tools (xml_tools): add missing `value` property to JidWidget
Goffi <goffi@goffi.org>
parents:
3396
diff
changeset
|
1097 def value(self): |
987198910e56
tools (xml_tools): add missing `value` property to JidWidget
Goffi <goffi@goffi.org>
parents:
3396
diff
changeset
|
1098 return self.elem.getAttribute("value") |
987198910e56
tools (xml_tools): add missing `value` property to JidWidget
Goffi <goffi@goffi.org>
parents:
3396
diff
changeset
|
1099 |
804
5174657b3378
XMLUI (core, frontends): added JidWidget and DividerWidget + popup type + some bugfixes:
Goffi <goffi@goffi.org>
parents:
803
diff
changeset
|
1100 |
5174657b3378
XMLUI (core, frontends): added JidWidget and DividerWidget + popup type + some bugfixes:
Goffi <goffi@goffi.org>
parents:
803
diff
changeset
|
1101 class DividerWidget(Widget): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1102 type = "divider" |
804
5174657b3378
XMLUI (core, frontends): added JidWidget and DividerWidget + popup type + some bugfixes:
Goffi <goffi@goffi.org>
parents:
803
diff
changeset
|
1103 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1104 def __init__(self, xmlui, style="line", name=None, parent=None): |
804
5174657b3378
XMLUI (core, frontends): added JidWidget and DividerWidget + popup type + some bugfixes:
Goffi <goffi@goffi.org>
parents:
803
diff
changeset
|
1105 """ Create a divider |
1472 | 1106 |
804
5174657b3378
XMLUI (core, frontends): added JidWidget and DividerWidget + popup type + some bugfixes:
Goffi <goffi@goffi.org>
parents:
803
diff
changeset
|
1107 @param xmlui: XMLUI instance |
5174657b3378
XMLUI (core, frontends): added JidWidget and DividerWidget + popup type + some bugfixes:
Goffi <goffi@goffi.org>
parents:
803
diff
changeset
|
1108 @param style: one of: |
5174657b3378
XMLUI (core, frontends): added JidWidget and DividerWidget + popup type + some bugfixes:
Goffi <goffi@goffi.org>
parents:
803
diff
changeset
|
1109 - line: a simple line |
5174657b3378
XMLUI (core, frontends): added JidWidget and DividerWidget + popup type + some bugfixes:
Goffi <goffi@goffi.org>
parents:
803
diff
changeset
|
1110 - dot: a line of dots |
5174657b3378
XMLUI (core, frontends): added JidWidget and DividerWidget + popup type + some bugfixes:
Goffi <goffi@goffi.org>
parents:
803
diff
changeset
|
1111 - dash: a line of dashes |
5174657b3378
XMLUI (core, frontends): added JidWidget and DividerWidget + popup type + some bugfixes:
Goffi <goffi@goffi.org>
parents:
803
diff
changeset
|
1112 - plain: a full thick line |
5174657b3378
XMLUI (core, frontends): added JidWidget and DividerWidget + popup type + some bugfixes:
Goffi <goffi@goffi.org>
parents:
803
diff
changeset
|
1113 - blank: a blank line/space |
5174657b3378
XMLUI (core, frontends): added JidWidget and DividerWidget + popup type + some bugfixes:
Goffi <goffi@goffi.org>
parents:
803
diff
changeset
|
1114 @param name: name of the widget |
5174657b3378
XMLUI (core, frontends): added JidWidget and DividerWidget + popup type + some bugfixes:
Goffi <goffi@goffi.org>
parents:
803
diff
changeset
|
1115 @param parent: parent container |
5174657b3378
XMLUI (core, frontends): added JidWidget and DividerWidget + popup type + some bugfixes:
Goffi <goffi@goffi.org>
parents:
803
diff
changeset
|
1116 |
5174657b3378
XMLUI (core, frontends): added JidWidget and DividerWidget + popup type + some bugfixes:
Goffi <goffi@goffi.org>
parents:
803
diff
changeset
|
1117 """ |
5174657b3378
XMLUI (core, frontends): added JidWidget and DividerWidget + popup type + some bugfixes:
Goffi <goffi@goffi.org>
parents:
803
diff
changeset
|
1118 super(DividerWidget, self).__init__(xmlui, name, parent) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1119 self.elem.setAttribute("style", style) |
804
5174657b3378
XMLUI (core, frontends): added JidWidget and DividerWidget + popup type + some bugfixes:
Goffi <goffi@goffi.org>
parents:
803
diff
changeset
|
1120 |
5174657b3378
XMLUI (core, frontends): added JidWidget and DividerWidget + popup type + some bugfixes:
Goffi <goffi@goffi.org>
parents:
803
diff
changeset
|
1121 |
1084
03dcb6ca7e49
core (XMLUI): created a read_only attribute for InputWidget + new JidInputWidget
Goffi <goffi@goffi.org>
parents:
1078
diff
changeset
|
1122 ### Inputs ### |
03dcb6ca7e49
core (XMLUI): created a read_only attribute for InputWidget + new JidInputWidget
Goffi <goffi@goffi.org>
parents:
1078
diff
changeset
|
1123 |
03dcb6ca7e49
core (XMLUI): created a read_only attribute for InputWidget + new JidInputWidget
Goffi <goffi@goffi.org>
parents:
1078
diff
changeset
|
1124 |
03dcb6ca7e49
core (XMLUI): created a read_only attribute for InputWidget + new JidInputWidget
Goffi <goffi@goffi.org>
parents:
1078
diff
changeset
|
1125 class InputWidget(Widget): |
1472 | 1126 """Widget which can accept user inputs |
1127 | |
1084
03dcb6ca7e49
core (XMLUI): created a read_only attribute for InputWidget + new JidInputWidget
Goffi <goffi@goffi.org>
parents:
1078
diff
changeset
|
1128 used mainly in forms |
03dcb6ca7e49
core (XMLUI): created a read_only attribute for InputWidget + new JidInputWidget
Goffi <goffi@goffi.org>
parents:
1078
diff
changeset
|
1129 """ |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1130 |
1084
03dcb6ca7e49
core (XMLUI): created a read_only attribute for InputWidget + new JidInputWidget
Goffi <goffi@goffi.org>
parents:
1078
diff
changeset
|
1131 def __init__(self, xmlui, name=None, parent=None, read_only=False): |
03dcb6ca7e49
core (XMLUI): created a read_only attribute for InputWidget + new JidInputWidget
Goffi <goffi@goffi.org>
parents:
1078
diff
changeset
|
1132 super(InputWidget, self).__init__(xmlui, name, parent) |
03dcb6ca7e49
core (XMLUI): created a read_only attribute for InputWidget + new JidInputWidget
Goffi <goffi@goffi.org>
parents:
1078
diff
changeset
|
1133 if read_only: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1134 self.elem.setAttribute("read_only", "true") |
1084
03dcb6ca7e49
core (XMLUI): created a read_only attribute for InputWidget + new JidInputWidget
Goffi <goffi@goffi.org>
parents:
1078
diff
changeset
|
1135 |
03dcb6ca7e49
core (XMLUI): created a read_only attribute for InputWidget + new JidInputWidget
Goffi <goffi@goffi.org>
parents:
1078
diff
changeset
|
1136 |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1137 class StringWidget(InputWidget): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1138 type = "string" |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1139 |
1084
03dcb6ca7e49
core (XMLUI): created a read_only attribute for InputWidget + new JidInputWidget
Goffi <goffi@goffi.org>
parents:
1078
diff
changeset
|
1140 def __init__(self, xmlui, value=None, name=None, parent=None, read_only=False): |
03dcb6ca7e49
core (XMLUI): created a read_only attribute for InputWidget + new JidInputWidget
Goffi <goffi@goffi.org>
parents:
1078
diff
changeset
|
1141 super(StringWidget, self).__init__(xmlui, name, parent, read_only=read_only) |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1142 if value: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1143 value_elt = self.xmlui.doc.createElement("value") |
1086
2cb30f46e560
core/frontends (XMLUI): value can now be inserted as a <value/> element, if not present value attribute is tested, else empty string is used.
Goffi <goffi@goffi.org>
parents:
1084
diff
changeset
|
1144 text = self.xmlui.doc.createTextNode(value) |
2cb30f46e560
core/frontends (XMLUI): value can now be inserted as a <value/> element, if not present value attribute is tested, else empty string is used.
Goffi <goffi@goffi.org>
parents:
1084
diff
changeset
|
1145 value_elt.appendChild(text) |
2cb30f46e560
core/frontends (XMLUI): value can now be inserted as a <value/> element, if not present value attribute is tested, else empty string is used.
Goffi <goffi@goffi.org>
parents:
1084
diff
changeset
|
1146 self.elem.appendChild(value_elt) |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1147 |
2446
bfd1e9d737c4
core (XMLUI): added value property for StringWidget and ListWidget
Goffi <goffi@goffi.org>
parents:
2429
diff
changeset
|
1148 @property |
bfd1e9d737c4
core (XMLUI): added value property for StringWidget and ListWidget
Goffi <goffi@goffi.org>
parents:
2429
diff
changeset
|
1149 def value(self): |
bfd1e9d737c4
core (XMLUI): added value property for StringWidget and ListWidget
Goffi <goffi@goffi.org>
parents:
2429
diff
changeset
|
1150 return self.elem.firstChild.firstChild.wholeText |
bfd1e9d737c4
core (XMLUI): added value property for StringWidget and ListWidget
Goffi <goffi@goffi.org>
parents:
2429
diff
changeset
|
1151 |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1152 |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1153 class PasswordWidget(StringWidget): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1154 type = "password" |
630
0b914394e74f
core: added advanced list to XMLUI (need improvment, very basic so far)
Goffi <goffi@goffi.org>
parents:
615
diff
changeset
|
1155 |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1156 |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1157 class TextBoxWidget(StringWidget): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1158 type = "textbox" |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1159 |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1160 |
2782
b17e6fa1e607
core (XMLUI): new XHTMLBox widget:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1161 class XHTMLBoxWidget(StringWidget): |
b17e6fa1e607
core (XMLUI): new XHTMLBox widget:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1162 """Specialized textbox to manipulate XHTML""" |
b17e6fa1e607
core (XMLUI): new XHTMLBox widget:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1163 type = "xhtmlbox" |
b17e6fa1e607
core (XMLUI): new XHTMLBox widget:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1164 |
b17e6fa1e607
core (XMLUI): new XHTMLBox widget:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1165 def __init__(self, xmlui, value, name=None, parent=None, read_only=False, clean=True): |
b17e6fa1e607
core (XMLUI): new XHTMLBox widget:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1166 """ |
b17e6fa1e607
core (XMLUI): new XHTMLBox widget:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1167 @param clean(bool): if True, the XHTML is considered insecure and will be cleaned |
b17e6fa1e607
core (XMLUI): new XHTMLBox widget:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1168 Only set to False if you are absolutely sure that the XHTML is safe (in other |
b17e6fa1e607
core (XMLUI): new XHTMLBox widget:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1169 word, set to False only if you made the XHTML yourself) |
b17e6fa1e607
core (XMLUI): new XHTMLBox widget:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1170 """ |
b17e6fa1e607
core (XMLUI): new XHTMLBox widget:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1171 if clean: |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1172 if clean_xhtml is None: |
2782
b17e6fa1e607
core (XMLUI): new XHTMLBox widget:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1173 raise exceptions.NotFound( |
3028 | 1174 "No cleaning method set, can't clean the XHTML") |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1175 value = clean_xhtml(value) |
2782
b17e6fa1e607
core (XMLUI): new XHTMLBox widget:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1176 |
b17e6fa1e607
core (XMLUI): new XHTMLBox widget:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1177 super(XHTMLBoxWidget, self).__init__( |
b17e6fa1e607
core (XMLUI): new XHTMLBox widget:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1178 xmlui, value=value, name=name, parent=parent, read_only=read_only) |
b17e6fa1e607
core (XMLUI): new XHTMLBox widget:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1179 |
b17e6fa1e607
core (XMLUI): new XHTMLBox widget:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1180 |
1084
03dcb6ca7e49
core (XMLUI): created a read_only attribute for InputWidget + new JidInputWidget
Goffi <goffi@goffi.org>
parents:
1078
diff
changeset
|
1181 class JidInputWidget(StringWidget): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1182 type = "jid_input" |
1084
03dcb6ca7e49
core (XMLUI): created a read_only attribute for InputWidget + new JidInputWidget
Goffi <goffi@goffi.org>
parents:
1078
diff
changeset
|
1183 |
03dcb6ca7e49
core (XMLUI): created a read_only attribute for InputWidget + new JidInputWidget
Goffi <goffi@goffi.org>
parents:
1078
diff
changeset
|
1184 |
1220
f91e7028e2c3
memory (params), tools (xml_tools), plugins, frontends: add "int" parameter type with "min" and "max" attributes
souliane <souliane@mailoo.org>
parents:
1199
diff
changeset
|
1185 # TODO handle min and max values |
f91e7028e2c3
memory (params), tools (xml_tools), plugins, frontends: add "int" parameter type with "min" and "max" attributes
souliane <souliane@mailoo.org>
parents:
1199
diff
changeset
|
1186 class IntWidget(StringWidget): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1187 type = "int" |
1220
f91e7028e2c3
memory (params), tools (xml_tools), plugins, frontends: add "int" parameter type with "min" and "max" attributes
souliane <souliane@mailoo.org>
parents:
1199
diff
changeset
|
1188 |
f91e7028e2c3
memory (params), tools (xml_tools), plugins, frontends: add "int" parameter type with "min" and "max" attributes
souliane <souliane@mailoo.org>
parents:
1199
diff
changeset
|
1189 def __init__(self, xmlui, value=0, name=None, parent=None, read_only=False): |
f91e7028e2c3
memory (params), tools (xml_tools), plugins, frontends: add "int" parameter type with "min" and "max" attributes
souliane <souliane@mailoo.org>
parents:
1199
diff
changeset
|
1190 try: |
f91e7028e2c3
memory (params), tools (xml_tools), plugins, frontends: add "int" parameter type with "min" and "max" attributes
souliane <souliane@mailoo.org>
parents:
1199
diff
changeset
|
1191 int(value) |
f91e7028e2c3
memory (params), tools (xml_tools), plugins, frontends: add "int" parameter type with "min" and "max" attributes
souliane <souliane@mailoo.org>
parents:
1199
diff
changeset
|
1192 except ValueError: |
f91e7028e2c3
memory (params), tools (xml_tools), plugins, frontends: add "int" parameter type with "min" and "max" attributes
souliane <souliane@mailoo.org>
parents:
1199
diff
changeset
|
1193 raise exceptions.DataError(_("Value must be an integer")) |
f91e7028e2c3
memory (params), tools (xml_tools), plugins, frontends: add "int" parameter type with "min" and "max" attributes
souliane <souliane@mailoo.org>
parents:
1199
diff
changeset
|
1194 super(IntWidget, self).__init__(xmlui, value, name, parent, read_only=read_only) |
f91e7028e2c3
memory (params), tools (xml_tools), plugins, frontends: add "int" parameter type with "min" and "max" attributes
souliane <souliane@mailoo.org>
parents:
1199
diff
changeset
|
1195 |
f91e7028e2c3
memory (params), tools (xml_tools), plugins, frontends: add "int" parameter type with "min" and "max" attributes
souliane <souliane@mailoo.org>
parents:
1199
diff
changeset
|
1196 |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1197 class BoolWidget(InputWidget): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1198 type = "bool" |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1199 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1200 def __init__(self, xmlui, value="false", name=None, parent=None, read_only=False): |
910
9754c0ebadba
core (XMLUI): BoolWidget now accept real boolean for value
Goffi <goffi@goffi.org>
parents:
905
diff
changeset
|
1201 if isinstance(value, bool): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1202 value = "true" if value else "false" |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1203 elif value == "0": |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1204 value = "false" |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1205 elif value == "1": |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1206 value = "true" |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1207 if value not in ("true", "false"): |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1208 raise exceptions.DataError(_("Value must be 0, 1, false or true")) |
1084
03dcb6ca7e49
core (XMLUI): created a read_only attribute for InputWidget + new JidInputWidget
Goffi <goffi@goffi.org>
parents:
1078
diff
changeset
|
1209 super(BoolWidget, self).__init__(xmlui, name, parent, read_only=read_only) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1210 self.elem.setAttribute("value", value) |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1211 |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1212 |
804
5174657b3378
XMLUI (core, frontends): added JidWidget and DividerWidget + popup type + some bugfixes:
Goffi <goffi@goffi.org>
parents:
803
diff
changeset
|
1213 class ButtonWidget(Widget): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1214 type = "button" |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1215 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1216 def __init__( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1217 self, xmlui, callback_id, value=None, fields_back=None, name=None, parent=None |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1218 ): |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1219 """Add a button |
1472 | 1220 |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1221 @param callback_id: callback which will be called if button is pressed |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1222 @param value: label of the button |
1487
0df627d0b4ca
tools (xmlui): changeContainer do not create a new one when the current one already fits
souliane <souliane@mailoo.org>
parents:
1486
diff
changeset
|
1223 @param fields_back: list of names of field to give back when pushing the button |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1224 @param name: name |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1225 @param parent: parent container |
630
0b914394e74f
core: added advanced list to XMLUI (need improvment, very basic so far)
Goffi <goffi@goffi.org>
parents:
615
diff
changeset
|
1226 """ |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1227 if fields_back is None: |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1228 fields_back = [] |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1229 super(ButtonWidget, self).__init__(xmlui, name, parent) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1230 self.elem.setAttribute("callback", callback_id) |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1231 if value: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1232 self.elem.setAttribute("value", value) |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1233 for field in fields_back: |
968
75f3b3b430ff
tools, frontends, memory: param definition and XMLUI handle multi-selection for list widgets:
souliane <souliane@mailoo.org>
parents:
910
diff
changeset
|
1234 FieldBackElement(self, field) |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1235 |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1236 |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1237 class ListWidget(InputWidget): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1238 type = "list" |
3028 | 1239 STYLES = ("multi", "noselect", "extensible", "reducible", "inline") |
630
0b914394e74f
core: added advanced list to XMLUI (need improvment, very basic so far)
Goffi <goffi@goffi.org>
parents:
615
diff
changeset
|
1240 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1241 def __init__( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1242 self, xmlui, options, selected=None, styles=None, name=None, parent=None |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1243 ): |
968
75f3b3b430ff
tools, frontends, memory: param definition and XMLUI handle multi-selection for list widgets:
souliane <souliane@mailoo.org>
parents:
910
diff
changeset
|
1244 """ |
75f3b3b430ff
tools, frontends, memory: param definition and XMLUI handle multi-selection for list widgets:
souliane <souliane@mailoo.org>
parents:
910
diff
changeset
|
1245 |
75f3b3b430ff
tools, frontends, memory: param definition and XMLUI handle multi-selection for list widgets:
souliane <souliane@mailoo.org>
parents:
910
diff
changeset
|
1246 @param xmlui |
1141
7fcafc3206b1
plugin OTR: authentication management + fixed a bug in setState (due to a wrong docstring in potr.context.getCurrentTrust)
Goffi <goffi@goffi.org>
parents:
1105
diff
changeset
|
1247 @param options (list[option]): each option can be given as: |
7fcafc3206b1
plugin OTR: authentication management + fixed a bug in setState (due to a wrong docstring in potr.context.getCurrentTrust)
Goffi <goffi@goffi.org>
parents:
1105
diff
changeset
|
1248 - a single string if the label and the value are the same |
2625
a55a14c3cbf4
plugin XEP-0070: use a confirm dialog instead of a form + simplified a bit the code
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
1249 - a tuple with a couple of string (value,label) if the label and the |
a55a14c3cbf4
plugin XEP-0070: use a confirm dialog instead of a form + simplified a bit the code
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
1250 value differ |
968
75f3b3b430ff
tools, frontends, memory: param definition and XMLUI handle multi-selection for list widgets:
souliane <souliane@mailoo.org>
parents:
910
diff
changeset
|
1251 @param selected (list[string]): list of the selected values |
1476
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
1252 @param styles (iterable[string]): flags to set the behaviour of the list |
2071
c2fdee1bd908
core (stdui): fixed cancellation of ContactList forms
Goffi <goffi@goffi.org>
parents:
2044
diff
changeset
|
1253 can be: |
2397
7fff98d64ab5
core (XMLUI), template(XMLUI): added flags to ListWidget:
Goffi <goffi@goffi.org>
parents:
2386
diff
changeset
|
1254 - multi: multiple selection is allowed |
7fff98d64ab5
core (XMLUI), template(XMLUI): added flags to ListWidget:
Goffi <goffi@goffi.org>
parents:
2386
diff
changeset
|
1255 - noselect: no selection is allowed |
7fff98d64ab5
core (XMLUI), template(XMLUI): added flags to ListWidget:
Goffi <goffi@goffi.org>
parents:
2386
diff
changeset
|
1256 useful when only the list itself is needed |
7fff98d64ab5
core (XMLUI), template(XMLUI): added flags to ListWidget:
Goffi <goffi@goffi.org>
parents:
2386
diff
changeset
|
1257 - extensible: can be extended by user (i.e. new options can be added) |
7fff98d64ab5
core (XMLUI), template(XMLUI): added flags to ListWidget:
Goffi <goffi@goffi.org>
parents:
2386
diff
changeset
|
1258 - reducible: can be reduced by user (i.e. options can be removed) |
2625
a55a14c3cbf4
plugin XEP-0070: use a confirm dialog instead of a form + simplified a bit the code
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
1259 - inline: hint that this list should be displayed on a single line |
a55a14c3cbf4
plugin XEP-0070: use a confirm dialog instead of a form + simplified a bit the code
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
1260 (e.g. list of labels) |
968
75f3b3b430ff
tools, frontends, memory: param definition and XMLUI handle multi-selection for list widgets:
souliane <souliane@mailoo.org>
parents:
910
diff
changeset
|
1261 @param name (string) |
75f3b3b430ff
tools, frontends, memory: param definition and XMLUI handle multi-selection for list widgets:
souliane <souliane@mailoo.org>
parents:
910
diff
changeset
|
1262 @param parent |
75f3b3b430ff
tools, frontends, memory: param definition and XMLUI handle multi-selection for list widgets:
souliane <souliane@mailoo.org>
parents:
910
diff
changeset
|
1263 """ |
1476
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
1264 styles = set() if styles is None else set(styles) |
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
1265 if styles is None: |
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
1266 styles = set() |
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
1267 else: |
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
1268 styles = set(styles) |
3028 | 1269 if "noselect" in styles and ("multi" in styles or selected): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1270 raise exceptions.DataError( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1271 _( |
3028 | 1272 '"multi" flag and "selected" option are not compatible with ' |
1273 '"noselect" flag' | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1274 ) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1275 ) |
820
462f2052af26
core(XMLUI): empty options in ListWidget now just show a warning message, no more assert
Goffi <goffi@goffi.org>
parents:
811
diff
changeset
|
1276 if not options: |
2364
918e38622a48
core (xmlui): added method to convert data form result to XMLUI:
Goffi <goffi@goffi.org>
parents:
2361
diff
changeset
|
1277 # we can have no options if we get a submitted data form |
918e38622a48
core (xmlui): added method to convert data form result to XMLUI:
Goffi <goffi@goffi.org>
parents:
2361
diff
changeset
|
1278 # but we can't use submitted values directly, |
918e38622a48
core (xmlui): added method to convert data form result to XMLUI:
Goffi <goffi@goffi.org>
parents:
2361
diff
changeset
|
1279 # because we would not have the labels |
993
301b342c697a
core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents:
981
diff
changeset
|
1280 log.warning(_('empty "options" list')) |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1281 super(ListWidget, self).__init__(xmlui, name, parent) |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1282 self.add_options(options, selected) |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1283 self.set_styles(styles) |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1284 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1285 def add_options(self, options, selected=None): |
968
75f3b3b430ff
tools, frontends, memory: param definition and XMLUI handle multi-selection for list widgets:
souliane <souliane@mailoo.org>
parents:
910
diff
changeset
|
1286 """Add options to a multi-values element (e.g. list) """ |
75f3b3b430ff
tools, frontends, memory: param definition and XMLUI handle multi-selection for list widgets:
souliane <souliane@mailoo.org>
parents:
910
diff
changeset
|
1287 if selected: |
3028 | 1288 if isinstance(selected, str): |
968
75f3b3b430ff
tools, frontends, memory: param definition and XMLUI handle multi-selection for list widgets:
souliane <souliane@mailoo.org>
parents:
910
diff
changeset
|
1289 selected = [selected] |
75f3b3b430ff
tools, frontends, memory: param definition and XMLUI handle multi-selection for list widgets:
souliane <souliane@mailoo.org>
parents:
910
diff
changeset
|
1290 else: |
75f3b3b430ff
tools, frontends, memory: param definition and XMLUI handle multi-selection for list widgets:
souliane <souliane@mailoo.org>
parents:
910
diff
changeset
|
1291 selected = [] |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1292 for option in options: |
3028 | 1293 assert isinstance(option, str) or isinstance(option, tuple) |
1294 value = option if isinstance(option, str) else option[0] | |
1067
f7f15d44fdfa
tools (xml_tools): dataForm2XMLUI handles the default value for "list-single" fields
souliane <souliane@mailoo.org>
parents:
1036
diff
changeset
|
1295 OptionElement(self, option, value in selected) |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1296 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1297 def set_styles(self, styles): |
2397
7fff98d64ab5
core (XMLUI), template(XMLUI): added flags to ListWidget:
Goffi <goffi@goffi.org>
parents:
2386
diff
changeset
|
1298 if not styles.issubset(self.STYLES): |
3028 | 1299 raise exceptions.DataError(_("invalid styles")) |
2397
7fff98d64ab5
core (XMLUI), template(XMLUI): added flags to ListWidget:
Goffi <goffi@goffi.org>
parents:
2386
diff
changeset
|
1300 for style in styles: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1301 self.elem.setAttribute(style, "yes") |
2397
7fff98d64ab5
core (XMLUI), template(XMLUI): added flags to ListWidget:
Goffi <goffi@goffi.org>
parents:
2386
diff
changeset
|
1302 # TODO: check flags incompatibily (noselect and multi) like in __init__ |
7fff98d64ab5
core (XMLUI), template(XMLUI): added flags to ListWidget:
Goffi <goffi@goffi.org>
parents:
2386
diff
changeset
|
1303 |
7fff98d64ab5
core (XMLUI), template(XMLUI): added flags to ListWidget:
Goffi <goffi@goffi.org>
parents:
2386
diff
changeset
|
1304 def setStyle(self, style): |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1305 self.set_styles([style]) |
2397
7fff98d64ab5
core (XMLUI), template(XMLUI): added flags to ListWidget:
Goffi <goffi@goffi.org>
parents:
2386
diff
changeset
|
1306 |
2446
bfd1e9d737c4
core (XMLUI): added value property for StringWidget and ListWidget
Goffi <goffi@goffi.org>
parents:
2429
diff
changeset
|
1307 @property |
bfd1e9d737c4
core (XMLUI): added value property for StringWidget and ListWidget
Goffi <goffi@goffi.org>
parents:
2429
diff
changeset
|
1308 def value(self): |
bfd1e9d737c4
core (XMLUI): added value property for StringWidget and ListWidget
Goffi <goffi@goffi.org>
parents:
2429
diff
changeset
|
1309 """Return the value of first selected option""" |
bfd1e9d737c4
core (XMLUI): added value property for StringWidget and ListWidget
Goffi <goffi@goffi.org>
parents:
2429
diff
changeset
|
1310 for child in self.elem.childNodes: |
3028 | 1311 if child.tagName == "option" and child.getAttribute("selected") == "true": |
1312 return child.getAttribute("value") | |
1313 return "" | |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1314 |
2397
7fff98d64ab5
core (XMLUI), template(XMLUI): added flags to ListWidget:
Goffi <goffi@goffi.org>
parents:
2386
diff
changeset
|
1315 |
1476
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
1316 class JidsListWidget(InputWidget): |
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
1317 """A list of text or jids where elements can be added/removed or modified""" |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1318 |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1319 type = "jids_list" |
1476
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
1320 |
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
1321 def __init__(self, xmlui, jids, styles=None, name=None, parent=None): |
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
1322 """ |
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
1323 |
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
1324 @param xmlui |
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
1325 @param jids (list[jid.JID]): base jids |
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
1326 @param styles (iterable[string]): flags to set the behaviour of the list |
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
1327 @param name (string) |
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
1328 @param parent |
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
1329 """ |
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
1330 super(JidsListWidget, self).__init__(xmlui, name, parent) |
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
1331 styles = set() if styles is None else set(styles) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1332 if not styles.issubset([]): # TODO |
1476
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
1333 raise exceptions.DataError(_("invalid styles")) |
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
1334 for style in styles: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1335 self.elem.setAttribute(style, "yes") |
1476
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
1336 if not jids: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1337 log.debug("empty jids list") |
1476
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
1338 else: |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1339 self.add_jids(jids) |
1476
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
1340 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1341 def add_jids(self, jids): |
1476
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
1342 for jid_ in jids: |
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
1343 JidElement(self, jid_) |
48706f4ff19c
core (xmlui): added JidsListWidget to manage editable list of jids:
Goffi <goffi@goffi.org>
parents:
1475
diff
changeset
|
1344 |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1345 |
1105
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1346 ## Dialog Elements ## |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1347 |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1348 |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1349 class DialogElement(Element): |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1350 """Main dialog element """ |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1351 |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1352 type = "dialog" |
1105
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1353 |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1354 def __init__(self, parent, type_, level=None): |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1355 if not isinstance(parent, TopElement): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1356 raise exceptions.DataError( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1357 _("DialogElement must be a direct child of TopElement") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1358 ) |
1105
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1359 super(DialogElement, self).__init__(parent.xmlui, parent) |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1360 self.elem.setAttribute(C.XMLUI_DATA_TYPE, type_) |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1361 self.elem.setAttribute(C.XMLUI_DATA_LVL, level or C.XMLUI_DATA_LVL_DEFAULT) |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1362 |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1363 |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1364 class MessageElement(Element): |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1365 """Element with the instruction message""" |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1366 |
1105
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1367 type = C.XMLUI_DATA_MESS |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1368 |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1369 def __init__(self, parent, message): |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1370 if not isinstance(parent, DialogElement): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1371 raise exceptions.DataError( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1372 _("MessageElement must be a direct child of DialogElement") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1373 ) |
1105
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1374 super(MessageElement, self).__init__(parent.xmlui, parent) |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1375 message_txt = self.xmlui.doc.createTextNode(message) |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1376 self.elem.appendChild(message_txt) |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1377 |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1378 |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1379 class ButtonsElement(Element): |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1380 """Buttons element which indicate which set to use""" |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1381 |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1382 type = "buttons" |
1105
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1383 |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1384 def __init__(self, parent, set_): |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1385 if not isinstance(parent, DialogElement): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1386 raise exceptions.DataError( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1387 _("ButtonsElement must be a direct child of DialogElement") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1388 ) |
1105
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1389 super(ButtonsElement, self).__init__(parent.xmlui, parent) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1390 self.elem.setAttribute("set", set_) |
1105
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1391 |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1392 |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1393 class FileElement(Element): |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1394 """File element used for FileDialog""" |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1395 |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1396 type = "file" |
1105
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1397 |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1398 def __init__(self, parent, type_): |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1399 if not isinstance(parent, DialogElement): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1400 raise exceptions.DataError( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1401 _("FileElement must be a direct child of DialogElement") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1402 ) |
1105
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1403 super(FileElement, self).__init__(parent.xmlui, parent) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1404 self.elem.setAttribute("type", type_) |
1105
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1405 |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1406 |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1407 ## XMLUI main class |
630
0b914394e74f
core: added advanced list to XMLUI (need improvment, very basic so far)
Goffi <goffi@goffi.org>
parents:
615
diff
changeset
|
1408 |
0b914394e74f
core: added advanced list to XMLUI (need improvment, very basic so far)
Goffi <goffi@goffi.org>
parents:
615
diff
changeset
|
1409 |
588
beaf6bec2fcd
Remove every old-style class.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
587
diff
changeset
|
1410 class XMLUI(object): |
103 | 1411 """This class is used to create a user interface (form/window/parameters/etc) using SàT XML""" |
1412 | |
2625
a55a14c3cbf4
plugin XEP-0070: use a confirm dialog instead of a form + simplified a bit the code
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
1413 def __init__(self, panel_type="window", container="vertical", dialog_opt=None, |
a55a14c3cbf4
plugin XEP-0070: use a confirm dialog instead of a form + simplified a bit the code
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
1414 title=None, submit_id=None, session_id=None): |
103 | 1415 """Init SàT XML Panel |
1105
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1416 |
103 | 1417 @param panel_type: one of |
1105
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1418 - C.XMLUI_WINDOW (new window) |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1419 - C.XMLUI_POPUP |
2625
a55a14c3cbf4
plugin XEP-0070: use a confirm dialog instead of a form + simplified a bit the code
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
1420 - C.XMLUI_FORM (form, depend of the frontend, usually a panel with |
a55a14c3cbf4
plugin XEP-0070: use a confirm dialog instead of a form + simplified a bit the code
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
1421 cancel/submit buttons) |
1105
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1422 - C.XMLUI_PARAM (parameters, presentation depend of the frontend) |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1423 - C.XMLUI_DIALOG (one common dialog, presentation depend of frontend) |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1424 @param container: disposition of elements, one of: |
107 | 1425 - vertical: elements are disposed up to bottom |
1426 - horizontal: elements are disposed left to right | |
1427 - pairs: elements come on two aligned columns | |
103 | 1428 (usually one for a label, the next for the element) |
2361
5defafc8ede6
core, frontends (xmlui): new LabelContainer:
Goffi <goffi@goffi.org>
parents:
2108
diff
changeset
|
1429 - label: associations of one LabelWidget or EmptyWidget with an other widget |
2625
a55a14c3cbf4
plugin XEP-0070: use a confirm dialog instead of a form + simplified a bit the code
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
1430 similar to pairs but specialized in LabelWidget, |
a55a14c3cbf4
plugin XEP-0070: use a confirm dialog instead of a form + simplified a bit the code
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
1431 and not necessarily arranged in 2 columns |
107 | 1432 - tabs: elemens are in categories with tabs (notebook) |
2625
a55a14c3cbf4
plugin XEP-0070: use a confirm dialog instead of a form + simplified a bit the code
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
1433 @param dialog_opt: only used if panel_type == C.XMLUI_DIALOG. |
a55a14c3cbf4
plugin XEP-0070: use a confirm dialog instead of a form + simplified a bit the code
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
1434 Dictionnary (string/string) where key can be: |
1105
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1435 - C.XMLUI_DATA_TYPE: type of dialog, value can be: |
2625
a55a14c3cbf4
plugin XEP-0070: use a confirm dialog instead of a form + simplified a bit the code
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
1436 - C.XMLUI_DIALOG_MESSAGE (default): an information/error message. |
a55a14c3cbf4
plugin XEP-0070: use a confirm dialog instead of a form + simplified a bit the code
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
1437 Action of user is necessary to close the dialog. |
a55a14c3cbf4
plugin XEP-0070: use a confirm dialog instead of a form + simplified a bit the code
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
1438 Usually the frontend display a classic popup. |
a55a14c3cbf4
plugin XEP-0070: use a confirm dialog instead of a form + simplified a bit the code
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
1439 - C.XMLUI_DIALOG_NOTE: like a C.XMLUI_DIALOG_MESSAGE, but action of user |
a55a14c3cbf4
plugin XEP-0070: use a confirm dialog instead of a form + simplified a bit the code
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
1440 is not necessary to close, at frontend choice (it can be closed after |
a55a14c3cbf4
plugin XEP-0070: use a confirm dialog instead of a form + simplified a bit the code
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
1441 a timeout). Usually the frontend display as a timed out notification |
1105
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1442 - C.XMLUI_DIALOG_CONFIRM: dialog with 2 choices (usualy "Ok"/"Cancel"). |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1443 returned data can contain: |
2625
a55a14c3cbf4
plugin XEP-0070: use a confirm dialog instead of a form + simplified a bit the code
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
1444 - "answer": "true" if answer is "ok", "yes" or equivalent, |
a55a14c3cbf4
plugin XEP-0070: use a confirm dialog instead of a form + simplified a bit the code
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
1445 "false" else |
1105
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1446 - C.XLMUI_DIALOG_FILE: a file selection dialog |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1447 returned data can contain: |
2625
a55a14c3cbf4
plugin XEP-0070: use a confirm dialog instead of a form + simplified a bit the code
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
1448 - "cancelled": "true" if dialog has been cancelled, not present |
a55a14c3cbf4
plugin XEP-0070: use a confirm dialog instead of a form + simplified a bit the code
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
1449 or "false" else |
1105
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1450 - "path": path of the choosed file/dir |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1451 - C.XMLUI_DATA_MESS: message shown in dialog |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1452 - C.XMLUI_DATA_LVL: one of: |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1453 - C.XMLUI_DATA_LVL_INFO (default): normal message |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1454 - C.XMLUI_DATA_LVL_WARNING: attention of user is important |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1455 - C.XMLUI_DATA_LVL_ERROR: something went wrong |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1456 - C.XMLUI_DATA_BTNS_SET: one of: |
2625
a55a14c3cbf4
plugin XEP-0070: use a confirm dialog instead of a form + simplified a bit the code
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
1457 - C.XMLUI_DATA_BTNS_SET_OKCANCEL (default): classical "OK" and "Cancel" |
a55a14c3cbf4
plugin XEP-0070: use a confirm dialog instead of a form + simplified a bit the code
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
1458 set |
a55a14c3cbf4
plugin XEP-0070: use a confirm dialog instead of a form + simplified a bit the code
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
1459 - C.XMLUI_DATA_BTNS_SET_YESNO: a translated "yes" for OK, and "no" for |
a55a14c3cbf4
plugin XEP-0070: use a confirm dialog instead of a form + simplified a bit the code
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
1460 Cancel |
1521
d2ab9c62ac3a
core (xmlui): deferDialog can now manage additional dialog options through the "options" argument
Goffi <goffi@goffi.org>
parents:
1507
diff
changeset
|
1461 - C.XMLUI_DATA_FILETYPE: only used for file dialogs, one of: |
d2ab9c62ac3a
core (xmlui): deferDialog can now manage additional dialog options through the "options" argument
Goffi <goffi@goffi.org>
parents:
1507
diff
changeset
|
1462 - C.XMLUI_DATA_FILETYPE_FILE: a file path is requested |
d2ab9c62ac3a
core (xmlui): deferDialog can now manage additional dialog options through the "options" argument
Goffi <goffi@goffi.org>
parents:
1507
diff
changeset
|
1463 - C.XMLUI_DATA_FILETYPE_DIR: a dir path is requested |
d2ab9c62ac3a
core (xmlui): deferDialog can now manage additional dialog options through the "options" argument
Goffi <goffi@goffi.org>
parents:
1507
diff
changeset
|
1464 - C.XMLUI_DATA_FILETYPE_DEFAULT: same as C.XMLUI_DATA_FILETYPE_FILE |
d2ab9c62ac3a
core (xmlui): deferDialog can now manage additional dialog options through the "options" argument
Goffi <goffi@goffi.org>
parents:
1507
diff
changeset
|
1465 |
107 | 1466 @param title: title or default if None |
2625
a55a14c3cbf4
plugin XEP-0070: use a confirm dialog instead of a form + simplified a bit the code
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
1467 @param submit_id: callback id to call for panel_type we can submit (form, param, |
a55a14c3cbf4
plugin XEP-0070: use a confirm dialog instead of a form + simplified a bit the code
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
1468 dialog) |
a55a14c3cbf4
plugin XEP-0070: use a confirm dialog instead of a form + simplified a bit the code
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
1469 @param session_id: use to keep a session attached to the dialog, must be |
a55a14c3cbf4
plugin XEP-0070: use a confirm dialog instead of a form + simplified a bit the code
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
1470 returned by frontends |
2398
3ff9d7a7fe71
core (XMLUI): filters can now be used when converting data form to XMLUI:
Goffi <goffi@goffi.org>
parents:
2397
diff
changeset
|
1471 @attribute named_widgets(dict): map from name to widget |
103 | 1472 """ |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1473 if panel_type not in [ |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1474 C.XMLUI_WINDOW, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1475 C.XMLUI_FORM, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1476 C.XMLUI_PARAM, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1477 C.XMLUI_POPUP, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1478 C.XMLUI_DIALOG, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1479 ]: |
760
73a0077f80cc
backend, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
759
diff
changeset
|
1480 raise exceptions.DataError(_("Unknown panel type [%s]") % panel_type) |
1105
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1481 if panel_type == C.XMLUI_FORM and submit_id is None: |
760
73a0077f80cc
backend, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
759
diff
changeset
|
1482 raise exceptions.DataError(_("form XMLUI need a submit_id")) |
3028 | 1483 if not isinstance(container, str): |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1484 raise exceptions.DataError(_("container argument must be a string")) |
1105
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1485 if dialog_opt is not None and panel_type != C.XMLUI_DIALOG: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1486 raise exceptions.DataError( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1487 _("dialog_opt can only be used with dialog panels") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1488 ) |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1489 self.type = panel_type |
103 | 1490 impl = minidom.getDOMImplementation() |
1491 | |
1492 self.doc = impl.createDocument(None, "sat_xmlui", None) | |
1493 top_element = self.doc.documentElement | |
1494 top_element.setAttribute("type", panel_type) | |
107 | 1495 if title: |
1496 top_element.setAttribute("title", title) | |
1530 | 1497 self.submit_id = submit_id |
798
8f5479f8709a
core: XMLUI now use @property for session_id and submit
Goffi <goffi@goffi.org>
parents:
796
diff
changeset
|
1498 self.session_id = session_id |
1105
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1499 if panel_type == C.XMLUI_DIALOG: |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1500 if dialog_opt is None: |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1501 dialog_opt = {} |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1502 self._create_dialog(dialog_opt) |
1105
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1503 return |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1504 self.main_container = self._create_container(container, TopElement(self)) |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1505 self.current_container = self.main_container |
2398
3ff9d7a7fe71
core (XMLUI): filters can now be used when converting data form to XMLUI:
Goffi <goffi@goffi.org>
parents:
2397
diff
changeset
|
1506 self.named_widgets = {} |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1507 |
2762
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
1508 @staticmethod |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1509 def creator_wrapper(widget_cls, is_input): |
2762
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
1510 # TODO: once moved to Python 3, use functools.partialmethod and |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1511 # remove the creator_wrapper |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1512 def create_widget(self, *args, **kwargs): |
2762
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
1513 if self.type == C.XMLUI_DIALOG: |
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
1514 raise exceptions.InternalError(_( |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1515 "create_widget can't be used with dialogs")) |
2762
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
1516 if "parent" not in kwargs: |
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
1517 kwargs["parent"] = self.current_container |
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
1518 if "name" not in kwargs and is_input: |
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
1519 # name can be given as first argument or in keyword |
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
1520 # arguments for InputWidgets |
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
1521 args = list(args) |
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
1522 kwargs["name"] = args.pop(0) |
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
1523 return widget_cls(self, *args, **kwargs) |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1524 return create_widget |
2762
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
1525 |
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
1526 @classmethod |
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
1527 def _introspect(cls): |
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
1528 """ Introspect module to find Widgets and Containers, and create addXXX methods""" |
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
1529 # FIXME: we can't log anything because this file is used |
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
1530 # in bin/sat script then evaluated |
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
1531 # bin/sat should be refactored |
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
1532 # log.debug(u'introspecting XMLUI widgets and containers') |
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
1533 cls._containers = {} |
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
1534 cls._widgets = {} |
3028 | 1535 for obj in list(globals().values()): |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1536 try: |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1537 if issubclass(obj, Widget): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1538 if obj.__name__ == "Widget": |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1539 continue |
2762
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
1540 cls._widgets[obj.type] = obj |
3028 | 1541 creator_name = "add" + obj.__name__ |
2762
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
1542 if creator_name.endswith('Widget'): |
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
1543 creator_name = creator_name[:-6] |
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
1544 is_input = issubclass(obj, InputWidget) |
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
1545 # FIXME: cf. above comment |
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
1546 # log.debug(u"Adding {creator_name} creator (is_input={is_input}))" |
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
1547 # .format(creator_name=creator_name, is_input=is_input)) |
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
1548 |
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
1549 assert not hasattr(cls, creator_name) |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1550 # XXX: we need to use creator_wrapper because we are in a loop |
2762
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
1551 # and Python 2 doesn't support default values in kwargs |
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
1552 # when using *args, **kwargs |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1553 setattr(cls, creator_name, cls.creator_wrapper(obj, is_input)) |
2762
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
1554 |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1555 elif issubclass(obj, Container): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1556 if obj.__name__ == "Container": |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1557 continue |
2762
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
1558 cls._containers[obj.type] = obj |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1559 except TypeError: |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1560 pass |
103 | 1561 |
1562 def __del__(self): | |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
1563 self.doc.unlink() |
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
1564 |
798
8f5479f8709a
core: XMLUI now use @property for session_id and submit
Goffi <goffi@goffi.org>
parents:
796
diff
changeset
|
1565 @property |
8f5479f8709a
core: XMLUI now use @property for session_id and submit
Goffi <goffi@goffi.org>
parents:
796
diff
changeset
|
1566 def submit_id(self): |
8f5479f8709a
core: XMLUI now use @property for session_id and submit
Goffi <goffi@goffi.org>
parents:
796
diff
changeset
|
1567 top_element = self.doc.documentElement |
1530 | 1568 if not top_element.hasAttribute("submit"): |
1569 # getAttribute never return None (it return empty string it attribute doesn't exists) | |
1570 # so we have to manage None here | |
1571 return None | |
798
8f5479f8709a
core: XMLUI now use @property for session_id and submit
Goffi <goffi@goffi.org>
parents:
796
diff
changeset
|
1572 value = top_element.getAttribute("submit") |
1530 | 1573 return value |
798
8f5479f8709a
core: XMLUI now use @property for session_id and submit
Goffi <goffi@goffi.org>
parents:
796
diff
changeset
|
1574 |
8f5479f8709a
core: XMLUI now use @property for session_id and submit
Goffi <goffi@goffi.org>
parents:
796
diff
changeset
|
1575 @submit_id.setter |
8f5479f8709a
core: XMLUI now use @property for session_id and submit
Goffi <goffi@goffi.org>
parents:
796
diff
changeset
|
1576 def submit_id(self, value): |
760
73a0077f80cc
backend, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
759
diff
changeset
|
1577 top_element = self.doc.documentElement |
798
8f5479f8709a
core: XMLUI now use @property for session_id and submit
Goffi <goffi@goffi.org>
parents:
796
diff
changeset
|
1578 if value is None: |
8f5479f8709a
core: XMLUI now use @property for session_id and submit
Goffi <goffi@goffi.org>
parents:
796
diff
changeset
|
1579 try: |
8f5479f8709a
core: XMLUI now use @property for session_id and submit
Goffi <goffi@goffi.org>
parents:
796
diff
changeset
|
1580 top_element.removeAttribute("submit") |
8f5479f8709a
core: XMLUI now use @property for session_id and submit
Goffi <goffi@goffi.org>
parents:
796
diff
changeset
|
1581 except NotFoundErr: |
8f5479f8709a
core: XMLUI now use @property for session_id and submit
Goffi <goffi@goffi.org>
parents:
796
diff
changeset
|
1582 pass |
1531
51dec65ec62c
core (xmlui): fixed submit_id returning None when its value is ''
Goffi <goffi@goffi.org>
parents:
1530
diff
changeset
|
1583 else: # submit_id can be the empty string to bypass form restriction |
798
8f5479f8709a
core: XMLUI now use @property for session_id and submit
Goffi <goffi@goffi.org>
parents:
796
diff
changeset
|
1584 top_element.setAttribute("submit", value) |
760
73a0077f80cc
backend, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
759
diff
changeset
|
1585 |
798
8f5479f8709a
core: XMLUI now use @property for session_id and submit
Goffi <goffi@goffi.org>
parents:
796
diff
changeset
|
1586 @property |
8f5479f8709a
core: XMLUI now use @property for session_id and submit
Goffi <goffi@goffi.org>
parents:
796
diff
changeset
|
1587 def session_id(self): |
8f5479f8709a
core: XMLUI now use @property for session_id and submit
Goffi <goffi@goffi.org>
parents:
796
diff
changeset
|
1588 top_element = self.doc.documentElement |
8f5479f8709a
core: XMLUI now use @property for session_id and submit
Goffi <goffi@goffi.org>
parents:
796
diff
changeset
|
1589 value = top_element.getAttribute("session_id") |
8f5479f8709a
core: XMLUI now use @property for session_id and submit
Goffi <goffi@goffi.org>
parents:
796
diff
changeset
|
1590 return value or None |
8f5479f8709a
core: XMLUI now use @property for session_id and submit
Goffi <goffi@goffi.org>
parents:
796
diff
changeset
|
1591 |
8f5479f8709a
core: XMLUI now use @property for session_id and submit
Goffi <goffi@goffi.org>
parents:
796
diff
changeset
|
1592 @session_id.setter |
8f5479f8709a
core: XMLUI now use @property for session_id and submit
Goffi <goffi@goffi.org>
parents:
796
diff
changeset
|
1593 def session_id(self, value): |
8f5479f8709a
core: XMLUI now use @property for session_id and submit
Goffi <goffi@goffi.org>
parents:
796
diff
changeset
|
1594 top_element = self.doc.documentElement |
8f5479f8709a
core: XMLUI now use @property for session_id and submit
Goffi <goffi@goffi.org>
parents:
796
diff
changeset
|
1595 if value is None: |
8f5479f8709a
core: XMLUI now use @property for session_id and submit
Goffi <goffi@goffi.org>
parents:
796
diff
changeset
|
1596 try: |
8f5479f8709a
core: XMLUI now use @property for session_id and submit
Goffi <goffi@goffi.org>
parents:
796
diff
changeset
|
1597 top_element.removeAttribute("session_id") |
8f5479f8709a
core: XMLUI now use @property for session_id and submit
Goffi <goffi@goffi.org>
parents:
796
diff
changeset
|
1598 except NotFoundErr: |
8f5479f8709a
core: XMLUI now use @property for session_id and submit
Goffi <goffi@goffi.org>
parents:
796
diff
changeset
|
1599 pass |
8f5479f8709a
core: XMLUI now use @property for session_id and submit
Goffi <goffi@goffi.org>
parents:
796
diff
changeset
|
1600 elif value: |
8f5479f8709a
core: XMLUI now use @property for session_id and submit
Goffi <goffi@goffi.org>
parents:
796
diff
changeset
|
1601 top_element.setAttribute("session_id", value) |
8f5479f8709a
core: XMLUI now use @property for session_id and submit
Goffi <goffi@goffi.org>
parents:
796
diff
changeset
|
1602 else: |
8f5479f8709a
core: XMLUI now use @property for session_id and submit
Goffi <goffi@goffi.org>
parents:
796
diff
changeset
|
1603 raise exceptions.DataError("session_id can't be empty") |
760
73a0077f80cc
backend, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
759
diff
changeset
|
1604 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1605 def _create_dialog(self, dialog_opt): |
1105
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1606 dialog_type = dialog_opt.setdefault(C.XMLUI_DATA_TYPE, C.XMLUI_DIALOG_MESSAGE) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1607 if ( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1608 dialog_type in [C.XMLUI_DIALOG_CONFIRM, C.XMLUI_DIALOG_FILE] |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1609 and self.submit_id is None |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1610 ): |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1611 raise exceptions.InternalError( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1612 _("Submit ID must be filled for this kind of dialog") |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1613 ) |
1105
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1614 top_element = TopElement(self) |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1615 level = dialog_opt.get(C.XMLUI_DATA_LVL) |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1616 dialog_elt = DialogElement(top_element, dialog_type, level) |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1617 |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1618 try: |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1619 MessageElement(dialog_elt, dialog_opt[C.XMLUI_DATA_MESS]) |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1620 except KeyError: |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1621 pass |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1622 |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1623 try: |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1624 ButtonsElement(dialog_elt, dialog_opt[C.XMLUI_DATA_BTNS_SET]) |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1625 except KeyError: |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1626 pass |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1627 |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1628 try: |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1629 FileElement(dialog_elt, dialog_opt[C.XMLUI_DATA_FILETYPE]) |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1630 except KeyError: |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1631 pass |
018bdd687747
core (XMLUI): Dialogs are now managemed in XMLUI:
Goffi <goffi@goffi.org>
parents:
1086
diff
changeset
|
1632 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1633 def _create_container(self, container, parent=None, **kwargs): |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1634 """Create a container element |
1472 | 1635 |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1636 @param type: container type (cf init doc) |
103 | 1637 @parent: parent element or None |
1638 """ | |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1639 if container not in self._containers: |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1640 raise exceptions.DataError(_("Unknown container type [%s]") % container) |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1641 cls = self._containers[container] |
804
5174657b3378
XMLUI (core, frontends): added JidWidget and DividerWidget + popup type + some bugfixes:
Goffi <goffi@goffi.org>
parents:
803
diff
changeset
|
1642 new_container = cls(self, parent=parent, **kwargs) |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1643 return new_container |
105 | 1644 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1645 def change_container(self, container, **kwargs): |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1646 """Change the current container |
1472 | 1647 |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1648 @param container: either container type (container it then created), |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1649 or an Container instance""" |
3028 | 1650 if isinstance(container, str): |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1651 self.current_container = self._create_container( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1652 container, |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1653 self.current_container.get_parent_container() or self.main_container, |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1654 **kwargs |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1655 ) |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1656 else: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1657 self.current_container = ( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1658 self.main_container if container is None else container |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1659 ) |
1475
7ac073d2e7e0
core(xmlui): removed useless parenthesis around assert
Goffi <goffi@goffi.org>
parents:
1473
diff
changeset
|
1660 assert isinstance(self.current_container, Container) |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1661 return self.current_container |
103 | 1662 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1663 def add_widget(self, type_, *args, **kwargs): |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1664 """Convenience method to add an element""" |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1665 if "parent" not in kwargs: |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1666 kwargs["parent"] = self.current_container |
2762
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
1667 try: |
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
1668 cls = self._widgets[type_] |
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
1669 except KeyError: |
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
1670 raise exceptions.DataError(_("Invalid type [{type_}]").format(type_=type_)) |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1671 return cls(self, *args, **kwargs) |
104 | 1672 |
103 | 1673 def toXml(self): |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
1674 """return the XML representation of the panel""" |
103 | 1675 return self.doc.toxml() |
289
0e54b1b0a8c8
xml_tools: added ElementParser for raw xml -> domish.Element conversion
Goffi <goffi@goffi.org>
parents:
228
diff
changeset
|
1676 |
0e54b1b0a8c8
xml_tools: added ElementParser for raw xml -> domish.Element conversion
Goffi <goffi@goffi.org>
parents:
228
diff
changeset
|
1677 |
2762
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
1678 # we call this to have automatic discovery of containers and widgets |
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
1679 XMLUI._introspect() |
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
1680 |
5a51c7fc74a5
core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
Goffi <goffi@goffi.org>
parents:
2741
diff
changeset
|
1681 |
1142
2f9f735334da
core (XMLUI): sugar method "note" allow to easily create a XMLUI note dialog (more methods for other dialogs should follow)
Goffi <goffi@goffi.org>
parents:
1141
diff
changeset
|
1682 # Some sugar for XMLUI dialogs |
2f9f735334da
core (XMLUI): sugar method "note" allow to easily create a XMLUI note dialog (more methods for other dialogs should follow)
Goffi <goffi@goffi.org>
parents:
1141
diff
changeset
|
1683 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1684 |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1685 def note(message, title="", level=C.XMLUI_DATA_LVL_INFO): |
2044
4de202bdde05
core (xmlui): added a quickNote method to easily send notes
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
1686 """sugar to easily create a Note Dialog |
1142
2f9f735334da
core (XMLUI): sugar method "note" allow to easily create a XMLUI note dialog (more methods for other dialogs should follow)
Goffi <goffi@goffi.org>
parents:
1141
diff
changeset
|
1687 |
1504
a2e4b976e707
core (xmlui): added helper method to easily manage dialogs with a deferred
Goffi <goffi@goffi.org>
parents:
1500
diff
changeset
|
1688 @param message(unicode): body of the note |
a2e4b976e707
core (xmlui): added helper method to easily manage dialogs with a deferred
Goffi <goffi@goffi.org>
parents:
1500
diff
changeset
|
1689 @param title(unicode): title of the note |
a2e4b976e707
core (xmlui): added helper method to easily manage dialogs with a deferred
Goffi <goffi@goffi.org>
parents:
1500
diff
changeset
|
1690 @param level(unicode): one of C.XMLUI_DATA_LVL_* |
a2e4b976e707
core (xmlui): added helper method to easily manage dialogs with a deferred
Goffi <goffi@goffi.org>
parents:
1500
diff
changeset
|
1691 @return(XMLUI): instance of XMLUI |
1142
2f9f735334da
core (XMLUI): sugar method "note" allow to easily create a XMLUI note dialog (more methods for other dialogs should follow)
Goffi <goffi@goffi.org>
parents:
1141
diff
changeset
|
1692 """ |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1693 note_xmlui = XMLUI( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1694 C.XMLUI_DIALOG, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1695 dialog_opt={ |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1696 C.XMLUI_DATA_TYPE: C.XMLUI_DIALOG_NOTE, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1697 C.XMLUI_DATA_MESS: message, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1698 C.XMLUI_DATA_LVL: level, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1699 }, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1700 title=title, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1701 ) |
1142
2f9f735334da
core (XMLUI): sugar method "note" allow to easily create a XMLUI note dialog (more methods for other dialogs should follow)
Goffi <goffi@goffi.org>
parents:
1141
diff
changeset
|
1702 return note_xmlui |
2f9f735334da
core (XMLUI): sugar method "note" allow to easily create a XMLUI note dialog (more methods for other dialogs should follow)
Goffi <goffi@goffi.org>
parents:
1141
diff
changeset
|
1703 |
1692
0fdd8fe34fbf
core (xmlui): new deferredUI method allows to manage XMLUI with a Deferred insteand of manual submit_id handling:
Goffi <goffi@goffi.org>
parents:
1645
diff
changeset
|
1704 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1705 def quick_note(host, client, message, title="", level=C.XMLUI_DATA_LVL_INFO): |
2044
4de202bdde05
core (xmlui): added a quickNote method to easily send notes
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
1706 """more sugar to do the whole note process""" |
4de202bdde05
core (xmlui): added a quickNote method to easily send notes
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
1707 note_ui = note(message, title, level) |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1708 host.action_new({"xmlui": note_ui.toXml()}, profile=client.profile) |
2044
4de202bdde05
core (xmlui): added a quickNote method to easily send notes
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
1709 |
4de202bdde05
core (xmlui): added a quickNote method to easily send notes
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
1710 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1711 def deferred_ui(host, xmlui, chained=False): |
4110
b274f0d5c138
tools (common/data_objects): handle messages without body
Goffi <goffi@goffi.org>
parents:
4071
diff
changeset
|
1712 """Create a deferred linked to XMLUI |
1692
0fdd8fe34fbf
core (xmlui): new deferredUI method allows to manage XMLUI with a Deferred insteand of manual submit_id handling:
Goffi <goffi@goffi.org>
parents:
1645
diff
changeset
|
1713 |
0fdd8fe34fbf
core (xmlui): new deferredUI method allows to manage XMLUI with a Deferred insteand of manual submit_id handling:
Goffi <goffi@goffi.org>
parents:
1645
diff
changeset
|
1714 @param xmlui(XMLUI): instance of the XMLUI |
0fdd8fe34fbf
core (xmlui): new deferredUI method allows to manage XMLUI with a Deferred insteand of manual submit_id handling:
Goffi <goffi@goffi.org>
parents:
1645
diff
changeset
|
1715 Must be an XMLUI that you can submit, with submit_id set to '' |
0fdd8fe34fbf
core (xmlui): new deferredUI method allows to manage XMLUI with a Deferred insteand of manual submit_id handling:
Goffi <goffi@goffi.org>
parents:
1645
diff
changeset
|
1716 @param chained(bool): True if the Deferred result must be returned to the frontend |
0fdd8fe34fbf
core (xmlui): new deferredUI method allows to manage XMLUI with a Deferred insteand of manual submit_id handling:
Goffi <goffi@goffi.org>
parents:
1645
diff
changeset
|
1717 useful when backend is in a series of dialogs with an ui |
0fdd8fe34fbf
core (xmlui): new deferredUI method allows to manage XMLUI with a Deferred insteand of manual submit_id handling:
Goffi <goffi@goffi.org>
parents:
1645
diff
changeset
|
1718 @return (D(data)): a deferred which fire the data |
0fdd8fe34fbf
core (xmlui): new deferredUI method allows to manage XMLUI with a Deferred insteand of manual submit_id handling:
Goffi <goffi@goffi.org>
parents:
1645
diff
changeset
|
1719 """ |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1720 assert xmlui.submit_id == "" |
1692
0fdd8fe34fbf
core (xmlui): new deferredUI method allows to manage XMLUI with a Deferred insteand of manual submit_id handling:
Goffi <goffi@goffi.org>
parents:
1645
diff
changeset
|
1721 xmlui_d = defer.Deferred() |
0fdd8fe34fbf
core (xmlui): new deferredUI method allows to manage XMLUI with a Deferred insteand of manual submit_id handling:
Goffi <goffi@goffi.org>
parents:
1645
diff
changeset
|
1722 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1723 def on_submit(data, profile): |
1692
0fdd8fe34fbf
core (xmlui): new deferredUI method allows to manage XMLUI with a Deferred insteand of manual submit_id handling:
Goffi <goffi@goffi.org>
parents:
1645
diff
changeset
|
1724 xmlui_d.callback(data) |
0fdd8fe34fbf
core (xmlui): new deferredUI method allows to manage XMLUI with a Deferred insteand of manual submit_id handling:
Goffi <goffi@goffi.org>
parents:
1645
diff
changeset
|
1725 return xmlui_d if chained else {} |
0fdd8fe34fbf
core (xmlui): new deferredUI method allows to manage XMLUI with a Deferred insteand of manual submit_id handling:
Goffi <goffi@goffi.org>
parents:
1645
diff
changeset
|
1726 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1727 xmlui.submit_id = host.register_callback(on_submit, with_data=True, one_shot=True) |
1692
0fdd8fe34fbf
core (xmlui): new deferredUI method allows to manage XMLUI with a Deferred insteand of manual submit_id handling:
Goffi <goffi@goffi.org>
parents:
1645
diff
changeset
|
1728 return xmlui_d |
0fdd8fe34fbf
core (xmlui): new deferredUI method allows to manage XMLUI with a Deferred insteand of manual submit_id handling:
Goffi <goffi@goffi.org>
parents:
1645
diff
changeset
|
1729 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1730 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1731 def defer_xmlui(host, xmlui, action_extra=None, security_limit=C.NO_SECURITY_LIMIT, |
2625
a55a14c3cbf4
plugin XEP-0070: use a confirm dialog instead of a form + simplified a bit the code
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
1732 chained=False, profile=C.PROF_KEY_NONE): |
1504
a2e4b976e707
core (xmlui): added helper method to easily manage dialogs with a deferred
Goffi <goffi@goffi.org>
parents:
1500
diff
changeset
|
1733 """Create a deferred linked to XMLUI |
a2e4b976e707
core (xmlui): added helper method to easily manage dialogs with a deferred
Goffi <goffi@goffi.org>
parents:
1500
diff
changeset
|
1734 |
a2e4b976e707
core (xmlui): added helper method to easily manage dialogs with a deferred
Goffi <goffi@goffi.org>
parents:
1500
diff
changeset
|
1735 @param xmlui(XMLUI): instance of the XMLUI |
a2e4b976e707
core (xmlui): added helper method to easily manage dialogs with a deferred
Goffi <goffi@goffi.org>
parents:
1500
diff
changeset
|
1736 Must be an XMLUI that you can submit, with submit_id set to '' |
a2e4b976e707
core (xmlui): added helper method to easily manage dialogs with a deferred
Goffi <goffi@goffi.org>
parents:
1500
diff
changeset
|
1737 @param profile: %(doc_profile)s |
1601
e0a152f2cf6d
core (xmlui), plugin file: added action_extra param to deferXMLUI/deferDialog which is merged to the action data dict when actionNew is called
Goffi <goffi@goffi.org>
parents:
1599
diff
changeset
|
1738 @param action_extra(None, dict): extra action to merge with xmlui |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1739 mainly used to add meta informations (see action_new doc) |
1599
e2ed8009e66e
backend, bridge, frontends: actionNew has now a security_limit argument + added some docstring to explain data argument
Goffi <goffi@goffi.org>
parents:
1531
diff
changeset
|
1740 @param security_limit: %(doc_security_limit)s |
1692
0fdd8fe34fbf
core (xmlui): new deferredUI method allows to manage XMLUI with a Deferred insteand of manual submit_id handling:
Goffi <goffi@goffi.org>
parents:
1645
diff
changeset
|
1741 @param chained(bool): True if the Deferred result must be returned to the frontend |
0fdd8fe34fbf
core (xmlui): new deferredUI method allows to manage XMLUI with a Deferred insteand of manual submit_id handling:
Goffi <goffi@goffi.org>
parents:
1645
diff
changeset
|
1742 useful when backend is in a series of dialogs with an ui |
1504
a2e4b976e707
core (xmlui): added helper method to easily manage dialogs with a deferred
Goffi <goffi@goffi.org>
parents:
1500
diff
changeset
|
1743 @return (data): a deferred which fire the data |
a2e4b976e707
core (xmlui): added helper method to easily manage dialogs with a deferred
Goffi <goffi@goffi.org>
parents:
1500
diff
changeset
|
1744 """ |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1745 xmlui_d = deferred_ui(host, xmlui, chained) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1746 action_data = {"xmlui": xmlui.toXml()} |
1601
e0a152f2cf6d
core (xmlui), plugin file: added action_extra param to deferXMLUI/deferDialog which is merged to the action data dict when actionNew is called
Goffi <goffi@goffi.org>
parents:
1599
diff
changeset
|
1747 if action_extra is not None: |
e0a152f2cf6d
core (xmlui), plugin file: added action_extra param to deferXMLUI/deferDialog which is merged to the action data dict when actionNew is called
Goffi <goffi@goffi.org>
parents:
1599
diff
changeset
|
1748 action_data.update(action_extra) |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1749 host.action_new( |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1750 action_data, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1751 security_limit=security_limit, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1752 keep_id=xmlui.submit_id, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1753 profile=profile, |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1754 ) |
1504
a2e4b976e707
core (xmlui): added helper method to easily manage dialogs with a deferred
Goffi <goffi@goffi.org>
parents:
1500
diff
changeset
|
1755 return xmlui_d |
a2e4b976e707
core (xmlui): added helper method to easily manage dialogs with a deferred
Goffi <goffi@goffi.org>
parents:
1500
diff
changeset
|
1756 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1757 |
4041
2594e1951cf7
core (bridge): `action_new` now use serialised dict for extra data.
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
1758 def defer_dialog( |
2594e1951cf7
core (bridge): `action_new` now use serialised dict for extra data.
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
1759 host, |
2594e1951cf7
core (bridge): `action_new` now use serialised dict for extra data.
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
1760 message: str, |
2594e1951cf7
core (bridge): `action_new` now use serialised dict for extra data.
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
1761 title: str = "Please confirm", |
2594e1951cf7
core (bridge): `action_new` now use serialised dict for extra data.
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
1762 type_: str = C.XMLUI_DIALOG_CONFIRM, |
2594e1951cf7
core (bridge): `action_new` now use serialised dict for extra data.
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
1763 options: Optional[dict] = None, |
2594e1951cf7
core (bridge): `action_new` now use serialised dict for extra data.
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
1764 action_extra: Optional[dict] = None, |
2594e1951cf7
core (bridge): `action_new` now use serialised dict for extra data.
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
1765 security_limit: int = C.NO_SECURITY_LIMIT, |
2594e1951cf7
core (bridge): `action_new` now use serialised dict for extra data.
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
1766 chained: bool = False, |
2594e1951cf7
core (bridge): `action_new` now use serialised dict for extra data.
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
1767 profile: str = C.PROF_KEY_NONE |
2594e1951cf7
core (bridge): `action_new` now use serialised dict for extra data.
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
1768 ) -> defer.Deferred: |
1504
a2e4b976e707
core (xmlui): added helper method to easily manage dialogs with a deferred
Goffi <goffi@goffi.org>
parents:
1500
diff
changeset
|
1769 """Create a submitable dialog and manage it with a deferred |
a2e4b976e707
core (xmlui): added helper method to easily manage dialogs with a deferred
Goffi <goffi@goffi.org>
parents:
1500
diff
changeset
|
1770 |
4041
2594e1951cf7
core (bridge): `action_new` now use serialised dict for extra data.
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
1771 @param message: message to display |
2594e1951cf7
core (bridge): `action_new` now use serialised dict for extra data.
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
1772 @param title: title of the dialog |
2594e1951cf7
core (bridge): `action_new` now use serialised dict for extra data.
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
1773 @param type: dialog type (C.XMLUI_DIALOG_* or plugin specific string) |
2594e1951cf7
core (bridge): `action_new` now use serialised dict for extra data.
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
1774 @param options: if not None, will be used to update (extend) dialog_opt arguments of |
2594e1951cf7
core (bridge): `action_new` now use serialised dict for extra data.
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
1775 XMLUI |
2594e1951cf7
core (bridge): `action_new` now use serialised dict for extra data.
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
1776 @param action_extra: extra action to merge with xmlui |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1777 mainly used to add meta informations (see action_new doc) |
1601
e0a152f2cf6d
core (xmlui), plugin file: added action_extra param to deferXMLUI/deferDialog which is merged to the action data dict when actionNew is called
Goffi <goffi@goffi.org>
parents:
1599
diff
changeset
|
1778 @param security_limit: %(doc_security_limit)s |
4041
2594e1951cf7
core (bridge): `action_new` now use serialised dict for extra data.
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
1779 @param chained: True if the Deferred result must be returned to the frontend |
1737 | 1780 useful when backend is in a series of dialogs with an ui |
1504
a2e4b976e707
core (xmlui): added helper method to easily manage dialogs with a deferred
Goffi <goffi@goffi.org>
parents:
1500
diff
changeset
|
1781 @param profile: %(doc_profile)s |
4041
2594e1951cf7
core (bridge): `action_new` now use serialised dict for extra data.
Goffi <goffi@goffi.org>
parents:
4037
diff
changeset
|
1782 @return: answer dict |
1504
a2e4b976e707
core (xmlui): added helper method to easily manage dialogs with a deferred
Goffi <goffi@goffi.org>
parents:
1500
diff
changeset
|
1783 """ |
a2e4b976e707
core (xmlui): added helper method to easily manage dialogs with a deferred
Goffi <goffi@goffi.org>
parents:
1500
diff
changeset
|
1784 assert profile is not None |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1785 dialog_opt = {"type": type_, "message": message} |
1521
d2ab9c62ac3a
core (xmlui): deferDialog can now manage additional dialog options through the "options" argument
Goffi <goffi@goffi.org>
parents:
1507
diff
changeset
|
1786 if options is not None: |
d2ab9c62ac3a
core (xmlui): deferDialog can now manage additional dialog options through the "options" argument
Goffi <goffi@goffi.org>
parents:
1507
diff
changeset
|
1787 dialog_opt.update(options) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1788 dialog = XMLUI(C.XMLUI_DIALOG, title=title, dialog_opt=dialog_opt, submit_id="") |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1789 return defer_xmlui(host, dialog, action_extra, security_limit, chained, profile) |
1504
a2e4b976e707
core (xmlui): added helper method to easily manage dialogs with a deferred
Goffi <goffi@goffi.org>
parents:
1500
diff
changeset
|
1790 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1791 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1792 def defer_confirm(*args, **kwargs): |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1793 """call defer_dialog and return a boolean instead of the whole data dict""" |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1794 d = defer_dialog(*args, **kwargs) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1795 d.addCallback(lambda data: C.bool(data["answer"])) |
1504
a2e4b976e707
core (xmlui): added helper method to easily manage dialogs with a deferred
Goffi <goffi@goffi.org>
parents:
1500
diff
changeset
|
1796 return d |
a2e4b976e707
core (xmlui): added helper method to easily manage dialogs with a deferred
Goffi <goffi@goffi.org>
parents:
1500
diff
changeset
|
1797 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1798 |
802
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1799 # Misc other funtions |
9007bb133009
core, frontends: XMLUI refactoring:
Goffi <goffi@goffi.org>
parents:
800
diff
changeset
|
1800 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1801 def element_copy( |
3395
d6a482a78bda
tools (xml_tools): added `with_parent` and `with_children` argument to `elementCopy`
Goffi <goffi@goffi.org>
parents:
3393
diff
changeset
|
1802 element: domish.Element, |
d6a482a78bda
tools (xml_tools): added `with_parent` and `with_children` argument to `elementCopy`
Goffi <goffi@goffi.org>
parents:
3393
diff
changeset
|
1803 with_parent: bool = True, |
d6a482a78bda
tools (xml_tools): added `with_parent` and `with_children` argument to `elementCopy`
Goffi <goffi@goffi.org>
parents:
3393
diff
changeset
|
1804 with_children: bool = True |
d6a482a78bda
tools (xml_tools): added `with_parent` and `with_children` argument to `elementCopy`
Goffi <goffi@goffi.org>
parents:
3393
diff
changeset
|
1805 ) -> domish.Element: |
2814
777a582d9641
core (xml_tools): new elementCopy method to shallow copy a domish.Element
Goffi <goffi@goffi.org>
parents:
2782
diff
changeset
|
1806 """Make a copy of a domish.Element |
777a582d9641
core (xml_tools): new elementCopy method to shallow copy a domish.Element
Goffi <goffi@goffi.org>
parents:
2782
diff
changeset
|
1807 |
777a582d9641
core (xml_tools): new elementCopy method to shallow copy a domish.Element
Goffi <goffi@goffi.org>
parents:
2782
diff
changeset
|
1808 The copy will have its own children list, so other elements |
777a582d9641
core (xml_tools): new elementCopy method to shallow copy a domish.Element
Goffi <goffi@goffi.org>
parents:
2782
diff
changeset
|
1809 can be added as direct children without modifying orignal one. |
777a582d9641
core (xml_tools): new elementCopy method to shallow copy a domish.Element
Goffi <goffi@goffi.org>
parents:
2782
diff
changeset
|
1810 Children are not deeply copied, so if an element is added to a child or grandchild, |
777a582d9641
core (xml_tools): new elementCopy method to shallow copy a domish.Element
Goffi <goffi@goffi.org>
parents:
2782
diff
changeset
|
1811 it will also affect original element. |
3395
d6a482a78bda
tools (xml_tools): added `with_parent` and `with_children` argument to `elementCopy`
Goffi <goffi@goffi.org>
parents:
3393
diff
changeset
|
1812 @param element: Element to clone |
2814
777a582d9641
core (xml_tools): new elementCopy method to shallow copy a domish.Element
Goffi <goffi@goffi.org>
parents:
2782
diff
changeset
|
1813 """ |
777a582d9641
core (xml_tools): new elementCopy method to shallow copy a domish.Element
Goffi <goffi@goffi.org>
parents:
2782
diff
changeset
|
1814 new_elt = domish.Element( |
777a582d9641
core (xml_tools): new elementCopy method to shallow copy a domish.Element
Goffi <goffi@goffi.org>
parents:
2782
diff
changeset
|
1815 (element.uri, element.name), |
777a582d9641
core (xml_tools): new elementCopy method to shallow copy a domish.Element
Goffi <goffi@goffi.org>
parents:
2782
diff
changeset
|
1816 defaultUri = element.defaultUri, |
777a582d9641
core (xml_tools): new elementCopy method to shallow copy a domish.Element
Goffi <goffi@goffi.org>
parents:
2782
diff
changeset
|
1817 attribs = element.attributes, |
777a582d9641
core (xml_tools): new elementCopy method to shallow copy a domish.Element
Goffi <goffi@goffi.org>
parents:
2782
diff
changeset
|
1818 localPrefixes = element.localPrefixes) |
3395
d6a482a78bda
tools (xml_tools): added `with_parent` and `with_children` argument to `elementCopy`
Goffi <goffi@goffi.org>
parents:
3393
diff
changeset
|
1819 if with_parent: |
d6a482a78bda
tools (xml_tools): added `with_parent` and `with_children` argument to `elementCopy`
Goffi <goffi@goffi.org>
parents:
3393
diff
changeset
|
1820 new_elt.parent = element.parent |
d6a482a78bda
tools (xml_tools): added `with_parent` and `with_children` argument to `elementCopy`
Goffi <goffi@goffi.org>
parents:
3393
diff
changeset
|
1821 if with_children: |
d6a482a78bda
tools (xml_tools): added `with_parent` and `with_children` argument to `elementCopy`
Goffi <goffi@goffi.org>
parents:
3393
diff
changeset
|
1822 new_elt.children = element.children[:] |
2814
777a582d9641
core (xml_tools): new elementCopy method to shallow copy a domish.Element
Goffi <goffi@goffi.org>
parents:
2782
diff
changeset
|
1823 return new_elt |
777a582d9641
core (xml_tools): new elementCopy method to shallow copy a domish.Element
Goffi <goffi@goffi.org>
parents:
2782
diff
changeset
|
1824 |
777a582d9641
core (xml_tools): new elementCopy method to shallow copy a domish.Element
Goffi <goffi@goffi.org>
parents:
2782
diff
changeset
|
1825 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1826 def is_xhtml_field(field): |
2782
b17e6fa1e607
core (XMLUI): new XHTMLBox widget:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1827 """Check if a data_form.Field is an XHTML one""" |
3028 | 1828 return (field.fieldType is None and field.ext_type == "xml" and |
2782
b17e6fa1e607
core (XMLUI): new XHTMLBox widget:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1829 field.value.uri == C.NS_XHTML) |
b17e6fa1e607
core (XMLUI): new XHTMLBox widget:
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1830 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1831 |
3393
2b6f69f6df8c
tools(xml_tools): fixed `<div>` unwrapping + added `parse` instance:
Goffi <goffi@goffi.org>
parents:
3233
diff
changeset
|
1832 class ElementParser: |
2b6f69f6df8c
tools(xml_tools): fixed `<div>` unwrapping + added `parse` instance:
Goffi <goffi@goffi.org>
parents:
3233
diff
changeset
|
1833 """Callable class to parse XML string into Element""" |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1834 |
1818
7e6342de71fb
core (xml_tools): unescape HTML sequences to avoid parsing error in ElementParser
Goffi <goffi@goffi.org>
parents:
1817
diff
changeset
|
1835 # XXX: Found at http://stackoverflow.com/questions/2093400/how-to-create-twisted-words-xish-domish-element-entirely-from-raw-xml/2095942#2095942 |
1472 | 1836 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1837 def _escape_html(self, matchobj): |
1818
7e6342de71fb
core (xml_tools): unescape HTML sequences to avoid parsing error in ElementParser
Goffi <goffi@goffi.org>
parents:
1817
diff
changeset
|
1838 entity = matchobj.group(1) |
7e6342de71fb
core (xml_tools): unescape HTML sequences to avoid parsing error in ElementParser
Goffi <goffi@goffi.org>
parents:
1817
diff
changeset
|
1839 if entity in XML_ENTITIES: |
7e6342de71fb
core (xml_tools): unescape HTML sequences to avoid parsing error in ElementParser
Goffi <goffi@goffi.org>
parents:
1817
diff
changeset
|
1840 # we don't escape XML entities |
7e6342de71fb
core (xml_tools): unescape HTML sequences to avoid parsing error in ElementParser
Goffi <goffi@goffi.org>
parents:
1817
diff
changeset
|
1841 return matchobj.group(0) |
7e6342de71fb
core (xml_tools): unescape HTML sequences to avoid parsing error in ElementParser
Goffi <goffi@goffi.org>
parents:
1817
diff
changeset
|
1842 else: |
7e6342de71fb
core (xml_tools): unescape HTML sequences to avoid parsing error in ElementParser
Goffi <goffi@goffi.org>
parents:
1817
diff
changeset
|
1843 try: |
3028 | 1844 return chr(html.entities.name2codepoint[entity]) |
1818
7e6342de71fb
core (xml_tools): unescape HTML sequences to avoid parsing error in ElementParser
Goffi <goffi@goffi.org>
parents:
1817
diff
changeset
|
1845 except KeyError: |
3028 | 1846 log.warning("removing unknown entity {}".format(entity)) |
1847 return "" | |
289
0e54b1b0a8c8
xml_tools: added ElementParser for raw xml -> domish.Element conversion
Goffi <goffi@goffi.org>
parents:
228
diff
changeset
|
1848 |
1817
7ef0f5f90862
core (xml_tools), plugin XEP-0277: ElementParser element now manage automatically the wrapping with <div/> element when needed + fixed content_xhtml/title_xhtml in XEP-0277
Goffi <goffi@goffi.org>
parents:
1792
diff
changeset
|
1849 def __call__(self, raw_xml, force_spaces=False, namespace=None): |
905
cad8e52bb2e6
tools: xml_tools.ElementParser do not replace '\n' and '\t' with ' ' by default
souliane <souliane@mailoo.org>
parents:
876
diff
changeset
|
1850 """ |
1456
a13be5c22334
xml_tools: minor attribute renaming
Goffi <goffi@goffi.org>
parents:
1444
diff
changeset
|
1851 @param raw_xml(unicode): the raw XML |
2625
a55a14c3cbf4
plugin XEP-0070: use a confirm dialog instead of a form + simplified a bit the code
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
1852 @param force_spaces (bool): if True, replace occurrences of '\n' and '\t' |
a55a14c3cbf4
plugin XEP-0070: use a confirm dialog instead of a form + simplified a bit the code
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
1853 with ' '. |
a55a14c3cbf4
plugin XEP-0070: use a confirm dialog instead of a form + simplified a bit the code
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
1854 @param namespace(unicode, None): if set, use this namespace for the wrapping |
a55a14c3cbf4
plugin XEP-0070: use a confirm dialog instead of a form + simplified a bit the code
Goffi <goffi@goffi.org>
parents:
2624
diff
changeset
|
1855 element |
905
cad8e52bb2e6
tools: xml_tools.ElementParser do not replace '\n' and '\t' with ' ' by default
souliane <souliane@mailoo.org>
parents:
876
diff
changeset
|
1856 """ |
1817
7ef0f5f90862
core (xml_tools), plugin XEP-0277: ElementParser element now manage automatically the wrapping with <div/> element when needed + fixed content_xhtml/title_xhtml in XEP-0277
Goffi <goffi@goffi.org>
parents:
1792
diff
changeset
|
1857 # we need to wrap element in case |
7ef0f5f90862
core (xml_tools), plugin XEP-0277: ElementParser element now manage automatically the wrapping with <div/> element when needed + fixed content_xhtml/title_xhtml in XEP-0277
Goffi <goffi@goffi.org>
parents:
1792
diff
changeset
|
1858 # there is not a unique one on the top |
7ef0f5f90862
core (xml_tools), plugin XEP-0277: ElementParser element now manage automatically the wrapping with <div/> element when needed + fixed content_xhtml/title_xhtml in XEP-0277
Goffi <goffi@goffi.org>
parents:
1792
diff
changeset
|
1859 if namespace is not None: |
3028 | 1860 raw_xml = "<div xmlns='{}'>{}</div>".format(namespace, raw_xml) |
1817
7ef0f5f90862
core (xml_tools), plugin XEP-0277: ElementParser element now manage automatically the wrapping with <div/> element when needed + fixed content_xhtml/title_xhtml in XEP-0277
Goffi <goffi@goffi.org>
parents:
1792
diff
changeset
|
1861 else: |
3028 | 1862 raw_xml = "<div>{}</div>".format(raw_xml) |
1817
7ef0f5f90862
core (xml_tools), plugin XEP-0277: ElementParser element now manage automatically the wrapping with <div/> element when needed + fixed content_xhtml/title_xhtml in XEP-0277
Goffi <goffi@goffi.org>
parents:
1792
diff
changeset
|
1863 |
1818
7e6342de71fb
core (xml_tools): unescape HTML sequences to avoid parsing error in ElementParser
Goffi <goffi@goffi.org>
parents:
1817
diff
changeset
|
1864 # avoid ParserError on HTML escaped chars |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1865 raw_xml = html_entity_re.sub(self._escape_html, raw_xml) |
1818
7e6342de71fb
core (xml_tools): unescape HTML sequences to avoid parsing error in ElementParser
Goffi <goffi@goffi.org>
parents:
1817
diff
changeset
|
1866 |
289
0e54b1b0a8c8
xml_tools: added ElementParser for raw xml -> domish.Element conversion
Goffi <goffi@goffi.org>
parents:
228
diff
changeset
|
1867 self.result = None |
590
56531f9e9ac7
Fix pep8 support in src/tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
1868 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1869 def on_start(elem): |
590
56531f9e9ac7
Fix pep8 support in src/tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
1870 self.result = elem |
56531f9e9ac7
Fix pep8 support in src/tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
1871 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1872 def on_end(): |
289
0e54b1b0a8c8
xml_tools: added ElementParser for raw xml -> domish.Element conversion
Goffi <goffi@goffi.org>
parents:
228
diff
changeset
|
1873 pass |
590
56531f9e9ac7
Fix pep8 support in src/tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
1874 |
56531f9e9ac7
Fix pep8 support in src/tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
1875 def onElement(elem): |
56531f9e9ac7
Fix pep8 support in src/tools.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
1876 self.result.addChild(elem) |
289
0e54b1b0a8c8
xml_tools: added ElementParser for raw xml -> domish.Element conversion
Goffi <goffi@goffi.org>
parents:
228
diff
changeset
|
1877 |
0e54b1b0a8c8
xml_tools: added ElementParser for raw xml -> domish.Element conversion
Goffi <goffi@goffi.org>
parents:
228
diff
changeset
|
1878 parser = domish.elementStream() |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1879 parser.DocumentStartEvent = on_start |
289
0e54b1b0a8c8
xml_tools: added ElementParser for raw xml -> domish.Element conversion
Goffi <goffi@goffi.org>
parents:
228
diff
changeset
|
1880 parser.ElementEvent = onElement |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1881 parser.DocumentEndEvent = on_end |
536
a31abb97310d
core, plugins: fixed bad namespace in stanza creation
Goffi <goffi@goffi.org>
parents:
480
diff
changeset
|
1882 tmp = domish.Element((None, "s")) |
905
cad8e52bb2e6
tools: xml_tools.ElementParser do not replace '\n' and '\t' with ' ' by default
souliane <souliane@mailoo.org>
parents:
876
diff
changeset
|
1883 if force_spaces: |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1884 raw_xml = raw_xml.replace("\n", " ").replace("\t", " ") |
1456
a13be5c22334
xml_tools: minor attribute renaming
Goffi <goffi@goffi.org>
parents:
1444
diff
changeset
|
1885 tmp.addRawXml(raw_xml) |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1886 parser.parse(tmp.toXml().encode("utf-8")) |
1817
7ef0f5f90862
core (xml_tools), plugin XEP-0277: ElementParser element now manage automatically the wrapping with <div/> element when needed + fixed content_xhtml/title_xhtml in XEP-0277
Goffi <goffi@goffi.org>
parents:
1792
diff
changeset
|
1887 top_elt = self.result.firstChildElement() |
7ef0f5f90862
core (xml_tools), plugin XEP-0277: ElementParser element now manage automatically the wrapping with <div/> element when needed + fixed content_xhtml/title_xhtml in XEP-0277
Goffi <goffi@goffi.org>
parents:
1792
diff
changeset
|
1888 # we now can check if there was a unique element on the top |
3393
2b6f69f6df8c
tools(xml_tools): fixed `<div>` unwrapping + added `parse` instance:
Goffi <goffi@goffi.org>
parents:
3233
diff
changeset
|
1889 # and remove our wrapping <div/> is this is the case |
2b6f69f6df8c
tools(xml_tools): fixed `<div>` unwrapping + added `parse` instance:
Goffi <goffi@goffi.org>
parents:
3233
diff
changeset
|
1890 top_elt_children = list(top_elt.elements()) |
2b6f69f6df8c
tools(xml_tools): fixed `<div>` unwrapping + added `parse` instance:
Goffi <goffi@goffi.org>
parents:
3233
diff
changeset
|
1891 if len(top_elt_children) == 1: |
2b6f69f6df8c
tools(xml_tools): fixed `<div>` unwrapping + added `parse` instance:
Goffi <goffi@goffi.org>
parents:
3233
diff
changeset
|
1892 top_elt = top_elt_children[0] |
1817
7ef0f5f90862
core (xml_tools), plugin XEP-0277: ElementParser element now manage automatically the wrapping with <div/> element when needed + fixed content_xhtml/title_xhtml in XEP-0277
Goffi <goffi@goffi.org>
parents:
1792
diff
changeset
|
1893 return top_elt |
1732
cf11cfc87ef9
xml_tools, plugin XEP-0071, XEP-0277: add method expandNewLinesToXHTML:
souliane <souliane@mailoo.org>
parents:
1692
diff
changeset
|
1894 |
cf11cfc87ef9
xml_tools, plugin XEP-0071, XEP-0277: add method expandNewLinesToXHTML:
souliane <souliane@mailoo.org>
parents:
1692
diff
changeset
|
1895 |
3393
2b6f69f6df8c
tools(xml_tools): fixed `<div>` unwrapping + added `parse` instance:
Goffi <goffi@goffi.org>
parents:
3233
diff
changeset
|
1896 parse = ElementParser() |
2b6f69f6df8c
tools(xml_tools): fixed `<div>` unwrapping + added `parse` instance:
Goffi <goffi@goffi.org>
parents:
3233
diff
changeset
|
1897 |
2b6f69f6df8c
tools(xml_tools): fixed `<div>` unwrapping + added `parse` instance:
Goffi <goffi@goffi.org>
parents:
3233
diff
changeset
|
1898 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1899 # FIXME: this method is duplicated from frontends.tools.xmlui.get_text |
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1900 def get_text(node): |
1740
681fe91abcc0
memory (params): parameter jids_list values are specified with <jid>...</jid>
souliane <souliane@mailoo.org>
parents:
1737
diff
changeset
|
1901 """Get child text nodes of a domish.Element. |
681fe91abcc0
memory (params): parameter jids_list values are specified with <jid>...</jid>
souliane <souliane@mailoo.org>
parents:
1737
diff
changeset
|
1902 |
681fe91abcc0
memory (params): parameter jids_list values are specified with <jid>...</jid>
souliane <souliane@mailoo.org>
parents:
1737
diff
changeset
|
1903 @param node (domish.Element) |
681fe91abcc0
memory (params): parameter jids_list values are specified with <jid>...</jid>
souliane <souliane@mailoo.org>
parents:
1737
diff
changeset
|
1904 @return: joined unicode text of all nodes |
681fe91abcc0
memory (params): parameter jids_list values are specified with <jid>...</jid>
souliane <souliane@mailoo.org>
parents:
1737
diff
changeset
|
1905 """ |
681fe91abcc0
memory (params): parameter jids_list values are specified with <jid>...</jid>
souliane <souliane@mailoo.org>
parents:
1737
diff
changeset
|
1906 data = [] |
681fe91abcc0
memory (params): parameter jids_list values are specified with <jid>...</jid>
souliane <souliane@mailoo.org>
parents:
1737
diff
changeset
|
1907 for child in node.childNodes: |
681fe91abcc0
memory (params): parameter jids_list values are specified with <jid>...</jid>
souliane <souliane@mailoo.org>
parents:
1737
diff
changeset
|
1908 if child.nodeType == child.TEXT_NODE: |
681fe91abcc0
memory (params): parameter jids_list values are specified with <jid>...</jid>
souliane <souliane@mailoo.org>
parents:
1737
diff
changeset
|
1909 data.append(child.wholeText) |
3028 | 1910 return "".join(data) |
1819
c271087d2020
core (xml_tools): added a method to find all elements corresponding to criteria
Goffi <goffi@goffi.org>
parents:
1818
diff
changeset
|
1911 |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1912 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1913 def find_all(elt, namespaces=None, names=None): |
1819
c271087d2020
core (xml_tools): added a method to find all elements corresponding to criteria
Goffi <goffi@goffi.org>
parents:
1818
diff
changeset
|
1914 """Find child element at any depth matching criteria |
c271087d2020
core (xml_tools): added a method to find all elements corresponding to criteria
Goffi <goffi@goffi.org>
parents:
1818
diff
changeset
|
1915 |
c271087d2020
core (xml_tools): added a method to find all elements corresponding to criteria
Goffi <goffi@goffi.org>
parents:
1818
diff
changeset
|
1916 @param elt(domish.Element): top parent of the elements to find |
2108 | 1917 @param names(iterable[unicode], basestring, None): names to match |
1819
c271087d2020
core (xml_tools): added a method to find all elements corresponding to criteria
Goffi <goffi@goffi.org>
parents:
1818
diff
changeset
|
1918 None to accept every names |
2108 | 1919 @param namespace(iterable[unicode], basestring, None): URIs to match |
1819
c271087d2020
core (xml_tools): added a method to find all elements corresponding to criteria
Goffi <goffi@goffi.org>
parents:
1818
diff
changeset
|
1920 None to accept every namespaces |
2108 | 1921 @return ((G)domish.Element): found elements |
1819
c271087d2020
core (xml_tools): added a method to find all elements corresponding to criteria
Goffi <goffi@goffi.org>
parents:
1818
diff
changeset
|
1922 """ |
3028 | 1923 if isinstance(namespaces, str): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1924 namespaces = tuple((namespaces,)) |
3028 | 1925 if isinstance(names, str): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1926 names = tuple((names,)) |
1819
c271087d2020
core (xml_tools): added a method to find all elements corresponding to criteria
Goffi <goffi@goffi.org>
parents:
1818
diff
changeset
|
1927 |
c271087d2020
core (xml_tools): added a method to find all elements corresponding to criteria
Goffi <goffi@goffi.org>
parents:
1818
diff
changeset
|
1928 for child in elt.elements(): |
2624
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1929 if ( |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1930 domish.IElement.providedBy(child) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1931 and (not names or child.name in names) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1932 and (not namespaces or child.uri in namespaces) |
56f94936df1e
code style reformatting using black
Goffi <goffi@goffi.org>
parents:
2562
diff
changeset
|
1933 ): |
1819
c271087d2020
core (xml_tools): added a method to find all elements corresponding to criteria
Goffi <goffi@goffi.org>
parents:
1818
diff
changeset
|
1934 yield child |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1935 for found in find_all(child, namespaces, names): |
1819
c271087d2020
core (xml_tools): added a method to find all elements corresponding to criteria
Goffi <goffi@goffi.org>
parents:
1818
diff
changeset
|
1936 yield found |
3396
a4774f5b6b17
tools (xml_tools): `domish.Element` pretty formatting functions:
Goffi <goffi@goffi.org>
parents:
3395
diff
changeset
|
1937 |
a4774f5b6b17
tools (xml_tools): `domish.Element` pretty formatting functions:
Goffi <goffi@goffi.org>
parents:
3395
diff
changeset
|
1938 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1939 def find_ancestor( |
4010
818db4ca3717
tools (xml_tools): accept several namespaces in `findAncestor`
Goffi <goffi@goffi.org>
parents:
3967
diff
changeset
|
1940 elt, |
818db4ca3717
tools (xml_tools): accept several namespaces in `findAncestor`
Goffi <goffi@goffi.org>
parents:
3967
diff
changeset
|
1941 name: str, |
818db4ca3717
tools (xml_tools): accept several namespaces in `findAncestor`
Goffi <goffi@goffi.org>
parents:
3967
diff
changeset
|
1942 namespace: Optional[Union[str, Iterable[str]]] = None |
818db4ca3717
tools (xml_tools): accept several namespaces in `findAncestor`
Goffi <goffi@goffi.org>
parents:
3967
diff
changeset
|
1943 ) -> domish.Element: |
818db4ca3717
tools (xml_tools): accept several namespaces in `findAncestor`
Goffi <goffi@goffi.org>
parents:
3967
diff
changeset
|
1944 """Retrieve ancestor of an element |
818db4ca3717
tools (xml_tools): accept several namespaces in `findAncestor`
Goffi <goffi@goffi.org>
parents:
3967
diff
changeset
|
1945 |
818db4ca3717
tools (xml_tools): accept several namespaces in `findAncestor`
Goffi <goffi@goffi.org>
parents:
3967
diff
changeset
|
1946 @param elt: starting element, its parent will be checked recursively until the |
818db4ca3717
tools (xml_tools): accept several namespaces in `findAncestor`
Goffi <goffi@goffi.org>
parents:
3967
diff
changeset
|
1947 required one if found |
818db4ca3717
tools (xml_tools): accept several namespaces in `findAncestor`
Goffi <goffi@goffi.org>
parents:
3967
diff
changeset
|
1948 @param name: name of the element to find |
818db4ca3717
tools (xml_tools): accept several namespaces in `findAncestor`
Goffi <goffi@goffi.org>
parents:
3967
diff
changeset
|
1949 @param namespace: namespace of the element to find |
818db4ca3717
tools (xml_tools): accept several namespaces in `findAncestor`
Goffi <goffi@goffi.org>
parents:
3967
diff
changeset
|
1950 - None to find any element with that name |
818db4ca3717
tools (xml_tools): accept several namespaces in `findAncestor`
Goffi <goffi@goffi.org>
parents:
3967
diff
changeset
|
1951 - a simple string to find the namespace |
818db4ca3717
tools (xml_tools): accept several namespaces in `findAncestor`
Goffi <goffi@goffi.org>
parents:
3967
diff
changeset
|
1952 - several namespaces can be specified in an iterable, if an element with any of |
818db4ca3717
tools (xml_tools): accept several namespaces in `findAncestor`
Goffi <goffi@goffi.org>
parents:
3967
diff
changeset
|
1953 this namespace and given name is found, it will match |
818db4ca3717
tools (xml_tools): accept several namespaces in `findAncestor`
Goffi <goffi@goffi.org>
parents:
3967
diff
changeset
|
1954 |
818db4ca3717
tools (xml_tools): accept several namespaces in `findAncestor`
Goffi <goffi@goffi.org>
parents:
3967
diff
changeset
|
1955 """ |
818db4ca3717
tools (xml_tools): accept several namespaces in `findAncestor`
Goffi <goffi@goffi.org>
parents:
3967
diff
changeset
|
1956 if isinstance(namespace, str): |
818db4ca3717
tools (xml_tools): accept several namespaces in `findAncestor`
Goffi <goffi@goffi.org>
parents:
3967
diff
changeset
|
1957 namespace = [namespace] |
3491
2bd75fc2555d
tools (xml_tools): new findAncestor method:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
1958 current = elt.parent |
2bd75fc2555d
tools (xml_tools): new findAncestor method:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
1959 while True: |
2bd75fc2555d
tools (xml_tools): new findAncestor method:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
1960 if current is None: |
2bd75fc2555d
tools (xml_tools): new findAncestor method:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
1961 raise exceptions.NotFound( |
2bd75fc2555d
tools (xml_tools): new findAncestor method:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
1962 f"Can't find any ancestor {name!r} (xmlns: {namespace!r})" |
2bd75fc2555d
tools (xml_tools): new findAncestor method:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
1963 ) |
4010
818db4ca3717
tools (xml_tools): accept several namespaces in `findAncestor`
Goffi <goffi@goffi.org>
parents:
3967
diff
changeset
|
1964 if current.name == name and (namespace is None or current.uri in namespace): |
3491
2bd75fc2555d
tools (xml_tools): new findAncestor method:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
1965 return current |
2bd75fc2555d
tools (xml_tools): new findAncestor method:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
1966 current = current.parent |
2bd75fc2555d
tools (xml_tools): new findAncestor method:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
1967 |
2bd75fc2555d
tools (xml_tools): new findAncestor method:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
1968 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1969 def p_fmt_elt(elt, indent=0, defaultUri=""): |
3396
a4774f5b6b17
tools (xml_tools): `domish.Element` pretty formatting functions:
Goffi <goffi@goffi.org>
parents:
3395
diff
changeset
|
1970 """Pretty format a domish.Element""" |
a4774f5b6b17
tools (xml_tools): `domish.Element` pretty formatting functions:
Goffi <goffi@goffi.org>
parents:
3395
diff
changeset
|
1971 strings = [] |
a4774f5b6b17
tools (xml_tools): `domish.Element` pretty formatting functions:
Goffi <goffi@goffi.org>
parents:
3395
diff
changeset
|
1972 for child in elt.children: |
a4774f5b6b17
tools (xml_tools): `domish.Element` pretty formatting functions:
Goffi <goffi@goffi.org>
parents:
3395
diff
changeset
|
1973 if domish.IElement.providedBy(child): |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1974 strings.append(p_fmt_elt(child, indent+2, defaultUri=elt.defaultUri)) |
3396
a4774f5b6b17
tools (xml_tools): `domish.Element` pretty formatting functions:
Goffi <goffi@goffi.org>
parents:
3395
diff
changeset
|
1975 else: |
a4774f5b6b17
tools (xml_tools): `domish.Element` pretty formatting functions:
Goffi <goffi@goffi.org>
parents:
3395
diff
changeset
|
1976 strings.append(f"{(indent+2)*' '}{child!s}") |
a4774f5b6b17
tools (xml_tools): `domish.Element` pretty formatting functions:
Goffi <goffi@goffi.org>
parents:
3395
diff
changeset
|
1977 if elt.children: |
a4774f5b6b17
tools (xml_tools): `domish.Element` pretty formatting functions:
Goffi <goffi@goffi.org>
parents:
3395
diff
changeset
|
1978 nochild_elt = domish.Element( |
3466 | 1979 (elt.uri, elt.name), elt.defaultUri, elt.attributes, elt.localPrefixes |
3396
a4774f5b6b17
tools (xml_tools): `domish.Element` pretty formatting functions:
Goffi <goffi@goffi.org>
parents:
3395
diff
changeset
|
1980 ) |
3466 | 1981 strings.insert(0, f"{indent*' '}{nochild_elt.toXml(defaultUri=defaultUri)[:-2]}>") |
3396
a4774f5b6b17
tools (xml_tools): `domish.Element` pretty formatting functions:
Goffi <goffi@goffi.org>
parents:
3395
diff
changeset
|
1982 strings.append(f"{indent*' '}</{nochild_elt.name}>") |
a4774f5b6b17
tools (xml_tools): `domish.Element` pretty formatting functions:
Goffi <goffi@goffi.org>
parents:
3395
diff
changeset
|
1983 else: |
3466 | 1984 strings.append(f"{indent*' '}{elt.toXml(defaultUri=defaultUri)}") |
3396
a4774f5b6b17
tools (xml_tools): `domish.Element` pretty formatting functions:
Goffi <goffi@goffi.org>
parents:
3395
diff
changeset
|
1985 return '\n'.join(strings) |
a4774f5b6b17
tools (xml_tools): `domish.Element` pretty formatting functions:
Goffi <goffi@goffi.org>
parents:
3395
diff
changeset
|
1986 |
a4774f5b6b17
tools (xml_tools): `domish.Element` pretty formatting functions:
Goffi <goffi@goffi.org>
parents:
3395
diff
changeset
|
1987 |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1988 def pp_elt(elt): |
3396
a4774f5b6b17
tools (xml_tools): `domish.Element` pretty formatting functions:
Goffi <goffi@goffi.org>
parents:
3395
diff
changeset
|
1989 """Pretty print a domish.Element""" |
4037
524856bd7b19
massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents:
4032
diff
changeset
|
1990 print(p_fmt_elt(elt)) |
3914
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
1991 |
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
1992 |
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
1993 # ElementTree |
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
1994 |
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
1995 def et_get_namespace_and_name(et_elt: ET.Element) -> Tuple[Optional[str], str]: |
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
1996 """Retrieve element namespace and name from ElementTree element |
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
1997 |
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
1998 @param et_elt: ElementTree element |
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
1999 @return: namespace and name of the element |
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
2000 if not namespace if specified, None is returned |
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
2001 """ |
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
2002 name = et_elt.tag |
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
2003 if not name: |
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
2004 raise ValueError("no name set in ET element") |
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
2005 elif name[0] != "{": |
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
2006 return None, name |
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
2007 end_idx = name.find("}") |
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
2008 if end_idx == -1: |
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
2009 raise ValueError("Invalid ET name") |
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
2010 return name[1:end_idx], name[end_idx+1:] |
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
2011 |
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
2012 |
3955
323017a4e4d2
tools (xml_tools): `domish_elt_2_et_elt` and `et_elt_2_domish_elt` now handle lxml.etree
Goffi <goffi@goffi.org>
parents:
3914
diff
changeset
|
2013 def et_elt_2_domish_elt(et_elt: Union[ET.Element, etree.Element]) -> domish.Element: |
3914
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
2014 """Convert ElementTree element to Twisted's domish.Element |
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
2015 |
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
2016 Note: this is a naive implementation, adapted to XMPP, and some content are ignored |
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
2017 (attributes namespaces, tail) |
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
2018 """ |
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
2019 namespace, name = et_get_namespace_and_name(et_elt) |
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
2020 elt = domish.Element((namespace, name), attribs=et_elt.attrib) |
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
2021 if et_elt.text: |
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
2022 elt.addContent(et_elt.text) |
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
2023 for child in et_elt: |
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
2024 elt.addChild(et_elt_2_domish_elt(child)) |
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
2025 return elt |
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
2026 |
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
2027 |
3955
323017a4e4d2
tools (xml_tools): `domish_elt_2_et_elt` and `et_elt_2_domish_elt` now handle lxml.etree
Goffi <goffi@goffi.org>
parents:
3914
diff
changeset
|
2028 @overload |
323017a4e4d2
tools (xml_tools): `domish_elt_2_et_elt` and `et_elt_2_domish_elt` now handle lxml.etree
Goffi <goffi@goffi.org>
parents:
3914
diff
changeset
|
2029 def domish_elt_2_et_elt(elt: domish.Element, lxml: Literal[False]) -> ET.Element: |
323017a4e4d2
tools (xml_tools): `domish_elt_2_et_elt` and `et_elt_2_domish_elt` now handle lxml.etree
Goffi <goffi@goffi.org>
parents:
3914
diff
changeset
|
2030 ... |
323017a4e4d2
tools (xml_tools): `domish_elt_2_et_elt` and `et_elt_2_domish_elt` now handle lxml.etree
Goffi <goffi@goffi.org>
parents:
3914
diff
changeset
|
2031 |
323017a4e4d2
tools (xml_tools): `domish_elt_2_et_elt` and `et_elt_2_domish_elt` now handle lxml.etree
Goffi <goffi@goffi.org>
parents:
3914
diff
changeset
|
2032 @overload |
323017a4e4d2
tools (xml_tools): `domish_elt_2_et_elt` and `et_elt_2_domish_elt` now handle lxml.etree
Goffi <goffi@goffi.org>
parents:
3914
diff
changeset
|
2033 def domish_elt_2_et_elt(elt: domish.Element, lxml: Literal[True]) -> etree.Element: |
323017a4e4d2
tools (xml_tools): `domish_elt_2_et_elt` and `et_elt_2_domish_elt` now handle lxml.etree
Goffi <goffi@goffi.org>
parents:
3914
diff
changeset
|
2034 ... |
323017a4e4d2
tools (xml_tools): `domish_elt_2_et_elt` and `et_elt_2_domish_elt` now handle lxml.etree
Goffi <goffi@goffi.org>
parents:
3914
diff
changeset
|
2035 |
323017a4e4d2
tools (xml_tools): `domish_elt_2_et_elt` and `et_elt_2_domish_elt` now handle lxml.etree
Goffi <goffi@goffi.org>
parents:
3914
diff
changeset
|
2036 @overload |
323017a4e4d2
tools (xml_tools): `domish_elt_2_et_elt` and `et_elt_2_domish_elt` now handle lxml.etree
Goffi <goffi@goffi.org>
parents:
3914
diff
changeset
|
2037 def domish_elt_2_et_elt( |
323017a4e4d2
tools (xml_tools): `domish_elt_2_et_elt` and `et_elt_2_domish_elt` now handle lxml.etree
Goffi <goffi@goffi.org>
parents:
3914
diff
changeset
|
2038 elt: domish.Element, lxml: bool |
323017a4e4d2
tools (xml_tools): `domish_elt_2_et_elt` and `et_elt_2_domish_elt` now handle lxml.etree
Goffi <goffi@goffi.org>
parents:
3914
diff
changeset
|
2039 ) -> Union[ET.Element, etree.Element]: |
323017a4e4d2
tools (xml_tools): `domish_elt_2_et_elt` and `et_elt_2_domish_elt` now handle lxml.etree
Goffi <goffi@goffi.org>
parents:
3914
diff
changeset
|
2040 ... |
323017a4e4d2
tools (xml_tools): `domish_elt_2_et_elt` and `et_elt_2_domish_elt` now handle lxml.etree
Goffi <goffi@goffi.org>
parents:
3914
diff
changeset
|
2041 |
323017a4e4d2
tools (xml_tools): `domish_elt_2_et_elt` and `et_elt_2_domish_elt` now handle lxml.etree
Goffi <goffi@goffi.org>
parents:
3914
diff
changeset
|
2042 def domish_elt_2_et_elt(elt, lxml = False): |
3914
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
2043 """Convert Twisted's domish.Element to ElementTree equivalent |
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
2044 |
3955
323017a4e4d2
tools (xml_tools): `domish_elt_2_et_elt` and `et_elt_2_domish_elt` now handle lxml.etree
Goffi <goffi@goffi.org>
parents:
3914
diff
changeset
|
2045 Note: this is a naive implementation, adapted to XMPP, and some text content may be |
3914
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
2046 missing (content put after a tag, i.e. what would go to the "tail" attribute of ET |
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
2047 Element) |
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
2048 """ |
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
2049 tag = f"{{{elt.uri}}}{elt.name}" if elt.uri else elt.name |
3955
323017a4e4d2
tools (xml_tools): `domish_elt_2_et_elt` and `et_elt_2_domish_elt` now handle lxml.etree
Goffi <goffi@goffi.org>
parents:
3914
diff
changeset
|
2050 if lxml: |
323017a4e4d2
tools (xml_tools): `domish_elt_2_et_elt` and `et_elt_2_domish_elt` now handle lxml.etree
Goffi <goffi@goffi.org>
parents:
3914
diff
changeset
|
2051 et_elt = etree.Element(tag, attr=elt.attributes) |
323017a4e4d2
tools (xml_tools): `domish_elt_2_et_elt` and `et_elt_2_domish_elt` now handle lxml.etree
Goffi <goffi@goffi.org>
parents:
3914
diff
changeset
|
2052 else: |
323017a4e4d2
tools (xml_tools): `domish_elt_2_et_elt` and `et_elt_2_domish_elt` now handle lxml.etree
Goffi <goffi@goffi.org>
parents:
3914
diff
changeset
|
2053 et_elt = ET.Element(tag, attrib=elt.attributes) |
3914
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
2054 content = str(elt) |
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
2055 if content: |
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
2056 et_elt.text = str(elt) |
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
2057 for child in elt.elements(): |
3955
323017a4e4d2
tools (xml_tools): `domish_elt_2_et_elt` and `et_elt_2_domish_elt` now handle lxml.etree
Goffi <goffi@goffi.org>
parents:
3914
diff
changeset
|
2058 et_elt.append(domish_elt_2_et_elt(child, lxml=lxml)) |
3914
4cb38c8312a1
plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents:
3903
diff
changeset
|
2059 return et_elt |
3967
f461f11ea176
plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents:
3955
diff
changeset
|
2060 |
f461f11ea176
plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents:
3955
diff
changeset
|
2061 |
f461f11ea176
plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents:
3955
diff
changeset
|
2062 def domish_elt_2_et_elt2(element: domish.Element) -> ET.Element: |
f461f11ea176
plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents:
3955
diff
changeset
|
2063 """ |
f461f11ea176
plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents:
3955
diff
changeset
|
2064 WIP, originally from the OMEMO plugin |
f461f11ea176
plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents:
3955
diff
changeset
|
2065 """ |
f461f11ea176
plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents:
3955
diff
changeset
|
2066 |
f461f11ea176
plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents:
3955
diff
changeset
|
2067 element_name = element.name |
f461f11ea176
plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents:
3955
diff
changeset
|
2068 if element.uri is not None: |
f461f11ea176
plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents:
3955
diff
changeset
|
2069 element_name = "{" + element.uri + "}" + element_name |
f461f11ea176
plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents:
3955
diff
changeset
|
2070 |
f461f11ea176
plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents:
3955
diff
changeset
|
2071 attrib: Dict[str, str] = {} |
f461f11ea176
plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents:
3955
diff
changeset
|
2072 for qname, value in element.attributes.items(): |
f461f11ea176
plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents:
3955
diff
changeset
|
2073 attribute_name = qname[1] if isinstance(qname, tuple) else qname |
f461f11ea176
plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents:
3955
diff
changeset
|
2074 attribute_namespace = qname[0] if isinstance(qname, tuple) else None |
f461f11ea176
plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents:
3955
diff
changeset
|
2075 if attribute_namespace is not None: |
f461f11ea176
plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents:
3955
diff
changeset
|
2076 attribute_name = "{" + attribute_namespace + "}" + attribute_name |
f461f11ea176
plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents:
3955
diff
changeset
|
2077 |
f461f11ea176
plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents:
3955
diff
changeset
|
2078 attrib[attribute_name] = value |
f461f11ea176
plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents:
3955
diff
changeset
|
2079 |
f461f11ea176
plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents:
3955
diff
changeset
|
2080 result = ET.Element(element_name, attrib) |
f461f11ea176
plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents:
3955
diff
changeset
|
2081 |
f461f11ea176
plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents:
3955
diff
changeset
|
2082 last_child: Optional[ET.Element] = None |
f461f11ea176
plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents:
3955
diff
changeset
|
2083 for child in element.children: |
f461f11ea176
plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents:
3955
diff
changeset
|
2084 if isinstance(child, str): |
f461f11ea176
plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents:
3955
diff
changeset
|
2085 if last_child is None: |
f461f11ea176
plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents:
3955
diff
changeset
|
2086 result.text = child |
f461f11ea176
plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents:
3955
diff
changeset
|
2087 else: |
f461f11ea176
plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents:
3955
diff
changeset
|
2088 last_child.tail = child |
f461f11ea176
plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents:
3955
diff
changeset
|
2089 else: |
f461f11ea176
plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents:
3955
diff
changeset
|
2090 last_child = domish_elt_2_et_elt2(child) |
f461f11ea176
plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents:
3955
diff
changeset
|
2091 result.append(last_child) |
f461f11ea176
plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents:
3955
diff
changeset
|
2092 |
f461f11ea176
plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents:
3955
diff
changeset
|
2093 return result |