Merge branch 'jordan' of ssh://git.onelab.eu/git/myslice into jordan
authorJordan Augé <jordan.auge@lip6.fr>
Fri, 23 Aug 2013 12:37:42 +0000 (14:37 +0200)
committerJordan Augé <jordan.auge@lip6.fr>
Fri, 23 Aug 2013 12:37:42 +0000 (14:37 +0200)
Conflicts:
portal/urls.py

1  2 
portal/urls.py
portal/views.py

diff --combined portal/urls.py
@@@ -22,7 -22,8 +22,7 @@@
  
  from django.conf.urls import patterns, include, url
  from portal           import views
- from portal.views     import UserRegisterView, UserValidateView, DashboardView, PresViewView, ValidatePendingView
 -from portal.views     import  DashboardView, PresViewView
 -from portal.views     import DashboardView, PresViewView, PlatformsView
++from portal.views     import DashboardView, PresViewView, PlatformsView, ValidatePendingView # UserRegisterView, UserValidateView
  from portal.util      import TemplateView
  
  # DEPRECATED #named_register_forms = (
  
  urlpatterns = patterns('',
      # User registration
-     url(r'^user/register/?$', UserRegisterView.as_view(), name='user_register'),
+     #url(r'^user/register/?$', UserRegisterView.as_view(), name='user_register'),
      url(r'^user/register/complete/$',
          TemplateView.as_view(template_name='user_register_complete.html'),
          name='user_register_complete'),
      # User validation
-     url(r'^user/validate/?$', UserValidateView.as_view(), name='user_validate'),
+     #url(r'^user/validate/?$', UserValidateView.as_view(), name='user_validate'),
      url(r'^dashboard/?$', DashboardView.as_view(), name='dashboard'),
      #url(r'^my_account/?$', MyAccountView.as_view(), name='my_account'),
      url(r'^account/?$', views.my_account),
+     url(r'^platforms/?$', PlatformsView.as_view(), name='platforms'),
      url(r'^acc_process/?$', views.acc_process),
      url(r'^register/?$', views.register_4m_f4f),
      #url(r'^reg_process/?$', views.reg_4m_f4f_process),
      url(r'^contact/?$', views.contact),
      # Slice request
      url(r'^slice_request/?$', views.slice_request),
 +    # Validate pending requests
 +    url(r'^validate/?$', ValidatePendingView.as_view()),
  
      url(r'^pres_view/?$', PresViewView.as_view(), name='pres_view'),
      (r'^methods/(?P<type>\w+)/?$', 'portal.views.pres_view_methods'),
diff --combined portal/views.py
@@@ -29,17 -29,16 +29,17 @@@ from django.views.generic.base   impor
  from django.shortcuts            import render
  
  from plugins.lists.simplelist    import SimpleList
+ from plugins.hazelnut            import Hazelnut
  from plugins.pres_view           import PresView
  from portal.event import Event
  import json
  
  from portal                      import signals
- from portal.forms                import UserRegisterForm, SliceRequestForm, ContactForm
+ from portal.forms                import SliceRequestForm, ContactForm
  from portal.util                 import RegistrationView, ActivationView
  from portal.models               import PendingUser, PendingSlice
  from manifold.core.query         import Query
 +from manifold.manifoldapi        import execute_query
  from unfold.page                 import Page
  from myslice.viewutils           import topmenu_items, the_user
  from django.http                 import HttpResponseRedirect, HttpResponse
@@@ -62,8 -61,6 +62,8 @@@ class DashboardView(TemplateView)
          #slice_query = Query().get('slice').filter_by('user.user_hrn', 'contains', user_hrn).select('slice_hrn')
          slice_query = Query().get('user').filter_by('user_hrn', '==', '$user_hrn').select('user_hrn', 'slice.slice_hrn')
          auth_query  = Query().get('network').select('network_hrn')
 +        print "AUTH QUERY =====================", auth_query
 +        print "filter", auth_query.filters
          page.enqueue_query(slice_query)
          page.enqueue_query(auth_query)
  
  
          return context
  
- class UserRegisterView(RegistrationView):
-     """
-     A registration backend which follows a simple workflow:
-     1. User signs up, inactive account is created.
-     2. Email is sent to user with activation link.
-     3. User clicks activation link, account is now active.
-     Using this backend requires that
-     * ``registration`` be listed in the ``INSTALLED_APPS`` setting
-       (since this backend makes use of models defined in this
-       application).
-     * The setting ``ACCOUNT_ACTIVATION_DAYS`` be supplied, specifying
-       (as an integer) the number of days from registration during
-       which a user may activate their account (after that period
-       expires, activation will be disallowed).
-     * The creation of the templates
-       ``registration/activation_email_subject.txt`` and
-       ``registration/activation_email.txt``, which will be used for
-       the activation email. See the notes for this backends
-       ``register`` method for details regarding these templates.
-     Additionally, registration can be temporarily closed by adding the
-     setting ``REGISTRATION_OPEN`` and setting it to
-     ``False``. Omitting this setting, or setting it to ``True``, will
-     be interpreted as meaning that registration is currently open and
-     permitt ed.
-     Internally, this is accomplished via storing an activation key in
-     an instance of ``registration.models.RegistrationProfile``. See
-     that model and its custom manager for full documentation of its
-     fields and supported operations.
-     
-     """
-     form_class = UserRegisterForm
-     
-     def register(self, request, **cleaned_data):
-         """
-         Given a username, email address and password, register a new
-         user account, which will initially be inactive.
-         Along with the new ``User`` object, a new
-         ``registration.models.RegistrationProfile`` will be created,
-         tied to that ``User``, containing the activation key which
-         will be used for this account.
-         An email will be sent to the supplied email address; this
-         email should contain an activation link. The email will be
-         rendered using two templates. See the documentation for
-         ``RegistrationProfile.send_activation_email()`` for
-         information about these templates and the contexts provided to
-         them.
-         After the ``User`` and ``RegistrationProfile`` are created and
-         the activation email is sent, the signal
-         ``registration.signals.user_registered`` will be sent, with
-         the new ``User`` as the keyword argument ``user`` and the
-         class of this backend as the sender.
-         """
-         first_name = cleaned_data['first_name']
-         last_name  = cleaned_data['last_name']
-         affiliation= cleaned_data['affiliation']
-         email      = cleaned_data['email']
-         password   = cleaned_data['password1']
-         
-         #password2  = cleaned_data['password2']
-         keypair    = cleaned_data['keypair']
-         #if Site._meta.installed:
-         #    site = Site.objects.get_current()
-         #else:
-         #    site = RequestSite(request) 
-         site = None
-         new_user = PendingUser.objects.create_inactive_user(first_name, last_name, email, password, site)
-         signals.user_registered.send(sender=self.__class__,
-                                      user=new_user,
-                                      request=request)
-         return new_user
-     def get_context_data(self, **kwargs):
-         context = super(UserRegisterView, self).get_context_data(**kwargs)
-         context['topmenu_items'] = topmenu_items('Register', self.request)
-         context['username'] = the_user (self.request)
-         return context
-     def registration_allowed(self, request):
-         """
-         Indicate whether account registration is currently permitted,
-         based on the value of the setting ``REGISTRATION_OPEN``. This
-         is determined as follows:
-         * If ``REGISTRATION_OPEN`` is not specified in settings, or is
-           set to ``True``, registration is permitted.
-         * If ``REGISTRATION_OPEN`` is both specified and set to
-           ``False``, registration is not permitted.
-         
-         """
-         return getattr(settings, 'REGISTRATION_OPEN', True)
-     def get_success_url(self, request, user):
-         """
-         Return the name of the URL to redirect to after successful
-         user registration.
-         
-         """
-         return ('user_register_complete', (), {})
- class UserValidateView(ActivationView):
-     def activate(self, request, activation_key):
-         """
-         Given an an activation key, look up and activate the user
-         account corresponding to that key (if possible).
-         After successful activation, the signal
-         ``registration.signals.user_activated`` will be sent, with the
-         newly activated ``User`` as the keyword argument ``user`` and
-         the class of this backend as the sender.
-         
-         """
-         activated_user = RegistrationProfile.objects.activate_user(activation_key)
-         if activated_user:
-             signals.user_activated.send(sender=self.__class__,
-                                         user=activated_user,
-                                         request=request)
-         return activated_user
-     def get_success_url(self, request, user):
-         return ('registration_activation_complete', (), {})
# DEPRECATED #class UserRegisterView(RegistrationView):
# DEPRECATED #    """
# DEPRECATED #    A registration backend which follows a simple workflow:
+ # DEPRECATED #
# DEPRECATED #    1. User signs up, inactive account is created.
+ # DEPRECATED #
# DEPRECATED #    2. Email is sent to user with activation link.
+ # DEPRECATED #
# DEPRECATED #    3. User clicks activation link, account is now active.
+ # DEPRECATED #
# DEPRECATED #    Using this backend requires that
+ # DEPRECATED #
# DEPRECATED #    * ``registration`` be listed in the ``INSTALLED_APPS`` setting
# DEPRECATED #      (since this backend makes use of models defined in this
# DEPRECATED #      application).
+ # DEPRECATED #
# DEPRECATED #    * The setting ``ACCOUNT_ACTIVATION_DAYS`` be supplied, specifying
# DEPRECATED #      (as an integer) the number of days from registration during
# DEPRECATED #      which a user may activate their account (after that period
# DEPRECATED #      expires, activation will be disallowed).
+ # DEPRECATED #
# DEPRECATED #    * The creation of the templates
# DEPRECATED #      ``registration/activation_email_subject.txt`` and
# DEPRECATED #      ``registration/activation_email.txt``, which will be used for
# DEPRECATED #      the activation email. See the notes for this backends
# DEPRECATED #      ``register`` method for details regarding these templates.
+ # DEPRECATED #
# DEPRECATED #    Additionally, registration can be temporarily closed by adding the
# DEPRECATED #    setting ``REGISTRATION_OPEN`` and setting it to
# DEPRECATED #    ``False``. Omitting this setting, or setting it to ``True``, will
# DEPRECATED #    be interpreted as meaning that registration is currently open and
# DEPRECATED #    permitt ed.
+ # DEPRECATED #
# DEPRECATED #    Internally, this is accomplished via storing an activation key in
# DEPRECATED #    an instance of ``registration.models.RegistrationProfile``. See
# DEPRECATED #    that model and its custom manager for full documentation of its
# DEPRECATED #    fields and supported operations.
+ # DEPRECATED #    
# DEPRECATED #    """
# DEPRECATED ## DEPRECATED #    form_class = UserRegisterForm
+ # DEPRECATED #    
# DEPRECATED #    def register(self, request, **cleaned_data):
# DEPRECATED #        """
# DEPRECATED #        Given a username, email address and password, register a new
# DEPRECATED #        user account, which will initially be inactive.
+ # DEPRECATED #
# DEPRECATED #        Along with the new ``User`` object, a new
# DEPRECATED #        ``registration.models.RegistrationProfile`` will be created,
# DEPRECATED #        tied to that ``User``, containing the activation key which
# DEPRECATED #        will be used for this account.
+ # DEPRECATED #
# DEPRECATED #        An email will be sent to the supplied email address; this
# DEPRECATED #        email should contain an activation link. The email will be
# DEPRECATED #        rendered using two templates. See the documentation for
# DEPRECATED #        ``RegistrationProfile.send_activation_email()`` for
# DEPRECATED #        information about these templates and the contexts provided to
# DEPRECATED #        them.
+ # DEPRECATED #
# DEPRECATED #        After the ``User`` and ``RegistrationProfile`` are created and
# DEPRECATED #        the activation email is sent, the signal
# DEPRECATED #        ``registration.signals.user_registered`` will be sent, with
# DEPRECATED #        the new ``User`` as the keyword argument ``user`` and the
# DEPRECATED #        class of this backend as the sender.
+ # DEPRECATED #
# DEPRECATED #        """
# DEPRECATED #        first_name = cleaned_data['first_name']
# DEPRECATED #        last_name  = cleaned_data['last_name']
# DEPRECATED #        affiliation= cleaned_data['affiliation']
# DEPRECATED #        email      = cleaned_data['email']
# DEPRECATED #        password   = cleaned_data['password1']
+ # DEPRECATED #        
# DEPRECATED #        #password2  = cleaned_data['password2']
# DEPRECATED #        keypair    = cleaned_data['keypair']
+ # DEPRECATED #
# DEPRECATED #        #if Site._meta.installed:
# DEPRECATED #        #    site = Site.objects.get_current()
# DEPRECATED #        #else:
# DEPRECATED #        #    site = RequestSite(request) 
# DEPRECATED #        site = None
+ # DEPRECATED #
# DEPRECATED #        new_user = PendingUser.objects.create_inactive_user(first_name, last_name, email, password, site)
# DEPRECATED #        signals.user_registered.send(sender=self.__class__,
# DEPRECATED #                                     user=new_user,
# DEPRECATED #                                     request=request)
# DEPRECATED #        return new_user
+ # DEPRECATED #
# DEPRECATED #    def get_context_data(self, **kwargs):
# DEPRECATED #        context = super(UserRegisterView, self).get_context_data(**kwargs)
# DEPRECATED #        context['topmenu_items'] = topmenu_items('Register', self.request)
# DEPRECATED #        context['username'] = the_user (self.request)
# DEPRECATED #        return context
+ # DEPRECATED #
# DEPRECATED #    def registration_allowed(self, request):
# DEPRECATED #        """
# DEPRECATED #        Indicate whether account registration is currently permitted,
# DEPRECATED #        based on the value of the setting ``REGISTRATION_OPEN``. This
# DEPRECATED #        is determined as follows:
+ # DEPRECATED #
# DEPRECATED #        * If ``REGISTRATION_OPEN`` is not specified in settings, or is
# DEPRECATED #          set to ``True``, registration is permitted.
+ # DEPRECATED #
# DEPRECATED #        * If ``REGISTRATION_OPEN`` is both specified and set to
# DEPRECATED #          ``False``, registration is not permitted.
+ # DEPRECATED #        
# DEPRECATED #        """
# DEPRECATED #        return getattr(settings, 'REGISTRATION_OPEN', True)
+ # DEPRECATED #
# DEPRECATED #    def get_success_url(self, request, user):
# DEPRECATED #        """
# DEPRECATED #        Return the name of the URL to redirect to after successful
# DEPRECATED #        user registration.
+ # DEPRECATED #        
# DEPRECATED #        """
# DEPRECATED #        return ('user_register_complete', (), {})
+ # DEPRECATED #
+ # DEPRECATED #
# DEPRECATED #class UserValidateView(ActivationView):
# DEPRECATED #    def activate(self, request, activation_key):
# DEPRECATED #        """
# DEPRECATED #        Given an an activation key, look up and activate the user
# DEPRECATED #        account corresponding to that key (if possible).
+ # DEPRECATED #
# DEPRECATED #        After successful activation, the signal
# DEPRECATED #        ``registration.signals.user_activated`` will be sent, with the
# DEPRECATED #        newly activated ``User`` as the keyword argument ``user`` and
# DEPRECATED #        the class of this backend as the sender.
+ # DEPRECATED #        
# DEPRECATED #        """
# DEPRECATED #        activated_user = RegistrationProfile.objects.activate_user(activation_key)
# DEPRECATED #        if activated_user:
# DEPRECATED #            signals.user_activated.send(sender=self.__class__,
# DEPRECATED #                                        user=activated_user,
# DEPRECATED #                                        request=request)
# DEPRECATED #        return activated_user
+ # DEPRECATED #
# DEPRECATED #    def get_success_url(self, request, user):
# DEPRECATED #        return ('registration_activation_complete', (), {})
+ # DEPRECATED #
+ # DEPRECATED #
  # DEPRECATED #from portal.portalpage  import PortalPage
  # DEPRECATED #from plugins.wizard     import Wizard
  # DEPRECATED #from plugins.form       import CreateForm
@@@ -482,6 -479,57 +482,57 @@@ def my_account(request)
          'username': the_user (request)
      })
  
