change feedback view to render feedback page with success message in case of success
[astakos] / astakos / im / views.py
index ba563ec..62040a9 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright 2011 GRNET S.A. All rights reserved.
+# Copyright 2011-2012 GRNET S.A. All rights reserved.
 # 
 # Redistribution and use in source and binary forms, with or
 # without modification, are permitted provided that the following
@@ -54,19 +54,18 @@ from django.shortcuts import render_to_response
 from django.utils.http import urlencode
 from django.utils.translation import ugettext as _
 from django.core.urlresolvers import reverse
-from django.contrib.auth.forms import AuthenticationForm
 from django.contrib.auth.models import AnonymousUser
 from django.contrib.auth.decorators import login_required
-from django.contrib.sites.models import get_current_site
+from django.contrib.sites.models import Site
 from django.contrib import messages
 from django.db import transaction
 from django.contrib.auth.forms import UserCreationForm
 
 #from astakos.im.openid_store import PithosOpenIDStore
 from astakos.im.models import AstakosUser, Invitation
-from astakos.im.util import isoformat, get_or_create_user, get_context
+from astakos.im.util import isoformat, get_context, get_current_site
 from astakos.im.backends import get_backend
-from astakos.im.forms import ProfileForm, FeedbackForm
+from astakos.im.forms import ProfileForm, FeedbackForm, LoginForm
 
 def render_response(template, tab=None, status=200, context_instance=None, **kwargs):
     """
@@ -80,26 +79,37 @@ def render_response(template, tab=None, status=200, context_instance=None, **kwa
     html = render_to_string(template, kwargs, context_instance=context_instance)
     return HttpResponse(html, status=status)
 
-def index(request, template_name='index.html', extra_context={}):
+def index(request, login_template_name='login.html', profile_template_name='profile.html', extra_context={}):
     """
-    Renders the index (login) page
+    If there is logged on user renders the profile page otherwise renders login page.
     
     **Arguments**
     
-    ``template_name``
-        A custom template to use. This is optional; if not specified,
-        this will default to ``index.html``.
+    ``login_template_name``
+        A custom login template to use. This is optional; if not specified,
+        this will default to ``login.html``.
+    
+    ``profile_template_name``
+        A custom profile template to use. This is optional; if not specified,
+        this will default to ``profile.html``.
     
     ``extra_context``
         An dictionary of variables to add to the template context.
     
     **Template:**
     
-    index.html or ``template_name`` keyword argument.
+    profile.html or login.html or ``template_name`` keyword argument.
     
     """
+    template_name = login_template_name
+    formclass = 'LoginForm'
+    kwargs = {}
+    if request.user.is_authenticated():
+        template_name = profile_template_name
+        formclass = 'ProfileForm'
+        kwargs.update({'instance':request.user})
     return render_response(template_name,
-                           form = AuthenticationForm(),
+                           form = globals()[formclass](**kwargs),
                            context_instance = get_context(request, extra_context))
 
 def _generate_invitation_code():
@@ -111,17 +121,17 @@ def _generate_invitation_code():
         except Invitation.DoesNotExist:
             return code
 
-def _send_invitation(baseurl, inv):
-    url = settings.SIGNUP_TARGET % (baseurl, inv.code, quote(baseurl))
-    subject = _('Invitation to Pithos')
-    site = get_current_site(request)
+def _send_invitation(request, baseurl, inv):
+    sitename, sitedomain = get_current_site(request, use_https=request.is_secure())
+    subject = _('Invitation to %s' % sitename)
+    url = settings.SIGNUP_TARGET % (baseurl, inv.code, quote(sitedomain))
     message = render_to_string('invitation.txt', {
                 'invitation': inv,
                 'url': url,
                 'baseurl': baseurl,
-                'service': site_name,
-                'support': settings.DEFAULT_CONTACT_EMAIL})
-    sender = settings.DEFAULT_FROM_EMAIL
+                'service': sitename,
+                'support': settings.DEFAULT_CONTACT_EMAIL % sitename.lower()})
+    sender = settings.DEFAULT_FROM_EMAIL % sitename
     send_mail(subject, message, sender, [inv.username])
     logging.info('Sent invitation %s', inv)
 
@@ -164,8 +174,8 @@ def invite(request, template_name='invitations.html', extra_context={}):
     """
     status = None
     message = None
