getAuthorities handling exception if no result from Registry platform
[myslice.git] / portal / actions.py
index 46c6919..523a9e1 100644 (file)
@@ -7,14 +7,16 @@ from unfold.page                    import Page
 import json
 
 from django.contrib.auth.models     import User
-from django.contrib.sites.models    import Site
 from django.contrib.auth            import get_user_model
 from django.template.loader         import render_to_string
 from django.core.mail               import EmailMultiAlternatives, send_mail
 
 from myslice.theme                  import ThemeView
 from myslice.configengine           import ConfigEngine
-from myslice.settings               import logger
+
+from myslice.settings import logger
+
+from rest.sfa_api import sfa_client
 
 theme = ThemeView()
 
@@ -78,6 +80,22 @@ def get_jfed_identity(request):
         print e
         return None
 
+def getAuthorities(request, admin = False):
+    # XXX theme has to be the same as the root authority 
+    result = sfa_client(request,'List',hrn=theme.theme,object_type='authority',platforms=['myslice'],admin=admin)
+    authorities = list()
+    try:
+        for item in result['myslice']:
+            t_hrn = item['hrn'].split('.')
+            if 'name' in item:
+                authorities.append({'authority_hrn':item['hrn'], 'name':item['name'], 'shortname':t_hrn[-1].upper()})    
+            else:
+                authorities.append({'authority_hrn':item['hrn']})    
+    except:
+        logger.error(result)
+    return sorted(authorities)
+
+
 # Get the list of pis in a given authority
 def authority_get_pis(request, authority_hrn):
     # CACHE PB with fields
@@ -382,7 +400,7 @@ def manifold_add_user(wsgi_request, request):
     if not results:
         raise Exception, "Failed creating manifold user: %s" % user_params['email']
     result = results[0]
-    return result['email']
+    return result['user_id']
 
 def manifold_update_user(request, email, user_params):
     # user_params: password, config e.g., 
@@ -445,7 +463,8 @@ def delete_local_user(wsgi_request, user_email):
         user_config = json.loads(user[0]['config'])
         authority_hrn = user_config.get('authority', None)
         
-        if is_pi(wsgi_request, '$user_hrn', authority_hrn):
+        #if is_pi(wsgi_request, '$user_hrn', authority_hrn):
+        try:
             # removing from Django auth_user
             UserModel = get_user_model()
             UserModel._default_manager.filter(email__iexact = user_email).delete()
@@ -455,9 +474,9 @@ def delete_local_user(wsgi_request, user_email):
                      
             # removing manifold user
             manifold_delete_user(wsgi_request, user_id)
-        else:
-            return False
-            #raise Exception, "No sufficient rights on authority = ",authority_hrn
+        except Exception, e:
+            #return False
+            print "No sufficient rights on authority = ",authority_hrn
 
     return True      
 
@@ -659,31 +678,30 @@ def portal_validate_request(wsgi_request, request_ids):
             elif request['type'] == 'authority':
                 #hrn = "%s.%s" % (request['authority_hrn'], request['site_authority'])
                 hrn = request['site_authority']
+                name = request['site_name']
                 # XXX tmp sfa dependency
                 from sfa.util.xrn import Xrn 
                 urn = Xrn(hrn, request['type']).get_urn()
                 
                 # Only hrn is required for Manifold Query 
                 sfa_authority_params = {
-                    'authority_hrn'        : hrn,
-                    #'authority_urn'        : urn,
-                    #'type'       : request['type'],
-                    #'pi'        : None,
-                    #'enabled'    : True
+                    'authority_hrn' : hrn,
+                    'name'          : name       
                 }
-                logger.info("ADD Authority")
+                #logger.info("ADD Authority")
                 sfa_add_authority(wsgi_request, sfa_authority_params)
                 request_status['SFA authority'] = {'status': True }
                 a = PendingAuthority.objects.get(id=request['id'])
                 ctx = { 
                     'site_name'     : a.site_name,
-                    'short_name'    : a.short_name,
-                    'url'           : a.url,
-                    'city'          : a.city,
-                    'country'       : a.country,                          
-                    'portal_url'    : a.current_site,
+                    #'short_name'    : a.short_name,
+                    #'url'           : a.url,
+                    'city'          : a.address_city,
+                    'country'       : a.address_country,                          
+                    #'portal_url'    : a.current_site,
                 }
-                user_email = a.email
+                # address_line1 contains the email of the user in pending_authority table
+                user_email = a.address_line1
 
                 PendingAuthority.objects.get(id=request['id']).delete()
                 
@@ -741,9 +759,12 @@ def portal_validate_request(wsgi_request, request_ids):
                 raise Exception, 'unknown type of request %s' % request['type']
             # XXX Remove from Pendings in database
 
-            send_status_email(ctx, user_email, request['type'], 'validated')
+            send_status_email(wsgi_request, ctx, user_email, request['type'], 'validated')
         except Exception, e:
             request_status['SFA '+request['type']] = {'status': False, 'description': str(e)}
