manifold.api : fixed authentication as admin
authorJordan Augé <jordan.auge@lip6.fr>
Fri, 18 Oct 2013 15:42:00 +0000 (17:42 +0200)
committerJordan Augé <jordan.auge@lip6.fr>
Fri, 18 Oct 2013 15:42:00 +0000 (17:42 +0200)
portal.registration, portal.slicerequest: improved authority queries
portal.slicerequest: added help messages

manifold/manifoldapi.py
myslice/config.py
portal/forms.py
portal/registrationview.py
portal/slicerequestview.py
portal/templates/slice-request-view.html

index 2a64a49..c00882a 100644 (file)
@@ -78,12 +78,7 @@ class ManifoldAPI:
 
         return func
 
-def execute_query(request, query):
-    if not 'manifold' in request.session or not 'auth' in request.session['manifold']:
-        print "W: Using hardcoded demo account for execute_query"
-        manifold_api_session_auth = {'AuthMethod': 'password', 'Username': 'demo', 'AuthString': 'demo'}
-    else:
-        manifold_api_session_auth = request.session['manifold']['auth']
+def _execute_query(request, query, manifold_api_session_auth):
     manifold_api = ManifoldAPI(auth=manifold_api_session_auth)
     print "-"*80
     print query
@@ -97,3 +92,15 @@ def execute_query(request, query):
     #Error running query: {'origin': [0, 'XMLRPCAPI'], 'code': 2, 'description': 'No such session: No row was found for one()', 'traceback': 'Traceback (most recent call last):\n  File "/usr/local/lib/python2.7/dist-packages/manifold/core/xmlrpc_api.py", line 68, in xmlrpc_forward\n    user = Auth(auth).check()\n  File "/usr/local/lib/python2.7/dist-packages/manifold/auth/__init__.py", line 245, in check\n    return self.auth_method.check()\n  File "/usr/local/lib/python2.7/dist-packages/manifold/auth/__init__.py", line 95, in check\n    raise AuthenticationFailure, "No such session: %s" % e\nAuthenticationFailure: No such session: No row was found for one()\n', 'type': 2, 'ts': None, 'value': None}
 
     return result['value'] 
+
+def execute_query(request, query):
+    if not 'manifold' in request.session or not 'auth' in request.session['manifold']:
+        raise Exception, "User not authenticated"
+    manifold_api_session_auth = request.session['manifold']['auth']
+    return _execute_query(request, query, manifold_api_session_auth)
+
+def execute_admin_query(request, query):
+    config = Config()
+    admin_user, admin_password = config.manifold_admin_user_password()
+    admin_auth = {'AuthMethod': 'password', 'Username': admin_user, 'AuthString': admin_password}
+    return _execute_query(request, query, admin_auth)
index 9cf2407..51bf4b7 100644 (file)
@@ -16,11 +16,15 @@ class Config:
     # if you use a development backend running on this box, use "http://localhost:7080/"
     # the INRIA setup is with "http://manifold.pl.sophia.inria.fr:7080/"
 
+    default_manifold_admin_user     = 'admin'
+    default_manifold_admin_password = None
+
     _config_parser = None
 
     # having grown tired of screwing up with git stashes 
     # taking away my local config, we now more properly use
     # an external config file to override teh default
+    # XXX we might use support from manifold util classes --jordan
     @staticmethod
     def manifold_url ():
         if Config._config_parser: 
@@ -32,6 +36,20 @@ class Config:
         Config._config_parser=config
         return Config.manifold_url()
 
+    @staticmethod
+    def manifold_admin_user_password():
+        if Config._config_parser: 
+            admin_user = Config._config_parser.get('manifold','admin_user')
+            admin_password = Config._config_parser.get('manifold','admin_password')
+            return (admin_user, admin_password)
+        config = RawConfigParser ()
+        config.add_section('manifold')
+        config.set ('manifold', 'admin_user', Config.default_manifold_admin_user)
+        config.set ('manifold', 'admin_password', Config.default_manifold_admin_password)
+        config.read (os.path.join(ROOT,'myslice/myslice.ini'))
+        Config._config_parser=config
+        return Config.manifold_admin_user_password()
+
     # exporting these details to js
     @staticmethod
     def manifold_js_export ():
index 109d966..075f942 100644 (file)
@@ -62,13 +62,29 @@ class SliceRequestForm(forms.Form):
 #    email = forms.EmailField()
 #    cc_myself = forms.BooleanField(required=False)
 
