Revision 8f5a3a06 snf-astakos-app/astakos/im/views.py
b/snf-astakos-app/astakos/im/views.py | ||
---|---|---|
54 | 54 |
from django.contrib.auth.views import password_change |
55 | 55 |
|
56 | 56 |
from astakos.im.models import AstakosUser, Invitation, ApprovalTerms |
57 |
from astakos.im.backends import get_backend |
|
57 |
from astakos.im.activation_backends import get_backend
|
|
58 | 58 |
from astakos.im.util import get_context, prepare_response, set_cookie, has_signed_terms |
59 | 59 |
from astakos.im.forms import * |
60 |
from astakos.im.functions import send_greeting |
|
60 |
from astakos.im.functions import send_greeting, send_feedback, SendMailError
|
|
61 | 61 |
from astakos.im.settings import DEFAULT_CONTACT_EMAIL, DEFAULT_FROM_EMAIL, COOKIE_NAME, COOKIE_DOMAIN, IM_MODULES, SITENAME, BASEURL, LOGOUT_NEXT |
62 | 62 |
from astakos.im.functions import invite as invite_func |
63 | 63 |
|
... | ... | |
132 | 132 |
|
133 | 133 |
""" |
134 | 134 |
template_name = login_template_name |
135 |
formclass = 'LoginForm' |
|
136 |
kwargs = {} |
|
137 | 135 |
if request.user.is_authenticated(): |
138 | 136 |
return HttpResponseRedirect(reverse('astakos.im.views.edit_profile')) |
139 | 137 |
return render_response(template_name, |
140 |
form = globals()[formclass](**kwargs),
|
|
138 |
login_form = LoginForm(),
|
|
141 | 139 |
context_instance = get_context(request, extra_context)) |
142 | 140 |
|
143 | 141 |
@login_required |
... | ... | |
180 | 178 |
status = None |
181 | 179 |
message = None |
182 | 180 |
inviter = AstakosUser.objects.get(username = request.user.username) |
181 |
form = InvitationForm() |
|
183 | 182 |
|
184 | 183 |
if request.method == 'POST': |
185 |
username = request.POST.get('uniq') |
|
186 |
realname = request.POST.get('realname') |
|
184 |
form = InvitationForm(request.POST) |
|
187 | 185 |
|
188 | 186 |
if inviter.invitations > 0: |
189 |
try: |
|
190 |
invite_func(inviter, username, realname) |
|
191 |
status = messages.SUCCESS |
|
192 |
message = _('Invitation sent to %s' % username) |
|
193 |
transaction.commit() |
|
194 |
except (SMTPException, socket.error) as e: |
|
195 |
status = messages.ERROR |
|
196 |
message = getattr(e, 'strerror', '') |
|
197 |
transaction.rollback() |
|
198 |
except IntegrityError, e: |
|
199 |
status = messages.ERROR |
|
200 |
message = _('There is already invitation for %s' % username) |
|
201 |
transaction.rollback() |
|
187 |
if form.is_valid(): |
|
188 |
try: |
|
189 |
invitation = form.save() |
|
190 |
invitation.inviter = inviter |
|
191 |
invite_func(invitation, inviter) |
|
192 |
status = messages.SUCCESS |
|
193 |
message = _('Invitation sent to %s' % invitation.username) |
|
194 |
transaction.commit() |
|
195 |
except SendMailError, e: |
|
196 |
message = e.message |
|
197 |
transaction.rollback() |
|
202 | 198 |
else: |
203 | 199 |
status = messages.ERROR |
204 | 200 |
message = _('No invitations left') |
... | ... | |
212 | 208 |
'sent':sent} |
213 | 209 |
context = get_context(request, extra_context, **kwargs) |
214 | 210 |
return render_response(template_name, |
211 |
invitation_form = form, |
|
215 | 212 |
context_instance = context) |
216 | 213 |
|
217 | 214 |
@login_required |
... | ... | |
265 | 262 |
messages.add_message(request, messages.ERROR, ve) |
266 | 263 |
return render_response(template_name, |
267 | 264 |
reset_cookie = reset_cookie, |
268 |
form = form, |
|
265 |
profile_form = form,
|
|
269 | 266 |
context_instance = get_context(request, |
270 | 267 |
extra_context)) |
271 | 268 |
|
272 |
def signup(request, on_failure='im/signup.html', on_success='im/signup_complete.html', extra_context={}, backend=None): |
|
269 |
@transaction.commit_manually |
|
270 |
def signup(request, template_name='im/signup.html', on_success='im/signup_complete.html', extra_context={}, backend=None): |
|
273 | 271 |
""" |
274 | 272 |
Allows a user to create a local account. |
275 | 273 |
|
... | ... | |
277 | 275 |
In case of POST handles the signup. |
278 | 276 |
|
279 | 277 |
The user activation will be delegated to the backend specified by the ``backend`` keyword argument |
280 |
if present, otherwise to the ``astakos.im.backends.InvitationBackend`` |
|
281 |
if settings.ASTAKOS_INVITATIONS_ENABLED is True or ``astakos.im.backends.SimpleBackend`` if not |
|
282 |
(see backends); |
|
278 |
if present, otherwise to the ``astakos.im.activation_backends.InvitationBackend``
|
|
279 |
if settings.ASTAKOS_INVITATIONS_ENABLED is True or ``astakos.im.activation_backends.SimpleBackend`` if not
|
|
280 |
(see activation_backends);
|
|
283 | 281 |
|
284 | 282 |
Upon successful user creation if ``next`` url parameter is present the user is redirected there |
285 | 283 |
otherwise renders the same page with a success message. |
286 | 284 |
|
287 |
On unsuccessful creation, renders ``on_failure`` with an error message.
|
|
285 |
On unsuccessful creation, renders ``template_name`` with an error message.
|
|
288 | 286 |
|
289 | 287 |
**Arguments** |
290 | 288 |
|
291 |
``on_failure``
|
|
292 |
A custom template to render in case of failure. This is optional;
|
|
289 |
``template_name``
|
|
290 |
A custom template to render. This is optional; |
|
293 | 291 |
if not specified, this will default to ``im/signup.html``. |
294 | 292 |
|
295 | 293 |
|
... | ... | |
302 | 300 |
|
303 | 301 |
**Template:** |
304 | 302 |
|
305 |
im/signup.html or ``on_failure`` keyword argument.
|
|
303 |
im/signup.html or ``template_name`` keyword argument.
|
|
306 | 304 |
im/signup_complete.html or ``on_success`` keyword argument. |
307 | 305 |
""" |
308 | 306 |
if request.user.is_authenticated(): |
309 | 307 |
return HttpResponseRedirect(reverse('astakos.im.views.index')) |
308 |
if not backend: |
|
309 |
backend = get_backend(request) |
|
310 | 310 |
try: |
311 |
if not backend: |
|
312 |
backend = get_backend(request) |
|
313 |
for provider in IM_MODULES: |
|
314 |
extra_context['%s_form' % provider] = backend.get_signup_form(provider) |
|
315 |
if request.method == 'POST': |
|
316 |
provider = request.POST.get('provider') |
|
317 |
next = request.POST.get('next', '') |
|
318 |
form = extra_context['%s_form' % provider] |
|
319 |
if form.is_valid(): |
|
320 |
if provider != 'local': |
|
321 |
url = reverse('astakos.im.target.%s.login' % provider) |
|
322 |
url = '%s?email=%s&next=%s' % (url, form.data['email'], next) |
|
323 |
if backend.invitation: |
|
324 |
url = '%s&code=%s' % (url, backend.invitation.code) |
|
325 |
return redirect(url) |
|
326 |
else: |
|
327 |
status, message, user = backend.signup(form) |
|
328 |
if user and user.is_active: |
|
329 |
return prepare_response(request, user, next=next) |
|
330 |
messages.add_message(request, status, message) |
|
331 |
return render_response(on_success, |
|
332 |
context_instance=get_context(request, extra_context)) |
|
311 |
query_dict = request.__getattribute__(request.method) |
|
312 |
provider = query_dict.get('provider', 'local') |
|
313 |
form = backend.get_signup_form(provider) |
|
333 | 314 |
except (Invitation.DoesNotExist, ValueError), e: |
334 | 315 |
messages.add_message(request, messages.ERROR, e) |
335 |
for provider in IM_MODULES: |
|
336 |
main = provider.capitalize() if provider == 'local' else 'ThirdParty' |
|
337 |
formclass = '%sUserCreationForm' % main |
|
338 |
extra_context['%s_form' % provider] = globals()[formclass]() |
|
339 |
return render_response(on_failure, |
|
316 |
if request.method == 'POST': |
|
317 |
if form.is_valid(): |
|
318 |
user = form.save() |
|
319 |
try: |
|
320 |
result = backend.handle_activation(user) |
|
321 |
except SendMailError, e: |
|
322 |
message = e.message |
|
323 |
status = messages.ERROR |
|
324 |
transaction.rollback() |
|
325 |
else: |
|
326 |
message = result.message |
|
327 |
status = messages.SUCCESS |
|
328 |
transaction.commit() |
|
329 |
if user and user.is_active: |
|
330 |
next = request.POST.get('next', '') |
|
331 |
return prepare_response(request, user, next=next) |
|
332 |
messages.add_message(request, status, message) |
|
333 |
return render_response(on_success, |
|
334 |
context_instance=get_context(request, extra_context)) |
|
335 |
return render_response(template_name, |
|
336 |
local_signup_form = form, |
|
340 | 337 |
context_instance=get_context(request, extra_context)) |
341 | 338 |
|
342 | 339 |
@login_required |
343 | 340 |
@signed_terms_required |
344 |
def send_feedback(request, template_name='im/feedback.html', email_template_name='im/feedback_mail.txt', extra_context={}):
|
|
341 |
def feedback(request, template_name='im/feedback.html', email_template_name='im/feedback_mail.txt', extra_context={}): |
|
345 | 342 |
""" |
346 | 343 |
Allows a user to send feedback. |
347 | 344 |
|
... | ... | |
376 | 373 |
|
377 | 374 |
form = FeedbackForm(request.POST) |
378 | 375 |
if form.is_valid(): |
379 |
subject = _("Feedback from %s alpha2 testing" % SITENAME) |
|
380 |
from_email = request.user.email |
|
381 |
recipient_list = [DEFAULT_CONTACT_EMAIL] |
|
382 |
content = render_to_string(email_template_name, { |
|
383 |
'message': form.cleaned_data['feedback_msg'], |
|
384 |
'data': form.cleaned_data['feedback_data'], |
|
385 |
'request': request}) |
|
386 |
|
|
376 |
msg = form.cleaned_data['feedback_msg'], |
|
377 |
data = form.cleaned_data['feedback_data'] |
|
387 | 378 |
try: |
388 |
send_mail(subject, content, from_email, recipient_list) |
|
379 |
send_feedback(msg, data, request.user, email_template_name) |
|
380 |
except SendMailError, e: |
|
381 |
message = e.message |
|
382 |
status = messages.ERROR |
|
383 |
else: |
|
389 | 384 |
message = _('Feedback successfully sent') |
390 | 385 |
status = messages.SUCCESS |
391 |
except (SMTPException, socket.error) as e: |
|
392 |
status = messages.ERROR |
|
393 |
message = getattr(e, 'strerror', '') |
|
394 | 386 |
messages.add_message(request, status, message) |
395 | 387 |
return render_response(template_name, |
396 |
form = form, |
|
388 |
feedback_form = form,
|
|
397 | 389 |
context_instance = get_context(request, extra_context)) |
398 | 390 |
|
399 | 391 |
def logout(request, template='registration/logged_out.html', extra_context={}): |
... | ... | |
441 | 433 |
response = prepare_response(request, user, next, renew=True) |
442 | 434 |
transaction.commit() |
443 | 435 |
return response |
444 |
except (SMTPException, socket.error) as e:
|
|
445 |
message = getattr(e, 'name') if hasattr(e, 'name') else e
|
|
436 |
except SendEmailError, e:
|
|
437 |
message = e.message
|
|
446 | 438 |
messages.add_message(request, messages.ERROR, message) |
447 | 439 |
transaction.rollback() |
448 | 440 |
return signup(request, on_failure='im/signup.html') |
... | ... | |
469 | 461 |
if request.method == 'POST': |
470 | 462 |
next = request.POST.get('next') |
471 | 463 |
if not next: |
472 |
return HttpResponseBadRequest(_('No next param.'))
|
|
464 |
next = reverse('astakos.im.views.index')
|
|
473 | 465 |
form = SignApprovalTermsForm(request.POST, instance=request.user) |
474 | 466 |
if not form.is_valid(): |
475 | 467 |
return render_response(template_name, |
476 | 468 |
terms = terms, |
477 |
form = form, |
|
469 |
approval_terms_form = form,
|
|
478 | 470 |
context_instance = get_context(request, extra_context)) |
479 | 471 |
user = form.save() |
480 | 472 |
return HttpResponseRedirect(next) |
... | ... | |
484 | 476 |
form = SignApprovalTermsForm(instance=request.user) |
485 | 477 |
return render_response(template_name, |
486 | 478 |
terms = terms, |
487 |
form = form, |
|
479 |
approval_terms_form = form,
|
|
488 | 480 |
context_instance = get_context(request, extra_context)) |
489 | 481 |
|
490 | 482 |
@signed_terms_required |
Also available in: Unified diff