annotate src/plugins/plugin_xep_0055.py @ 2144:1d3f73e065e1

core, jp: component handling + client handling refactoring: - SàT can now handle components - plugin have now a "modes" key in PLUGIN_INFO where they declare if they can be used with clients and or components. They default to be client only. - components are really similar to clients, but with some changes in behaviour: * component has "entry point", which is a special plugin with a componentStart method, which is called just after component is connected * trigger end with a different suffixes (e.g. profileConnected vs profileConnectedComponent), so a plugin which manage both clients and components can have different workflow * for clients, only triggers of plugins handling client mode are launched * for components, only triggers of plugins needed in dependencies are launched. They all must handle component mode. * component have a sendHistory attribute (False by default) which can be set to True to allow saving sent messages into history * for convenience, "client" is still used in method even if it can now be a component * a new "component" boolean attribute tells if we have a component or a client * components have to add themselve Message protocol * roster and presence protocols are not added for components * component default port is 5347 (which is Prosody's default port) - asyncCreateProfile has been renamed for profileCreate, both to follow new naming convention and to prepare the transition to fully asynchronous bridge - createProfile has a new "component" attribute. When used to create a component, it must be set to a component entry point - jp: added --component argument to profile/create - disconnect bridge method is now asynchronous, this way frontends can know when disconnection is finished - new PI_* constants for PLUGIN_INFO values (not used everywhere yet) - client/component connection workflow has been moved to their classes instead of being a host methods - host.messageSend is now client.sendMessage, and former client.sendMessage is now client.sendMessageData. - identities are now handled in client.identities list, so it can be updated dynamically by plugins (in the future, frontends should be able to update them too through bridge) - profileConnecting* profileConnected* profileDisconnected* and getHandler now all use client instead of profile
author Goffi <goffi@goffi.org>
date Sun, 12 Feb 2017 17:55:43 +0100
parents 2daf7b4c6756
children 33c8c4973743
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1934
2daf7b4c6756 use of /usr/bin/env instead of /usr/bin/python in shebang
Goffi <goffi@goffi.org>
parents: 1810
diff changeset
1 #!/usr/bin/env python2
631
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
2 # -*- coding: utf-8 -*-
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
3
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
4 # SAT plugin for Jabber Search (xep-0055)
1766
d17772b0fe22 copyright update
Goffi <goffi@goffi.org>
parents: 1707
diff changeset
5 # Copyright (C) 2009-2016 Jérôme Poisson (goffi@goffi.org)
631
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
6
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
7 # This program is free software: you can redistribute it and/or modify
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
8 # it under the terms of the GNU Affero General Public License as published by
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
9 # the Free Software Foundation, either version 3 of the License, or
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
10 # (at your option) any later version.
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
11
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
12 # This program is distributed in the hope that it will be useful,
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
15 # GNU Affero General Public License for more details.
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
16
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
17 # You should have received a copy of the GNU Affero General Public License
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
19
799
7f2082b192ed plugin XEP-0055, Primitivus: Directory search dialogs are now entirely done in plugin XEP-0055, specific code in frontend is not needed anymore
Goffi <goffi@goffi.org>
parents: 771
diff changeset
20 from sat.core.i18n import _, D_
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 867
diff changeset
21 from sat.core.log import getLogger
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 867
diff changeset
22 log = getLogger(__name__)
1498
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
23
631
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
24 from twisted.words.protocols.jabber.xmlstream import IQ
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
25 from twisted.words.protocols.jabber import jid
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 867
diff changeset
26 from twisted.internet import defer
631
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
27 from wokkel import data_form
1498
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
28 from sat.core.constants import Const as C
631
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
29 from sat.core.exceptions import DataError
799
7f2082b192ed plugin XEP-0055, Primitivus: Directory search dialogs are now entirely done in plugin XEP-0055, specific code in frontend is not needed anymore
Goffi <goffi@goffi.org>
parents: 771
diff changeset
30 from sat.tools import xml_tools
631
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
31
1498
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
32 from wokkel import disco, iwokkel
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
33 try:
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
34 from twisted.words.protocols.xmlstream import XMPPHandler
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
35 except ImportError:
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
36 from wokkel.subprotocols import XMPPHandler
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
37 from zope.interface import implements
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
38
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
39
631
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
40 NS_SEARCH = 'jabber:iq:search'
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
41
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
42 PLUGIN_INFO = {
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
43 "name": "Jabber Search",
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
44 "import_name": "XEP-0055",
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
45 "type": "XEP",
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
46 "protocols": ["XEP-0055"],
1219
16484ebb695b plugin XEP-0059: first draft, pubsub and jabber search do not exploit it yet
souliane <souliane@mailoo.org>
parents: 993
diff changeset
47 "dependencies": [],
1810
25c3569abb71 plugin XEP-0055, tmp_directory_subscription: move directory subscription to a new temporary plugin
souliane <souliane@mailoo.org>
parents: 1766
diff changeset
48 "recommendations": ["XEP-0059"],
631
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
49 "main": "XEP_0055",
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
50 "handler": "no",
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
51 "description": _("""Implementation of Jabber Search""")
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
52 }
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
53
1498
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
54 # config file parameters
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
55 CONFIG_SECTION = "plugin search"
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
56 CONFIG_SERVICE_LIST = "service_list"
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
57
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
58 DEFAULT_SERVICE_LIST = ["salut.libervia.org"]
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
59
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
60 FIELD_SINGLE = "field_single" # single text field for the simple search
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
61 FIELD_CURRENT_SERVICE = "current_service_jid" # read-only text field for the advanced search
631
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
62
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
63 class XEP_0055(object):
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
64
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
65 def __init__(self, host):
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 867
diff changeset
66 log.info(_("Jabber search plugin initialization"))
631
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
67 self.host = host
1498
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
68
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
69 # default search services (config file + hard-coded lists)
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
70 self.services = [jid.JID(entry) for entry in host.memory.getConfig(CONFIG_SECTION, CONFIG_SERVICE_LIST, DEFAULT_SERVICE_LIST)]
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
71
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
72 host.bridge.addMethod("searchGetFieldsUI", ".plugin", in_sign='ss', out_sign='s',
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
73 method=self._getFieldsUI,
631
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
74 async=True)
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
75 host.bridge.addMethod("searchRequest", ".plugin", in_sign='sa{ss}s', out_sign='s',
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
76 method=self._searchRequest,
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
77 async=True)
799
7f2082b192ed plugin XEP-0055, Primitivus: Directory search dialogs are now entirely done in plugin XEP-0055, specific code in frontend is not needed anymore
Goffi <goffi@goffi.org>
parents: 771
diff changeset
78
1498
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
79 self.__search_menu_id = host.registerCallback(self._getMainUI, with_data=True)
1707
94c450972346 primitivus and plugins: renamed a few menus:
souliane <souliane@mailoo.org>
parents: 1552
diff changeset
80 host.importMenu((D_("Contacts"), D_("Search directory")), self._getMainUI, security_limit=1, help_string=D_("Search user directory"))
1509
72e6ee3fdf53 plugin XEP-0055: add "Directory subscription" menu + use the category "Service" for this plugin's menus instead of "Communication"
souliane <souliane@mailoo.org>
parents: 1508
diff changeset
81
72e6ee3fdf53 plugin XEP-0055: add "Directory subscription" menu + use the category "Service" for this plugin's menus instead of "Communication"
souliane <souliane@mailoo.org>
parents: 1508
diff changeset
82 def _getHostServices(self, profile):
72e6ee3fdf53 plugin XEP-0055: add "Directory subscription" menu + use the category "Service" for this plugin's menus instead of "Communication"
souliane <souliane@mailoo.org>
parents: 1508
diff changeset
83 """Return the jabber search services associated to the user host.
1552
e0bde0d0b321 core (disco): use of “profile” instead of “profile_key” in several disco methods
Goffi <goffi@goffi.org>
parents: 1509
diff changeset
84
1509
72e6ee3fdf53 plugin XEP-0055: add "Directory subscription" menu + use the category "Service" for this plugin's menus instead of "Communication"
souliane <souliane@mailoo.org>
parents: 1508
diff changeset
85 @param profile (unicode): %(doc_profile)s
72e6ee3fdf53 plugin XEP-0055: add "Directory subscription" menu + use the category "Service" for this plugin's menus instead of "Communication"
souliane <souliane@mailoo.org>
parents: 1508
diff changeset
86 @return: list[jid.JID]
72e6ee3fdf53 plugin XEP-0055: add "Directory subscription" menu + use the category "Service" for this plugin's menus instead of "Communication"
souliane <souliane@mailoo.org>
parents: 1508
diff changeset
87 """
1552
e0bde0d0b321 core (disco): use of “profile” instead of “profile_key” in several disco methods
Goffi <goffi@goffi.org>
parents: 1509
diff changeset
88 d = self.host.findFeaturesSet([NS_SEARCH], profile=profile)
1509
72e6ee3fdf53 plugin XEP-0055: add "Directory subscription" menu + use the category "Service" for this plugin's menus instead of "Communication"
souliane <souliane@mailoo.org>
parents: 1508
diff changeset
89 return d.addCallback(lambda set_: list(set_))
1498
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
90
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
91
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
92 ## Main search UI (menu item callback) ##
799
7f2082b192ed plugin XEP-0055, Primitivus: Directory search dialogs are now entirely done in plugin XEP-0055, specific code in frontend is not needed anymore
Goffi <goffi@goffi.org>
parents: 771
diff changeset
93
7f2082b192ed plugin XEP-0055, Primitivus: Directory search dialogs are now entirely done in plugin XEP-0055, specific code in frontend is not needed anymore
Goffi <goffi@goffi.org>
parents: 771
diff changeset
94
1498
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
95 def _getMainUI(self, raw_data, profile):
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
96 """Get the XMLUI for selecting a service and searching the directory.
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
97
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
98 @param raw_data (dict): data received from the frontend
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
99 @param profile (unicode): %(doc_profile)s
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
100 @return: a deferred XMLUI string representation
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
101 """
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
102 # check if the user's server offers some search services
1509
72e6ee3fdf53 plugin XEP-0055: add "Directory subscription" menu + use the category "Service" for this plugin's menus instead of "Communication"
souliane <souliane@mailoo.org>
parents: 1508
diff changeset
103 d = self._getHostServices(profile)
72e6ee3fdf53 plugin XEP-0055: add "Directory subscription" menu + use the category "Service" for this plugin's menus instead of "Communication"
souliane <souliane@mailoo.org>
parents: 1508
diff changeset
104 return d.addCallback(lambda services: self.getMainUI(services, raw_data, profile))
1498
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
105
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
106 def getMainUI(self, services, raw_data, profile):
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
107 """Get the XMLUI for selecting a service and searching the directory.
799
7f2082b192ed plugin XEP-0055, Primitivus: Directory search dialogs are now entirely done in plugin XEP-0055, specific code in frontend is not needed anymore
Goffi <goffi@goffi.org>
parents: 771
diff changeset
108
1498
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
109 @param services (list[jid.JID]): search services offered by the user server
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
110 @param raw_data (dict): data received from the frontend
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
111 @param profile (unicode): %(doc_profile)s
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
112 @return: a deferred XMLUI string representation
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
113 """
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
114 # extend services offered by user's server with the default services
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
115 services.extend([service for service in self.services if service not in services])
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
116 data = xml_tools.XMLUIResult2DataFormResult(raw_data)
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
117 main_ui = xml_tools.XMLUI(C.XMLUI_WINDOW, container="tabs", title=_("Search users"), submit_id=self.__search_menu_id)
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
118
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
119 d = self._addSimpleSearchUI(services, main_ui, data, profile)
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
120 d.addCallback(lambda dummy: self._addAdvancedSearchUI(services, main_ui, data, profile))
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
121 return d.addCallback(lambda dummy: {'xmlui': main_ui.toXml()})
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
122
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
123 def _addSimpleSearchUI(self, services, main_ui, data, profile):
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
124 """Add to the main UI a tab for the simple search.
1552
e0bde0d0b321 core (disco): use of “profile” instead of “profile_key” in several disco methods
Goffi <goffi@goffi.org>
parents: 1509
diff changeset
125
1498
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
126 Display a single input field and search on the main service (it actually does one search per search field and then compile the results).
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
127
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
128 @param services (list[jid.JID]): search services offered by the user server
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
129 @param main_ui (XMLUI): the main XMLUI instance
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
130 @param data (dict): form data without SAT_FORM_PREFIX
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
131 @param profile (unicode): %(doc_profile)s
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
132
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
133 @return: a dummy Deferred
799
7f2082b192ed plugin XEP-0055, Primitivus: Directory search dialogs are now entirely done in plugin XEP-0055, specific code in frontend is not needed anymore
Goffi <goffi@goffi.org>
parents: 771
diff changeset
134 """
1498
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
135 service_jid = services[0] # TODO: search on all the given services, not only the first one
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
136
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
137 form = data_form.Form('form', formNamespace=NS_SEARCH)
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
138 form.addField(data_form.Field('text-single', FIELD_SINGLE, label=_('Search for'), value=data.get(FIELD_SINGLE, '')))
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
139
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
140 sub_cont = main_ui.main_container.addTab("simple_search", label=_("Simple search"), container=xml_tools.VerticalContainer)
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
141 main_ui.changeContainer(sub_cont.append(xml_tools.PairsContainer(main_ui)))
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
142 xml_tools.dataForm2Widgets(main_ui, form)
1552
e0bde0d0b321 core (disco): use of “profile” instead of “profile_key” in several disco methods
Goffi <goffi@goffi.org>
parents: 1509
diff changeset
143
1498
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
144 # FIXME: add colspan attribute to divider? (we are in a PairsContainer)
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
145 main_ui.addDivider('blank')
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
146 main_ui.addDivider('blank') # here we added a blank line before the button
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
147 main_ui.addDivider('blank')
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
148 main_ui.addButton(self.__search_menu_id, _("Search"), (FIELD_SINGLE,))
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
149 main_ui.addDivider('blank')
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
150 main_ui.addDivider('blank') # a blank line again after the button
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
151
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
152 simple_data = {key: value for key, value in data.iteritems() if key in (FIELD_SINGLE,)}
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
153 if simple_data:
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
154 log.debug("Simple search with %s on %s" % (simple_data, service_jid))
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
155 sub_cont.parent.setSelected(True)
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
156 main_ui.changeContainer(sub_cont.append(xml_tools.VerticalContainer(main_ui)))
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
157 main_ui.addDivider('dash')
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
158 d = self.searchRequest(service_jid, simple_data, profile)
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
159 d.addCallbacks(lambda elt: self._displaySearchResult(main_ui, elt),
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
160 lambda failure: main_ui.addText(failure.getErrorMessage()))
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
161 return d
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
162
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
163 return defer.succeed(None)
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
164
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
165 def _addAdvancedSearchUI(self, services, main_ui, data, profile):
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
166 """Add to the main UI a tab for the advanced search.
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
167
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
168 Display a service selector and allow to search on all the fields that are implemented by the selected service.
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
169
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
170 @param services (list[jid.JID]): search services offered by the user server
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
171 @param main_ui (XMLUI): the main XMLUI instance
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
172 @param data (dict): form data without SAT_FORM_PREFIX
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
173 @param profile (unicode): %(doc_profile)s
631
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
174
1498
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
175 @return: a dummy Deferred
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
176 """
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
177 sub_cont = main_ui.main_container.addTab("advanced_search", label=_("Advanced search"), container=xml_tools.VerticalContainer)
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
178 service_selection_fields = ['service_jid', 'service_jid_extra']
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
179
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
180 if 'service_jid_extra' in data:
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
181 # refresh button has been pushed, select the tab
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
182 sub_cont.parent.setSelected(True)
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
183 # get the selected service
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
184 service_jid_s = data.get('service_jid_extra', '')
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
185 if not service_jid_s:
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
186 service_jid_s = data.get('service_jid', unicode(services[0]))
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
187 log.debug("Refreshing search fields for %s" % service_jid_s)
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
188 else:
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
189 service_jid_s = data.get(FIELD_CURRENT_SERVICE, unicode(services[0]))
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
190 services_s = [unicode(service) for service in services]
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
191 if service_jid_s not in services_s:
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
192 services_s.append(service_jid_s)
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
193
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
194 main_ui.changeContainer(sub_cont.append(xml_tools.PairsContainer(main_ui)))
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
195 main_ui.addLabel(_("Search on"))
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
196 main_ui.addList('service_jid', options=services_s, selected=service_jid_s)
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
197 main_ui.addLabel(_("Other service"))
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
198 main_ui.addString(name='service_jid_extra')
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
199
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
200 # FIXME: add colspan attribute to divider? (we are in a PairsContainer)
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
201 main_ui.addDivider('blank')
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
202 main_ui.addDivider('blank') # here we added a blank line before the button
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
203 main_ui.addDivider('blank')
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
204 main_ui.addButton(self.__search_menu_id, _("Refresh fields"), service_selection_fields)
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
205 main_ui.addDivider('blank')
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
206 main_ui.addDivider('blank') # a blank line again after the button
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
207 main_ui.addLabel(_("Displaying the search form for"))
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
208 main_ui.addString(name=FIELD_CURRENT_SERVICE, value=service_jid_s, read_only=True)
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
209 main_ui.addDivider('dash')
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
210 main_ui.addDivider('dash')
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
211
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
212 main_ui.changeContainer(sub_cont.append(xml_tools.VerticalContainer(main_ui)))
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
213 service_jid = jid.JID(service_jid_s)
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
214 d = self.getFieldsUI(service_jid, profile)
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
215 d.addCallbacks(self._addAdvancedForm, lambda failure: main_ui.addText(failure.getErrorMessage()),
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
216 [service_jid, main_ui, sub_cont, data, profile])
799
7f2082b192ed plugin XEP-0055, Primitivus: Directory search dialogs are now entirely done in plugin XEP-0055, specific code in frontend is not needed anymore
Goffi <goffi@goffi.org>
parents: 771
diff changeset
217 return d
631
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
218
1498
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
219 def _addAdvancedForm(self, form_elt, service_jid, main_ui, sub_cont, data, profile):
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
220 """Add the search form and the search results (if there is some to display).
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
221
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
222 @param form_elt (domish.Element): form element listing the fields
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
223 @param service_jid (jid.JID): current search service
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
224 @param main_ui (XMLUI): the main XMLUI instance
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
225 @param sub_cont (Container): the container of the current tab
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
226 @param data (dict): form data without SAT_FORM_PREFIX
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
227 @param profile (unicode): %(doc_profile)s
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
228
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
229 @return: a dummy Deferred
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
230 """
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
231 field_list = data_form.Form.fromElement(form_elt).fieldList
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
232 adv_fields = [field.var for field in field_list if field.var]
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
233 adv_data = {key: value for key, value in data.iteritems() if key in adv_fields}
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
234
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
235 xml_tools.dataForm2Widgets(main_ui, data_form.Form.fromElement(form_elt))
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
236
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
237 # refill the submitted values
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
238 # FIXME: wokkel's data_form.Form.fromElement doesn't parse the values, so we do it directly in XMLUI for now
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
239 for widget in main_ui.current_container.elem.childNodes:
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
240 name = widget.getAttribute("name")
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
241 if adv_data.get(name):
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
242 widget.setAttribute("value", adv_data[name])
1552
e0bde0d0b321 core (disco): use of “profile” instead of “profile_key” in several disco methods
Goffi <goffi@goffi.org>
parents: 1509
diff changeset
243
1498
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
244 # FIXME: add colspan attribute to divider? (we are in a PairsContainer)
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
245 main_ui.addDivider('blank')
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
246 main_ui.addDivider('blank') # here we added a blank line before the button
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
247 main_ui.addDivider('blank')
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
248 main_ui.addButton(self.__search_menu_id, _("Search"), adv_fields + [FIELD_CURRENT_SERVICE])
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
249 main_ui.addDivider('blank')
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
250 main_ui.addDivider('blank') # a blank line again after the button
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
251
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
252 if adv_data: # display the search results
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
253 log.debug("Advanced search with %s on %s" % (adv_data, service_jid))
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
254 sub_cont.parent.setSelected(True)
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
255 main_ui.changeContainer(sub_cont.append(xml_tools.VerticalContainer(main_ui)))
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
256 main_ui.addDivider('dash')
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
257 d = self.searchRequest(service_jid, adv_data, profile)
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
258 d.addCallbacks(lambda elt: self._displaySearchResult(main_ui, elt),
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
259 lambda failure: main_ui.addText(failure.getErrorMessage()))
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
260 return d
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
261
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
262 return defer.succeed(None)
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
263
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
264
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
265 def _displaySearchResult(self, main_ui, elt):
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
266 """Display the search results.
1552
e0bde0d0b321 core (disco): use of “profile” instead of “profile_key” in several disco methods
Goffi <goffi@goffi.org>
parents: 1509
diff changeset
267
1498
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
268 @param main_ui (XMLUI): the main XMLUI instance
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
269 @param elt (domish.Element): form result element
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
270 """
1552
e0bde0d0b321 core (disco): use of “profile” instead of “profile_key” in several disco methods
Goffi <goffi@goffi.org>
parents: 1509
diff changeset
271 if [child for child in elt.children if child.name == "item"]:
1508
ec60682a9d17 plugin XEP-0055: display the search results using XMLUI JidsListWidget
souliane <souliane@mailoo.org>
parents: 1506
diff changeset
272 headers, xmlui_data = xml_tools.dataFormResult2XMLUIData(elt)
ec60682a9d17 plugin XEP-0055: display the search results using XMLUI JidsListWidget
souliane <souliane@mailoo.org>
parents: 1506
diff changeset
273 if "jid" in headers: # use XMLUI JidsListWidget to display the results
ec60682a9d17 plugin XEP-0055: display the search results using XMLUI JidsListWidget
souliane <souliane@mailoo.org>
parents: 1506
diff changeset
274 values = {}
ec60682a9d17 plugin XEP-0055: display the search results using XMLUI JidsListWidget
souliane <souliane@mailoo.org>
parents: 1506
diff changeset
275 for i in range(len(xmlui_data)):
ec60682a9d17 plugin XEP-0055: display the search results using XMLUI JidsListWidget
souliane <souliane@mailoo.org>
parents: 1506
diff changeset
276 header = headers.keys()[i % len(headers)]
ec60682a9d17 plugin XEP-0055: display the search results using XMLUI JidsListWidget
souliane <souliane@mailoo.org>
parents: 1506
diff changeset
277 widget_type, widget_args, widget_kwargs = xmlui_data[i]
ec60682a9d17 plugin XEP-0055: display the search results using XMLUI JidsListWidget
souliane <souliane@mailoo.org>
parents: 1506
diff changeset
278 value = widget_args[0]
ec60682a9d17 plugin XEP-0055: display the search results using XMLUI JidsListWidget
souliane <souliane@mailoo.org>
parents: 1506
diff changeset
279 values.setdefault(header, []).append(jid.JID(value) if header == "jid" else value)
ec60682a9d17 plugin XEP-0055: display the search results using XMLUI JidsListWidget
souliane <souliane@mailoo.org>
parents: 1506
diff changeset
280 main_ui.addJidsList(jids=values["jid"], name=D_(u"Search results"))
ec60682a9d17 plugin XEP-0055: display the search results using XMLUI JidsListWidget
souliane <souliane@mailoo.org>
parents: 1506
diff changeset
281 # TODO: also display the values other than JID
ec60682a9d17 plugin XEP-0055: display the search results using XMLUI JidsListWidget
souliane <souliane@mailoo.org>
parents: 1506
diff changeset
282 else:
ec60682a9d17 plugin XEP-0055: display the search results using XMLUI JidsListWidget
souliane <souliane@mailoo.org>
parents: 1506
diff changeset
283 xml_tools.XMLUIData2AdvancedList(main_ui, headers, xmlui_data)
1498
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
284 else:
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
285 main_ui.addText(D_("The search gave no result"))
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
286
1506
8405d622bde0 plugin XEP-0055: remove a "debug" break that has been forgotten here
souliane <souliane@mailoo.org>
parents: 1498
diff changeset
287
1498
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
288 ## Retrieve the search fields ##
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
289
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
290
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
291 def _getFieldsUI(self, to_jid_s, profile_key):
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
292 """Ask a service to send us the list of the form fields it manages.
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
293
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
294 @param to_jid_s (unicode): XEP-0055 compliant search entity
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
295 @param profile_key (unicode): %(doc_profile_key)s
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
296 @return: a deferred XMLUI instance
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
297 """
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
298 d = self.getFieldsUI(jid.JID(to_jid_s), profile_key)
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
299 d.addCallback(lambda form: xml_tools.dataFormResult2XMLUI(form).toXml())
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
300 return d
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
301
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
302 def getFieldsUI(self, to_jid, profile_key):
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
303 """Ask a service to send us the list of the form fields it manages.
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
304
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
305 @param to_jid (jid.JID): XEP-0055 compliant search entity
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
306 @param profile_key (unicode): %(doc_profile_key)s
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
307 @return: a deferred domish.Element
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
308 """
631
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
309 client = self.host.getClient(profile_key)
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
310 fields_request = IQ(client.xmlstream, 'get')
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
311 fields_request["from"] = client.jid.full()
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
312 fields_request["to"] = to_jid.full()
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
313 fields_request.addElement('query', NS_SEARCH)
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
314 d = fields_request.send(to_jid.full())
1498
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
315 d.addCallbacks(self._getFieldsUICb, self._getFieldsUIEb)
631
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
316 return d
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
317
1498
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
318 def _getFieldsUICb(self, answer):
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
319 """Callback for self.getFieldsUI.
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
320
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
321 @param answer (domish.Element): search query element
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
322 @return: domish.Element
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
323 """
631
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
324 try:
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
325 query_elts = answer.elements('jabber:iq:search', 'query').next()
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
326 except StopIteration:
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 867
diff changeset
327 log.info(_("No query element found"))
1498
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
328 raise DataError # FIXME: StanzaError is probably more appropriate, check the RFC
631
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
329 try:
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
330 form_elt = query_elts.elements(data_form.NS_X_DATA, 'x').next()
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
331 except StopIteration:
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 867
diff changeset
332 log.info(_("No data form found"))
631
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
333 raise NotImplementedError("Only search through data form is implemented so far")
1498
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
334 return form_elt
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
335
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
336 def _getFieldsUIEb(self, failure):
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
337 """Errback to self.getFieldsUI.
631
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
338
1498
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
339 @param failure (defer.failure.Failure): twisted failure
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
340 @raise: the unchanged defer.failure.Failure
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
341 """
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
342 log.info(_("Fields request failure: %s") % unicode(failure.getErrorMessage()))
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
343 raise failure
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
344
631
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
345
1498
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
346 ## Do the search ##
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
347
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
348
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
349 def _searchRequest(self, to_jid_s, search_data, profile_key):
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
350 """Actually do a search, according to filled data.
799
7f2082b192ed plugin XEP-0055, Primitivus: Directory search dialogs are now entirely done in plugin XEP-0055, specific code in frontend is not needed anymore
Goffi <goffi@goffi.org>
parents: 771
diff changeset
351
1498
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
352 @param to_jid_s (unicode): XEP-0055 compliant search entity
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
353 @param search_data (dict): filled data, corresponding to the form obtained in getFieldsUI
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
354 @param profile_key (unicode): %(doc_profile_key)s
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
355 @return: a deferred XMLUI string representation
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
356 """
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
357 d = self.searchRequest(jid.JID(to_jid_s), search_data, profile_key)
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
358 d.addCallback(lambda form: xml_tools.dataFormResult2XMLUI(form).toXml())
799
7f2082b192ed plugin XEP-0055, Primitivus: Directory search dialogs are now entirely done in plugin XEP-0055, specific code in frontend is not needed anymore
Goffi <goffi@goffi.org>
parents: 771
diff changeset
359 return d
7f2082b192ed plugin XEP-0055, Primitivus: Directory search dialogs are now entirely done in plugin XEP-0055, specific code in frontend is not needed anymore
Goffi <goffi@goffi.org>
parents: 771
diff changeset
360
1498
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
361 def searchRequest(self, to_jid, search_data, profile_key):
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
362 """Actually do a search, according to filled data.
631
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
363
1498
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
364 @param to_jid (jid.JID): XEP-0055 compliant search entity
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
365 @param search_data (dict): filled data, corresponding to the form obtained in getFieldsUI
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
366 @param profile_key (unicode): %(doc_profile_key)s
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
367 @return: a deferred domish.Element
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
368 """
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
369 if FIELD_SINGLE in search_data:
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
370 value = search_data[FIELD_SINGLE]
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
371 d = self.getFieldsUI(to_jid, profile_key)
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
372 d.addCallback(lambda elt: self.searchRequestMulti(to_jid, value, elt, profile_key))
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
373 return d
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
374
631
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
375 client = self.host.getClient(profile_key)
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
376 search_request = IQ(client.xmlstream, 'set')
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
377 search_request["from"] = client.jid.full()
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
378 search_request["to"] = to_jid.full()
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
379 query_elt = search_request.addElement('query', NS_SEARCH)
1498
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
380 x_form = data_form.Form('submit', formNamespace=NS_SEARCH)
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
381 x_form.makeFields(search_data)
631
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
382 query_elt.addChild(x_form.toElement())
1219
16484ebb695b plugin XEP-0059: first draft, pubsub and jabber search do not exploit it yet
souliane <souliane@mailoo.org>
parents: 993
diff changeset
383 # TODO: XEP-0059 could be used here (with the needed new method attributes)
631
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
384 d = search_request.send(to_jid.full())
1498
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
385 d.addCallbacks(self._searchOk, self._searchErr)
631
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
386 return d
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
387
1498
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
388 def searchRequestMulti(self, to_jid, value, form_elt, profile_key):
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
389 """Search for a value simultaneously in all fields, returns the results compilation.
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
390
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
391 @param to_jid (jid.JID): XEP-0055 compliant search entity
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
392 @param value (unicode): value to search
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
393 @param form_elt (domish.Element): form element listing the fields
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
394 @param profile_key (unicode): %(doc_profile_key)s
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
395 @return: a deferred domish.Element
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
396 """
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
397 form = data_form.Form.fromElement(form_elt)
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
398 d_list = []
1506
8405d622bde0 plugin XEP-0055: remove a "debug" break that has been forgotten here
souliane <souliane@mailoo.org>
parents: 1498
diff changeset
399
1498
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
400 for field in [field.var for field in form.fieldList if field.var]:
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
401 d_list.append(self.searchRequest(to_jid, {field: value}, profile_key))
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
402
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
403 def cb(result): # return the results compiled in one domish element
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
404 result_elt = None
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
405 for success, form_elt in result:
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
406 if not success:
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
407 continue
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
408 if result_elt is None: # the result element is built over the first answer
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
409 result_elt = form_elt
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
410 continue
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
411 for item_elt in form_elt.elements('jabber:x:data', 'item'):
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
412 result_elt.addChild(item_elt)
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
413 if result_elt is None:
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
414 raise defer.failure.Failure(DataError(_("The search could not be performed")))
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
415 return result_elt
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
416
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
417 return defer.DeferredList(d_list).addCallback(cb)
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
418
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
419 def _searchOk(self, answer):
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
420 """Callback for self.searchRequest.
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
421
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
422 @param answer (domish.Element): search query element
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
423 @return: domish.Element
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
424 """
631
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
425 try:
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
426 query_elts = answer.elements('jabber:iq:search', 'query').next()
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
427 except StopIteration:
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 867
diff changeset
428 log.info(_("No query element found"))
1498
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
429 raise DataError # FIXME: StanzaError is probably more appropriate, check the RFC
631
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
430 try:
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
431 form_elt = query_elts.elements(data_form.NS_X_DATA, 'x').next()
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
432 except StopIteration:
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 867
diff changeset
433 log.info(_("No data form found"))
631
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
434 raise NotImplementedError("Only search through data form is implemented so far")
1498
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
435 return form_elt
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
436
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
437 def _searchErr(self, failure):
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
438 """Errback to self.searchRequest.
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
439
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
440 @param failure (defer.failure.Failure): twisted failure
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
441 @raise: the unchanged defer.failure.Failure
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
442 """
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
443 log.info(_("Search request failure: %s") % unicode(failure.getErrorMessage()))
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
444 raise failure
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
445
631
694f118d0cd5 plugin XEP-0055: implementation of Jabber Search
Goffi <goffi@goffi.org>
parents:
diff changeset
446
1810
25c3569abb71 plugin XEP-0055, tmp_directory_subscription: move directory subscription to a new temporary plugin
souliane <souliane@mailoo.org>
parents: 1766
diff changeset
447 class XEP_0055_handler(XMPPHandler):
1498
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
448 implements(iwokkel.IDisco)
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
449
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
450 def __init__(self, plugin_parent, profile):
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
451 self.plugin_parent = plugin_parent
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
452 self.host = plugin_parent.host
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
453 self.profile = profile
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
454
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
455 def getDiscoInfo(self, requestor, target, nodeIdentifier=''):
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
456 return [disco.DiscoFeature(NS_SEARCH)]
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
457
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
458 def getDiscoItems(self, requestor, target, nodeIdentifier=''):
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
459 return []
e3330ce65285 plugin XEP-0055: add "simple" and "advanced" modes to Jabber search:
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
460