]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/web/js/dojo/openils/User.js
getPermOrgList will collect the descendants for us now
[working/Evergreen.git] / Open-ILS / web / js / dojo / openils / User.js
1 /* ---------------------------------------------------------------------------
2  * Copyright (C) 2008  Georgia Public Library Service
3  * Bill Erickson <erickson@esilibrary.com>
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  * ---------------------------------------------------------------------------
15  */
16
17
18 if(!dojo._hasResource["openils.User"]) {
19
20     dojo._hasResource["openils.User"] = true;
21     dojo.provide("openils.User");
22     dojo.require("DojoSRF");
23     dojo.require('openils.Event');
24     dojo.require('fieldmapper.Fieldmapper');
25     dojo.require('fieldmapper.OrgUtils');
26
27     dojo.declare('openils.User', null, {
28
29         user : null,
30         username : null,
31         passwd : null,
32         login_type : 'opac',
33         location : null,
34         authtoken : null,
35         authtime : null,
36         workstation : null,
37     
38         constructor : function ( kwargs ) {
39             kwargs = kwargs || {};
40             this.id = kwargs.id;
41             this.user = kwargs.user;
42             this.passwd = kwargs.passwd;
43             this.authtoken = kwargs.authtoken || openils.User.authtoken;
44             this.authtime = kwargs.authtime || openils.User.authtime;
45             this.login_type = kwargs.login_type;
46             this.location = kwargs.location;
47             this.authcookie = kwargs.authcookie || openils.User.authcookie;
48             this.permOrgStoreCache = {}; /* permName => permOrgUnitStore map */
49
50             if (this.id && this.authtoken) this.user = this.getById( this.id );
51             else if (this.authtoken) this.getBySession();
52             else if (kwargs.login) this.login();
53         },
54
55         getBySession : function(onComplete) {
56             var _u = this;
57             var req = ['open-ils.auth', 'open-ils.auth.session.retrieve'];
58             var params = [_u.authtoken];
59
60             if(onComplete) {
61                 fieldmapper.standardRequest(
62                     req, {   
63                         async: true,
64                         params: params,
65                         oncomplete : function(r) {
66                             var user = r.recv().content();
67                             _u.user = user;
68                                                 if (!openils.User.user) openils.User.user = _u.user;
69                             if(onComplete)
70                                 onComplete(user);
71                         }
72                     }
73                 );
74             } else {
75                 _u.user = fieldmapper.standardRequest(req, params);
76                                 if (!openils.User.user) openils.User.user = _u.user;
77                 return _u.user;
78             }
79         },
80     
81         getById : function(id, onComplete) {
82             var req = OpenSRF.CachedClientSession('open-ils.actor').request('open-ils.actor.user.retrieve', this.authtoken, id);
83             if(onComplete) {
84                 req.oncomplete = function(r) {
85                     var user = r.recv().content();
86                     onComplete(user);
87                 }
88                 req.send();
89             } else {
90                 req.timeout = 10;
91                 req.send();
92                 return req.recv().content();
93             }
94         },
95     
96     
97         /**
98          * Logs in, sets the authtoken/authtime vars, and fetches the logged in user
99          */
100         login_async : function(args, onComplete) {
101             var _u = this;
102
103             if (!args) args = {};
104             if (!args.username) args.username = _u.username;
105             if (!args.passwd) args.passwd = _u.passwd;
106             if (!args.type) args.type = _u.login_type;
107             if (!args.location) args.location = _u.location;
108
109             var initReq = OpenSRF.CachedClientSession('open-ils.auth').request('open-ils.auth.authenticate.init', args.username);
110     
111             initReq.oncomplete = function(r) {
112                 var seed = r.recv().content(); 
113                 var loginInfo = {
114                     username : args.username,
115                     password : hex_md5(seed + hex_md5(args.passwd)), 
116                     type : args.type,
117                     org : args.location,
118                     workstation : args.workstation
119                 };
120     
121                 var authReq = OpenSRF.CachedClientSession('open-ils.auth').request('open-ils.auth.authenticate.complete', loginInfo);
122                 authReq.oncomplete = function(rr) {
123                     var data = rr.recv().content();
124                     _u.authtoken = data.payload.authtoken;
125                                         if (!openils.User.authtoken) openils.User.authtoken = _u.authtoken;
126                     _u.authtime = data.payload.authtime;
127                                         if (!openils.User.authtime) openils.User.authtime = _u.authtime;
128                     _u.getBySession(onComplete);
129                     if(_u.authcookie) {
130                         dojo.require('dojo.cookie');
131                         dojo.cookie(_u.authcookie, _u.authtoken, {path:'/'});
132                     }
133                 }
134                 authReq.send();
135             }
136     
137             initReq.send();
138         },
139
140         login : function(args) {
141             var _u = this;
142             if (!args) args = {};
143             if (!args.username) args.username = _u.username;
144             if (!args.passwd) args.passwd = _u.passwd;
145             if (!args.type) args.type = _u.login_type;
146             if (!args.location) args.location = _u.location;
147
148             var seed = fieldmapper.standardRequest(
149                 ['open-ils.auth', 'open-ils.auth.authenticate.init'],
150                 [args.username]
151             );
152
153             var loginInfo = {
154                 username : args.username,
155                 password : hex_md5(seed + hex_md5(args.passwd)), 
156                 type : args.type,
157                 org : args.location,
158                 workstation : args.workstation,
159             };
160
161             var data = fieldmapper.standardRequest(
162                 ['open-ils.auth', 'open-ils.auth.authenticate.complete'],
163                 [loginInfo]
164             );
165
166             _u.authtoken = data.payload.authtoken;
167             if (!openils.User.authtoken) openils.User.authtoken = _u.authtoken;
168             _u.authtime = data.payload.authtime;
169             if (!openils.User.authtime) openils.User.authtime = _u.authtime;
170
171             if(_u.authcookie) {
172                 dojo.require('dojo.cookie');
173                 dojo.cookie(_u.authcookie, _u.authtoken, {path:'/'});
174             }
175         },
176
177     
178         /**
179          * Returns a list of the "highest" org units where the user has the given permission(s).
180          * @param permList A single permission or list of permissions
181          * @param includeDescendents If true, return a list of 'highest' orgs plus descendents
182          * @idlist If true, return a list of IDs instead of org unit objects
183          */
184         getPermOrgList : function(permList, onload, includeDescendents, idlist) {
185             if(typeof permList == 'string') permList = [permList];
186
187             console.log('loading org perms ' + permList + ' for user ' + this.user.id());
188             var oncomplete = function(r) {
189                 var permMap = openils.Util.readResponse(r);
190                 var orgList = [];
191                 for(var perm in permMap) {
192                     var permOrgList = permMap[perm];
193                     for(var i in permOrgList) {
194                         if(includeDescendents) {
195                             orgList = orgList.concat(
196                                 fieldmapper.aou.descendantNodeList(permOrgList[i]));
197                         } else {
198                             orgList = orgList.concat(fieldmapper.aou.findOrgUnit(permOrgList[i]));
199                         }
200                     }
201                 }
202
203                 // remove duplicates
204                 var trimmed = [];
205                 for(var idx in orgList) {
206                     var val = (idlist) ? orgList[idx].id() : orgList[idx];
207                     if(trimmed.indexOf(val) < 0)
208                         trimmed.push(val);
209                 }
210                 onload(trimmed);
211             };
212
213             fieldmapper.standardRequest(
214                 ['open-ils.actor', 'open-ils.actor.user.work_perm.highest_org_set.batch'],
215                 {   async: true,
216                     params: [this.authtoken, permList],
217                     oncomplete: oncomplete
218                 }
219             );
220         },
221
222     
223         /**
224          * Builds a dijit.Tree using the orgs where the user has the requested permission
225          * @param perm The permission to check
226          * @param domId The DOM node where the tree widget should live
227          * @param onClick If defined, this will be connected to the tree widget for
228          * onClick events
229          */
230         buildPermOrgTreePicker : function(perm, domId, onClick) {
231
232             dojo.require('dojo.data.ItemFileReadStore');
233             dojo.require('dijit.Tree');
234             function buildTreePicker(r) {
235                 var orgList = r.recv().content();
236                 var store = new dojo.data.ItemFileReadStore({data:aou.toStoreData(orgList)});
237                 var model = new dijit.tree.ForestStoreModel({
238                     store: store,
239                     query: {_top:'true'},
240                     childrenAttrs: ["children"],
241                     rootLabel : "Location" /* XXX i18n */
242                 });
243     
244                 var tree = new dijit.Tree({model : model}, dojo.byId(domId));
245                 if(onClick)
246                     dojo.connect(tree, 'onClick', onClick);
247                 tree.startup()
248             }
249     
250             fieldmapper.standardRequest(
251                 ['open-ils.actor', 'open-ils.actor.user.work_perm.org_unit_list'],
252                 {   params: [this.authtoken, perm],
253                     oncomplete: buildTreePicker,
254                     async: true
255                 }
256             )
257         },
258     
259         /**
260          * Sets the store for an existing openils.widget.OrgUnitFilteringSelect 
261          * using the orgs where the user has the requested permission.
262          * @param perm The permission to check
263          * @param selector The pre-created dijit.form.FilteringSelect object.  
264          */
265         buildPermOrgSelector : function(perm, selector, selectedOrg, onload) {
266             var _u = this;
267     
268             dojo.require('dojo.data.ItemFileReadStore');
269
270             function hookupStore(store) {
271                 selector.store = store;
272                 selector.startup();
273                 if(selectedOrg != null)
274                     selector.setValue(selectedOrg);
275                 else
276                     selector.setValue(_u.user.ws_ou());
277                 if(onload) onload();
278             }
279
280             function buildTreePicker(orgList) {
281                 var store = new dojo.data.ItemFileReadStore({data:aou.toStoreData(orgList)});
282                 hookupStore(store);
283                 _u.permOrgStoreCache[perm] = store;
284             }
285     
286                 if (_u.permOrgStoreCache[perm])
287                         hookupStore(_u.permOrgStoreCache[perm]);
288                 else
289                 _u.getPermOrgList(perm, buildTreePicker);
290         },
291     });
292
293         openils.User.user = null;
294         openils.User.authtoken = null;
295         openils.User.authtime = null;
296     openils.User.authcookie = null;
297 }
298
299