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]