From: Ciro Scognamiglio Date: Tue, 27 Jan 2015 17:43:26 +0000 (+0100) Subject: Merge branch 'onelab' of ssh://git.onelab.eu/git/myslice into onelab X-Git-Tag: myslice-1.3~98 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=5c6d3dfae3a4aed1a18a9f1a946655631328351d;hp=43abd432f3e64b33dd6e87d7c15efae684a48a59;p=unfold.git Merge branch 'onelab' of ssh://git.onelab.eu/git/myslice into onelab Conflicts: portal/actions.py portal/static/js/myslice.js --- diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs index f73c991a..dad90097 100644 --- a/.settings/org.eclipse.core.resources.prefs +++ b/.settings/org.eclipse.core.resources.prefs @@ -2,7 +2,10 @@ eclipse.preferences.version=1 encoding//portal/django_passresetview.py=utf-8 encoding//portal/forms.py=utf-8 encoding//portal/migrations/0002_extend_slice.py=utf-8 +encoding//portal/migrations/0005_extend_user.py=utf-8 +encoding//portal/migrations/0008_extend_user.py=utf-8 +encoding//portal/migrations/0009_initial.py=utf-8 +encoding//portal/migrations/0010_project.py=utf-8 encoding//portal/models.py=utf-8 encoding//portal/urls.py=utf-8 encoding//portal/validationview.py=utf-8 -encoding//portal/views.py=utf-8 diff --git a/myslice/settings.py b/myslice/settings.py index bd1474bd..3b1f1f3d 100644 --- a/myslice/settings.py +++ b/myslice/settings.py @@ -47,7 +47,7 @@ except: # assume we have ./static present already HTTPROOT="/var/myslice-f4f" # the place to store local data, like e.g. the sqlite db -DATAROOT="/var/unfold" +DATAROOT="/Users/moray/Sites/upmc/myslice" # if not there, then we assume it's from a devel tree if not os.path.isdir (os.path.join(HTTPROOT,"static")): HTTPROOT=ROOT 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 5b72d646..9018fbf3 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, PendingProject +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, PendingProject +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 @@ -713,9 +722,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/models.py b/portal/models.py index cc484b5b..6670c4c0 100644 --- a/portal/models.py +++ b/portal/models.py @@ -96,3 +96,10 @@ class PendingSlice(models.Model): type_of_nodes = models.TextField(default='NA') purpose = models.TextField(default='NA') created = models.DateTimeField(auto_now_add = True) + +class PendingProject(models.Model): + project_name = models.TextField() + user_hrn = models.TextField() + authority_hrn = models.TextField(null=True) + purpose = models.TextField(default='NA') + created = models.DateTimeField(auto_now_add = True) diff --git a/portal/projectrequestview.py b/portal/projectrequestview.py index d2f11a6a..70f49949 100644 --- a/portal/projectrequestview.py +++ b/portal/projectrequestview.py @@ -1,35 +1,132 @@ from django.shortcuts import render from django.contrib.sites.models import Site - -from unfold.page import Page - from manifold.core.query import Query from manifoldapi.manifoldapi import execute_admin_query, execute_query -from portal.actions import is_pi, create_slice, create_pending_slice, clear_user_creds -#from portal.forms import SliceRequestForm from unfold.loginrequired import LoginRequiredAutoLogoutView -from ui.topmenu import topmenu_items_live, the_user + +from portal.actions import create_pending_project + +from portal.models import PendingProject from myslice.theme import ThemeView import json, time, re -import activity.user - -class ProjectRequestView (LoginRequiredAutoLogoutView, ThemeView): +class ProjectRequestView(LoginRequiredAutoLogoutView, ThemeView): template_name = 'projectrequest_view.html' - # because we inherit LoginRequiredAutoLogoutView that is implemented by redefining 'dispatch' - # we cannot redefine dispatch here, or we'd lose LoginRequired and AutoLogout behaviours - def post (self, request): - return self.get_or_post (request, 'POST') + def getAuthorities(self, request): + authorities_query = Query.get('authority').select('name', 'authority_hrn') + authorities = execute_admin_query(request, authorities_query) + if authorities is not None: + authorities = sorted(authorities, key=lambda k: k['authority_hrn']) + authorities = sorted(authorities, key=lambda k: k['name']) + return authorities + + def getUserAuthority(self, request): + # Get user_email (XXX Would deserve to be simplified) + user_query = Query().get('local:user').select('email','config') + user_details = execute_query(request, user_query) + for user_detail in user_details: + user_config = json.loads(user_detail['config']) + user_authority = user_config.get('authority','N/A') + return user_authority + + def getUserHrn(self, request): + user_hrn = None + + account_query = Query().get('local:account').select('user_id','platform_id','auth_type','config') + account_details = execute_query(request, account_query) + + platform_query = Query().get('local:platform').select('platform_id','platform','gateway_type','disabled') + platform_details = execute_query(request, platform_query) + + # getting user_hrn from local:account + for account_detail in account_details: + for platform_detail in platform_details: + if platform_detail['platform_id'] == account_detail['platform_id']: + # taking user_hrn only from myslice account + # NOTE: we should later handle accounts filter_by auth_type= managed OR user + if 'myslice' in platform_detail['platform']: + account_config = json.loads(account_detail['config']) + user_hrn = account_config.get('user_hrn','N/A') + return user_hrn + + def post(self, request): + return self.handle_request(request, 'POST') - def get (self, request): - return self.get_or_post (request, 'GET') + def get(self, request): + return self.handle_request(request, 'GET') - def get_or_post (self, wsgi_request, method): + def handle_request(self, wsgi_request, method): + errors = [] + authority_hrn = None + authority_name = None + + user_hrn = self.getUserHrn(wsgi_request) + + authorities = self.getAuthorities(wsgi_request) + + user_authority = self.getUserAuthority(wsgi_request) + + # getting the org from authority + for authority in authorities: + if authority['authority_hrn'] == user_authority: + authority_name = authority['name'] + + if method == 'POST' : + + post = { + 'user_hrn' : user_hrn, + 'authority_hrn' : wsgi_request.POST.get('authority_name', ''), + 'project_name' : wsgi_request.POST.get('project_name', ''), + 'purpose' : wsgi_request.POST.get('purpose', ''), + } + +# # create slice_hrn based on authority_hrn and slice_name +# # slice_name = slice_request['slice_name'] +# req_slice_hrn = authority_hrn + '.' + slice_name +# # comparing requested slice_hrn with the existing slice_hrn +# slice_query = Query().get('myslice:slice').select('slice_hrn','parent_authority').filter_by('parent_authority','==',authority_hrn) +# slice_details_sfa = execute_admin_query(wsgi_request, slice_query) +# for _slice in slice_details_sfa: +# if _slice['slice_hrn'] == req_slice_hrn: +# errors.append('Slice already exists. Please use a different slice name.') + + + # What kind of slice name is valid? + if (post['project_name'] is None or post['project_name'] == ''): + errors.append('Project name is mandatory') + + if (re.search(r'^[A-Za-z0-9_]*$', post['project_name']) == None): + errors.append('Project name may contain only letters, numbers, and underscore.') + + if (post['authority_hrn'] is None or post['authority_hrn'] == ''): + errors.append('Organization is mandatory') + + if (post['purpose'] is None or post['purpose'] == ''): + errors.append('Experiment purpose is mandatory') + + if not errors: + create_pending_project(wsgi_request, post) + + # retrieves the pending projects list + pending_projects = PendingProject.objects.all().filter(user_hrn=user_hrn) + + env = { + 'errors': errors, + 'username': wsgi_request.user, + 'theme': self.theme, + 'authorities': authorities, + 'authority_hrn': user_authority, + 'pending_projects': pending_projects, + } + return render(wsgi_request, self.template, env) + + + """ """ errors = [] @@ -67,6 +164,7 @@ class ProjectRequestView (LoginRequiredAutoLogoutView, ThemeView): # platform_query = Query().get('local:platform').select('platform_id','platform','gateway_type','disabled') platform_details = execute_query(wsgi_request, platform_query) + user_hrn = None # getting user_hrn from local:account for account_detail in account_details: @@ -88,17 +186,17 @@ class ProjectRequestView (LoginRequiredAutoLogoutView, ThemeView): # Page rendering - page = Page(wsgi_request) - page.add_js_files ( [ "js/jquery.validate.js", "js/jquery-ui.js" ] ) - page.add_css_files ( [ "https://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css" ] ) - page.expose_js_metadata() +# page = Page(wsgi_request) +# page.add_js_files ( [ "js/jquery.validate.js", "js/jquery-ui.js" ] ) +# page.add_css_files ( [ "https://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css" ] ) +# page.expose_js_metadata() if method == 'POST': # The form has been submitted # get the domain url - current_site = Site.objects.get_current() - current_site = current_site.domain +# current_site = Site.objects.get_current() +# current_site = current_site.domain # getting the authority_hrn from the selected organization for authority in authorities: @@ -124,7 +222,7 @@ class ProjectRequestView (LoginRequiredAutoLogoutView, ThemeView): } # create slice_hrn based on authority_hrn and slice_name - slice_name = slice_request['slice_name'] +# slice_name = slice_request['slice_name'] req_slice_hrn = authority_hrn + '.' + slice_name # comparing requested slice_hrn with the existing slice_hrn slice_query = Query().get('myslice:slice').select('slice_hrn','parent_authority').filter_by('parent_authority','==',authority_hrn) @@ -173,7 +271,6 @@ class ProjectRequestView (LoginRequiredAutoLogoutView, ThemeView): template_env = { 'username': wsgi_request.user.email, - 'topmenu_items': topmenu_items_live('Request a slice', page), 'errors': errors, 'slice_name': slice_name, 'purpose': purpose, 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/css/fed4fire.css b/portal/static/css/fed4fire.css index 987d54e5..ca827bf4 100644 --- a/portal/static/css/fed4fire.css +++ b/portal/static/css/fed4fire.css @@ -31,6 +31,20 @@ h3 { color:#201E62; } +input[type=text], input[type=password], input[type=email], input[type=tel], input[type=number] { + min-width:260px; + padding:6px; + border:1pt solid #CCCCCC; + vertical-align:bottom; + border-radius:0; +} + +textarea { + padding:6px; + border:1pt solid #CCCCCC !important; + border-radius:0 !important; +} + div.wrapper { width:980px; margin:0 auto; diff --git a/portal/static/js/myslice.js b/portal/static/js/myslice.js index fcde9672..548d5dab 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,7 @@ var myslice = { } }, - loadProjects: function(fn) { - var u = localStorage.getItem('user'); - if (u !== 'undefined') { - var user = JSON.parse(u); - var 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/_widget-slice-sections.html b/portal/templates/_widget-slice-sections.html index 175b09c0..0856bd89 100644 --- a/portal/templates/_widget-slice-sections.html +++ b/portal/templates/_widget-slice-sections.html @@ -4,7 +4,7 @@
  • Testbeds
  • Resources
  • Users
  • - +
  • Statistics
  • Measurements
  • Experiment
  • SLA
  • @@ -15,7 +15,7 @@
  • Testbeds
  • Resources
  • Users
  • - +
  • Statistics
  • Measurements
  • Experiment
  • SLA
  • 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 %} + +
    + +
    -
    + diff --git a/portal/templates/fed4fire/fed4fire_slicerequest_view.html b/portal/templates/fed4fire/fed4fire_slicerequest_view.html index 82f12410..7c172d58 100644 --- a/portal/templates/fed4fire/fed4fire_slicerequest_view.html +++ b/portal/templates/fed4fire/fed4fire_slicerequest_view.html @@ -38,14 +38,17 @@ {% else %} - + Authority:   +
    + Loading authority +
    {% endif %}
    Project: -
    @@ -72,8 +75,15 @@ jQuery(document).ready(function(){ $("#authority_hrn").load("/rest/user/", {"fields" : ["parent_authority"], "filters": {"user_hrn": "{{ user_hrn }}"}}, function(data) { var jsonData = JSON.parse(data); $(this).attr("value", jsonData[0]['parent_authority']); + {% if pi %} draw_projects(jsonData[0]['parent_authority']); + {% else %} + $('#authority_display').html(jsonData[0]['parent_authority']); + draw_projects(''); + {% endif %} }); + + {% if pi %} $("#authority_hrn").val("{{authority_name}}"); var availableTags = [ {% if authorities %} @@ -107,23 +117,36 @@ jQuery(document).ready(function(){ draw_projects(jQuery('.ui-state-focus').html()); }, }); - + {% endif %} }); function draw_projects(authority_hrn){ - $.post("/rest/myslice:authority/",{'fields':['authority_hrn','pi_users'],'filters':{'authority_hrn':'CONTAINS'+authority_hrn}}, function( data ) { - - var projects = []; - project_row = ""; - projects.push(project_row); - - $.each( data, function( key, val ) { - console.log(val); - project_row = ""; + var projects = []; + project_row = ""; + projects.push(project_row); + + if(authority_hrn.length > 0){ + // Not for root authority + if(authority_hrn.split('.').length > 1){ + $.post("/rest/myslice:authority/",{'fields':['authority_hrn','pi_users'],'filters':{'authority_hrn':'CONTAINS'+authority_hrn}}, function( data ) { + + $.each( data, function( key, val ) { + project_row = ""; + projects.push(project_row); + }); + $("#project").html(projects.join( "" )); + }); + }else{ + $("#project").html(projects.join( "" )); + } + }else{ + my_projects = JSON.parse(localStorage.getItem('projects')); + $.each( my_projects, function( i, val ) { + project_row = ""; projects.push(project_row); }); - $("#projects").html(projects.join( "" )); - }); + $("#project").html(projects.join( "" )); + } } {% endblock %} diff --git a/portal/templates/management-tab-requests.html b/portal/templates/management-tab-requests.html index dad0e6e7..dd3ce14f 100644 --- a/portal/templates/management-tab-requests.html +++ b/portal/templates/management-tab-requests.html @@ -139,6 +139,8 @@ {{request.first_name}} {{request.last_name}} <{{request.email}}> {% elif request.type == 'slice' %} {{request.slice_name}} -- Number of nodes: {{request.number_of_nodes}} -- Type of nodes: {{request.type_of_nodes}} -- Purpose: {{request.purpose}} + {% elif request.type == 'project' %} + {{request.project_name}} -- {{ request.user_hrn }} -- Purpose: {{request.purpose}} {% else %} {{request.site_name}} ({{request.site_authority}}) -- {{request.address_city}}, {{request.address_country}} {% endif %} @@ -201,6 +203,8 @@ {% else %} {% if request.type == 'slice' %} Slice name: {{request.slice_name}} -- Number of nodes: {{request.number_of_nodes}} -- Type of nodes: {{request.type_of_nodes}} -- Purpose: {{request.purpose}} + {% elif request.type == 'project' %} + {{request.project_name}} -- {{ request.user_hrn }} -- Purpose: {{request.purpose}} {% else %} {# authority #} Authority name: {{request.site_name}} -- authority_hrn: {{request.site_authority}} -- City: {{request.address_city}} -- Country: {{request.address_country}} {% endif %} @@ -255,6 +259,8 @@ {% else %} {% if request.type == 'slice' %} Slice name: {{request.slice_name}} -- Number of nodes: {{request.number_of_nodes}} -- Type of nodes: {{request.type_of_nodes}} -- Purpose: {{request.purpose}} + {% elif request.type == 'project' %} + {{request.project_name}} -- {{ request.user_hrn }} -- Purpose: {{request.purpose}} {% else %} {# authority #} Authority name: {{request.site_name}} -- authority_hrn: {{request.site_authority}} -- City: {{request.address_city}} -- Country: {{request.address_country}} {% endif %} 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/templates/slice-resource-view.html b/portal/templates/slice-resource-view.html index ff1fc3e0..93285e12 100644 --- a/portal/templates/slice-resource-view.html +++ b/portal/templates/slice-resource-view.html @@ -54,9 +54,9 @@ $(document).ready(function() {
    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: