getAuthorities handling exception if no result from Registry platform
[myslice.git] / portal / actions.py
index a6b33a5..523a9e1 100644 (file)
@@ -7,14 +7,16 @@ from unfold.page                    import Page
 import json
 
 from django.contrib.auth.models     import User
 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 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()
 
 
 theme = ThemeView()
 
@@ -78,6 +80,22 @@ def get_jfed_identity(request):
         print e
         return None
 
         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
 # 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]
     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., 
 
 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)
         
         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()
             # 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)
                      
             # 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      
 
 
     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']
             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 = {
                 # 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,
                 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()
                 
 
                 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
 
                 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)}
         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
 
 
         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")
 
     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 = {}
 
 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]
 
     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']
 
             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)}
         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
 
 
         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:
     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'
         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', '')
                        
         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:
     
         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")
 
 
         logger.error("Failed to send email, please check the mail templates and the SMTP configuration of your server")
 
 
@@ -1038,29 +1070,33 @@ def create_pending_join(wsgi_request, request):
 # SEND EMAILS
 #-------------------------------------------------------------------------------
 
 # SEND EMAILS
 #-------------------------------------------------------------------------------
 
-def send_email_to_pis(wsgi_request, request, obj_type):
+def send_email_to_pis(request, context, obj_type):
     try:
     try:
+        context['current_site'] = get_current_site(request)
+        context['theme'] = theme
         # Send an email: the recipients are the PIs of the authority
         # 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' 
 
         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' 
 
         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'
 
         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:
         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"
 
 
         print "Failed to send email, please check the mail templates and the SMTP configuration of your server"
 
 
@@ -1230,6 +1266,8 @@ def create_pending_user(wsgi_request, request, user_detail):
     )
     b.save()
     # sends email to user to activate the email
     )
     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'
     theme.template_name = 'activate_user.html'
     html_content = render_to_string(theme.template, request)
     theme.template_name = 'activate_user.txt'
@@ -1262,8 +1300,6 @@ def create_pending_user(wsgi_request, request, user_detail):
     if request['private_key']:
         account_config['user_private_key'] = request['private_key']
 
     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
     # 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