Merge branch 'onelab' of ssh://git.onelab.eu/git/myslice into fibre
authorLoic Baron <loic.baron@lip6.fr>
Mon, 21 Jul 2014 13:25:19 +0000 (10:25 -0300)
committerLoic Baron <loic.baron@lip6.fr>
Mon, 21 Jul 2014 13:25:19 +0000 (10:25 -0300)
manifoldapi/static/js/manifold.js
plugins/scheduler2/static/css/scheduler2.css
portal/actions.py
portal/homeview.py
portal/joinview.py
portal/manageuserview.py
portal/registrationview.py
portal/sliceresourceview.py
portal/templates/slice-tab-users-view.html

index b959c10..7dfcb4d 100644 (file)
@@ -1302,7 +1302,7 @@ case TYPE_LIST_OF_VALUES:
                 */
                 case TYPE_LIST_OF_VALUES: // XXX Until fixed
                 case TYPE_LIST_OF_RECORDS:
-                    var new_state,cur_query_uuid;
+                    var key, new_state, cur_query_uuid;
 
                     cur_query_uuid = query.analyzed_query.subqueries[field].query_uuid;
 
@@ -1310,7 +1310,15 @@ case TYPE_LIST_OF_VALUES:
                     //  - update_query_orig.params.resource = resources in slice before update
                     //  - update_query.params.resource = resource requested in slice
                     //  - keys from field = resources obtained