+            logger.error('ERROR - actions.py - portal_validate_request: %s' % e)
+            import traceback
+            logger.error(traceback.format_exc())
 
         status['%s__%s' % (request['type'], request['id'])] = request_status
 
@@ -762,14 +783,17 @@ def reject_action(request, **kwargs):
     json_answer = json.dumps(status)
     return HttpResponse (json_answer, content_type="application/json")
 
+def get_current_site(request):
+    if request.is_secure():
+        current_site = 'https://'
+    else:
+        current_site = 'http://'
+    current_site += request.META['HTTP_HOST']
+    return current_site
 
 def portal_reject_request(wsgi_request, request_ids):
     status = {}
-    # get the domain url    
-    current_site = Site.objects.get_current()
-    current_site = current_site.domain
-
-
+    current_site = get_current_site(wsgi_request)
     if not isinstance(request_ids, list):
         request_ids = [request_ids]
 
@@ -876,30 +900,38 @@ def portal_reject_request(wsgi_request, request_ids):
             else:
                 raise Exception, 'unknown type of request %s' % request['type']
 
-            send_status_email(ctx, user_email, request['type'], 'denied')
+            send_status_email(wsgi_request, ctx, user_email, request['type'], 'denied')
         except Exception, e:
             request_status['SFA '+request['type']] = {'status': False, 'description': str(e)}
+            logger.error('ERROR - actions.py - portal_reject_request: %s' % e)
+            import traceback
+            logger.error(traceback.format_exc())
 
         status['%s__%s' % (request['type'], request['id'])] = request_status
 
     return status
 
-def send_status_email(ctx, user_email, obj_type, status):
+def send_status_email(request, ctx, user_email, obj_type, status):
     try:
+        ctx['current_site'] = get_current_site(request)
+        ctx['theme'] = theme
+
         theme.template_name = obj_type + '_request_' + status + '.txt'
         text_content = render_to_string(theme.template, ctx)
         theme.template_name = obj_type + '_request_' + status + '.html'
         html_content = render_to_string(theme.template, ctx)
         theme.template_name = 'email_default_sender.txt'
+
         sender =  render_to_string(theme.template, ctx)
         sender = sender.replace('\n', '')
                        
-        subject = obj_type + ' request '+ status +'.'
+        subject = obj_type.title() + ' request '+ status
     
         msg = EmailMultiAlternatives(subject, text_content, sender, [user_email])
         msg.attach_alternative(html_content, "text/html")
         msg.send()
     except Exception as e:
+        print e
         logger.error("Failed to send email, please check the mail templates and the SMTP configuration of your server")
 
 
@@ -1038,28 +1070,33 @@ def create_pending_join(wsgi_request, request):
 # SEND EMAILS
 #-------------------------------------------------------------------------------
 
-def send_email_to_pis(wsgi_request, request, obj_type):
+def send_email_to_pis(request, context, obj_type):
     try:
+        context['current_site'] = get_current_site(request)
+        context['theme'] = theme
         # Send an email: the recipients are the PIs of the authority
-        recipients = authority_get_pi_emails(wsgi_request, request['authority_hrn'])
+        recipients = authority_get_pi_emails(request, context['authority_hrn'])
 
         theme.template_name = obj_type + '_request_email.txt' 
-        text_content = render_to_string(theme.template, request)
+        text_content = render_to_string(theme.template, context)
 
         theme.template_name = obj_type + '_request_email.html' 
-        html_content = render_to_string(theme.template, request)
+        html_content = render_to_string(theme.template, context)
 
-        theme.template_name = obj_type + '_request_email_subject.txt'
-        subject = render_to_string(theme.template, request)
-        subject = subject.replace('\n', '')
+        #theme.template_name = obj_type + '_request_email_subject.txt'
+        #subject = render_to_string(theme.template, request)
+        #subject = subject.replace('\n', '')
+        subject = "New "+obj_type+" request"
 
         theme.template_name = 'email_default_sender.txt'
-        sender =  render_to_string(theme.template, request)
+        sender =  render_to_string(theme.template, context)
+        sender = sender.replace('\n', '')
 
         msg = EmailMultiAlternatives(subject, text_content, sender, recipients)
         msg.attach_alternative(html_content, "text/html")
         msg.send()
     except Exception, e:
+        print e
         print "Failed to send email, please check the mail templates and the SMTP configuration of your server"
 
 
@@ -1229,6 +1266,8 @@ def create_pending_user(wsgi_request, request, user_detail):
     )
     b.save()
     # sends email to user to activate the email
+    request['current_site'] = get_current_site(wsgi_request)
+    request['theme'] = theme
     theme.template_name = 'activate_user.html'
     html_content = render_to_string(theme.template, request)
     theme.template_name = 'activate_user.txt'
@@ -1261,8 +1300,6 @@ def create_pending_user(wsgi_request, request, user_detail):
     if request['private_key']:
         account_config['user_private_key'] = request['private_key']
 
-    user_id = user_detail['user_id'] + 1 # the user_id for the newly created user in local:user
-
     # XXX TODO: Require a myslice platform
     # ALERT: this will disapear with ROUTERV2 of Manifold
     # We have to consider the case where several registries can be used