+ # View for platforms
+ class PlatformsView(TemplateView):
+     template_name = "platforms.html"
+     def get_context_data(self, **kwargs):
+         page = Page(self.request)
+         network_query  = Query().get('local:platform').filter_by('disabled', '==', '0').select('platform','platform_longname','gateway_type')
+         page.enqueue_query(network_query)
+         page.expose_js_metadata()
+         page.expose_queries()
+         networklist = Hazelnut(
+             page  = page,
+             title = 'List',
+             domid = 'checkboxes',
+             # this is the query at the core of the slice list
+             query = network_query,
+             query_all = network_query,
+             checkboxes = False,
+             datatables_options = {
+             # for now we turn off sorting on the checkboxes columns this way
+             # this of course should be automatic in hazelnut
+             'aoColumns'      : [None, None, None, None, {'bSortable': False}],
+             'iDisplayLength' : 25,
+             'bLengthChange'  : True,
+             },
+         )
+ #
+ #        networklist = SimpleList(
+ #            title = None,
+ #            page  = page,
+ #            key   = 'platform',
+ #            query = network_query,
+ #        )
+         context = super(PlatformsView, self).get_context_data(**kwargs)
+         context['person']   = self.request.user
+         context['networks'] = networklist.render(self.request)
+         # XXX This is repeated in all pages
+         # more general variables expected in the template
+         context['title'] = 'Platforms connected to MySlice'
+         # the menu items on the top
+         context['topmenu_items'] = topmenu_items('Platforms', self.request)
+         # so we can sho who is logged
+         context['username'] = the_user(self.request)
+         context.update(page.prelude_env())
+         return context
  
  #my_acc form value processing
  def acc_process(request):
          return HttpResponse(message)
  
  def register_4m_f4f(request):
