Merge branch 'onelab' of ssh://git.onelab.eu/git/myslice into fibre
authorLoic Baron <loic.baron@lip6.fr>
Tue, 22 Jul 2014 12:48:55 +0000 (09:48 -0300)
committerLoic Baron <loic.baron@lip6.fr>
Tue, 22 Jul 2014 12:48:55 +0000 (09:48 -0300)
plugins/scheduler2/static/js/scheduler2.js
plugins/scheduler2/templates/scheduler.html
portal/actions.py
portal/managementtabrequests.py
portal/migrations/0009_initial.py [new file with mode: 0644]

index 0b294b4..293324e 100755 (executable)
@@ -478,10 +478,6 @@ var SCHEDULER_COLWIDTH = 50;
                  * be updated when resources arrive.  Should be the pgcd in fact XXX */\r
                 this._granularity = DEFAULT_GRANULARITY;\r
                 scope.granularity = this._granularity;\r
-                this._all_slots = this._generate_all_slots();\r
-\r
-                // A list of {id, time} dictionaries representing the slots for the given day\r
-                scope.slots = this._all_slots;\r
                 this.scope_resources_by_key = {};\r
 \r
                 this.do_resize();\r
@@ -495,7 +491,16 @@ var SCHEDULER_COLWIDTH = 50;
             do_resize: function()\r
             {\r
                 var scope = this._get_scope();\r
-                var num_hidden_cells, new_max;\r
+                var num_hidden_cells, new_max, lcm;\r
+\r
+                // do_resize has to be called when the window is resized, or one parameter changes\r
+                // e.g. when new resources have been received\r
+                //\r
+                this.resource_granularities = [3600, 1800]; //, 2400]; /* s */\r
+\r
+                /* Compute the slot length to accommodate all resources. This\r
+                 * is the GCD of all resource granularities. */\r
+                this._slot_length = this._gcdn(this.resource_granularities);\r
 \r
                 $('#' + schedulerTblId + ' thead tr th:eq(0)').css("width", SCHEDULER_FIRST_COLWIDTH);\r
                 //self get width might need fix depending on the template \r
@@ -503,13 +508,23 @@ var SCHEDULER_COLWIDTH = 50;
 \r
                 /* Number of visible cells...*/\r
                 this._num_visible_cells = parseInt((tblwidth - SCHEDULER_FIRST_COLWIDTH) / SCHEDULER_COLWIDTH);\r
+\r
                 /* ...should be a multiple of the lcm of all encountered granularities. */\r
-                // XXX Should be updated everytime a new resource is added\r
-                this._lcm_colspan = this._lcm(this._granularity, RESOURCE_DEFAULT_GRANULARITY) / this._granularity;\r
-                this._num_visible_cells = this._num_visible_cells - this._num_visible_cells % this._lcm_colspan;\r
+                lcm = this._lcmn(this.resource_granularities) / this._slot_length;\r
+                this._num_visible_cells = this._num_visible_cells - this._num_visible_cells % lcm;\r
+\r
+                // A list of {id, time} dictionaries representing the slots for the given day\r
+                this._all_slots = this._generate_all_slots();\r
+\r
                 /* scope also needs this value */\r
+                scope.slots = this._all_slots;\r
+                scope.slot_length = this._slot_length;\r
                 scope.num_visible_cells = this._num_visible_cells;\r
-                scope.lcm_colspan = this._lcm_colspan;\r
+                scope.lcm_colspan = this._lcmn(this.resource_granularities); // XXX WHY ?\r
+\r
+                /* Redraw... */\r
+                this._scope_clear_leases();\r
+                this._set_all_lease_slots();\r
 \r
                 // Slider max value\r
                 if ($('#tblSlider').data('slider') != undefined) {\r
@@ -517,8 +532,8 @@ var SCHEDULER_COLWIDTH = 50;
 \r
                     $('#tblSlider').slider('setAttribute', 'max', num_hidden_cells);\r
                     $('#tblSlider').slider('setValue', scope.from, true);\r
-                    this._get_scope().$apply();\r
                 }\r
+                this._get_scope().$apply();\r
 \r
 \r
             },\r