-                    var key = manifold.metadata.get_key(field);
+                
+                    if (field == 'lease') {
+                         // lease_id has been added to be repeated when
+                         // constructing request rspec. We don't want it for
+                         // comparisons
+                        key = ['start_time', 'end_time', 'resource'];
+                    } else {
+                        key = manifold.metadata.get_key(field);
+                    }
                     if (!key)
                         continue;
                     /*
index 2fcf063..cda74b1 100755 (executable)
     cursor: not-allowed;\r
 }\r
 \r
-#scheduler-reservation-table tbody tr td.success {\r
+#scheduler-reservation-table tbody tr td.success:after {\r
        content: "✓";\r
 }\r
-#scheduler-reservation-table tbody tr td.failure {\r
+#scheduler-reservation-table tbody tr td.failure:after {\r
        content: "✗";\r
 }\r
 \r
index 97850f7..cc167d1 100644 (file)
@@ -688,7 +688,7 @@ def create_pending_user(wsgi_request, request, user_detail):
         public_key    = request['public_key'],
         private_key   = request['private_key'],
         user_hrn      = request['user_hrn'],
-        pi            = '',                         # XXX Why not None ?
+        pi            = request['pi'],
         email_hash    = request['email_hash'],
         status        = 'False',
     )
index 3e68487..858c887 100644 (file)
@@ -108,6 +108,7 @@ class HomeView (FreeAccessView, ThemeView):
             ## check user is pi or not
             platform_query  = Query().get('local:platform').select('platform_id','platform','gateway_type','disabled')
             account_query  = Query().get('local:account').select('user_id','platform_id','auth_type','config')
+            # XXX Something like an invalid session seems to make the execute fail sometimes, and thus gives an error on the main page
             platform_details = execute_query(self.request, platform_query)
             account_details = execute_query(self.request, account_query)
             for platform_detail in platform_details:
index 5dd04c2..8356dec 100644 (file)
@@ -2,12 +2,14 @@ import os.path, re
 import json
 from random import randint
 
+from hashlib                    import md5
 from django.core.mail           import EmailMultiAlternatives
 from django.contrib.auth.models import User
 from django.views.generic       import View
 from django.template.loader     import render_to_string
 from django.shortcuts           import render
 from django.contrib.auth        import get_user_model
+from django.contrib.sites.models import Site
 
 from unfold.page                import Page
 from unfold.loginrequired       import FreeAccessView
@@ -17,7 +19,7 @@ from manifoldapi.manifoldapi    import execute_admin_query
 from manifold.core.query        import Query
 
 from portal.models              import PendingUser,PendingAuthority
-from portal.actions             import authority_get_pi_emails, manifold_add_user,manifold_add_account
+from portal.actions             import authority_get_pi_emails, manifold_add_user,manifold_add_account, create_pending_user
 
 from myslice.theme import ThemeView
 
@@ -59,20 +61,20 @@ class JoinView (FreeAccessView, ThemeView):
 
             reg_site_name = request.POST.get('site_name', '')
             reg_site_authority = request.POST.get('site_authority', '').lower()
-            reg_site_abbreviated_name = request.POST.get('site_abbreviated_name', '')
+            reg_site_abbreviated_name = request.POST.get('site_abbreviated_name', '').lower()
             reg_site_url = request.POST.get('site_url', '')
             reg_site_latitude = request.POST.get('site_latitude', '')
             reg_site_longitude = request.POST.get('site_longitude', '')
 
             reg_fname  = request.POST.get('pi_first_name', '')
             reg_lname  = request.POST.get('pi_last_name', '')
-            reg_auth   = reg_root_authority_hrn + "." + reg_site_authority 
+            reg_auth   = 'onelab.' + reg_site_abbreviated_name   
             reg_email  = request.POST.get('pi_email','').lower()
             reg_phone  = request.POST.get('pi_phone','')
             #prepare user_hrn 
             split_email = reg_email.split("@")[0] 
             split_email = split_email.replace(".", "_")
-            user_hrn = reg_auth + '.' + split_email+ str(randint(1,1000000))
+            user_hrn = reg_auth + '.' + split_email
             
             UserModel = get_user_model()
             
@@ -123,7 +125,7 @@ class JoinView (FreeAccessView, ThemeView):
                 reg_password = request.POST['pi_password']
                 a = PendingAuthority(
                     site_name             = reg_site_name,             
-                    site_authority        = 'onelab.' + reg_site_abbreviated_name
+                    site_authority        = reg_auth
                     site_abbreviated_name = reg_site_abbreviated_name, 
                     site_url              = reg_site_url,
                     site_latitude         = reg_site_latitude, 
@@ -140,23 +142,33 @@ class JoinView (FreeAccessView, ThemeView):
                 a.save()
  
                 reg_password = request.POST['pi_password']
-                b = PendingUser(
-                    first_name    = reg_fname, 
-                    last_name     = reg_lname, 
-                    authority_hrn = reg_auth,
-                    email         = reg_email, 
-                    password      = reg_password,
-                    public_key    = public_key,
-                    private_key   = private_key,
-                    user_hrn      = user_hrn,  
-                    pi            = reg_auth,
-                    email_hash    = '',
-                    status        = 'True',
-                )
-                b.save()
+                salt = randint(1,100000)
+                # get the domain url
+                current_site = Site.objects.get_current()
+                current_site = current_site.domain
+
+                email_hash = md5(str(salt)+reg_email).hexdigest()
+                user_request = {
+                    'first_name'    : reg_fname,
+                    'last_name'     : reg_lname,
+                    'organization'  : reg_site_name,
+                    'authority_hrn' : reg_auth,
+                    'email'         : reg_email,
+                    'password'      : reg_password,
+                    'public_key'    : public_key,
+                    'private_key'   : private_key,
+                    'current_site'  : current_site,
+                    'email_hash'    : email_hash,
+                    'user_hrn'      : user_hrn,
+                    'pi'            : [reg_auth],
+                    'auth_type'     : 'managed',
+                    'validation_link': 'http://' + current_site + '/portal/email_activation/'+ email_hash
+                }
 
+                
+                create_pending_user(request, user_request, user_detail)
                 # saves the user to django auth_user table [needed for password reset]
-                user = User.objects.create_user(reg_email, reg_email, reg_password)
+                #user = User.objects.create_user(reg_email, reg_email, reg_password)
 
                 #creating user to manifold local:user
                 #user_config = '{"first_name":"'+ reg_fname + '", "last_name":"'+ reg_lname + '", "authority_hrn":"'+ reg_auth + '"}'
index 7687d34..3cbb91d 100644 (file)
@@ -24,8 +24,8 @@ class UserView(LoginRequiredAutoLogoutView, ThemeView):
     def get_context_data(self, **kwargs):
 
         page = Page(self.request)
-        page.add_js_files  ( [ "js/jquery.validate.js", "js/my_account.register.js", "js/my_account.edit_profile.js" ] )
-        page.add_css_files ( [ "css/onelab.css", "css/account_view.css","css/plugin.css" ] )
+        page.add_js_files  ( [ "js/jquery.validate.js", "js/my_account.register.js", "js/my_account.edit_profile.js", "js/jquery-ui.js" ] )
+        page.add_css_files ( [ "css/onelab.css", "css/account_view.css","css/plugin.css","css/jquery-ui.css" ] )
 
         for key, value in kwargs.iteritems():
             #print "%s = %s" % (key, value)
index 7bb25fc..0bccac9 100644 (file)
@@ -79,6 +79,7 @@ class RegistrationView (FreeAccessView, ThemeView):
                 'password'      : wsgi_request.POST.get('password',      ''),
                 'current_site'  : current_site,
                 'email_hash'    : email_hash,
+                'pi'            : '',
                 'validation_link': 'http://' + current_site + '/portal/email_activation/'+ email_hash
             }
 
@@ -144,8 +145,8 @@ class RegistrationView (FreeAccessView, ThemeView):
                 ALLOWED_EXTENSIONS =  ['.pub','.txt']
                 if file_extension not in ALLOWED_EXTENSIONS or not re.search(r'ssh-rsa',file_content):
                     errors.append('Please upload a valid RSA public key.')
-
-                user_request['private_key'] = None
+                # user_request['private_key'] can't be Null because all db fields are set as NOT NULL
+                user_request['private_key'] = ""
                 user_request['public_key']  = file_content
                 
             if not errors:
index db72dca..db7413d 100644 (file)
@@ -256,6 +256,8 @@ class SliceResourceView (LoginRequiredView, ThemeView):
         account_query  = Query().get('local:account').select('user_id','platform_id','auth_type','config')
         platform_details = execute_query(self.request, platform_query)
         account_details = execute_query(self.request, account_query)
+
+        # XXX When session has expired, this is None and thus not iterable
         for platform_detail in platform_details:
             for account_detail in account_details:
                 if platform_detail['platform_id'] == account_detail['platform_id']:
index 1052c49..103a1ff 100644 (file)
@@ -1,3 +1,7 @@
+<script type="text/javascript" src="{{STATIC_URL}}/js/jquery-ui.js"></script>
+<script type="text/javascript" src="{{STATIC_URL}}/js/jquery.qtip.min.js"></script>
+<link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}css/jquery.qtip.min.css">
+<link rel="stylesheet" href="{{ STATIC_URL }}css/jquery-ui.css">
 <script>
     function get_users_in_slice(authority_hrn){
         console.log(authority_hrn);
                     // Keep only the sub authorities, remove root auth
                     if(auth_hrn.indexOf(".") > -1){
                         list_authorities.push(auth_hrn);
+                                               list_authorities.sort();
                         if(auth_hrn=="{{user_details.parent_authority}}"){
-                            $("#auth_list").append("<option value='"+auth_hrn+"' selected='selected'>"+auth_hrn+"</option>");
-                        }else{
-                            $("#auth_list").append("<option value='"+auth_hrn+"'>"+auth_hrn+"</option>");
-                        }
+                                                       $('#auth_list').val(auth_hrn);
+                                               }
                     }
                 });
+                               $( "#auth_list" ).autocomplete({
+                               source: list_authorities,
+                               minLength: 0,
+                               select: function (event, ui) {
+                                               get_users_in_slice(ui.item.value);
+                               }
+                               //select: function( event, ui ) {console.log(jQuery(this))}
+                       });
             }); // post rest/authority
 
             get_users_in_slice("{{user_details.parent_authority}}");
@@ -84,7 +95,7 @@
                //window.location="/portal/institution#slices";
 
             }); // button#addusers click
-
+       $('[title!=""]').qtip();
     }); // document ready
 </script>
 
                </div>
                        
                <ul class="list-group">
-                 <li class="list-group-item">Authority:<b> {{user_details.parent_authority}}</b>
-                 </li>
+                 <li class="list-group-item">Authority</li>
                  <li class="list-group-item" style="padding-left:5px;">
-                       <select id="auth_list" onchange="get_users_in_slice(this.value);" style ="min-width:190px;">
-            </select>
+                       <input type="text" id="auth_list"  style ="min-width:190px;" 
+                       title="The default value is  the authority that you belong to and the selected users belong to this slice.
+                                  You can view users of other authorities (organizations) from the list that apears when you click in the field and start to type.
+                                  Use the arrow keys to scroll through the list; type part of the name to narrow down the list."/>
           </li>
                </ul>