-     #return render(request, 'register_4m_f4f.html')
- #def reg_4m_f4f_process(request):
-     if 'submit' in request.POST:
+     errors = []
+     if request.method == 'POST':
          #get_email = PendingUser.objects.get(email)
-         reg_fname = request.POST['firstname']
-         reg_lname = request.POST['lastname']
-         reg_aff = request.POST['affiliation']
-         reg_email = request.POST['email'].lower()
+         reg_fname = request.POST.get('firstname', '')
+         reg_lname = request.POST.get('lastname', '')
+         reg_aff = request.POST.get('affiliation','')
+         reg_email = request.POST.get('email','').lower()
          
          #POST value validation  
          if (re.search(r'^[\w+\s.@+-]+$', reg_fname)==None):
-             messages.error(request, 'First Name may contain only letters, numbers, spaces and @/./+/-/_ characters.')
+             errors.append('First Name may contain only letters, numbers, spaces and @/./+/-/_ characters.')
              #return HttpResponse("Only Letters, Numbers, - and _ allowd in First Name")
-             return render(request, 'register_4m_f4f.html')
+             #return render(request, 'register_4m_f4f.html')
          if (re.search(r'^[\w+\s.@+-]+$', reg_lname) == None):
-             messages.error(request, 'Last Name may contain only letters, numbers, spaces and @/./+/-/_ characters.')
+             errors.append('Last Name may contain only letters, numbers, spaces and @/./+/-/_ characters.')
              #return HttpResponse("Only Letters, Numbers, - and _ is allowed in Last name")