-    slice_name = forms.CharField(widget=forms.TextInput(attrs={'class':'form-control'}))
-    authority_hrn = forms.ChoiceField(choices=[(1, 'un')],widget=forms.Select(attrs={'class':'form-control'}))
-    number_of_nodes  = forms.DecimalField(widget=forms.TextInput(attrs={'class':'form-control'}))
-    type_of_nodes = forms.CharField(widget=forms.TextInput(attrs={'class':'form-control'}))
-    purpose = forms.CharField(widget=forms.Textarea(attrs={'class':'form-control'}))
-    email = forms.EmailField(widget=forms.TextInput(attrs={'class':'form-control'}))
-    cc_myself = forms.BooleanField(required=False,widget=forms.CheckboxInput(attrs={'class':'form-control'}))
+    slice_name = forms.CharField(
+        widget=forms.TextInput(attrs={'class':'form-control'}), 
+        help_text="Enter a name for the slice you wish to create")
+    authority_hrn = forms.ChoiceField(
+        widget    = forms.Select(attrs={'class':'form-control'}),
+        choices   = [],
+        help_text = "Please select an authority responsible for vetting your slice")
+    number_of_nodes = forms.DecimalField(
+        widget    = forms.TextInput(attrs={'class':'form-control'}),
+        help_text = "Enter the number of nodes you expect to request (informative only)")
+    type_of_nodes = forms.CharField(
+        widget    = forms.TextInput(attrs={'class':'form-control'}),
+        help_text = "Enter the type of nodes you expect to request (informative only)")
+    purpose = forms.CharField(
+        widget    = forms.Textarea(attrs={'class':'form-control'}),
+        help_text = "Enter the purpose of your experiment (informative only)")
+    email = forms.EmailField(
+        widget    = forms.TextInput(attrs={'class':'form-control'}),
+        help_text = "Enter your email address")
+    cc_myself = forms.BooleanField(
+        widget    = forms.CheckboxInput(attrs={'class':'form-control'}),
+        required  = False,
+        help_text = "Please indicate whether you would like to be CC'ed to the request email")
 
     def __init__(self, *args, **kwargs):
         initial =  kwargs.get('initial', {})
index aefdaa7..1f8ab8b 100644 (file)
@@ -9,7 +9,7 @@ from django.shortcuts           import render
 from unfold.page                import Page
 from ui.topmenu                 import topmenu_items
 
-from manifold.manifoldapi       import execute_query
+from manifold.manifoldapi       import execute_admin_query
 from manifold.core.query        import Query
 
 from portal.models              import PendingUser
@@ -30,10 +30,17 @@ class RegistrationView (View):
         errors = []
 
         authorities_query = Query.get('authority').\
-            filter_by('authority_hrn', 'included', ['ple.inria', 'ple.upmc']).\
             select('name', 'authority_hrn')
-        #authorities_query = Query.get('authority').select('authority_hrn')
-        authorities = execute_query(request, authorities_query)
+        
+        onelab_enabled_query = Query.get('local:platform').filter_by('platform', '==', 'ple-onelab').filter_by('disabled', '==', 'False')
+        onelab_enabled = not not execute_admin_query(request, onelab_enabled_query)
+        if onelab_enabled:
+            print "ONELAB ENABLED"
+            authorities_query = authorities_query.filter_by('authority_hrn', 'included', ['ple.inria', 'ple.upmc'])
+        else:
+            print "FIREXP ENABLED"
+
+        authorities = execute_admin_query(request, authorities_query)
         # xxx tocheck - if authorities is empty, it's no use anyway
         # (users won't be able to validate the form anyway)
 
index de1f83d..5f6c786 100644 (file)
@@ -3,7 +3,7 @@ from django.shortcuts            import render
 from django.core.mail            import send_mail
 
 from manifold.core.query         import Query
-from manifold.manifoldapi        import execute_query
+from manifold.manifoldapi        import execute_admin_query, execute_query
 
 from portal.models               import PendingSlice
 from portal.actions              import authority_get_pi_emails
@@ -14,12 +14,19 @@ from ui.topmenu                  import topmenu_items, the_user
 class SliceRequestView (LoginRequiredAutoLogoutView):
 
     def authority_hrn_initial (self, request):
-#        authorities_query = Query.get('authority').filter_by('authority_hrn', 'included', ['ple.inria', 'ple.upmc']).select('name', 'authority_hrn')
-        authorities_query = Query.get('authority').select('authority_hrn')
-        authorities = execute_query(request, authorities_query)
-        authorities = sorted(authorities)
+        authorities_query = Query.get('authority').\
+            select('name', 'authority_hrn')
         
-        authority_hrn_tuples = [ (authority['authority_hrn'], authority['name'],) for authority in authorities ]
+        onelab_enabled_query = Query.get('local:platform').filter_by('platform', '==', 'ple-onelab').filter_by('disabled', '==', 'False')
+        onelab_enabled = not not execute_admin_query(request, onelab_enabled_query)
+        if onelab_enabled:
+            authorities_query = authorities_query.filter_by('authority_hrn', 'included', ['ple.inria', 'ple.upmc'])
+
+        authorities = execute_admin_query(request, authorities_query)
+        #authorities = sorted(authorities)
+        
+        authority_hrn_tuples = [ (authority['authority_hrn'], authority['name'] if authority['name'] else authority['authority_hrn'],) for authority in authorities ]
+        print "authority_hrn_tuples=", authority_hrn_tuples
         return {'authority_hrn': authority_hrn_tuples}
 
     # because we inherit LoginRequiredAutoLogoutView that is implemented by redefining 'dispatch'
index 6983354..f437ae0 100644 (file)
@@ -21,7 +21,8 @@
     {% for field in form %}
     <div class="form-group">
       <label for="{{ field.html_name }}" class="col-xs-4 control-label">{{ field.label }}</label>
-      <div class="col-xs-4"> {{ field.errors }} {{ field }} <p class="form-hint">{{ field.help_text }}</p> </div>
+      <div class="col-xs-4"> {{ field.errors }} {{ field }} </div>
+      <div class="col-xs-4"> <p class="form-hint">{{ field.help_text }}</p> </div>
     </div>
     {% endfor %}
     <div class="col-xs-offset-4 col-xs-4">