# HG changeset patch # User Goffi # Date 1509121475 -7200 # Node ID f05c884cd3ef12b8a60d7f6c8c33cfd0248399b1 # Parent dec31114c402197010b78a929d152fb19fc1962c plugin tickets: high level tickets handling, first draft: this plugin use plugin schema to handle tickets, and filter well known fields like created, updated and labels. diff -r dec31114c402 -r f05c884cd3ef src/plugins/plugin_misc_tickets.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/plugins/plugin_misc_tickets.py Fri Oct 27 18:24:35 2017 +0200 @@ -0,0 +1,109 @@ +#!/usr/bin/env python2 +# -*- coding: utf-8 -*- + +# SAT plugin for Pubsub Schemas +# Copyright (C) 2009-2017 Jérôme Poisson (goffi@goffi.org) + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. + +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +from sat.core.i18n import _ +from sat.core.constants import Const as C +from twisted.words.protocols.jabber import jid +from twisted.internet import defer +from sat.tools import utils +from sat.core.log import getLogger +log = getLogger(__name__) + +NS_TICKETS = 'org.salut-a-toi.tickets:0' + +PLUGIN_INFO = { + C.PI_NAME: _("Tickets management"), + C.PI_IMPORT_NAME: "TICKETS", + C.PI_TYPE: "EXP", + C.PI_PROTOCOLS: [], + C.PI_DEPENDENCIES: ["XEP-0060", "PUBSUB_SCHEMA"], + C.PI_MAIN: "Tickets", + C.PI_HANDLER: "no", + C.PI_DESCRIPTION: _("""Tickets management plugin""") +} + + +class Tickets(object): + + def __init__(self, host): + log.info(_(u"Tickets plugin initialization")) + self.host = host + self._p = self.host.plugins["XEP-0060"] + self._s = self.host.plugins["PUBSUB_SCHEMA"] + host.bridge.addMethod("ticketsGet", ".plugin", + in_sign='ssiassa{ss}s', out_sign='(asa{ss})', + method=self._get, + async=True + ) + + def _labelsFilter(self, widget_type, args, kwargs): + if widget_type != u'textbox': + return widget_type, args, kwargs + widget_type = u'list' + options = [o for o in args.pop(0).split(u'\n') if o] + kwargs = {'options': options, + 'name': kwargs.get('name'), + 'styles': (u'noselect', u'extensible', u'reducible')} + return widget_type, args, kwargs + + def _dateFilter(self, widget_type, args, kwargs): + if widget_type != u'string': + return widget_type, args, kwargs + # we convert XMPP date to timestamp + args[0] = unicode(utils.date_parse(args[0])) + return widget_type, args, kwargs + + def _get(self, service='', node='', max_items=10, item_ids=None, sub_id=None, extra_dict=None, profile_key=C.PROF_KEY_NONE): + client = self.host.getClient(profile_key) + service = jid.JID(service) if service else None + max_items = None if max_items == C.NO_LIMIT else max_items + extra = self._p.parseExtra(extra_dict) + d = self.get(client, service, node or None, max_items, item_ids, sub_id or None, extra.rsm_request, extra.extra) + d.addCallback(self._p.serItemsData) + return d + + @defer.inlineCallbacks + def get(self, client, service=None, node=None, max_items=None, item_ids=None, sub_id=None, rsm_request=None, extra=None): + """Retrieve tickets and convert them to XMLUI + + @param node(unicode, None): PubSub node to use + if None, default ticket node will be used + other parameters as the same as for [XEP_0060.getItems] + @return (list[unicode]): XMLUI of the tickets + """ + if not node: + node = NS_TICKETS + filters = {u'labels': self._labelsFilter, + u'created': self._dateFilter, + u'updated': self._dateFilter, + } + tickets, metadata = yield self._s.getDataFormItems( + client, + NS_TICKETS, + service, + node, + max_items = max_items, + item_ids = item_ids, + sub_id = sub_id, + rsm_request = rsm_request, + extra = extra, + filters = filters, + ) + + defer.returnValue((tickets, metadata))