Mercurial > libervia-backend
annotate sat/plugins/plugin_misc_lists.py @ 3466:80f8635dc66e
tools (xml_tools): fix pFmtElt:
default URI was not handled correctly, and attributes were missing, this patch fixes
those bugs.
author | Goffi <goffi@goffi.org> |
---|---|
date | Fri, 19 Feb 2021 15:53:25 +0100 |
parents | 54b9cdbeb335 |
children | c063cbb2ad6e |
rev | line source |
---|---|
3458 | 1 #!/usr/bin/env python3 |
2 | |
3 # Copyright (C) 2009-2020 Jérôme Poisson (goffi@goffi.org) | |
4 | |
5 # This program is free software: you can redistribute it and/or modify | |
6 # it under the terms of the GNU Affero General Public License as published by | |
7 # the Free Software Foundation, either version 3 of the License, or | |
8 # (at your option) any later version. | |
9 | |
10 # This program is distributed in the hope that it will be useful, | |
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 # GNU Affero General Public License for more details. | |
14 | |
15 # You should have received a copy of the GNU Affero General Public License | |
16 # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
17 | |
3460 | 18 import shortuuid |
3463
483bcfeb11c9
plugin misc list: register lists for pubsub invitations
Goffi <goffi@goffi.org>
parents:
3461
diff
changeset
|
19 from typing import List, Tuple, Optional |
3460 | 20 from twisted.internet import defer |
21 from twisted.words.xish import domish | |
22 from twisted.words.protocols.jabber import jid | |
23 from wokkel import data_form | |
3459
8dc26e5edcd3
plugin tickets, merge_requests: renamed "tickets" feature to "lists":
Goffi <goffi@goffi.org>
parents:
3458
diff
changeset
|
24 from sat.core.i18n import _, D_ |
3463
483bcfeb11c9
plugin misc list: register lists for pubsub invitations
Goffi <goffi@goffi.org>
parents:
3461
diff
changeset
|
25 from sat.core.xmpp import SatXMPPEntity |
3458 | 26 from sat.core.constants import Const as C |
27 from sat.tools.common import uri | |
3460 | 28 from sat.tools.common import data_format |
3458 | 29 from sat.core.log import getLogger |
30 | |
31 log = getLogger(__name__) | |
32 | |
3459
8dc26e5edcd3
plugin tickets, merge_requests: renamed "tickets" feature to "lists":
Goffi <goffi@goffi.org>
parents:
3458
diff
changeset
|
33 # XXX: this plugin was formely named "tickets", thus the namespace keeps this |
8dc26e5edcd3
plugin tickets, merge_requests: renamed "tickets" feature to "lists":
Goffi <goffi@goffi.org>
parents:
3458
diff
changeset
|
34 # name |
3458 | 35 APP_NS_TICKETS = "org.salut-a-toi.tickets:0" |
3460 | 36 NS_TICKETS_TYPE = "org.salut-a-toi.tickets#type:0" |
3458 | 37 |
38 PLUGIN_INFO = { | |
3459
8dc26e5edcd3
plugin tickets, merge_requests: renamed "tickets" feature to "lists":
Goffi <goffi@goffi.org>
parents:
3458
diff
changeset
|
39 C.PI_NAME: _("Pubsub Lists"), |
8dc26e5edcd3
plugin tickets, merge_requests: renamed "tickets" feature to "lists":
Goffi <goffi@goffi.org>
parents:
3458
diff
changeset
|
40 C.PI_IMPORT_NAME: "LISTS", |
3458 | 41 C.PI_TYPE: "EXP", |
42 C.PI_PROTOCOLS: [], | |
3463
483bcfeb11c9
plugin misc list: register lists for pubsub invitations
Goffi <goffi@goffi.org>
parents:
3461
diff
changeset
|
43 C.PI_DEPENDENCIES: ["XEP-0060", "XEP-0346", "XEP-0277", "IDENTITY", |
483bcfeb11c9
plugin misc list: register lists for pubsub invitations
Goffi <goffi@goffi.org>
parents:
3461
diff
changeset
|
44 "PUBSUB_INVITATION"], |
3459
8dc26e5edcd3
plugin tickets, merge_requests: renamed "tickets" feature to "lists":
Goffi <goffi@goffi.org>
parents:
3458
diff
changeset
|
45 C.PI_MAIN: "PubsubLists", |
3458 | 46 C.PI_HANDLER: "no", |
3459
8dc26e5edcd3
plugin tickets, merge_requests: renamed "tickets" feature to "lists":
Goffi <goffi@goffi.org>
parents:
3458
diff
changeset
|
47 C.PI_DESCRIPTION: _("""Pubsub lists management plugin"""), |
3458 | 48 } |
49 | |
3460 | 50 TEMPLATES = { |
51 "todo": { | |
52 "name": D_("TODO List"), | |
53 "icon": "check", | |
54 "fields": [ | |
55 {"name": "title"}, | |
56 {"name": "author"}, | |
57 {"name": "created"}, | |
58 {"name": "updated"}, | |
59 {"name": "time_limit"}, | |
60 {"name": "labels", "type": "text-multi"}, | |
61 { | |
62 "name": "status", | |
63 "label": D_("status"), | |
64 "type": "list-single", | |
65 "options": [ | |
66 { | |
67 "label": D_("to do"), | |
68 "value": "todo" | |
69 }, | |
70 { | |
71 "label": D_("in progress"), | |
72 "value": "in_progress" | |
73 }, | |
74 { | |
75 "label": D_("done"), | |
76 "value": "done" | |
77 }, | |
78 ], | |
79 "value": "todo" | |
80 }, | |
81 { | |
82 "name": "priority", | |
83 "label": D_("priority"), | |
84 "type": "list-single", | |
85 "options": [ | |
86 { | |
87 "label": D_("major"), | |
88 "value": "major" | |
89 }, | |
90 { | |
91 "label": D_("normal"), | |
92 "value": "normal" | |
93 }, | |
94 { | |
95 "label": D_("minor"), | |
96 "value": "minor" | |
97 }, | |
98 ], | |
99 "value": "normal" | |
100 }, | |
101 {"name": "body", "type": "xhtml"}, | |
102 {"name": "comments_uri"}, | |
103 ] | |
104 }, | |
105 "shopping": { | |
106 "name": D_("Shopping List"), | |
107 "icon": "basket", | |
108 "fields": [ | |
109 {"name": "name", "label": D_("name")}, | |
110 {"name": "quantity", "label": D_("quantity")}, | |
111 { | |
112 "name": "status", | |
113 "label": D_("status"), | |
114 "type": "list-single", | |
115 "options": [ | |
116 { | |
117 "label": D_("to buy"), | |
118 "value": "to_buy" | |
119 }, | |
120 { | |
121 "label": D_("bought"), | |
122 "value": "bought" | |
123 }, | |
124 ], | |
125 "value": "to_buy" | |
126 }, | |
127 ] | |
128 }, | |
129 "tickets": { | |
130 "name": D_("Tickets"), | |
131 "icon": "clipboard", | |
132 "fields": [ | |
133 {"name": "title"}, | |
134 {"name": "author"}, | |
135 {"name": "created"}, | |
136 {"name": "updated"}, | |
137 {"name": "labels", "type": "text-multi"}, | |
138 { | |
139 "name": "type", | |
140 "label": D_("type"), | |
141 "type": "list-single", | |
142 "options": [ | |
143 { | |
144 "label": D_("bug"), | |
145 "value": "bug" | |
146 }, | |
147 { | |
148 "label": D_("feature request"), | |
149 "value": "feature" | |
150 }, | |
151 ], | |
152 "value": "bug" | |
153 }, | |
154 { | |
155 "name": "status", | |
156 "label": D_("status"), | |
157 "type": "list-single", | |
158 "options": [ | |
159 { | |
160 "label": D_("queued"), | |
161 "value": "queued" | |
162 }, | |
163 { | |
164 "label": D_("started"), | |
165 "value": "started" | |
166 }, | |
167 { | |
168 "label": D_("review"), | |
169 "value": "review" | |
170 }, | |
171 { | |
172 "label": D_("closed"), | |
173 "value": "closed" | |
174 }, | |
175 ], | |
176 "value": "queued" | |
177 }, | |
178 { | |
179 "name": "priority", | |
180 "label": D_("priority"), | |
181 "type": "list-single", | |
182 "options": [ | |
183 { | |
184 "label": D_("major"), | |
185 "value": "major" | |
186 }, | |
187 { | |
188 "label": D_("normal"), | |
189 "value": "normal" | |
190 }, | |
191 { | |
192 "label": D_("minor"), | |
193 "value": "minor" | |
194 }, | |
195 ], | |
196 "value": "normal" | |
197 }, | |
198 {"name": "body", "type": "xhtml"}, | |
199 {"name": "comments_uri"}, | |
200 ] | |
201 } | |
202 } | |
203 | |
3458 | 204 |
3459
8dc26e5edcd3
plugin tickets, merge_requests: renamed "tickets" feature to "lists":
Goffi <goffi@goffi.org>
parents:
3458
diff
changeset
|
205 class PubsubLists: |
3458 | 206 |
207 def __init__(self, host): | |
3459
8dc26e5edcd3
plugin tickets, merge_requests: renamed "tickets" feature to "lists":
Goffi <goffi@goffi.org>
parents:
3458
diff
changeset
|
208 log.info(_("Pubsub lists plugin initialization")) |
3458 | 209 self.host = host |
210 self._s = self.host.plugins["XEP-0346"] | |
211 self.namespace = self._s.getSubmittedNS(APP_NS_TICKETS) | |
3461
02a8d227d5bb
plugin misc lists: register app NS for "tickets" NS instead of XEP-0346 submitted one
Goffi <goffi@goffi.org>
parents:
3460
diff
changeset
|
212 host.registerNamespace("tickets", APP_NS_TICKETS) |
3463
483bcfeb11c9
plugin misc list: register lists for pubsub invitations
Goffi <goffi@goffi.org>
parents:
3461
diff
changeset
|
213 self.host.plugins["PUBSUB_INVITATION"].register( |
483bcfeb11c9
plugin misc list: register lists for pubsub invitations
Goffi <goffi@goffi.org>
parents:
3461
diff
changeset
|
214 APP_NS_TICKETS, self |
483bcfeb11c9
plugin misc list: register lists for pubsub invitations
Goffi <goffi@goffi.org>
parents:
3461
diff
changeset
|
215 ) |
3458 | 216 self._p = self.host.plugins["XEP-0060"] |
217 self._m = self.host.plugins["XEP-0277"] | |
218 host.bridge.addMethod( | |
3459
8dc26e5edcd3
plugin tickets, merge_requests: renamed "tickets" feature to "lists":
Goffi <goffi@goffi.org>
parents:
3458
diff
changeset
|
219 "listGet", |
3458 | 220 ".plugin", |
221 in_sign="ssiassa{ss}s", | |
222 out_sign="s", | |
223 method=lambda service, node, max_items, items_ids, sub_id, extra, profile_key: | |
224 self._s._get( | |
225 service, | |
226 node, | |
227 max_items, | |
228 items_ids, | |
229 sub_id, | |
230 extra, | |
231 default_node=self.namespace, | |
232 form_ns=APP_NS_TICKETS, | |
233 filters={ | |
234 "author": self._s.valueOrPublisherFilter, | |
235 "created": self._s.dateFilter, | |
236 "updated": self._s.dateFilter, | |
3460 | 237 "time_limit": self._s.dateFilter, |
3458 | 238 }, |
239 profile_key=profile_key), | |
240 async_=True, | |
241 ) | |
242 host.bridge.addMethod( | |
3459
8dc26e5edcd3
plugin tickets, merge_requests: renamed "tickets" feature to "lists":
Goffi <goffi@goffi.org>
parents:
3458
diff
changeset
|
243 "listSet", |
3458 | 244 ".plugin", |
245 in_sign="ssa{sas}ssss", | |
246 out_sign="s", | |
247 method=self._set, | |
248 async_=True, | |
249 ) | |
250 host.bridge.addMethod( | |
3459
8dc26e5edcd3
plugin tickets, merge_requests: renamed "tickets" feature to "lists":
Goffi <goffi@goffi.org>
parents:
3458
diff
changeset
|
251 "listSchemaGet", |
3458 | 252 ".plugin", |
253 in_sign="sss", | |
254 out_sign="s", | |
255 method=lambda service, nodeIdentifier, profile_key: self._s._getUISchema( | |
256 service, nodeIdentifier, default_node=self.namespace, | |
257 profile_key=profile_key), | |
258 async_=True, | |
259 ) | |
3460 | 260 host.bridge.addMethod( |
3464
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
261 "listsList", |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
262 ".plugin", |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
263 in_sign="sss", |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
264 out_sign="s", |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
265 method=self._listsList, |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
266 async_=True, |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
267 ) |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
268 host.bridge.addMethod( |
3460 | 269 "listTemplatesNamesGet", |
270 ".plugin", | |
271 in_sign="ss", | |
272 out_sign="s", | |
273 method=self._getTemplatesNames, | |
274 ) | |
275 host.bridge.addMethod( | |
276 "listTemplateGet", | |
277 ".plugin", | |
278 in_sign="sss", | |
279 out_sign="s", | |
280 method=self._getTemplate, | |
281 ) | |
282 host.bridge.addMethod( | |
283 "listTemplateCreate", | |
284 ".plugin", | |
285 in_sign="ssss", | |
286 out_sign="(ss)", | |
287 method=self._createTemplate, | |
288 async_=True, | |
289 ) | |
3458 | 290 |
3463
483bcfeb11c9
plugin misc list: register lists for pubsub invitations
Goffi <goffi@goffi.org>
parents:
3461
diff
changeset
|
291 async def onInvitationPreflight( |
483bcfeb11c9
plugin misc list: register lists for pubsub invitations
Goffi <goffi@goffi.org>
parents:
3461
diff
changeset
|
292 self, |
483bcfeb11c9
plugin misc list: register lists for pubsub invitations
Goffi <goffi@goffi.org>
parents:
3461
diff
changeset
|
293 client: SatXMPPEntity, |
483bcfeb11c9
plugin misc list: register lists for pubsub invitations
Goffi <goffi@goffi.org>
parents:
3461
diff
changeset
|
294 namespace: str, |
483bcfeb11c9
plugin misc list: register lists for pubsub invitations
Goffi <goffi@goffi.org>
parents:
3461
diff
changeset
|
295 name: str, |
483bcfeb11c9
plugin misc list: register lists for pubsub invitations
Goffi <goffi@goffi.org>
parents:
3461
diff
changeset
|
296 extra: dict, |
483bcfeb11c9
plugin misc list: register lists for pubsub invitations
Goffi <goffi@goffi.org>
parents:
3461
diff
changeset
|
297 service: jid.JID, |
483bcfeb11c9
plugin misc list: register lists for pubsub invitations
Goffi <goffi@goffi.org>
parents:
3461
diff
changeset
|
298 node: str, |
483bcfeb11c9
plugin misc list: register lists for pubsub invitations
Goffi <goffi@goffi.org>
parents:
3461
diff
changeset
|
299 item_id: Optional[str], |
483bcfeb11c9
plugin misc list: register lists for pubsub invitations
Goffi <goffi@goffi.org>
parents:
3461
diff
changeset
|
300 item_elt: domish.Element |
483bcfeb11c9
plugin misc list: register lists for pubsub invitations
Goffi <goffi@goffi.org>
parents:
3461
diff
changeset
|
301 ) -> None: |
483bcfeb11c9
plugin misc list: register lists for pubsub invitations
Goffi <goffi@goffi.org>
parents:
3461
diff
changeset
|
302 try: |
483bcfeb11c9
plugin misc list: register lists for pubsub invitations
Goffi <goffi@goffi.org>
parents:
3461
diff
changeset
|
303 schema = await self._s.getSchemaForm(client, service, node) |
483bcfeb11c9
plugin misc list: register lists for pubsub invitations
Goffi <goffi@goffi.org>
parents:
3461
diff
changeset
|
304 except Exception as e: |
483bcfeb11c9
plugin misc list: register lists for pubsub invitations
Goffi <goffi@goffi.org>
parents:
3461
diff
changeset
|
305 log.warning(f"Can't retrive node schema as {node!r} [{service}]: {e}") |
483bcfeb11c9
plugin misc list: register lists for pubsub invitations
Goffi <goffi@goffi.org>
parents:
3461
diff
changeset
|
306 else: |
483bcfeb11c9
plugin misc list: register lists for pubsub invitations
Goffi <goffi@goffi.org>
parents:
3461
diff
changeset
|
307 try: |
483bcfeb11c9
plugin misc list: register lists for pubsub invitations
Goffi <goffi@goffi.org>
parents:
3461
diff
changeset
|
308 field_type = schema[NS_TICKETS_TYPE] |
483bcfeb11c9
plugin misc list: register lists for pubsub invitations
Goffi <goffi@goffi.org>
parents:
3461
diff
changeset
|
309 except KeyError: |
483bcfeb11c9
plugin misc list: register lists for pubsub invitations
Goffi <goffi@goffi.org>
parents:
3461
diff
changeset
|
310 log.debug("no type found in list schema") |
483bcfeb11c9
plugin misc list: register lists for pubsub invitations
Goffi <goffi@goffi.org>
parents:
3461
diff
changeset
|
311 else: |
483bcfeb11c9
plugin misc list: register lists for pubsub invitations
Goffi <goffi@goffi.org>
parents:
3461
diff
changeset
|
312 list_elt = extra["element"] = domish.Element((APP_NS_TICKETS, "list")) |
483bcfeb11c9
plugin misc list: register lists for pubsub invitations
Goffi <goffi@goffi.org>
parents:
3461
diff
changeset
|
313 list_elt["type"] = field_type |
483bcfeb11c9
plugin misc list: register lists for pubsub invitations
Goffi <goffi@goffi.org>
parents:
3461
diff
changeset
|
314 |
3458 | 315 def _set(self, service, node, values, schema=None, item_id=None, extra='', |
316 profile_key=C.PROF_KEY_NONE): | |
317 client, service, node, schema, item_id, extra = self._s.prepareBridgeSet( | |
318 service, node, schema, item_id, extra, profile_key | |
319 ) | |
320 d = defer.ensureDeferred(self.set( | |
321 client, service, node, values, schema, item_id, extra, deserialise=True | |
322 )) | |
323 d.addCallback(lambda ret: ret or "") | |
324 return d | |
325 | |
3460 | 326 async def set( |
327 self, client, service, node, values, schema=None, item_id=None, extra=None, | |
328 deserialise=False, form_ns=APP_NS_TICKETS | |
329 ): | |
3458 | 330 """Publish a tickets |
331 | |
332 @param node(unicode, None): Pubsub node to use | |
333 None to use default tickets node | |
334 @param values(dict[key(unicode), [iterable[object]|object]]): values of the ticket | |
335 | |
336 if value is not iterable, it will be put in a list | |
337 'created' and 'updated' will be forced to current time: | |
338 - 'created' is set if item_id is None, i.e. if it's a new ticket | |
339 - 'updated' is set everytime | |
340 @param extra(dict, None): same as for [XEP-0060.sendItem] with additional keys: | |
341 - update(bool): if True, get previous item data to merge with current one | |
342 if True, item_id must be None | |
343 other arguments are same as for [self._s.sendDataFormItem] | |
344 @return (unicode): id of the created item | |
345 """ | |
346 if not node: | |
347 node = self.namespace | |
348 | |
349 if not item_id: | |
350 comments_service = await self._m.getCommentsService(client, service) | |
351 | |
352 # we need to use uuid for comments node, because we don't know item id in | |
353 # advance (we don't want to set it ourselves to let the server choose, so we | |
354 # can have a nicer id if serial ids is activated) | |
355 comments_node = self._m.getCommentsNode( | |
356 node + "_" + str(shortuuid.uuid()) | |
357 ) | |
358 options = { | |
359 self._p.OPT_ACCESS_MODEL: self._p.ACCESS_OPEN, | |
360 self._p.OPT_PERSIST_ITEMS: 1, | |
361 self._p.OPT_MAX_ITEMS: -1, | |
362 self._p.OPT_DELIVER_PAYLOADS: 1, | |
363 self._p.OPT_SEND_ITEM_SUBSCRIBE: 1, | |
364 self._p.OPT_PUBLISH_MODEL: self._p.ACCESS_OPEN, | |
365 } | |
366 await self._p.createNode(client, comments_service, comments_node, options) | |
367 values["comments_uri"] = uri.buildXMPPUri( | |
368 "pubsub", | |
369 subtype="microblog", | |
370 path=comments_service.full(), | |
371 node=comments_node, | |
372 ) | |
373 | |
374 return await self._s.set( | |
375 client, service, node, values, schema, item_id, extra, deserialise, form_ns | |
376 ) | |
3460 | 377 |
3464
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
378 def _listsList(self, service, node, profile): |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
379 service = jid.JID(service) if service else None |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
380 node = node or None |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
381 client = self.host.getClient(profile) |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
382 d = defer.ensureDeferred(self.listsList(client, service, node)) |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
383 d.addCallback(data_format.serialise) |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
384 return d |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
385 |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
386 async def listsList( |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
387 self, client, service: Optional[jid.JID], node: Optional[str]=None |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
388 ) -> List[dict]: |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
389 """Retrieve list of pubsub lists registered in personal interests |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
390 |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
391 @return list: list of lists metadata |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
392 """ |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
393 items, metadata = await self.host.plugins['LIST_INTEREST'].listInterests( |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
394 client, service, node, namespace=APP_NS_TICKETS) |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
395 lists = [] |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
396 for item in items: |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
397 interest_elt = item.interest |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
398 if interest_elt is None: |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
399 log.warning(f"invalid interest for {client.profile}: {item.toXml}") |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
400 continue |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
401 if interest_elt.getAttribute("namespace") != APP_NS_TICKETS: |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
402 continue |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
403 pubsub_elt = interest_elt.pubsub |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
404 list_data = { |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
405 "id": item["id"], |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
406 "name": interest_elt["name"], |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
407 "service": pubsub_elt["service"], |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
408 "node": pubsub_elt["node"], |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
409 "creator": C.bool(pubsub_elt.getAttribute("creator", C.BOOL_FALSE)), |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
410 } |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
411 try: |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
412 list_elt = next(pubsub_elt.elements(APP_NS_TICKETS, "list")) |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
413 except StopIteration: |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
414 pass |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
415 else: |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
416 list_type = list_data["type"] = list_elt["type"] |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
417 if list_type in TEMPLATES: |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
418 list_data["icon_name"] = TEMPLATES[list_type]["icon"] |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
419 lists.append(list_data) |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
420 |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
421 return lists |
54b9cdbeb335
plugin lists: new `listsList` method to retrieve lists from personal interests
Goffi <goffi@goffi.org>
parents:
3463
diff
changeset
|
422 |
3460 | 423 def _getTemplatesNames(self, language, profile): |
424 client = self.host.getClient(profile) | |
425 return data_format.serialise(self.getTemplatesNames(client, language)) | |
426 | |
427 def getTemplatesNames(self, client, language: str) -> list: | |
428 """Retrieve well known list templates""" | |
429 | |
430 templates = [{"id": tpl_id, "name": d["name"], "icon": d["icon"]} | |
431 for tpl_id, d in TEMPLATES.items()] | |
432 return templates | |
433 | |
434 def _getTemplate(self, name, language, profile): | |
435 client = self.host.getClient(profile) | |
436 return data_format.serialise(self.getTemplate(client, name, language)) | |
437 | |
438 def getTemplate(self, client, name: str, language: str) -> dict: | |
439 """Retrieve a well known template""" | |
440 return TEMPLATES[name] | |
441 | |
442 def _createTemplate(self, template_id, name, access_model, profile): | |
443 client = self.host.getClient(profile) | |
444 d = defer.ensureDeferred(self.createTemplate( | |
445 client, template_id, name, access_model | |
446 )) | |
447 d.addCallback(lambda node_data: (node_data[0].full(), node_data[1])) | |
448 return d | |
449 | |
450 async def createTemplate( | |
451 self, client, template_id: str, name: str, access_model: str | |
452 ) -> Tuple[jid.JID, str]: | |
453 """Create a list from a template""" | |
454 name = name.strip() | |
455 if not name: | |
456 name = shortuuid.uuid() | |
457 template = TEMPLATES[template_id] | |
458 | |
459 fields = [ | |
460 data_form.Field(fieldType="hidden", var=NS_TICKETS_TYPE, value=template_id) | |
461 ] | |
462 for field_data in template['fields']: | |
463 field_type = field_data.get('type', 'text-single') | |
464 kwargs = { | |
465 "fieldType": field_type, | |
466 "var": field_data["name"], | |
467 "label": field_data.get('label'), | |
468 "value": field_data.get("value"), | |
469 } | |
470 if field_type == "xhtml": | |
471 kwargs.update({ | |
472 "fieldType": None, | |
473 "ext_type": "xml", | |
474 }) | |
475 if kwargs["value"] is None: | |
476 kwargs["value"] = domish.Element((C.NS_XHTML, "div")) | |
477 elif "options" in field_data: | |
478 kwargs["options"] = [ | |
479 data_form.Option(o["value"], o.get("label")) | |
480 for o in field_data["options"] | |
481 ] | |
482 field = data_form.Field(**kwargs) | |
483 fields.append(field) | |
484 | |
485 schema = data_form.Form( | |
486 "form", | |
487 formNamespace=APP_NS_TICKETS, | |
488 fields=fields | |
489 ).toElement() | |
490 | |
491 service = client.jid.userhostJID() | |
492 node = self._s.getSubmittedNS(f"{APP_NS_TICKETS}_{name}") | |
493 options = { | |
494 self._p.OPT_ACCESS_MODEL: access_model | |
495 } | |
496 await self._p.createNode(client, service, node, options) | |
497 await self._s.setSchema(client, service, node, schema) | |
498 list_elt = domish.Element((APP_NS_TICKETS, "list")) | |
499 list_elt["type"] = template_id | |
500 try: | |
501 await self.host.plugins['LIST_INTEREST'].registerPubsub( | |
502 client, APP_NS_TICKETS, service, node, creator=True, | |
503 name=name, element=list_elt) | |
504 except Exception as e: | |
505 log.warning(f"Can't add list to interests: {e}") | |
506 return service, node |