From c8396ad1b6cf17a60769496c3b51aa1e390575cc Mon Sep 17 00:00:00 2001 From: Loic Baron Date: Tue, 27 Jan 2015 18:37:24 +0100 Subject: [PATCH] Projects: Management, Slice Request, localStorage, ... --- portal/accountview.py | 32 ++++--- portal/actions.py | 70 ++++++++++------ portal/dashboardview.py | 2 +- portal/institution.py | 20 +++-- portal/managementtabrequests.py | 10 ++- portal/slicerequestview.py | 11 ++- portal/static/js/myslice.js | 52 +++++------- portal/templates/base.html | 8 +- .../fed4fire/fed4fire_account-view.html | 35 ++++---- .../fed4fire/fed4fire_home-view.html | 83 ------------------- .../fed4fire/fed4fire_institution.html | 22 ++++- .../fed4fire/fed4fire_slicerequest_view.html | 53 ++++++++---- portal/templates/slice-request-done-view.html | 6 +- portal/validationview.py | 2 +- 14 files changed, 199 insertions(+), 207 deletions(-) diff --git a/portal/accountview.py b/portal/accountview.py index 5b9c0d87..264948ac 100644 --- a/portal/accountview.py +++ b/portal/accountview.py @@ -38,8 +38,8 @@ class AccountView(LoginRequiredAutoLogoutView, ThemeView): page.add_css_files ( [ "css/onelab.css", "css/account_view.css","css/plugin.css" ] ) # Execute a Query to delegate credentials if necessary - sfa_user_query = Query().get('myslice:user').select('user_hrn').filter_by('user_hrn','==','$user_hrn') - sfa_user_result = execute_query(self.request, sfa_user_query) + #sfa_user_query = Query().get('myslice:user').select('user_hrn').filter_by('user_hrn','==','$user_hrn') + #sfa_user_result = execute_query(self.request, sfa_user_query) user_query = Query().get('local:user').select('config','email','status') user_details = execute_query(self.request, user_query) @@ -298,7 +298,7 @@ def account_process(request): for account_detail in account_details: for platform_detail in platform_details: # Add reference account to the platforms - if 'add_'+platform_detail['platform'] in request.POST: + if 'add_'+platform_detail['platform'] in request.POST or request.POST['button_value'] == 'add_'+platform_detail['platform']: platform_id = platform_detail['platform_id'] user_params = {'platform_id': platform_id, 'user_id': user_id, 'auth_type': "reference", 'config': '{"reference_platform": "myslice"}'} manifold_add_account(request,user_params) @@ -306,7 +306,7 @@ def account_process(request): return HttpResponseRedirect("/portal/account/") # Delete reference account from the platforms - if 'delete_'+platform_detail['platform'] in request.POST: + if 'delete_'+platform_detail['platform'] in request.POST or request.POST['button_value'] == 'delete_'+platform_detail['platform']: platform_id = platform_detail['platform_id'] user_params = {'user_id':user_id} manifold_delete_account(request,platform_id, user_id, user_params) @@ -331,7 +331,7 @@ def account_process(request): slice_cred.append(value) # special case: download each slice credentials separately for i in range(0, len(slice_list)): - if 'dl_'+slice_list[i] in request.POST: + if 'dl_'+slice_list[i] in request.POST or request.POST['button_value'] == 'dl_'+slice_list[i]: slice_detail = "Slice name: " + slice_list[i] +"\nSlice Credentials: \n"+ slice_cred[i] response = HttpResponse(slice_detail, content_type='text/plain') response['Content-Disposition'] = 'attachment; filename="slice_credential.txt"' @@ -346,7 +346,7 @@ def account_process(request): auth_cred.append(value) # special case: download each slice credentials separately for i in range(0, len(auth_list)): - if 'dl_'+auth_list[i] in request.POST: + if 'dl_'+auth_list[i] in request.POST or request.POST['button_value'] == 'dl_'+auth_list[i]: auth_detail = "Authority: " + auth_list[i] +"\nAuthority Credentials: \n"+ auth_cred[i] response = HttpResponse(auth_detail, content_type='text/plain') response['Content-Disposition'] = 'attachment; filename="auth_credential.txt"' @@ -468,7 +468,7 @@ def account_process(request): messages.error(request, 'Account error: You need an account in myslice platform to perform this action') return HttpResponseRedirect("/portal/account/") - elif 'dl_pubkey' in request.POST: + elif 'dl_pubkey' in request.POST or request.POST['button_value'] == 'dl_pubkey': for account_detail in account_details: for platform_detail in platform_details: if platform_detail['platform_id'] == account_detail['platform_id']: @@ -483,7 +483,7 @@ def account_process(request): messages.error(request, 'Account error: You need an account in myslice platform to perform this action') return HttpResponseRedirect("/portal/account/") - elif 'dl_pkey' in request.POST: + elif 'dl_pkey' in request.POST or request.POST['button_value'] == 'dl_pkey': for account_detail in account_details: for platform_detail in platform_details: if platform_detail['platform_id'] == account_detail['platform_id']: @@ -502,7 +502,7 @@ def account_process(request): messages.error(request, 'Account error: You need an account in myslice platform to perform this action') return HttpResponseRedirect("/portal/account/") - elif 'delete' in request.POST: + elif 'delete' in request.POST or request.POST['button_value'] == 'delete': for account_detail in account_details: for platform_detail in platform_details: if platform_detail['platform_id'] == account_detail['platform_id']: @@ -528,7 +528,7 @@ def account_process(request): return HttpResponseRedirect("/portal/account/") # download identity for jfed - elif 'dl_identity' in request.POST: + elif 'dl_identity' in request.POST or request.POST['button_value'] == 'dl_identity': for account_detail in account_details: for platform_detail in platform_details: if platform_detail['platform_id'] == account_detail['platform_id']: @@ -551,7 +551,7 @@ def account_process(request): return HttpResponseRedirect("/portal/account/") # Download sfi_config - elif 'dl_sfi_config' in request.POST: + elif 'dl_sfi_config' in request.POST or request.POST['button_value'] == 'dl_sfi_config': platform_detail = get_myslice_platform(request) platform_config = json.loads(platform_detail['config']) account_detail = get_myslice_account(request) @@ -585,7 +585,7 @@ def account_process(request): return response #clear all creds - elif 'clear_cred' in request.POST: + elif 'clear_cred' in request.POST or request.POST['button_value'] == 'clear_cred': try: result = clear_user_creds(request, user_email) if result is not None: @@ -598,7 +598,7 @@ def account_process(request): return HttpResponseRedirect("/portal/account/") # Download delegated_user_cred - elif 'dl_user_cred' in request.POST: + elif 'dl_user_cred' in request.POST or request.POST['button_value'] == 'dl_user_cred': if 'delegated_user_credential' in account_config: user_cred = account_config['delegated_user_credential'] response = HttpResponse(user_cred, content_type='text/plain') @@ -609,7 +609,7 @@ def account_process(request): return HttpResponseRedirect("/portal/account/") # Download user_cert - elif 'dl_user_cert' in request.POST: + elif 'dl_user_cert' in request.POST or request.POST['button_value'] == 'dl_user_cert': if 'user_credential' in account_config: user_cred = account_config['user_credential'] obj_cred = Credential(string=user_cred) @@ -632,7 +632,7 @@ def account_process(request): return HttpResponseRedirect("/portal/account/") # Download user p12 = private_key + Certificate - elif 'dl_user_p12' in request.POST: + elif 'dl_user_p12' in request.POST or request.POST['button_value'] == 'dl_user_p12': if 'user_credential' in account_config and 'user_private_key' in account_config: user_cred = account_config['user_credential'] obj_cred = Credential(string=user_cred) @@ -674,8 +674,6 @@ def account_process(request): messages.error(request, 'Download error: User private key or credential is not stored in the server') return HttpResponseRedirect("/portal/account/") - - else: messages.info(request, 'Under Construction. Please try again later!') return HttpResponseRedirect("/portal/account/") diff --git a/portal/actions.py b/portal/actions.py index 2075300d..90f7db9b 100644 --- a/portal/actions.py +++ b/portal/actions.py @@ -1,17 +1,19 @@ -from django.http import HttpResponse -from manifold.core.query import Query -from manifoldapi.manifoldapi import execute_query,execute_admin_query -from portal.models import PendingUser, PendingSlice, PendingAuthority +from django.http import HttpResponse +from manifold.core.query import Query +from manifoldapi.manifoldapi import execute_query,execute_admin_query +from portal.models import PendingUser, PendingSlice, PendingAuthority +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 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.theme import ThemeView +from myslice.configengine import ConfigEngine theme = ThemeView() @@ -28,7 +30,7 @@ import activity.slice def authority_get_pis(request, authority_hrn): # REGISTRY ONLY TO BE REMOVED WITH MANIFOLD-V2 - query = Query.get('authority').filter_by('authority_hrn', '==', authority_hrn).select('pi_users') + query = Query.get('myslice: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. @@ -172,19 +174,26 @@ def clear_user_creds(request, user_email): return None def is_pi(wsgi_request, user_hrn, authority_hrn): - # XXX could be done in a single query ! - - # seauthorities from user where user_hrn == "ple.upmc.jordan_auge" - - # REGISTRY ONLY TO BE REMOVED WITH MANIFOLD-V2 - query = Query.get('myslice:user').filter_by('user_hrn', '==', user_hrn).select('pi_authorities') - results = execute_admin_query(wsgi_request, query) - if not results: - # XXX Warning ? - return False - result = results[0] - user_authority_hrns = result.get('pi_authorities', []) - return authority_hrn in user_authority_hrns + # authorities from user where user_hrn == "ple.upmc.jordan_auge" + print "#### actions.py is_pi authority_hrn = ", authority_hrn + try: + # CACHE PB with fields + page = Page(wsgi_request) + metadata = page.get_metadata() + user_md = metadata.details_by_object('user') + user_fields = [column['name'] for column in user_md['column']] + + # REGISTRY ONLY TO BE REMOVED WITH MANIFOLD-V2 + query = Query().get('myslice:user').select(user_fields).filter_by('user_hrn','==',user_hrn) + #query = Query.get('myslice:user').filter_by('user_hrn', '==', user_hrn).select('pi_authorities') + results = execute_query(wsgi_request, query) + print "is_pi results = ", results + for user_detail in results: + if authority_hrn in user_detail['pi_authorities']: + return True + except Exception,e: + print "Exception in actions.py in is_pi %s" % e + return False # SFA get record @@ -694,9 +703,16 @@ 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() - + + # CACHE PB with fields + page = Page(wsgi_request) + metadata = page.get_metadata() + user_md = metadata.details_by_object('user') + user_fields = [column['name'] for column in user_md['column']] + # REGISTRY ONLY TO BE REMOVED WITH MANIFOLD-V2 - user_query = Query().get('myslice:user').select('user_hrn','user_email').filter_by('user_hrn','==',user_hrn) + #user_query = Query().get('myslice:user').select('user_hrn','user_email').filter_by('user_hrn','==',user_hrn) + user_query = Query().get('myslice:user').select(user_fields).filter_by('user_hrn','==',user_hrn) user_details_sfa = execute_admin_query(wsgi_request, user_query) if not user_details_sfa: raise Exception, "User %s doesn't exist, validate user before validating slice" % user_hrn diff --git a/portal/dashboardview.py b/portal/dashboardview.py index 06f02f83..0de9b93f 100644 --- a/portal/dashboardview.py +++ b/portal/dashboardview.py @@ -49,7 +49,7 @@ class DashboardView (LoginRequiredAutoLogoutView, ThemeView): # else: print "SLICE QUERY" print "-" * 80 - slice_query = Query().get('user').filter_by('user_hrn', '==', '$user_hrn').select('slices.slice_hrn') + slice_query = Query().get('myslice:user').filter_by('user_hrn', '==', '$user_hrn').select('slices.slice_hrn') page.enqueue_query(slice_query) page.enqueue_query(testbed_query) diff --git a/portal/institution.py b/portal/institution.py index 77cea8d4..d86e3eef 100644 --- a/portal/institution.py +++ b/portal/institution.py @@ -5,6 +5,7 @@ from django.template import RequestContext from django.shortcuts import render_to_response from django.shortcuts import render +from unfold.page import Page from unfold.loginrequired import LoginRequiredAutoLogoutView from manifold.core.query import Query @@ -13,7 +14,7 @@ from manifoldapi.manifoldresult import ManifoldResult from ui.topmenu import topmenu_items, the_user from myslice.configengine import ConfigEngine -from portal.actions import authority_check_pis +from portal.actions import is_pi, authority_check_pis from myslice.theme import ThemeView import json @@ -36,7 +37,15 @@ class InstitutionView (LoginRequiredAutoLogoutView, ThemeView): if request.user.is_authenticated(): env['person'] = self.request.user if authority_hrn is None: - user_query = Query().get('myslice:user').select('user_hrn','parent_authority').filter_by('user_hrn','==','$user_hrn') + # CACHE PB with fields + page = Page(wsgi_request) + metadata = page.get_metadata() + user_md = metadata.details_by_object('user') + user_fields = [column['name'] for column in user_md['column']] + + # REGISTRY ONLY TO BE REMOVED WITH MANIFOLD-V2 + user_query = Query().get('myslice:user').select(user_fields).filter_by('user_hrn','==',user_hrn) + #user_query = Query().get('myslice:user').select('user_hrn','parent_authority').filter_by('user_hrn','==','$user_hrn') user_details = execute_query(self.request, user_query) try: env['user_details'] = user_details[0] @@ -57,12 +66,11 @@ class InstitutionView (LoginRequiredAutoLogoutView, ThemeView): env['project'] = True env['user_details'] = {'parent_authority': authority_hrn} - - else: env['person'] = None - - pi = authority_check_pis (self.request, str(self.request.user)) + print "BEFORE ####------#### is_pi" + pi = is_pi(self.request, '$user_hrn', env['user_details']['parent_authority']) + print "is_pi = ",is_pi env['theme'] = self.theme env['section'] = "Institution" diff --git a/portal/managementtabrequests.py b/portal/managementtabrequests.py index dcbe8a0f..d1293722 100644 --- a/portal/managementtabrequests.py +++ b/portal/managementtabrequests.py @@ -7,6 +7,8 @@ from manifoldapi.manifoldapi import execute_query from django.views.generic.base import TemplateView from unfold.loginrequired import LoginRequiredView +from unfold.page import Page + from django.http import HttpResponse from django.shortcuts import render @@ -85,9 +87,15 @@ class ManagementRequestsView (LoginRequiredView, ThemeView): for authority_hrn, credential in config['delegated_authority_credentials'].items(): credential_authorities.add(authority_hrn) + # CACHE PB with fields + page = Page(wsgi_request) + metadata = page.get_metadata() + user_md = metadata.details_by_object('user') + user_fields = [column['name'] for column in user_md['column']] + # ** Where am I a PI ** # For this we need to ask SFA (of all authorities) = PI function - pi_authorities_query = Query.get('myslice:user').filter_by('user_hrn', '==', '$user_hrn').select('pi_authorities') + pi_authorities_query = Query.get('myslice:user').filter_by('user_hrn', '==', '$user_hrn').select(user_fields) pi_authorities_tmp = execute_query(self.request, pi_authorities_query) pi_authorities = set() try: diff --git a/portal/slicerequestview.py b/portal/slicerequestview.py index 15e2d740..f9c4636d 100644 --- a/portal/slicerequestview.py +++ b/portal/slicerequestview.py @@ -42,7 +42,8 @@ class SliceRequestView (LoginRequiredAutoLogoutView, ThemeView): authorities_query = Query.get('authority').select('name', 'authority_hrn') authorities = execute_admin_query(wsgi_request, authorities_query) if authorities is not None: - authorities = sorted(authorities) + authorities = sorted(authorities, key=lambda k: k['authority_hrn']) + authorities = sorted(authorities, key=lambda k: k['name']) # Get user_email (XXX Would deserve to be simplified) user_query = Query().get('local:user').select('email','config') @@ -85,7 +86,8 @@ class SliceRequestView (LoginRequiredAutoLogoutView, ThemeView): #else: # pi = "is_pi" - pi = authority_check_pis (wsgi_request, user_email) + pi = authority_check_pis (wsgi_request, user_email) + print "SLICEREQUESTVIEW.PY ----- pi=",pi # Page rendering page = Page(wsgi_request) @@ -109,6 +111,11 @@ class SliceRequestView (LoginRequiredAutoLogoutView, ThemeView): if authority_hrn is None: authority_hrn = wsgi_request.POST.get('org_name', '') + # Handle project if used + project = wsgi_request.POST.get('project', None) + if project is not None: + authority_hrn = project + slice_request = { 'type' : 'slice', 'id' : None, diff --git a/portal/static/js/myslice.js b/portal/static/js/myslice.js index d3537fb8..4fe42dae 100644 --- a/portal/static/js/myslice.js +++ b/portal/static/js/myslice.js @@ -174,6 +174,29 @@ var myslice = { $.post("/rest/myslice:user/",{'filters':{'user_hrn':'$user_hrn'}}, function( data ) { if (data.length > 0) { localStorage.setItem('user', JSON.stringify(data[0])); + projects = []; + $.each(data[0].pi_authorities, function(idx, auth) { + // PI on projects + if(auth.split('.').length>2){ + if($.inArray(auth,projects) == -1){ + projects.push(auth); + } + }else if (auth.split('.').length>1){ + // PI on authorities + // What are the projects under this authority? + $.post("/rest/myslice:authority/",{'fields':['authority_hrn'],'filters':{'authority_hrn':'CONTAINS'+auth}}, function( data ) { + $.each(data, function(idx, project) { + console.log(project.authority_hrn); + if($.inArray(project.authority_hrn,projects) == -1){ + projects.push(project.authority_hrn); + } + }); + }); + }else{ + console.log("admin account - we don't list all from root"); + } + }); + localStorage.setItem('projects', JSON.stringify(projects)); myslice.loadSlices(data[0].slices); if(isFunction(fn)){ fn(); @@ -187,35 +210,6 @@ var myslice = { } }, - loadProjects: function(fn) { - var u = localStorage.getItem('user'); - if (u !== 'undefined') { - user = JSON.parse(u); - projects = localStorage.getItem('projects'); - if($.isEmptyObject(projects)){ - if($.isEmptyObject(user) || $.isEmptyObject(user.parent_authority)){ - $.post("/rest/myslice:user/",{'filters':{'user_hrn':'$user_hrn'},'fields':['parent_authority']}, function( data ) { - parent_authority = data[0].parent_authority; - - }); - }else{ - parent_authority = user.parent_authority; - } - // REGISTRY ONLY TO BE REMOVED WITH MANIFOLD-V2 - $.post("/rest/myslice:authority/",{'fields':['authority_hrn'],'filters':{'authority_hrn':'CONTAINS'+parent_authority}}, function( data ) { - localStorage.setItem('projects', JSON.stringify(data)); - if(isFunction(fn)){ - fn(); - } - }); - }else{ - if(isFunction(fn)){ - fn(); - } - } - } - - }, getSlices: function(name) { diff --git a/portal/templates/base.html b/portal/templates/base.html index 4e2c5064..6ccabce6 100644 --- a/portal/templates/base.html +++ b/portal/templates/base.html @@ -63,10 +63,10 @@ $(document).ready(function() { drawSlices(slices); } {% if theme == "fed4fire" %} - myslice.loadProjects(function(){ - p = myslice.projects(); + p = myslice.projects(); + if(p != null){ drawProjects(p); - }); + } {% endif %} }); @@ -85,7 +85,7 @@ $(document).ready(function() { var items = []; $.each( projects, function(i, val) { - items.push( "
  • " + val.authority_hrn + "
  • " ); + items.push( "
  • " + val + "
  • " ); }); $("div#home-project-list").html($( " {% endif %} + +
    + +
    -
    + {% endblock %} diff --git a/portal/templates/slice-request-done-view.html b/portal/templates/slice-request-done-view.html index 0d0a03b4..9ab6807b 100644 --- a/portal/templates/slice-request-done-view.html +++ b/portal/templates/slice-request-done-view.html @@ -5,6 +5,10 @@

    Slice created

    As a manager of your institution, your slice has directly been created directly. - + {% endblock %} diff --git a/portal/validationview.py b/portal/validationview.py index b26ba0fa..b87a250f 100644 --- a/portal/validationview.py +++ b/portal/validationview.py @@ -151,7 +151,7 @@ class ValidatePendingView(LoginRequiredAutoLogoutView, ThemeView): # ** Where am I a PI ** # For this we need to ask SFA (of all authorities) = PI function - pi_authorities_query = Query.get('user').filter_by('user_hrn', '==', '$user_hrn').select('pi_authorities') + pi_authorities_query = Query.get('myslice:user').filter_by('user_hrn', '==', '$user_hrn').select('pi_authorities') pi_authorities_tmp = execute_query(self.request, pi_authorities_query) pi_authorities = set() try: -- 2.47.0