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