-    inviter = request.user
-
+    inviter = AstakosUser.objects.get(username = request.user.username)
+    
     if request.method == 'POST':
         username = request.POST.get('uniq')
         realname = request.POST.get('realname')
@@ -178,7 +188,8 @@ def invite(request, template_name='invitations.html', extra_context={}):
                 defaults={'code': code, 'realname': realname})
             
             try:
-                _send_invitation(request.build_absolute_uri('/').rstrip('/'), invitation)
+                baseurl = request.build_absolute_uri('/').rstrip('/')
+                _send_invitation(request, baseurl, invitation)
                 if created:
                     inviter.invitations = max(0, inviter.invitations - 1)
                     inviter.save()
@@ -285,23 +296,23 @@ def signup(request, template_name='signup.html', extra_context={}, backend=None)
     
     signup.html or ``template_name`` keyword argument.
     """
-    if not backend:
-            backend = get_backend()
     try:
-        form = backend.get_signup_form(request)
+        if not backend:
+            backend = get_backend(request)
+        form = backend.get_signup_form()
         if request.method == 'POST':
             if form.is_valid():
-                status, message = backend.signup(request)
-                # rollback incase of error
+                status, message = backend.signup(form)
+                # rollback in case of error
                 if status == messages.ERROR:
                     transaction.rollback()
                 else:
                     transaction.commit()
-                next = request.POST.get('next')
-                if next:
-                    return redirect(next)
+                    next = request.POST.get('next')
+                    if next:
+                        return redirect(next)
                 messages.add_message(request, status, message)
-    except (Invitation.DoesNotExist), e:
+    except (Invitation.DoesNotExist, Exception), e:
         messages.add_message(request, messages.ERROR, e)
     return render_response(template_name,
                            form = form if 'form' in locals() else UserCreationForm(),
@@ -332,7 +343,7 @@ def send_feedback(request, template_name='feedback.html', email_template_name='f
     
     **Settings:**
     
-    * FEEDBACK_CONTACT_EMAIL: List of feedback recipients
+    * DEFAULT_CONTACT_EMAIL: List of feedback recipients
     """
     if request.method == 'GET':
         form = FeedbackForm()
@@ -342,18 +353,23 @@ def send_feedback(request, template_name='feedback.html', email_template_name='f
         
         form = FeedbackForm(request.POST)
         if form.is_valid():
-            subject = _("Feedback from Okeanos")
+            sitename, sitedomain = get_current_site(request, use_https=request.is_secure())
+            subject = _("Feedback from %s" % sitename)
             from_email = request.user.email
-            recipient_list = [settings.FEEDBACK_CONTACT_EMAIL]
+            recipient_list = [settings.DEFAULT_CONTACT_EMAIL % sitename.lower()]
             content = render_to_string(email_template_name, {
-                        'message': form.cleaned_data('feedback_msg'),
-                        'data': form.cleaned_data('feedback_data'),
+                        'message': form.cleaned_data['feedback_msg'],
+                        'data': form.cleaned_data['feedback_data'],
                         'request': request})
             
-            send_mail(subject, content, from_email, recipient_list)
-            
-            resp = json.dumps({'status': 'send'})
-            return HttpResponse(resp)
+            try:
+                send_mail(subject, content, from_email, recipient_list)
+                message = _('Feedback successfully sent')
+                status = messages.SUCCESS
+            except (SMTPException, socket.error) as e:
+                status = messages.ERROR
+                message = getattr(e, 'strerror', '')
+            messages.add_message(request, status, message)
     return render_response(template_name,
                            form = form,
-                           context_instance = get_context(request, extra_context))
\ No newline at end of file
+                           context_instance = get_context(request, extra_context))