testbed list: make it uppercase. Actions: send confirmation email on user validation
[unfold.git] / portal / actions.py
index e39d480..3f3ae56 100644 (file)
@@ -6,9 +6,9 @@ import json
 
 from django.contrib.auth.models import User
 from django.template.loader     import render_to_string
-from django.core.mail           import send_mail,EmailMultiAlternatives
+from django.core.mail           import EmailMultiAlternatives, send_mail
 
-from theme                      import ThemeView
+from myslice.theme              import ThemeView
 
 theme = ThemeView()
 
@@ -23,6 +23,7 @@ theme = ThemeView()
 def authority_get_pis(request, authority_hrn):
     query = Query.get('authority').filter_by('authority_hrn', '==', authority_hrn).select('pi_users')
     results = execute_admin_query(request, query)
+    print "authority_get_pis = %s" % results
     # NOTE: temporarily commented. Because results is giving empty list. 
     # Needs more debugging
     #if not results:
@@ -33,11 +34,15 @@ def authority_get_pis(request, authority_hrn):
 
 def authority_get_pi_emails(request, authority_hrn):
     pi_users = authority_get_pis(request,authority_hrn)
-    if any(d['pi_users'] == None for d in pi_users):
-        theme.template_name = 'email_default_recipients.txt' 
-        default_email = render_to_string(theme.template, request)
-        default_email = default_email.replace('\n', '')
-        return default_email
+    print "pi_users = %s" % pi_users
+
+    if any(pi['pi_users'] == None or not pi['pi_users']  for pi in pi_users):
+        #theme.template_name = 'email_default_recipients.txt' 
+        #default_email = render_to_string(theme.template, request)
+        #default_email = default_email.replace('\n', '')
+        #return default_email
+        # the above doesn't work
+        return ['support@myslice.info']
     else:
         pi_user_hrns = [ hrn for x in pi_users for hrn in x['pi_users'] ]
         query = Query.get('user').filter_by('user_hrn', 'included', pi_user_hrns).select('user_email')
@@ -247,7 +252,8 @@ def get_request_by_id(ids):
 def get_requests(authority_hrns=None):
     print "get_request_by_authority auth_hrns = ", authority_hrns
     if not authority_hrns:
-        pending_users  = PendingUser.objects.all()
+        ## get those pending users who have confirmed their emails
+        pending_users  = PendingUser.objects.filter(status__iexact = 'True')
         pending_slices = PendingSlice.objects.all()
         pending_authorities = PendingAuthority.objects.all()
     else:
@@ -279,7 +285,7 @@ def portal_validate_request(wsgi_request, request_ids):
             try:
                 create_user(wsgi_request, request)
                 request_status['SFA user'] = {'status': True }
-
+                PendingUser.objects.get(id=request['id']).delete()
             except Exception, e:
                  request_status['SFA user'] = {'status': False, 'description': str(e)}
                        
@@ -303,6 +309,7 @@ def portal_validate_request(wsgi_request, request_ids):
             try:
                 create_slice(wsgi_request, request)
                 request_status['SFA slice'] = {'status': True }
+                PendingSlice.objects.get(id=request['id']).delete()
 
             except Exception, e:
                 request_status['SFA slice'] = {'status': False, 'description': str(e)}
@@ -325,6 +332,7 @@ def portal_validate_request(wsgi_request, request_ids):
                 print "ADD Authority"
                 sfa_add_authority(wsgi_request, sfa_authority_params)
                 request_status['SFA authority'] = {'status': True }
+                PendingAuthority.objects.get(id=request['id']).delete()
 
             except Exception, e:
                 request_status['SFA authority'] = {'status': False, 'description': str(e)}
@@ -368,6 +376,8 @@ def create_slice(wsgi_request, request):
     # Add User to Slice if we have the user_hrn in pendingslice table
     user_hrn = request.get('user_hrn', None)
     user_hrns = list([user_hrn]) if user_hrn else list()
+    
+    user_email = request.get
 
     # XXX We should create a slice with Manifold terminology
     slice_params = {
@@ -383,6 +393,13 @@ def create_slice(wsgi_request, request):
     results = execute_query(wsgi_request, query)
     if not results:
         raise Exception, "Could not create %s. Already exists ?" % slice_params['hrn']
+    ## We do not store the email in pendingslice table. As a result receiver's email is unknown ##
+    ## Need modification in pendingslice table ###
+    #else:
+    #    subject = 'Slice created'
+    #    msg = 'A manager of your institution has validated your slice request. You can now add resources to the slice and start experimenting.'
+    #    send_mail(subject, msg, 'support@onelab.eu',['yasin.upmc@gmail.com'], fail_silently=False)
+       
     return results
 
 def create_pending_slice(wsgi_request, request, email):
@@ -394,30 +411,31 @@ def create_pending_slice(wsgi_request, request, email):
         slice_name      = request['slice_name'],
         user_hrn        = request['user_hrn'],
         authority_hrn   = request['authority_hrn'],
-        number_of_nodes = request['number_of_nodes'],
+        number_of_nodes = request['exp_url'],
         purpose         = request['purpose'],
     )
     s.save()
 
-    # Send an email: the recipients are the PI of the authority
-    recipients = authority_get_pi_emails(wsgi_request, request['authority_hrn'])
-
-    theme.template_name = 'slice_request_email.txt' 
-    text_content = render_to_string(theme.template, request)
-
-    theme.template_name = 'slice_request_email.html' 
-    html_content = render_to_string(theme.template, request)
-
-    theme.template_name = 'slice_request_email_subject.txt'
-    subject = render_to_string(theme.template, request)
-    subject = subject.replace('\n', '')
+    try:
+        # Send an email: the recipients are the PI of the authority
+        recipients = authority_get_pi_emails(wsgi_request, request['authority_hrn'])
 
