Mercurial > libervia-backend
annotate src/plugins/plugin_misc_invitations.py @ 2227:79d279d1ee88
plugin XEP-0277: comments node access model changes:
comments node access model is now copied from parent item by default. If whitelist access is used, parent item affiliations are copied too.
publish model is now open by default instead of subscribers
author | Goffi <goffi@goffi.org> |
---|---|
date | Mon, 17 Apr 2017 20:33:32 +0200 |
parents | c6c9a97ffebf |
children | ebc0c1701811 |
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) |
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
|
83 |
2219
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
84 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
|
85 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
|
86 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
|
87 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
|
88 |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
89 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 | 90 # XXX: we don't use **kwargs here to keep arguments name for introspection with D-Bus bridge |
91 | |
92 if extra is None: | |
93 extra = {} | |
94 else: | |
95 extra = {unicode(k): unicode(v) for k,v in extra.iteritems()} | |
96 | |
97 # we need to be sure that values are unicode, else they won't be pickled correctly with D-Bus | |
98 kwargs = {"extra": extra} | |
99 for key in ("jid_", "password", "name", "host_name", "email", "language", "url_template", "message_subject", "message_body", "profile"): | |
100 value = locals()[key] | |
101 if value: | |
102 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
|
103 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
|
104 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
|
105 data[KEY_JID] = data[KEY_JID].full() |
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
|
106 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
|
107 return d |
2184 | 108 |
109 @defer.inlineCallbacks | |
2219
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
110 def create(self, **kwargs): |
2184 | 111 ur"""create an invitation |
112 | |
113 this will create an XMPP account and a profile, and use a UUID to retrieve them. | |
114 the profile is automatically generated in the form guest@@[UUID], this way they can be retrieved easily | |
115 **kwargs: keywords arguments which can have the following keys, unset values are equivalent to None: | |
116 jid_(jid.JID, None): jid to use for invitation, the jid will be created using XEP-0077 | |
117 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
|
118 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
|
119 same as the invitation one, as jid can be used publicly (leaking the UUID), and invitation UUID give access to account. |
2184 | 120 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) |
121 password(unicode, None): password to use (will be used for XMPP account and profile) | |
122 None to automatically generate one | |
123 name(unicode, None): name of the invitee | |
124 host_name(unicode, None): name of the host | |
125 email(unicode, None): email to send the invitation to | |
126 if None, no invitation email is sent, you can still associate email using extra | |
127 if email is used, extra can't have "email" key | |
128 language(unicode): language of the invitee (used notabily to translate the invitation) | |
129 TODO: not used yet | |
130 url_template(unicode, None): template to use to construct the invitation URL | |
131 use {uuid} as a placeholder for identifier | |
132 use None if you don't want to include URL (or if it is already specified in custom message) | |
133 /!\ you must put full URL, don't forget https:// | |
134 /!\ 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
|
135 message_subject(unicode, None): customised message body for the invitation email |
2184 | 136 None to use default subject |
137 uses the same substitution as for message_body | |
138 message_body(unicode, None): customised message body for the invitation email | |
139 None to use default body | |
140 use {name} as a place holder for invitee name | |
141 use {url} as a placeholder for the invitation url | |
142 use {uuid} as a placeholder for the identifier | |
143 use {app_name} as a placeholder for this software name | |
144 use {app_url} as a placeholder for this software official website | |
145 use {profile} as a placeholder for host's profile | |
146 use {host_name} as a placeholder for host's name | |
147 extra(dict, None): extra data to associate with the invitee | |
148 some keys are reserved: | |
149 - created (creation date) | |
150 if email argument is used, "email" key can't be used | |
151 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
|
152 @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
|
153 - UUID associated with the invitee (key: id) |
2184 | 154 - filled extra dictionary, as saved in the databae |
155 """ | |
156 ## initial checks | |
157 extra = kwargs.pop('extra', {}) | |
158 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
|
159 raise ValueError(_(u"You can't use following key(s) in both args and extra: {}").format( |
2184 | 160 u', '.join(set(kwargs).intersection(extra)))) |
161 | |
2219
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
162 self.checkExtra(extra) |
2184 | 163 |
2223
c6c9a97ffebf
plugin invitations: fixed url_template check
Goffi <goffi@goffi.org>
parents:
2219
diff
changeset
|
164 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
|
165 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
|
166 |
f8d61592f1fc
plugin invitations: raise ValueError if url_template and message_body are both not specified
Goffi <goffi@goffi.org>
parents:
2208
diff
changeset
|
167 |
2184 | 168 ## uuid |
169 log.info(_(u"creating an invitation")) | |
170 id_ = unicode(shortuuid.uuid()) | |
171 | |
172 ## XMPP account creation | |
173 password = kwargs.pop(u'password', None) | |
174 if password is None: | |
175 password = utils.generatePassword() | |
176 assert password | |
177 # XXX: password is here saved in clear in database | |
178 # it is needed for invitation as the same password is used for profile | |
179 # and SàT need to be able to automatically open the profile with the uuid | |
180 # FIXME: we could add an extra encryption key which would be used with the uuid | |
181 # when the invitee is connecting (e.g. with URL). This key would not be saved | |
182 # 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
|
183 extra[KEY_PASSWORD] = password |
2184 | 184 |
185 jid_ = kwargs.pop(u'jid_', None) | |
186 if not jid_: | |
187 domain = self.host.memory.getConfig(None, 'xmpp_domain') | |
188 if not domain: | |
189 # TODO: fallback to profile's domain | |
190 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
|
191 jid_ = u"invitation-{uuid}@{domain}".format(uuid=shortuuid.uuid(), domain=domain) |
2184 | 192 jid_ = jid.JID(jid_) |
193 if jid_.user: | |
194 # we don't register account if there is no user as anonymous login is then used | |
195 try: | |
196 yield self.host.plugins['XEP-0077'].registerNewAccount(jid_, password) | |
197 except error.StanzaError as e: | |
198 prefix = jid_.user | |
199 idx = 0 | |
200 while e.condition == u'conflict': | |
201 if idx >= SUFFIX_MAX: | |
202 raise exceptions.ConflictError(_(u"Can't create XMPP account")) | |
203 jid_.user = prefix + '_' + unicode(idx) | |
204 log.info(_(u"requested jid already exists, trying with {}".format(jid_.full()))) | |
205 try: | |
206 yield self.host.plugins['XEP-0077'].registerNewAccount(jid_, password) | |
207 except error.StanzaError as e: | |
208 idx += 1 | |
209 else: | |
210 break | |
211 if e.condition != u'conflict': | |
212 raise e | |
213 | |
214 log.info(_(u"account {jid_} created").format(jid_=jid_.full())) | |
215 | |
216 ## profile creation | |
2219
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
217 extra[KEY_GUEST_PROFILE] = guest_profile = INVITEE_PROFILE_TPL.format(uuid=id_) |
2184 | 218 # profile creation should not fail as we generate unique name ourselves |
219 yield self.host.memory.createProfile(guest_profile, password) | |
220 yield self.host.memory.startSession(password, guest_profile) | |
221 yield self.host.memory.setParam("JabberID", jid_.full(), "Connection", profile_key=guest_profile) | |
222 yield self.host.memory.setParam("Password", password, "Connection", profile_key=guest_profile) | |
223 | |
224 ## email | |
225 language = kwargs.pop(u'language', None) | |
226 if language is not None: | |
227 extra[u'language'] = language | |
228 email = kwargs.pop(u'email', None) | |
229 | |
230 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
|
231 extra[u'email'] = email |
2184 | 232 url_template = kwargs.pop(u'url_template', '') |
233 format_args = { | |
234 u'uuid': id_, | |
235 u'app_name': C.APP_NAME, | |
236 u'app_url': C.APP_URL} | |
237 | |
238 name = kwargs.pop(u'name', None) | |
239 if name is None: | |
240 format_args[u'name'] = email | |
241 else: | |
242 format_args[u'name'] = extra[u'name'] = name | |
243 | |
244 profile = kwargs.pop(u'profile', None) | |
245 if profile is None: | |
246 format_args[u'profile'] = u'' | |
247 else: | |
248 format_args[u'profile'] = extra[u'profile'] = profile | |
249 | |
250 host_name = kwargs.pop(u'host_name', None) | |
251 if host_name is None: | |
252 format_args[u'host_name'] = profile or _(u"somebody") | |
253 else: | |
254 format_args[u'host_name'] = extra[u'host_name'] = host_name | |
255 | |
256 invite_url = url_template.format(**format_args) | |
257 format_args[u'url'] = invite_url | |
258 | |
259 yield sat_email.sendEmail( | |
260 self.host, | |
261 [email], | |
262 (kwargs.pop(u'message_subject', None) or DEFAULT_SUBJECT).format(**format_args), | |
263 (kwargs.pop(u'message_body', None) or DEFAULT_BODY).format(**format_args), | |
264 ) | |
265 | |
266 ## extra data saving | |
267 self.invitations[id_] = extra | |
268 | |
269 if kwargs: | |
270 log.warning(_(u"Not all arguments have been consumed: {}").format(kwargs)) | |
271 | |
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
|
272 extra[KEY_ID] = 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
|
273 extra[KEY_JID] = jid |
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
|
274 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
|
275 |
2219
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
276 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
|
277 """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
|
278 |
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 @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
|
280 @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
|
281 @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
|
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 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
|
284 |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
285 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
|
286 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
|
287 |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
288 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
|
289 """Modify invitation data |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
290 |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
291 @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
|
292 @param new_extra(dict[unicode, unicode]): data to update |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
293 @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
|
294 else update them |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
295 @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
|
296 """ |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
297 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
|
298 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
|
299 if replace: |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
300 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
|
301 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
|
302 try: |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
303 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
|
304 except KeyError: |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
305 continue |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
306 else: |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
307 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
|
308 for k,v in new_extra.iteritems(): |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
309 new_data[k] = v |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
310 |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
311 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
|
312 |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
313 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
|
314 d.addCallback(gotCurrentData) |
77a3d0a28642
plugin invitations: added modify method (+ bridge) and fixed email setting in extra
Goffi <goffi@goffi.org>
parents:
2212
diff
changeset
|
315 return d |