added some user sesssion and object-list caching
authorerickson <erickson@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Wed, 18 Mar 2009 02:31:15 +0000 (02:31 +0000)
committererickson <erickson@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Wed, 18 Mar 2009 02:31:15 +0000 (02:31 +0000)
git-svn-id: svn://svn.open-ils.org/ILS/trunk@12569 dcc99617-32d9-48b4-a31d-7c20da2025e4

Open-ILS/web/js/dojo/openils/User.js
Open-ILS/web/js/dojo/openils/widget/AutoFieldWidget.js

index ecf92cf..edee31a 100644 (file)
@@ -35,6 +35,8 @@ if(!dojo._hasResource["openils.User"]) {
         authtoken : null,
         authtime : null,
         workstation : null,
+        permOrgCache : {},
+        sessionCache : {},
     
         constructor : function ( kwargs ) {
             kwargs = kwargs || {};
@@ -51,6 +53,10 @@ if(!dojo._hasResource["openils.User"]) {
             if (this.id && this.authtoken) this.user = this.getById( this.id );
             else if (this.authtoken) this.getBySession();
             else if (kwargs.login) this.login();
+
+            var id = this.id || (this.user) ? this.user.id() : null;
+            if(id && !this.permOrgCache[id])
+                this.permOrgCache[id] = {};
         },
 
         getBySession : function(onComplete) {
@@ -58,6 +64,13 @@ if(!dojo._hasResource["openils.User"]) {
             var req = ['open-ils.auth', 'open-ils.auth.session.retrieve'];
             var params = [_u.authtoken];
 
+            if(this.sessionCache[this.authtoken]) {
+                this.user = this.sessionCache[this.authtoken];
+                               if (!openils.User.user) 
+                    openils.User.user = this.user;
+                return this.user;
+            }
+
             if(onComplete) {
                 fieldmapper.standardRequest(
                     req, {   
@@ -66,6 +79,7 @@ if(!dojo._hasResource["openils.User"]) {
                         oncomplete : function(r) {
                             var user = r.recv().content();
                             _u.user = user;
+                            _u.sessionCache[_u.authtoken] = user;
                                                if (!openils.User.user) openils.User.user = _u.user;
                             if(onComplete)
                                 onComplete(user);
@@ -75,6 +89,7 @@ if(!dojo._hasResource["openils.User"]) {
             } else {
                 _u.user = fieldmapper.standardRequest(req, params);
                                if (!openils.User.user) openils.User.user = _u.user;
+                _u.sessionCache[_u.authtoken] = _u.user;
                 return _u.user;
             }
         },
@@ -185,12 +200,15 @@ if(!dojo._hasResource["openils.User"]) {
         getPermOrgList : function(permList, onload, includeDescendents, idlist) {
             if(typeof permList == 'string') permList = [permList];
 
-            console.log('loading org perms ' + permList + ' for user ' + this.user.id());
+            var self = this;
             var oncomplete = function(r) {
-                var permMap = openils.Util.readResponse(r);
+                var permMap = {};
+                if(r) permMap = openils.Util.readResponse(r);
                 var orgList = [];
-                for(var perm in permMap) {
-                    var permOrgList = permMap[perm];
+                for(var i = 0; i < permList.length; i++) {
+                    var perm = permList[i];
+                    var permOrgList = permMap[perm] || self.permOrgCache[self.user.id()][perm];
+                    self.permOrgCache[self.user.id()][perm] = permOrgList;
                     for(var i in permOrgList) {
                         if(includeDescendents) {
                             orgList = orgList.concat(
@@ -211,10 +229,19 @@ if(!dojo._hasResource["openils.User"]) {
                 onload(trimmed);
             };
 
+            var fetchList = [];
+            for(var i = 0; i < permList.length; i++) {
+                if(!self.permOrgCache[self.user.id()][permList[i]])
+                    fetchList.push(permList[i]);
+            }
+
+            if(fetchList.length == 0) 
+                return oncomplete();
+
             fieldmapper.standardRequest(
                 ['open-ils.actor', 'open-ils.actor.user.has_work_perm_at.batch'],
                 {   async: true,
-                    params: [this.authtoken, permList],
+                    params: [this.authtoken, fetchList],
                     oncomplete: oncomplete
                 }
             );
index 3173fe5..df2ad32 100644 (file)
@@ -203,18 +203,28 @@ if(!dojo._hasResource['openils.widget.AutoFieldWidget']) {
             this.widget.searchAttr = this.widget.labelAttr = vfield.selector || vfield.name;
             this.widget.valueAttr = vfield.name;
 
-            new openils.PermaCrud().retrieveAll(linkClass, {   
-                async : true,
-                oncomplete : function(r) {
-                    var list = openils.Util.readResponse(r, false, true);
-                    if(list) {
-                        self.widget.store = 
-                            new dojo.data.ItemFileReadStore({data:fieldmapper[linkClass].toStoreData(list)});
-                    }
-                    self.widget.startup();
-                    self._widgetLoaded();
+            var oncomplete = function(list) {
+                if(list) {
+                    self.widget.store = 
+                        new dojo.data.ItemFileReadStore({data:fieldmapper[linkClass].toStoreData(list)});
+                    self.cache[linkClass] = list;
                 }
-            });
+                self.widget.startup();
+                self._widgetLoaded();
+            };
+
+            if(this.cache[linkClass]) {
+                oncomplete(this.cache[linkClass]);
+
+            } else {
+                new openils.PermaCrud().retrieveAll(linkClass, {   
+                    async : true,
+                    oncomplete : function(r) {
+                        var list = openils.Util.readResponse(r, false, true);
+                        oncomplete(list);
+                    }
+                });
+            }
 
             return true;
         },