-    sender = email
-    msg = EmailMultiAlternatives(subject, text_content, sender, [recipients])
-    print msg
-    msg.attach_alternative(html_content, "text/html")
-    msg.send()
-    #send_mail(subject, msg, email, recipients)
+        theme.template_name = 'slice_request_email.txt' 
+        text_content = render_to_string(theme.template, request)
+    
+        theme.template_name = 'slice_request_email.html' 
+        html_content = render_to_string(theme.template, request)
+    
+        theme.template_name = 'slice_request_email_subject.txt'
+        subject = render_to_string(theme.template, request)
+        subject = subject.replace('\n', '')
+    
+        sender = email
+        msg = EmailMultiAlternatives(subject, text_content, sender, recipients)
+        msg.attach_alternative(html_content, "text/html")
+        msg.send()
+    except Exception, e:
+        print "Failed to send email, please check the mail templates and the SMTP configuration of your server"
 
 #-------------------------------------------------------------------------------
 # REQUESTS - Users
@@ -496,6 +514,10 @@ def sfa_create_user(wsgi_request, request):
     results = execute_query(wsgi_request, query)
     if not results:
         raise Exception, "Could not create %s. Already exists ?" % sfa_user_params['user_hrn']
+    else:
+        subject = 'User validated'
+        msg = 'A manager of your institution has validated your account. You have now full user access to the portal.'
+        send_mail(subject, msg, 'support@onelab.eu',[request['email']], fail_silently=False)       
     return results
 
 def create_user(wsgi_request, request):
@@ -529,10 +551,30 @@ def create_pending_user(wsgi_request, request, user_detail):
         public_key    = request['public_key'],
         private_key   = request['private_key'],
         user_hrn      = request['user_hrn'],
-        pi            = '',                         # XXX Why not None ?
+        pi            = request['pi'],
+        email_hash    = request['email_hash'],
+        status        = 'False',
     )
     b.save()
+    # sends email to user to activate the email
+    theme.template_name = 'activate_user.html'
+    html_content = render_to_string(theme.template, request)
+    theme.template_name = 'activate_user.txt'
+    text_content = render_to_string(theme.template, request)
+    theme.template_name = 'activate_user_email_subject.txt'
+    subject = render_to_string(theme.template, request)
+    subject = subject.replace('\n', '')
+    #sender = 'support@myslice.info'
+    theme.template_name = 'email_default_sender.txt'
+    sender =  render_to_string(theme.template, request)
+    sender = sender.replace('\n', '')
+    recipient = [request['email']]
+    #recipient = recipient.append(request['email'])
 
+    msg = EmailMultiAlternatives(subject, text_content, sender, recipient)
+    msg.attach_alternative(html_content, "text/html")
+    msg.send()
+   
     # saves the user to django auth_user table [needed for password reset]
     user = User.objects.create_user(request['email'], request['email'], request['password'])
 
@@ -561,7 +603,7 @@ def create_pending_user(wsgi_request, request, user_detail):
             .select('platform_id')
         reg_platform = execute_admin_query(wsgi_request, reg_platform_query)
 
-        registry_platform_id = reg_platform[0]['platform_id']
+        reg_platform_id = reg_platform[0]['platform_id']
         account_params = {
             'platform_id'   : reg_platform_id, # XXX ALERT !!
             'user_id'       : user_id, 
@@ -572,24 +614,29 @@ def create_pending_user(wsgi_request, request, user_detail):
     except Exception, e:
         print "Failed creating manifold account on platform %s for user: %s" % ('myslice', request['email'])
 
-    # Send an email: the recipients are the PI of the authority
-    # If No PI is defined for this Authority, send to a default email (different for each theme)
-    recipients = authority_get_pi_emails(wsgi_request, request['authority_hrn'])
+    try:
+        # Send an email: the recipients are the PI of the authority
+        # If No PI is defined for this Authority, send to a default email (different for each theme)
+        recipients = authority_get_pi_emails(wsgi_request, request['authority_hrn'])
+        
+        theme.template_name = 'user_request_email.html'
+        html_content = render_to_string(theme.template, request)
+        theme.template_name = 'user_request_email.txt'
+        text_content = render_to_string(theme.template, request)
     
-    theme.template_name = 'user_request_email.html'
-    html_content = render_to_string(theme.template, request)
-
-    theme.template_name = 'user_request_email.txt'
-    text_content = render_to_string(theme.template, request)
-
-    theme.template_name = 'user_request_email_subject.txt'
-    subject = render_to_string(theme.template, request)
-    subject = subject.replace('\n', '')
-
-    theme.template_name = 'email_default_sender.txt'
-    sender =  render_to_string(theme.template, request)
-    sender = sender.replace('\n', '')
-
-    msg = EmailMultiAlternatives(subject, text_content, sender, [recipients])
-    msg.attach_alternative(html_content, "text/html")
-    msg.send()
+        theme.template_name = 'user_request_email_subject.txt'
+        subject = render_to_string(theme.template, request)
+        subject = subject.replace('\n', '')
+    
+        theme.template_name = 'email_default_sender.txt'
+        sender =  render_to_string(theme.template, request)
+        sender = sender.replace('\n', '')
+    
+        msg = EmailMultiAlternatives(subject, text_content, sender, recipients)
+        msg.attach_alternative(html_content, "text/html")
+        msg.send()
+    except Exception, e:
+        print "Failed to send email, please check the mail templates and the SMTP configuration of your server"
+        import traceback
+        traceback.print_exc()