@@ -580,7 +595,7 @@ var SCHEDULER_COLWIDTH = 50;
                 // Setup leases with a default free status...\r
                 $.each(this.scope_resources_by_key, function(resource_key, resource) {\r
                     resource.leases = [];\r
-                    var colspan_lease = resource.granularity / self._granularity; //eg. 3600 / 1800 => 2 cells\r
+                    var colspan_lease = resource.granularity / self._slot_length; //eg. 3600 / 1800 => 2 cells\r
                     time = SchedulerDateSelected.getTime();\r
                     for (i=0; i < self._all_slots.length / colspan_lease; i++) { // divide by granularity\r
                         resource.leases.push({\r
@@ -715,7 +730,7 @@ var SCHEDULER_COLWIDTH = 50;
                     return true; // ~ continue\r
 \r
                 id_end   = Math.ceil((lease.end_time   - day_timestamp) / resource.granularity);\r
-                colspan_lease = resource.granularity / this._granularity; //eg. 3600 / 1800 => 2 cells\r
+                colspan_lease = resource.granularity / this._slot_length; //eg. 3600 / 1800 => 2 cells\r
                 if (id_end >= this._all_slots.length / colspan_lease) {\r
                     /* Limit the display to the current day */\r
                     id_end = this._all_slots.length / colspan_lease\r
@@ -819,11 +834,11 @@ var SCHEDULER_COLWIDTH = 50;
                 \r
                 $('#tblSlider').slider({\r
                     min: 0,\r
-                    max: num_hidden_cells, // / self._lcm_colspan,\r
+                    max: num_hidden_cells,\r
                     value: init_cell,\r
                 }).on('slide', function(ev) {\r
                     var scope = self._get_scope();\r
-                    scope.from = ev.value * self._lcm_colspan;\r
+                    scope.from = ev.value;\r
                     scope.$apply();\r
                 });\r
                 scope.from = init_cell;\r
@@ -843,6 +858,12 @@ var SCHEDULER_COLWIDTH = 50;
             return (y==0) ? x : this._gcd(y, x % y);\r
         },\r
 \r
+        _gcdn : function(array)\r
+        {\r
+            var self = this;\r
+            return array.reduce(function(prev, cur, idx, arr) { return self._gcd(prev, cur); });\r
+        },\r
+\r
         /**\r
          * Least common multiple\r
          */\r
@@ -850,6 +871,12 @@ var SCHEDULER_COLWIDTH = 50;
         {\r
             return x * y / this._gcd(x, y);\r
         },\r
+\r
+        _lcmn : function(array)\r
+        {\r
+            var self = this;\r
+            return array.reduce(function(prev, cur, idx, arr) { return self._lcm(prev, cur); });\r
+        },\r
     \r
         _pad_str : function(i)\r
         {\r
@@ -876,7 +903,7 @@ var SCHEDULER_COLWIDTH = 50;
                 /// ...and add the slot to the list of results\r
                 slots.push({ id: i, time: tmpTime });\r
                 // Increment the date with the granularity\r
-                d = new Date(d.getTime() + this._granularity * 1000);\r
+                d = new Date(d.getTime() + this._slot_length * 1000);\r
                 i++;\r
             }\r
             return slots;\r
index 231a1d2..e07637a 100755 (executable)
                                                        style="word-wrap: break-word; word-break: break-all; ">\r
                                                        {[{ resource.hostname }]}\r
                                                </th>\r
-                        <td ng-repeat="lease in resource.leases | offset: from / lcm_colspan  | limitTo: num_visible_cells / lcm_colspan"\r
+                        <td ng-repeat="lease in resource.leases | offset: from / (resource.granularity / slot_length)  | limitTo: num_visible_cells / (resource.granularity / slot_length)"\r
                                                        data-slotid="{[{ lease.id }]}" \r
                                                        data-groupid="{[{ lease.groupid }]}" \r
                                                        ng-class="{{ 'lease.status' }}"\r
                                                        ng-class="{{ 'lease.success' }}"\r
-                                                       colspan="{[{resource.granularity / granularity}]}"\r
+                                                       colspan="{[{resource.granularity / slot_length}]}"\r
                                                        ng-click="select(from+$index, lease, $parent.resource)">\r
                                                </td>\r
                     </tr>\r
index cc167d1..da537cb 100644 (file)
@@ -252,7 +252,7 @@ def get_request_by_id(ids):
 def get_requests(authority_hrns=None):
     print "get_request_by_authority auth_hrns = ", authority_hrns
     if not authority_hrns:
-        ## get those pending users who have validated their emails
+        ## get those pending users who have confirmed their emails
         pending_users  = PendingUser.objects.filter(status__iexact = 'True')
         pending_slices = PendingSlice.objects.all()
         pending_authorities = PendingAuthority.objects.all()
index 850bbc6..6e37f1d 100644 (file)
@@ -133,8 +133,9 @@ class ManagementRequestsView (LoginRequiredView, ThemeView):
                 if auth_hrn in pi_expired_credential_authorities:
                     r['allowed'] = 'expired'
                 if 'allowed' not in r:
-                    r['allowed'] = 'denied'
-
+                    ## TEMP FIX for allowing new authority registration
+                    #r['allowed'] = 'denied'
+                    r['allowed'] = 'allowed'
 
                 if not auth_hrn in dest:
                     dest[auth_hrn] = []
diff --git a/portal/migrations/0009_initial.py b/portal/migrations/0009_initial.py
new file mode 100644 (file)
index 0000000..4e7e20a
--- /dev/null
@@ -0,0 +1,141 @@
+# -*- coding: utf-8 -*-
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        # Adding model 'Institution'
+        db.create_table(u'portal_institution', (
+            (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('name', self.gf('django.db.models.fields.TextField')()),
+        ))
+        db.send_create_signal(u'portal', ['Institution'])
+
+        # Adding model 'PendingUser'
+        db.create_table(u'portal_pendinguser', (
+            (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('first_name', self.gf('django.db.models.fields.TextField')()),
+            ('last_name', self.gf('django.db.models.fields.TextField')()),
+            ('email', self.gf('django.db.models.fields.EmailField')(max_length=75)),
+            ('password', self.gf('django.db.models.fields.TextField')()),
+            ('user_hrn', self.gf('django.db.models.fields.TextField')()),
+            ('public_key', self.gf('django.db.models.fields.TextField')()),
+            ('private_key', self.gf('django.db.models.fields.TextField')()),
+            ('authority_hrn', self.gf('django.db.models.fields.TextField')()),
+            ('login', self.gf('django.db.models.fields.TextField')()),
+            ('pi', self.gf('django.db.models.fields.TextField')()),
+            ('email_hash', self.gf('django.db.models.fields.TextField')()),
+            ('status', self.gf('django.db.models.fields.TextField')()),
+            ('created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
+        ))
+        db.send_create_signal(u'portal', ['PendingUser'])
+
+        # Adding model 'PendingAuthority'
+        db.create_table(u'portal_pendingauthority', (
+            (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('site_name', self.gf('django.db.models.fields.TextField')()),
+            ('site_authority', self.gf('django.db.models.fields.TextField')()),
+            ('site_abbreviated_name', self.gf('django.db.models.fields.TextField')()),
+            ('site_url', self.gf('django.db.models.fields.TextField')()),
+            ('site_latitude', self.gf('django.db.models.fields.TextField')()),
+            ('site_longitude', self.gf('django.db.models.fields.TextField')()),
+            ('address_line1', self.gf('django.db.models.fields.TextField')()),
+            ('address_line2', self.gf('django.db.models.fields.TextField')()),
+            ('address_line3', self.gf('django.db.models.fields.TextField')()),
+            ('address_city', self.gf('django.db.models.fields.TextField')()),
+            ('address_postalcode', self.gf('django.db.models.fields.TextField')()),
+            ('address_state', self.gf('django.db.models.fields.TextField')()),
+            ('address_country', self.gf('django.db.models.fields.TextField')()),
+            ('authority_hrn', self.gf('django.db.models.fields.TextField')()),
+            ('created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
+        ))
+        db.send_create_signal(u'portal', ['PendingAuthority'])
+
+        # Adding model 'PendingSlice'
+        db.create_table(u'portal_pendingslice', (
+            (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('slice_name', self.gf('django.db.models.fields.TextField')()),
+            ('user_hrn', self.gf('django.db.models.fields.TextField')()),
+            ('authority_hrn', self.gf('django.db.models.fields.TextField')(null=True)),
+            ('number_of_nodes', self.gf('django.db.models.fields.TextField')(default=0)),
+            ('type_of_nodes', self.gf('django.db.models.fields.TextField')(default='NA')),
+            ('purpose', self.gf('django.db.models.fields.TextField')(default='NA')),
+            ('created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
+        ))
+        db.send_create_signal(u'portal', ['PendingSlice'])
+
+
+    def backwards(self, orm):
+        # Deleting model 'Institution'
+        db.delete_table(u'portal_institution')
+
+        # Deleting model 'PendingUser'
+        db.delete_table(u'portal_pendinguser')
+
+        # Deleting model 'PendingAuthority'
+        db.delete_table(u'portal_pendingauthority')
+
+        # Deleting model 'PendingSlice'
+        db.delete_table(u'portal_pendingslice')
+
+
+    models = {
+        u'portal.institution': {
+            'Meta': {'object_name': 'Institution'},
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.TextField', [], {})
+        },
+        u'portal.pendingauthority': {
+            'Meta': {'object_name': 'PendingAuthority'},
+            'address_city': ('django.db.models.fields.TextField', [], {}),
+            'address_country': ('django.db.models.fields.TextField', [], {}),
+            'address_line1': ('django.db.models.fields.TextField', [], {}),
+            'address_line2': ('django.db.models.fields.TextField', [], {}),
+            'address_line3': ('django.db.models.fields.TextField', [], {}),
+            'address_postalcode': ('django.db.models.fields.TextField', [], {}),
+            'address_state': ('django.db.models.fields.TextField', [], {}),
+            'authority_hrn': ('django.db.models.fields.TextField', [], {}),
+            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'site_abbreviated_name': ('django.db.models.fields.TextField', [], {}),
+            'site_authority': ('django.db.models.fields.TextField', [], {}),
+            'site_latitude': ('django.db.models.fields.TextField', [], {}),
+            'site_longitude': ('django.db.models.fields.TextField', [], {}),
+            'site_name': ('django.db.models.fields.TextField', [], {}),
+            'site_url': ('django.db.models.fields.TextField', [], {})
+        },
+        u'portal.pendingslice': {
+            'Meta': {'object_name': 'PendingSlice'},
+            'authority_hrn': ('django.db.models.fields.TextField', [], {'null': 'True'}),
+            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'number_of_nodes': ('django.db.models.fields.TextField', [], {'default': '0'}),
+            'purpose': ('django.db.models.fields.TextField', [], {'default': "'NA'"}),
+            'slice_name': ('django.db.models.fields.TextField', [], {}),
+            'type_of_nodes': ('django.db.models.fields.TextField', [], {'default': "'NA'"}),
+            'user_hrn': ('django.db.models.fields.TextField', [], {})
+        },
+        u'portal.pendinguser': {
+            'Meta': {'object_name': 'PendingUser'},
+            'authority_hrn': ('django.db.models.fields.TextField', [], {}),
+            'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75'}),
+            'email_hash': ('django.db.models.fields.TextField', [], {}),
+            'first_name': ('django.db.models.fields.TextField', [], {}),
+            u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'last_name': ('django.db.models.fields.TextField', [], {}),
+            'login': ('django.db.models.fields.TextField', [], {}),
+            'password': ('django.db.models.fields.TextField', [], {}),
+            'pi': ('django.db.models.fields.TextField', [], {}),
+            'private_key': ('django.db.models.fields.TextField', [], {}),
+            'public_key': ('django.db.models.fields.TextField', [], {}),
+            'status': ('django.db.models.fields.TextField', [], {}),
+            'user_hrn': ('django.db.models.fields.TextField', [], {})
+        }
+    }
+
+    complete_apps = ['portal']
\ No newline at end of file