-             return render(request, 'register_4m_f4f.html')
+             #return render(request, 'register_4m_f4f.html')
          if (re.search(r'^[\w+\s.@+-]+$', reg_aff) == None):
-             messages.error(request, 'Affiliation may contain only letters, numbers, spaces and @/./+/-/_ characters.')
+             errors.append('Affiliation may contain only letters, numbers, spaces and @/./+/-/_ characters.')
              #return HttpResponse("Only Letters, Numbers and _ is allowed in Affiliation")
-             return render(request, 'register_4m_f4f.html')
+             #return render(request, 'register_4m_f4f.html')
          if PendingUser.objects.filter(email__iexact=reg_email):
-             messages.error(request, 'Email already registered.Please provide a new email address.')
+             errors.append('Email already registered.Please provide a new email address.')
              #return HttpResponse("Email Already exists")
-             return render(request, 'register_4m_f4f.html')
+             #return render(request, 'register_4m_f4f.html')
          if 'generate' in request.POST['question']:
              #import os
              #from M2Crypto import Rand, RSA, BIO
                  keypair = re.sub("\n", "\\n",keypair)
                  keypair = ''.join(keypair.split())
              else:
-                 return HttpResponse('Please upload a valid RSA public key [.txt or .pub].')
+                 errors.append('Please upload a valid RSA public key [.txt or .pub].')
  
