Mercurial > libervia-backend
annotate src/plugins/plugin_misc_invitations.py @ 2243:5e12fc5ae52a
plugin events: separation of event node and invitees node
- event node is handling the main metadata of the event, and invitees node handle the invitations/invitees answers
- invitees and blog node are automatically created and associated to the event, except if they are specified (in which cas the existing one are used and attached to the event node)
- extra metadata are added to <meta> elements
author | Goffi <goffi@goffi.org> |
---|---|
date | Fri, 19 May 2017 12:43:41 +0200 |
parents | f87b673c7d17 |
children | ba613d32ca60 |
rev | line source |
---|---|
2184 | 1 #!/usr/bin/env python2 |
2 # -*- coding: utf-8 -*- | |
3 | |
4 # SAT plugin for file tansfer | |
5 # Copyright (C) 2009-2016 Jérôme Poisson (goffi@goffi.org) | |
6 | |
7 # This program is free software: you can redistribute it and/or modify | |
8 # it under the terms of the GNU Affero General Public License as published by | |
9 # the Free Software Foundation, either version 3 of the License, or | |
10 # (at your option) any later version. | |
11 | |
12 # This program is distributed in the hope that it will be useful, | |
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 # GNU Affero General Public License for more details. | |
16 | |
17 # You should have received a copy of the GNU Affero General Public License | |
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
19 | |
20 from sat.core.i18n import _, D_ | |
21 from sat.core.constants import Const as C | |
22 from sat.core import exceptions | |
23 from sat.core.log import getLogger | |
24 log = getLogger(__name__) | |
25 import shortuuid | |
26 from sat.tools import utils | |
27 from twisted.internet import defer | |
28 from twisted.words.protocols.jabber import jid | |
29 from twisted.words.protocols.jabber import error | |
30 from sat.memory import persistent | |
31 from sat.tools import email as sat_email | |
32 | |
33 | |
34 PLUGIN_INFO = { | |
35 C.PI_NAME: "Invitations", | |
36 C.PI_IMPORT_NAME: "INVITATIONS", | |
37 C.PI_TYPE: C.PLUG_TYPE_MISC, | |
38 C.PI_DEPENDENCIES: ['XEP-0077'], | |
39 C.PI_MAIN: "InvitationsPlugin", | |
40 C.PI_HANDLER: "no", | |
41 C.PI_DESCRIPTION: _(u"""invitation of people without XMPP account""") | |
42 } | |
43 | |
44 | |
45 SUFFIX_MAX = 5 | |
46 INVITEE_PROFILE_TPL = u"guest@@{uuid}" | |
2211
df115e4a36c7
plugin invitations: invitation id and invitee jid are now added to return dict in invitationCreate, bridge signature has changed too
Goffi <goffi@goffi.org>
parents:
2210
diff
changeset
|
47 KEY_ID = u'id' |
df115e4a36c7
plugin invitations: invitation id and invitee jid are now added to return dict in invitationCreate, bridge signature has changed too
Goffi <goffi@goffi.org>
parents:
2210
diff
changeset
|
48 KEY_JID = u'jid' |
2184 | 49 KEY_CREATED = u'created' |
50 KEY_LAST_CONNECTION = u'last_connection' | |
2219
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
51 KEY_GUEST_PROFILE = u'guest_profile' |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
52 KEY_PASSWORD = u'password' |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
53 EXTRA_RESERVED = {KEY_ID, KEY_JID, KEY_CREATED, u'jid_', u'jid', KEY_LAST_CONNECTION, KEY_GUEST_PROFILE, KEY_PASSWORD} |
2184 | 54 DEFAULT_SUBJECT = D_(u"You have been invited by {host_name} to {app_name}") |
55 DEFAULT_BODY = D_(u"""Hello {name}! | |
56 | |
57 You have received an invitation from {host_name} to participate to "{app_name}". | |
58 To join, you just have to click on the following URL: | |
59 {url} | |
60 | |
61 Please note that this URL should not be shared with anybody! | |
62 If you want more details on {app_name}, you can check {app_url}. | |
63 | |
64 Welcome! | |
65 """) | |
66 | |
67 | |
68 class InvitationsPlugin(object): | |
69 | |
70 def __init__(self, host): | |
71 log.info(_(u"plugin Invitations initialization")) | |
72 self.host = host | |
73 self.invitations = persistent.LazyPersistentBinaryDict(u'invitations') | |
2211
df115e4a36c7
plugin invitations: invitation id and invitee jid are now added to return dict in invitationCreate, bridge signature has changed too
Goffi <goffi@goffi.org>
parents:
2210
diff
changeset
|
74 host.bridge.addMethod("invitationCreate", ".plugin", in_sign='sssssssssa{ss}s', out_sign='a{ss}', |
2219
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
75 method=self._create, |
2184 | 76 async=True) |
2212
eaf2467d19ce
plugin invitations: added getInvitation method, it return invitation data and raise an error if it is not found
Goffi <goffi@goffi.org>
parents:
2211
diff
changeset
|
77 host.bridge.addMethod("invitationGet", ".plugin", in_sign='s', out_sign='a{ss}', |
2219
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
78 method=self.get, |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
79 async=True) |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
80 host.bridge.addMethod("invitationModify", ".plugin", in_sign='sa{ss}b', out_sign='', |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
81 method=self._modify, |
2212
eaf2467d19ce
plugin invitations: added getInvitation method, it return invitation data and raise an error if it is not found
Goffi <goffi@goffi.org>
parents:
2211
diff
changeset
|
82 async=True) |
2230
ebc0c1701811
plugin invitations: added invitationList command
Goffi <goffi@goffi.org>
parents:
2223
diff
changeset
|
83 host.bridge.addMethod("invitationList", ".plugin", in_sign='s', out_sign='a{sa{ss}}', |
ebc0c1701811
plugin invitations: added invitationList command
Goffi <goffi@goffi.org>
parents:
2223
diff
changeset
|
84 method=self._list, |
ebc0c1701811
plugin invitations: added invitationList command
Goffi <goffi@goffi.org>
parents:
2223
diff
changeset
|
85 async=True) |
2212
eaf2467d19ce
plugin invitations: added getInvitation method, it return invitation data and raise an error if it is not found
Goffi <goffi@goffi.org>
parents:
2211
diff
changeset
|
86 |
2219
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
87 def checkExtra(self, extra): |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
88 if EXTRA_RESERVED.intersection(extra): |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
89 raise ValueError(_(u"You can't use following key(s) in extra, they are reserved: {}").format( |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
90 u', '.join(EXTRA_RESERVED.intersection(extra)))) |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
91 |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
92 def _create(self, jid_=u'', password=u'', name=u'', host_name=u'', email=u'', language=u'', url_template=u'', message_subject=u'', message_body=u'', extra=None, profile=u''): |
2184 | 93 # XXX: we don't use **kwargs here to keep arguments name for introspection with D-Bus bridge |
94 | |
95 if extra is None: | |
96 extra = {} | |
97 else: | |
98 extra = {unicode(k): unicode(v) for k,v in extra.iteritems()} | |
99 | |
100 # we need to be sure that values are unicode, else they won't be pickled correctly with D-Bus | |
101 kwargs = {"extra": extra} | |
102 for key in ("jid_", "password", "name", "host_name", "email", "language", "url_template", "message_subject", "message_body", "profile"): | |
103 value = locals()[key] | |
104 if value: | |
105 kwargs[key] = unicode(value) | |
2219
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
106 d = self.create(**kwargs) |
2211
df115e4a36c7
plugin invitations: invitation id and invitee jid are now added to return dict in invitationCreate, bridge signature has changed too
Goffi <goffi@goffi.org>
parents:
2210
diff
changeset
|
107 def serialize(data): |
df115e4a36c7
plugin invitations: invitation id and invitee jid are now added to return dict in invitationCreate, bridge signature has changed too
Goffi <goffi@goffi.org>
parents:
2210
diff
changeset
|
108 data[KEY_JID] = data[KEY_JID].full() |
2230
ebc0c1701811
plugin invitations: added invitationList command
Goffi <goffi@goffi.org>
parents:
2223
diff
changeset
|
109 return data |
2211
df115e4a36c7
plugin invitations: invitation id and invitee jid are now added to return dict in invitationCreate, bridge signature has changed too
Goffi <goffi@goffi.org>
parents:
2210
diff
changeset
|
110 d.addCallback(serialize) |
df115e4a36c7
plugin invitations: invitation id and invitee jid are now added to return dict in invitationCreate, bridge signature has changed too
Goffi <goffi@goffi.org>
parents:
2210
diff
changeset
|
111 return d |
2184 | 112 |
113 @defer.inlineCallbacks | |
2219
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
114 def create(self, **kwargs): |
2184 | 115 ur"""create an invitation |
116 | |
117 this will create an XMPP account and a profile, and use a UUID to retrieve them. | |
118 the profile is automatically generated in the form guest@@[UUID], this way they can be retrieved easily | |
119 **kwargs: keywords arguments which can have the following keys, unset values are equivalent to None: | |
120 jid_(jid.JID, None): jid to use for invitation, the jid will be created using XEP-0077 | |
121 if the jid has no user part, an anonymous account will be used (no XMPP account created in this case) | |
2208
c316c6f6a737
plugin invitations: fixed leak of uuid in jid
Goffi <goffi@goffi.org>
parents:
2185
diff
changeset
|
122 if None, automatically generate an account name (in the form "invitation-[random UUID]@domain.tld") (note that this UUID is not the |
c316c6f6a737
plugin invitations: fixed leak of uuid in jid
Goffi <goffi@goffi.org>
parents:
2185
diff
changeset
|
123 same as the invitation one, as jid can be used publicly (leaking the UUID), and invitation UUID give access to account. |
2184 | 124 in case of conflict, a suffix number is added to the account until a free one if found (with a failure if SUFFIX_MAX is reached) |
125 password(unicode, None): password to use (will be used for XMPP account and profile) | |
126 None to automatically generate one | |
127 name(unicode, None): name of the invitee | |
128 host_name(unicode, None): name of the host | |
129 email(unicode, None): email to send the invitation to | |
130 if None, no invitation email is sent, you can still associate email using extra | |
131 if email is used, extra can't have "email" key | |
132 language(unicode): language of the invitee (used notabily to translate the invitation) | |
133 TODO: not used yet | |
134 url_template(unicode, None): template to use to construct the invitation URL | |
135 use {uuid} as a placeholder for identifier | |
136 use None if you don't want to include URL (or if it is already specified in custom message) | |
137 /!\ you must put full URL, don't forget https:// | |
138 /!\ the URL will give access to the invitee account, you should warn in message to not publish it publicly | |
2210
f8d61592f1fc
plugin invitations: raise ValueError if url_template and message_body are both not specified
Goffi <goffi@goffi.org>
parents:
2208
diff
changeset
|
139 message_subject(unicode, None): customised message body for the invitation email |
2184 | 140 None to use default subject |
141 uses the same substitution as for message_body | |
142 message_body(unicode, None): customised message body for the invitation email | |
143 None to use default body | |
144 use {name} as a place holder for invitee name | |
145 use {url} as a placeholder for the invitation url | |
146 use {uuid} as a placeholder for the identifier | |
147 use {app_name} as a placeholder for this software name | |
148 use {app_url} as a placeholder for this software official website | |
149 use {profile} as a placeholder for host's profile | |
150 use {host_name} as a placeholder for host's name | |
151 extra(dict, None): extra data to associate with the invitee | |
152 some keys are reserved: | |
153 - created (creation date) | |
154 if email argument is used, "email" key can't be used | |
155 profile(unicode, None): profile of the host (person who is inviting) | |
2211
df115e4a36c7
plugin invitations: invitation id and invitee jid are now added to return dict in invitationCreate, bridge signature has changed too
Goffi <goffi@goffi.org>
parents:
2210
diff
changeset
|
156 @return (dict[unicode, unicode]): dictionary with: |
df115e4a36c7
plugin invitations: invitation id and invitee jid are now added to return dict in invitationCreate, bridge signature has changed too
Goffi <goffi@goffi.org>
parents:
2210
diff
changeset
|
157 - UUID associated with the invitee (key: id) |
2184 | 158 - filled extra dictionary, as saved in the databae |
159 """ | |
160 ## initial checks | |
161 extra = kwargs.pop('extra', {}) | |
162 if set(kwargs).intersection(extra): | |
2219
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
163 raise ValueError(_(u"You can't use following key(s) in both args and extra: {}").format( |
2184 | 164 u', '.join(set(kwargs).intersection(extra)))) |
165 | |
2219
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
166 self.checkExtra(extra) |
2184 | 167 |
2223
c6c9a97ffebf
plugin invitations: fixed url_template check
Goffi <goffi@goffi.org>
parents:
2219
diff
changeset
|
168 if not 'url_template' in kwargs and not 'message_body' in kwargs: |
2210
f8d61592f1fc
plugin invitations: raise ValueError if url_template and message_body are both not specified
Goffi <goffi@goffi.org>
parents:
2208
diff
changeset
|
169 raise ValueError(_(u"You need to provide url_template if you use default message body")) |
f8d61592f1fc
plugin invitations: raise ValueError if url_template and message_body are both not specified
Goffi <goffi@goffi.org>
parents:
2208
diff
changeset
|
170 |
f8d61592f1fc
plugin invitations: raise ValueError if url_template and message_body are both not specified
Goffi <goffi@goffi.org>
parents:
2208
diff
changeset
|
171 |
2184 | 172 ## uuid |
173 log.info(_(u"creating an invitation")) | |
174 id_ = unicode(shortuuid.uuid()) | |
175 | |
176 ## XMPP account creation | |
177 password = kwargs.pop(u'password', None) | |
178 if password is None: | |
179 password = utils.generatePassword() | |
180 assert password | |
181 # XXX: password is here saved in clear in database | |
182 # it is needed for invitation as the same password is used for profile | |
183 # and SàT need to be able to automatically open the profile with the uuid | |
184 # FIXME: we could add an extra encryption key which would be used with the uuid | |
185 # when the invitee is connecting (e.g. with URL). This key would not be saved | |
186 # and could be used to encrypt profile password. | |
2219
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
187 extra[KEY_PASSWORD] = password |
2184 | 188 |
189 jid_ = kwargs.pop(u'jid_', None) | |
190 if not jid_: | |
191 domain = self.host.memory.getConfig(None, 'xmpp_domain') | |
192 if not domain: | |
193 # TODO: fallback to profile's domain | |
194 raise ValueError(_(u"You need to specify xmpp_domain in sat.conf")) | |
2208
c316c6f6a737
plugin invitations: fixed leak of uuid in jid
Goffi <goffi@goffi.org>
parents:
2185
diff
changeset
|
195 jid_ = u"invitation-{uuid}@{domain}".format(uuid=shortuuid.uuid(), domain=domain) |
2184 | 196 jid_ = jid.JID(jid_) |
197 if jid_.user: | |
198 # we don't register account if there is no user as anonymous login is then used | |
199 try: | |
200 yield self.host.plugins['XEP-0077'].registerNewAccount(jid_, password) | |
201 except error.StanzaError as e: | |
202 prefix = jid_.user | |
203 idx = 0 | |
204 while e.condition == u'conflict': | |
205 if idx >= SUFFIX_MAX: | |
206 raise exceptions.ConflictError(_(u"Can't create XMPP account")) | |
207 jid_.user = prefix + '_' + unicode(idx) | |
208 log.info(_(u"requested jid already exists, trying with {}".format(jid_.full()))) | |
209 try: | |
210 yield self.host.plugins['XEP-0077'].registerNewAccount(jid_, password) | |
211 except error.StanzaError as e: | |
212 idx += 1 | |
213 else: | |
214 break | |
215 if e.condition != u'conflict': | |
216 raise e | |
217 | |
218 log.info(_(u"account {jid_} created").format(jid_=jid_.full())) | |
219 | |
220 ## profile creation | |
2219
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
221 extra[KEY_GUEST_PROFILE] = guest_profile = INVITEE_PROFILE_TPL.format(uuid=id_) |
2184 | 222 # profile creation should not fail as we generate unique name ourselves |
223 yield self.host.memory.createProfile(guest_profile, password) | |
224 yield self.host.memory.startSession(password, guest_profile) | |
225 yield self.host.memory.setParam("JabberID", jid_.full(), "Connection", profile_key=guest_profile) | |
226 yield self.host.memory.setParam("Password", password, "Connection", profile_key=guest_profile) | |
227 | |
228 ## email | |
229 language = kwargs.pop(u'language', None) | |
230 if language is not None: | |
231 extra[u'language'] = language | |
232 email = kwargs.pop(u'email', None) | |
233 | |
234 if email is not None: | |
2219
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
235 extra[u'email'] = email |
2184 | 236 url_template = kwargs.pop(u'url_template', '') |
237 format_args = { | |
238 u'uuid': id_, | |
239 u'app_name': C.APP_NAME, | |
240 u'app_url': C.APP_URL} | |
241 | |
242 name = kwargs.pop(u'name', None) | |
243 if name is None: | |
244 format_args[u'name'] = email | |
245 else: | |
246 format_args[u'name'] = extra[u'name'] = name | |
247 | |
248 profile = kwargs.pop(u'profile', None) | |
249 if profile is None: | |
250 format_args[u'profile'] = u'' | |
251 else: | |
252 format_args[u'profile'] = extra[u'profile'] = profile | |
253 | |
254 host_name = kwargs.pop(u'host_name', None) | |
255 if host_name is None: | |
256 format_args[u'host_name'] = profile or _(u"somebody") | |
257 else: | |
258 format_args[u'host_name'] = extra[u'host_name'] = host_name | |
259 | |
260 invite_url = url_template.format(**format_args) | |
261 format_args[u'url'] = invite_url | |
262 | |
263 yield sat_email.sendEmail( | |
264 self.host, | |
265 [email], | |
266 (kwargs.pop(u'message_subject', None) or DEFAULT_SUBJECT).format(**format_args), | |
267 (kwargs.pop(u'message_body', None) or DEFAULT_BODY).format(**format_args), | |
268 ) | |
269 | |
270 ## extra data saving | |
271 self.invitations[id_] = extra | |
272 | |
273 if kwargs: | |
274 log.warning(_(u"Not all arguments have been consumed: {}").format(kwargs)) | |
275 | |
2211
df115e4a36c7
plugin invitations: invitation id and invitee jid are now added to return dict in invitationCreate, bridge signature has changed too
Goffi <goffi@goffi.org>
parents:
2210
diff
changeset
|
276 extra[KEY_ID] = id_ |
2230
ebc0c1701811
plugin invitations: added invitationList command
Goffi <goffi@goffi.org>
parents:
2223
diff
changeset
|
277 extra[KEY_JID] = jid_ |
2211
df115e4a36c7
plugin invitations: invitation id and invitee jid are now added to return dict in invitationCreate, bridge signature has changed too
Goffi <goffi@goffi.org>
parents:
2210
diff
changeset
|
278 defer.returnValue(extra) |
2212
eaf2467d19ce
plugin invitations: added getInvitation method, it return invitation data and raise an error if it is not found
Goffi <goffi@goffi.org>
parents:
2211
diff
changeset
|
279 |
2219
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
280 def get(self, id_): |
2212
eaf2467d19ce
plugin invitations: added getInvitation method, it return invitation data and raise an error if it is not found
Goffi <goffi@goffi.org>
parents:
2211
diff
changeset
|
281 """Retrieve invitation linked to uuid if it exists |
eaf2467d19ce
plugin invitations: added getInvitation method, it return invitation data and raise an error if it is not found
Goffi <goffi@goffi.org>
parents:
2211
diff
changeset
|
282 |
eaf2467d19ce
plugin invitations: added getInvitation method, it return invitation data and raise an error if it is not found
Goffi <goffi@goffi.org>
parents:
2211
diff
changeset
|
283 @param id_(unicode): UUID linked to an invitation |
2219
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
284 @return (dict[unicode, unicode]): data associated to the invitation |
2212
eaf2467d19ce
plugin invitations: added getInvitation method, it return invitation data and raise an error if it is not found
Goffi <goffi@goffi.org>
parents:
2211
diff
changeset
|
285 @raise KeyError: there is not invitation with this id_ |
eaf2467d19ce
plugin invitations: added getInvitation method, it return invitation data and raise an error if it is not found
Goffi <goffi@goffi.org>
parents:
2211
diff
changeset
|
286 """ |
eaf2467d19ce
plugin invitations: added getInvitation method, it return invitation data and raise an error if it is not found
Goffi <goffi@goffi.org>
parents:
2211
diff
changeset
|
287 return self.invitations[id_] |
2219
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
288 |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
289 def _modify(self, id_, new_extra, replace): |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
290 return self.modify(id_, {unicode(k): unicode(v) for k,v in new_extra.iteritems()}, replace) |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
291 |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
292 def modify(self, id_, new_extra, replace=False): |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
293 """Modify invitation data |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
294 |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
295 @param id_(unicode): UUID linked to an invitation |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
296 @param new_extra(dict[unicode, unicode]): data to update |
2241
f87b673c7d17
plugin invitations: on modify an empty value delete corresponding extra keys, and reserved keys are now ignored.
Goffi <goffi@goffi.org>
parents:
2230
diff
changeset
|
297 empty values will be deleted if replace is True |
2219
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
298 @param replace(bool): if True replace the data |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
299 else update them |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
300 @raise KeyError: there is not invitation with this id_ |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
301 """ |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
302 self.checkExtra(new_extra) |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
303 def gotCurrentData(current_data): |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
304 if replace: |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
305 new_data = new_extra |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
306 for k in EXTRA_RESERVED: |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
307 try: |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
308 new_data[k] = current_data[k] |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
309 except KeyError: |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
310 continue |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
311 else: |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
312 new_data = current_data |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
313 for k,v in new_extra.iteritems(): |
2241
f87b673c7d17
plugin invitations: on modify an empty value delete corresponding extra keys, and reserved keys are now ignored.
Goffi <goffi@goffi.org>
parents:
2230
diff
changeset
|
314 if k in EXTRA_RESERVED: |
f87b673c7d17
plugin invitations: on modify an empty value delete corresponding extra keys, and reserved keys are now ignored.
Goffi <goffi@goffi.org>
parents:
2230
diff
changeset
|
315 log.warning(_(u"Skipping reserved key {key}".format(k))) |
f87b673c7d17
plugin invitations: on modify an empty value delete corresponding extra keys, and reserved keys are now ignored.
Goffi <goffi@goffi.org>
parents:
2230
diff
changeset
|
316 continue |
f87b673c7d17
plugin invitations: on modify an empty value delete corresponding extra keys, and reserved keys are now ignored.
Goffi <goffi@goffi.org>
parents:
2230
diff
changeset
|
317 if v: |
f87b673c7d17
plugin invitations: on modify an empty value delete corresponding extra keys, and reserved keys are now ignored.
Goffi <goffi@goffi.org>
parents:
2230
diff
changeset
|
318 new_data[k] = v |
f87b673c7d17
plugin invitations: on modify an empty value delete corresponding extra keys, and reserved keys are now ignored.
Goffi <goffi@goffi.org>
parents:
2230
diff
changeset
|
319 else: |
f87b673c7d17
plugin invitations: on modify an empty value delete corresponding extra keys, and reserved keys are now ignored.
Goffi <goffi@goffi.org>
parents:
2230
diff
changeset
|
320 try: |
f87b673c7d17
plugin invitations: on modify an empty value delete corresponding extra keys, and reserved keys are now ignored.
Goffi <goffi@goffi.org>
parents:
2230
diff
changeset
|
321 del new_data[k] |
f87b673c7d17
plugin invitations: on modify an empty value delete corresponding extra keys, and reserved keys are now ignored.
Goffi <goffi@goffi.org>
parents:
2230
diff
changeset
|
322 except KeyError: |
f87b673c7d17
plugin invitations: on modify an empty value delete corresponding extra keys, and reserved keys are now ignored.
Goffi <goffi@goffi.org>
parents:
2230
diff
changeset
|
323 pass |
2219
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
324 |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
325 self.invitations[id_] = new_data |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
326 |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
327 d = self.invitations[id_] |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
328 d.addCallback(gotCurrentData) |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
329 return d |
2230
ebc0c1701811
plugin invitations: added invitationList command
Goffi <goffi@goffi.org>
parents:
2223
diff
changeset
|
330 |
ebc0c1701811
plugin invitations: added invitationList command
Goffi <goffi@goffi.org>
parents:
2223
diff
changeset
|
331 def _list(self, profile=C.PROF_KEY_NONE): |
ebc0c1701811
plugin invitations: added invitationList command
Goffi <goffi@goffi.org>
parents:
2223
diff
changeset
|
332 return self.list(profile) |
ebc0c1701811
plugin invitations: added invitationList command
Goffi <goffi@goffi.org>
parents:
2223
diff
changeset
|
333 |
ebc0c1701811
plugin invitations: added invitationList command
Goffi <goffi@goffi.org>
parents:
2223
diff
changeset
|
334 @defer.inlineCallbacks |
ebc0c1701811
plugin invitations: added invitationList command
Goffi <goffi@goffi.org>
parents:
2223
diff
changeset
|
335 def list(self, profile=C.PROF_KEY_NONE): |
ebc0c1701811
plugin invitations: added invitationList command
Goffi <goffi@goffi.org>
parents:
2223
diff
changeset
|
336 """List invitations |
ebc0c1701811
plugin invitations: added invitationList command
Goffi <goffi@goffi.org>
parents:
2223
diff
changeset
|
337 |
ebc0c1701811
plugin invitations: added invitationList command
Goffi <goffi@goffi.org>
parents:
2223
diff
changeset
|
338 @param profile(unicode): return invitation linked to this profile only |
ebc0c1701811
plugin invitations: added invitationList command
Goffi <goffi@goffi.org>
parents:
2223
diff
changeset
|
339 C.PROF_KEY_NONE: don't filter invitations |
ebc0c1701811
plugin invitations: added invitationList command
Goffi <goffi@goffi.org>
parents:
2223
diff
changeset
|
340 @return list(unicode): invitations uids |
ebc0c1701811
plugin invitations: added invitationList command
Goffi <goffi@goffi.org>
parents:
2223
diff
changeset
|
341 """ |
ebc0c1701811
plugin invitations: added invitationList command
Goffi <goffi@goffi.org>
parents:
2223
diff
changeset
|
342 invitations = yield self.invitations.items() |
ebc0c1701811
plugin invitations: added invitationList command
Goffi <goffi@goffi.org>
parents:
2223
diff
changeset
|
343 if profile != C.PROF_KEY_NONE: |
ebc0c1701811
plugin invitations: added invitationList command
Goffi <goffi@goffi.org>
parents:
2223
diff
changeset
|
344 invitations = {id_:data for id_, data in invitations.iteritems() if data.get(u'profile') == profile} |
ebc0c1701811
plugin invitations: added invitationList command
Goffi <goffi@goffi.org>
parents:
2223
diff
changeset
|
345 |
ebc0c1701811
plugin invitations: added invitationList command
Goffi <goffi@goffi.org>
parents:
2223
diff
changeset
|
346 defer.returnValue(invitations) |