Mercurial > libervia-backend
comparison sat/plugins/plugin_misc_merge_requests.py @ 3452:bb0225aaf4e6
plugin XEP-0346: "Form Discovery and Publishing" implementation:
this implementation replaces the former non standard node schema, and works in a similar
way (the schema is put in a separated node instead of a special field, thus it will now
work with most/all PubSub services, and not only SàT PubSub).
The implementation has been done in a way that nothing should be changed in frontends
(bridge methods names and arguments stay the same). The nodes are modified, but if values
are taken from backend, it's automatically adapted.
author | Goffi <goffi@goffi.org> |
---|---|
date | Fri, 11 Dec 2020 17:57:00 +0100 |
parents | 71761e9fb984 |
children | 6deea0d8d0e7 |
comparison
equal
deleted
inserted
replaced
3451:f37e6e78db12 | 3452:bb0225aaf4e6 |
---|---|
27 from sat.core.log import getLogger | 27 from sat.core.log import getLogger |
28 | 28 |
29 | 29 |
30 log = getLogger(__name__) | 30 log = getLogger(__name__) |
31 | 31 |
32 NS_MERGE_REQUESTS = 'org.salut-a-toi.merge_requests:0' | 32 APP_NS_MERGE_REQUESTS = 'org.salut-a-toi.merge_requests:0' |
33 | 33 |
34 PLUGIN_INFO = { | 34 PLUGIN_INFO = { |
35 C.PI_NAME: _("Merge requests management"), | 35 C.PI_NAME: _("Merge requests management"), |
36 C.PI_IMPORT_NAME: "MERGE_REQUESTS", | 36 C.PI_IMPORT_NAME: "MERGE_REQUESTS", |
37 C.PI_TYPE: "EXP", | 37 C.PI_TYPE: "EXP", |
38 C.PI_PROTOCOLS: [], | 38 C.PI_PROTOCOLS: [], |
39 C.PI_DEPENDENCIES: ["XEP-0060", "PUBSUB_SCHEMA", "TICKETS", "TEXT_SYNTAXES"], | 39 C.PI_DEPENDENCIES: ["XEP-0060", "XEP-0346", "TICKETS", "TEXT_SYNTAXES"], |
40 C.PI_MAIN: "MergeRequests", | 40 C.PI_MAIN: "MergeRequests", |
41 C.PI_HANDLER: "no", | 41 C.PI_HANDLER: "no", |
42 C.PI_DESCRIPTION: _("""Merge requests management plugin""") | 42 C.PI_DESCRIPTION: _("""Merge requests management plugin""") |
43 } | 43 } |
44 | 44 |
66 META_DIFF_IDX = 'diff_idx' | 66 META_DIFF_IDX = 'diff_idx' |
67 | 67 |
68 def __init__(self, host): | 68 def __init__(self, host): |
69 log.info(_("Merge requests plugin initialization")) | 69 log.info(_("Merge requests plugin initialization")) |
70 self.host = host | 70 self.host = host |
71 host.registerNamespace('merge_requests', NS_MERGE_REQUESTS) | 71 self._s = self.host.plugins["XEP-0346"] |
72 self.namespace = self._s.getSubmittedNS(APP_NS_MERGE_REQUESTS) | |
73 host.registerNamespace('merge_requests', self.namespace) | |
72 self._p = self.host.plugins["XEP-0060"] | 74 self._p = self.host.plugins["XEP-0060"] |
73 self._s = self.host.plugins["PUBSUB_SCHEMA"] | |
74 self._t = self.host.plugins["TICKETS"] | 75 self._t = self.host.plugins["TICKETS"] |
75 self._handlers = {} | 76 self._handlers = {} |
76 self._handlers_list = [] # handlers sorted by priority | 77 self._handlers_list = [] # handlers sorted by priority |
77 self._type_handlers = {} # data type => handler map | 78 self._type_handlers = {} # data type => handler map |
78 host.bridge.addMethod("mergeRequestsGet", ".plugin", | 79 host.bridge.addMethod("mergeRequestsGet", ".plugin", |
87 host.bridge.addMethod("mergeRequestsSchemaGet", ".plugin", | 88 host.bridge.addMethod("mergeRequestsSchemaGet", ".plugin", |
88 in_sign='sss', out_sign='s', | 89 in_sign='sss', out_sign='s', |
89 method=lambda service, nodeIdentifier, profile_key: | 90 method=lambda service, nodeIdentifier, profile_key: |
90 self._s._getUISchema(service, | 91 self._s._getUISchema(service, |
91 nodeIdentifier, | 92 nodeIdentifier, |
92 default_node=NS_MERGE_REQUESTS, | 93 default_node=self.namespace, |
93 profile_key=profile_key), | 94 profile_key=profile_key), |
94 async_=True) | 95 async_=True) |
95 host.bridge.addMethod("mergeRequestParseData", ".plugin", | 96 host.bridge.addMethod("mergeRequestParseData", ".plugin", |
96 in_sign='ss', out_sign='aa{ss}', | 97 in_sign='ss', out_sign='aa{ss}', |
97 method=self._parseData, | 98 method=self._parseData, |
170 - XMLUI of the tickets, like [TICKETS._get] | 171 - XMLUI of the tickets, like [TICKETS._get] |
171 - node metadata | 172 - node metadata |
172 - list of parsed request data (if extra['parse'] is set, else empty list) | 173 - list of parsed request data (if extra['parse'] is set, else empty list) |
173 """ | 174 """ |
174 if not node: | 175 if not node: |
175 node = NS_MERGE_REQUESTS | 176 node = self.namespace |
176 if extra is None: | 177 if extra is None: |
177 extra = {} | 178 extra = {} |
178 # XXX: Q&D way to get list for labels when displaying them, but text when we | 179 # XXX: Q&D way to get list for labels when displaying them, but text when we |
179 # have to modify them | 180 # have to modify them |
180 if C.bool(extra.get('labels_as_list', C.BOOL_FALSE)): | 181 if C.bool(extra.get('labels_as_list', C.BOOL_FALSE)): |
181 filters = {'labels': self._s.textbox2ListFilter} | 182 filters = {'labels': self._s.textbox2ListFilter} |
182 else: | 183 else: |
183 filters = {} | 184 filters = {} |
184 tickets_xmlui, metadata = yield self._s.getDataFormItems( | 185 tickets_xmlui, metadata = yield defer.ensureDeferred( |
185 client, | 186 self._s.getDataFormItems( |
186 service, | 187 client, |
187 node, | 188 service, |
188 max_items=max_items, | 189 node, |
189 item_ids=item_ids, | 190 max_items=max_items, |
190 sub_id=sub_id, | 191 item_ids=item_ids, |
191 rsm_request=rsm_request, | 192 sub_id=sub_id, |
192 extra=extra, | 193 rsm_request=rsm_request, |
193 form_ns=NS_MERGE_REQUESTS, | 194 extra=extra, |
194 filters = filters) | 195 form_ns=APP_NS_MERGE_REQUESTS, |
196 filters = filters) | |
197 ) | |
195 parsed_patches = [] | 198 parsed_patches = [] |
196 if extra.get('parse', False): | 199 if extra.get('parse', False): |
197 for ticket in tickets_xmlui: | 200 for ticket in tickets_xmlui: |
198 request_type = ticket.named_widgets[FIELD_DATA_TYPE].value | 201 request_type = ticket.named_widgets[FIELD_DATA_TYPE].value |
199 request_data = ticket.named_widgets[FIELD_DATA].value | 202 request_data = ticket.named_widgets[FIELD_DATA].value |
226 or "auto" to try autodetection. | 229 or "auto" to try autodetection. |
227 other arguments are same as for [TICKETS.set] | 230 other arguments are same as for [TICKETS.set] |
228 @return (unicode): id of the created item | 231 @return (unicode): id of the created item |
229 """ | 232 """ |
230 if not node: | 233 if not node: |
231 node = NS_MERGE_REQUESTS | 234 node = self.namespace |
232 if values is None: | 235 if values is None: |
233 values = {} | 236 values = {} |
234 update = extra.get('update', False) | 237 update = extra.get('update', False) |
235 if not repository and not update: | 238 if not repository and not update: |
236 # in case of update, we may re-user former patches data | 239 # in case of update, we may re-user former patches data |
283 ns=C.NS_XHTML, xhtml=xhtml) | 286 ns=C.NS_XHTML, xhtml=xhtml) |
284 | 287 |
285 values[FIELD_DATA] = data | 288 values[FIELD_DATA] = data |
286 | 289 |
287 item_id = await self._t.set(client, service, node, values, schema, item_id, extra, | 290 item_id = await self._t.set(client, service, node, values, schema, item_id, extra, |
288 deserialise, form_ns=NS_MERGE_REQUESTS) | 291 deserialise, form_ns=APP_NS_MERGE_REQUESTS) |
289 return item_id | 292 return item_id |
290 | 293 |
291 def _parseData(self, data_type, data): | 294 def _parseData(self, data_type, data): |
292 d = self.parseData(data_type, data) | 295 d = self.parseData(data_type, data) |
293 d.addCallback(lambda parsed_patches: | 296 d.addCallback(lambda parsed_patches: |
324 """Import a merge request in specified directory | 327 """Import a merge request in specified directory |
325 | 328 |
326 @param repository(unicode): path to the repository where the code stands | 329 @param repository(unicode): path to the repository where the code stands |
327 """ | 330 """ |
328 if not node: | 331 if not node: |
329 node = NS_MERGE_REQUESTS | 332 node = self.namespace |
330 tickets_xmlui, metadata = yield self._s.getDataFormItems( | 333 tickets_xmlui, metadata = yield defer.ensureDeferred( |
331 client, | 334 self._s.getDataFormItems( |
332 service, | 335 client, |
333 node, | 336 service, |
334 max_items=1, | 337 node, |
335 item_ids=[item], | 338 max_items=1, |
336 form_ns=NS_MERGE_REQUESTS) | 339 item_ids=[item], |
340 form_ns=APP_NS_MERGE_REQUESTS) | |
341 ) | |
337 ticket_xmlui = tickets_xmlui[0] | 342 ticket_xmlui = tickets_xmlui[0] |
338 data = ticket_xmlui.named_widgets[FIELD_DATA].value | 343 data = ticket_xmlui.named_widgets[FIELD_DATA].value |
339 data_type = ticket_xmlui.named_widgets[FIELD_DATA_TYPE].value | 344 data_type = ticket_xmlui.named_widgets[FIELD_DATA_TYPE].value |
340 try: | 345 try: |
341 handler = self._type_handlers[data_type] | 346 handler = self._type_handlers[data_type] |