-         b = PendingUser(first_name=reg_fname, last_name=reg_lname, affiliation=reg_aff, 
-                         email=reg_email, password=request.POST['password'], keypair=keypair)
-         b.save()
-         return render(request, 'user_register_complete.html')
-     return render(request, 'register_4m_f4f.html')        
+         #b = PendingUser(first_name=reg_fname, last_name=reg_lname, affiliation=reg_aff, 
+         #                email=reg_email, password=request.POST['password'], keypair=keypair)
+         #b.save()
+         if not errors:
+             b = PendingUser(first_name=reg_fname, last_name=reg_lname, affiliation=reg_aff,
+                             email=reg_email, password=request.POST['password'], keypair=keypair)
+             b.save()
+             return render(request, 'user_register_complete.html')
+     return render(request, 'register_4m_f4f.html',{
+         'topmenu_items': topmenu_items('Register', request),
+         'errors': errors,
+         'firstname': request.POST.get('firstname', ''),
+         'lastname': request.POST.get('lastname', ''),
+         'affiliation': request.POST.get('affiliation', ''),
+         'email': request.POST.get('email', ''),
+         'password': request.POST.get('password', ''),           
+     })        
      
  
  # view for contact form
@@@ -897,217 -955,3 +958,217 @@@ def pres_view_static(request, constrain
  
      json_answer = json.dumps(cmd)
      return HttpResponse (json_answer, mimetype="application/json")
 +
 +class ValidatePendingView(TemplateView):
 +    template_name = "validate_pending.html"
 +
 +    def get_context_data(self, **kwargs):
 +        # We might have slices on different registries with different user accounts 
 +        # We note that this portal could be specific to a given registry, to which we register users, but i'm not sure that simplifies things
 +        # Different registries mean different identities, unless we identify via SFA HRN or have associated the user email to a single hrn
 +
 +        #messages.info(self.request, 'You have logged in')
 +        page = Page(self.request)
 +
 +        ctx_my_authorities = {}
 +        ctx_delegation_authorities = {}
 +
 +
 +        # The user need to be logged in
 +        if the_user(self.request):
 +            # Who can a PI validate:
 +            # His own authorities + those he has credentials for.
 +            # In MySlice we need to look at credentials also.
 +            
 +
 +            # XXX This will have to be asynchroneous. Need to implement barriers,
 +            # for now it will be sufficient to have it working statically
 +
 +            # get user_id to later on query accounts
 +            # XXX Having real query plan on local tables would simplify all this
 +            # XXX $user_email is still not available for local tables
 +            #user_query = Query().get('local:user').filter_by('email', '==', '$user_email').select('user_id')
 +            user_query = Query().get('local:user').filter_by('email', '==', the_user(self.request)).select('user_id')
 +            user, = execute_query(self.request, user_query)
 +            user_id = user['user_id']
 +
 +            # Query manifold to learn about available SFA platforms for more information
 +            # In general we will at least have the portal
 +            # For now we are considering all registries
 +            all_authorities = []
 +            platform_ids = []
 +            sfa_platforms_query = Query().get('local:platform').filter_by('gateway_type', '==', 'sfa').select('platform_id', 'platform', 'auth_type')
 +            sfa_platforms = execute_query(self.request, sfa_platforms_query)
 +            for sfa_platform in sfa_platforms:
 +                print "SFA PLATFORM > ", sfa_platform['platform']
 +                if not 'auth_type' in sfa_platform:
 +                    continue
 +                auth = sfa_platform['auth_type']
 +                if not auth in all_authorities:
 +                    all_authorities.append(auth)
 +                platform_ids.append(sfa_platform['platform_id'])
 +
 +            # We can check on which the user has authoritity credentials = PI rights
 +            credential_authorities = set()
 +            credential_authorities_expired = set()
 +
 +            # User account on these registries
 +            user_accounts_query = Query.get('local:account').filter_by('user_id', '==', user_id).filter_by('platform_id', 'included', platform_ids).select('config')
 +            user_accounts = execute_query(self.request, user_accounts_query)
 +            #print "=" * 80
 +            #print user_accounts
 +            #print "=" * 80
 +            for user_account in user_accounts:
 +                config = json.loads(user_account['config'])
 +                creds = []
 +                if 'authority_credentials' in config:
 +                    for authority_hrn, credential in config['authority_credentials'].items():
 +                        #if credential is not expired:
 +                        credential_authorities.add(authority_hrn)
 +                        #else
 +                        #    credential_authorities_expired.add(authority_hrn)
 +                if 'delegated_authority_credentials' in config:
 +                    for authority_hrn, credential in config['delegated_authority_credentials'].items():
 +                        #if credential is not expired:
 +                        credential_authorities.add(authority_hrn)
 +                        #else
 +                        #    credential_authorities_expired.add(authority_hrn)
 +
 +            print 'credential_authorities =', credential_authorities
 +            print 'credential_authorities_expired =', credential_authorities_expired
 +
 +            # ** 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_tmp = execute_query(self.request, pi_authorities_query)
 +            pi_authorities = set()
 +            for pa in pi_authorities_tmp:
 +                pi_authorities |= set(pa['pi_authorities'])
 +
 +            print "pi_authorities =", pi_authorities
 +            
 +            # My authorities + I have a credential
 +            pi_credential_authorities = pi_authorities & credential_authorities
 +            pi_no_credential_authorities = pi_authorities - credential_authorities - credential_authorities_expired
 +            pi_expired_credential_authorities = pi_authorities & credential_authorities_expired
 +            # Authorities I've been delegated PI rights
 +            pi_delegation_credential_authorities = credential_authorities - pi_authorities
 +            pi_delegation_expired_authorities = credential_authorities_expired - pi_authorities
 +
 +            print "pi_credential_authorities =", pi_credential_authorities
 +            print "pi_no_credential_authorities =", pi_no_credential_authorities
 +            print "pi_expired_credential_authorities =", pi_expired_credential_authorities
 +            print "pi_delegation_credential_authorities = ", pi_delegation_credential_authorities
 +            print "pi_delegation_expired_authorities = ", pi_delegation_expired_authorities
 +
 +            # Summary intermediary
 +            pi_my_authorities = pi_credential_authorities | pi_no_credential_authorities | pi_expired_credential_authorities
 +            pi_delegation_authorities = pi_delegation_credential_authorities | pi_delegation_expired_authorities
 +
 +            print "--"
 +            print "pi_my_authorities = ", pi_my_authorities
 +            print "pi_delegation_authorities = ", pi_delegation_authorities
 +
 +            # Summary all
 +            queried_pending_authorities = pi_my_authorities | pi_delegation_authorities
 +            print "----"
 +            print "queried_pending_authorities = ", queried_pending_authorities
 +            
 +            # Pending requests + authorities
 +            #pending_users = PendingUser.objects.filter(authority_hrn__in = queried_pending_authorities).all() 
 +            #pending_slices = PendingSlice.objects.filter(authority_hrn__in = queried_pending_authorities).all() 
 +            pending_users = PendingUser.objects.all()
 +            pending_slices = PendingSlice.objects.all()
 +
 +            # Dispatch requests and build the proper structure for the template:
 +
 +            print "pending users =", pending_users
 +            print "pending slices =", pending_slices
 +
 +            for user in pending_users:
 +                auth_hrn = user.authority_hrn
 +                if not auth_hrn:
 +                    auth_hrn = "ple.upmc" # XXX HARDCODED
 +
 +                request = {}
 +                request['type'] = 'user'
 +                request['id'] = 'TODO' # XXX in DB ?
 +                request['timestamp'] = 'TODO' # XXX in DB ?
 +                request['details'] = "%s %s <%s>" % (user.first_name, user.last_name, user.email)
 +
 +                if auth_hrn in pi_my_authorities:
 +                    dest = ctx_my_authorities
 +
 +                    # define the css class
 +                    if auth_hrn in pi_credential_authorities:
 +                        request['allowed'] = 'allowed'
 +                    elif auth_hrn in pi_expired_credential_authorities:
 +                        request['allowed'] = 'expired'
 +                    else: # pi_no_credential_authorities
 +                        request['allowed'] = 'denied'
 +
 +                elif auth_hrn in pi_delegation_authorities:
 +                    dest = ctx_delegation_authorities
 +
 +                    if auth_hrn in pi_delegation_credential_authorities:
 +                        request['allowed'] = 'allowed'
 +                    else: # pi_delegation_expired_authorities
 +                        request['allowed'] = 'expired'
 +
 +                else:
 +                    continue
 +                    
 +                if not auth_hrn in dest:
 +                    dest[auth_hrn] = []
 +                print "auth_hrn [%s] was added %r" % (auth_hrn, request)
 +                dest[auth_hrn].append(request) 
 +
 +            for slice in pending_slices:
 +                auth_hrn = slice.authority_hrn
 +                if not auth_hrn:
 +                    auth_hrn = "ple.upmc" # XXX HARDCODED
 +
 +                request = {}
 +                request['type'] = 'slice'
 +                request['id'] = 'TODO' # XXX in DB ?
 +                request['timestamp'] = 'TODO' # XXX in DB ?
 +                request['details'] = "Number of nodes: %d -- Type of nodes: %s<br/>%s" % ('TODO', 'TODO', 'TODO') # XXX 
 +                if auth_hrn in pi_my_authorities:
 +                    dest = ctx_my_authorities
 +
 +                    # define the css class
 +                    if auth_hrn in pi_credential_authorities:
 +                        request['allowed'] = 'allowed'
 +                    elif auth_hrn in pi_expired_credential_authorities:
 +                        request['allowed'] = 'expired'
 +                    else: # pi_no_credential_authorities
 +                        request['allowed'] = 'denied'
 +
 +                elif auth_hrn in pi_delegation_authorities:
 +                    dest = ctx_delegation_authorities
 +
 +                    if auth_hrn in pi_delegation_credential_authorities:
 +                        request['allowed'] = 'allowed'
 +                    else: # pi_delegation_expired_authorities
 +                        request['allowed'] = 'expired'
 +                    
 +                if not auth_hrn in dest:
 +                    dest[auth_hrn] = []
 +                dest[auth_hrn].append(request) 
 +
 +        context = super(ValidatePendingView, self).get_context_data(**kwargs)
 +        context['my_authorities']   = ctx_my_authorities
 +        context['delegation_authorities'] = ctx_delegation_authorities
 +
 +        # XXX This is repeated in all pages
 +        # more general variables expected in the template
 +        context['title'] = 'Test view that combines various plugins'
 +        # the menu items on the top
 +        context['topmenu_items'] = topmenu_items('Dashboard', self.request) 
 +        # so we can sho who is logged
 +        context['username'] = the_user(self.request) 
 +
 +        # XXX We need to prepare the page for queries
 +        #context.update(page.prelude_env())
 +
 +        return context