Fix #5560 - Gitlive - branching wip
[gitlive] / old_seed_version / Tasks.js
1
2 XObject = imports.XObject.XObject;
3 XMLHttpRequest = imports.XMLHttpRequest.XMLHttpRequest;
4 Netrc = imports.Netrc.Netrc;
5 Date = imports.Date.Date;
6 /**
7  *
8  * Tasks
9  *
10  *  Flow
11  *
12  *    Commit
13  *      => Tasks.notify(commit)
14  *
15  *
16  *
17  *
18  */
19
20 Tasks = {
21     
22     curTask : false,
23     commitRepo : false, // the DB version of repo info..
24     lastCommit : false,
25     
26     nextPrompt : false, // time when the system last prompted a confirmation that a task is being worked on.
27     
28     
29     notifyIdle : function()
30     {
31         
32     },
33     
34     notify : function(commit)
35     {
36         if (this.inQuery && this.inQuery > (new Date())) {
37             // ignore the notification.. we are currently checking what the current
38             // status is.
39             
40             // we need to handle a WTF situation where something below failed... so
41             
42             return; 
43         }
44         this.inQuery = (new Date()).add(Date.MINUTE, 5);
45         this.lastCommit = commit;
46         this.commitRepo = false;
47         this.curTask = false;
48         this.fetchTask();
49     },
50     
51     
52     
53     fetchTask: function()
54     {
55         // have we got the status in the last 15 mins..
56         // we should not need to get it again... - it's probably not changed.
57         if (this.curTask && !this.curTask.hasExpired()) {
58             this.fetchRepo();
59         }
60         _this = this;
61         // do the request to get the task..
62         var r = new XMLHttpRequest({
63             onreadystatechange : function() {
64                 print("Got result.");
65                 if (this.status != 4) {
66                     return;
67                 }
68                 
69                   
70                 var res = JSON.parse(this.responseText);
71                 
72                 //print(JSON.stringify(res,null,4))
73                 //print([ res.success , res.data.length ]);
74                 _this.curTask = (res.success && res.data.length) ? (new Task(res.data[0])) : false;
75                 
76                 print("Current task:" + JSON.stringify(_this.curTask,null,4));
77                 _this.fetchRepo();
78             }
79             
80         });
81         var netrc  = Netrc.forHost('git.roojs.com');
82         
83         r.open('GET',
84                "http://roojs.com/admin.php/Roo/cash_invoice_entry?_current_task=1"
85                ,true, netrc.login, netrc.password  );
86          print("Getting current task: "  +  "http://roojs.com/admin.php/Roo/cash_invoice_entry?_current_task=1");        
87         r.send();
88         
89     },
90     
91     
92    
93     list: function(repo, callback)
94     {
95         // have we got the status in the last 15 mins..
96         // we should not need to get it again... - it's probably not changed.
97          
98          
99         this.query({repo_shortname : repo.name }, callback);
100     },
101                 
102          
103     query : function(params , callback)
104     {
105          
106         _this = this;
107         // do the request to get the task..
108         var r = new XMLHttpRequest({
109             onreadystatechange : function() {
110                 print("Got result.");
111                 if (this.status != 4) {
112                     return;
113                 }
114                 
115                   
116                 var res = JSON.parse(this.responseText);
117                 
118                 //print(JSON.stringify(res,null,4))
119                 //print([ res.success , res.data.length ]);
120                 if (!res.success || !res.data.length)  {
121                     print("NO tasks returned");
122                     callback([]);
123                     return;
124                 }
125                 
126                 //print("Current task:" + JSON.stringify(_this.curTask,null,4));
127                 callback(res.data);
128             }
129             
130         });
131         var netrc  = Netrc.forHost('git.roojs.com');
132         
133           
134         
135         r.open('GET',
136                "http://roojs.com/admin.php/Roo/mtrack_ticket?" + r.urlEncode(params)
137                ,true, netrc.login, netrc.password  );
138          print("Getting current task: "  +
139                
140                "http://roojs.com/admin.php/Roo/mtrack_ticket?" + r.urlEncode(params));        
141         r.send();
142         
143     },
144     
145     
146     
147     
148     fetchRepo: function()
149     {
150         
151         var repo = this.lastCommit.repo;
152         
153          _this = this;
154         var r = new XMLHttpRequest({
155             onreadystatechange : function() {
156                 print("Got result.");
157                 if (this.status != 4) {
158                     return;
159                 }
160                 
161                   
162                 var res = JSON.parse(this.responseText);
163                 
164                 print(JSON.stringify(res,null,4))
165                 //print([ res.success , res.data.length ]);
166                 _this.commitRepo = (res.success && res.data.length) ? res.data[0] : false;
167                 print(JSON.stringify(_this.commitRepo))
168                 _this.verifyCommit();
169             }
170             
171         });
172         var netrc  = Netrc.forHost('git.roojs.com');
173         
174         r.open('GET',
175                "http://roojs.com/admin.php/Roo/mtrack_repos?shortname=" + repo.name
176                ,true, netrc.login, netrc.password  );
177         //print("SEding request");        
178         r.send();
179         
180         
181     },
182     
183         //---------- end fetching - now verifying..
184
185     
186     
187     verifyCommit : function()
188     {
189         // using curTask + lastCommit decide what to do.
190         this.inQuery = 0;
191         //tests:::
192        
193         // check to see if current task is being planned for too long..
194         // you should only enter task, and allow it to span over an hour.
195         // if you do the whole day on a task, then it will need to verify with you every so often that you
196         // need to confirm that you are still working on it..
197         
198         /*
199           
200            Example:
201            
202             Start at 10am, marked working on it till 3pm.
203             
204             So:
205                 at 11am, the system will pop up a warning - are you still working on it?
206                 -> if yes pressed, then next warning will be at 11pm
207                 
208           
209          */
210         
211         if (!this.currTask) {
212              this.promptForTask();
213             return;
214         }
215         
216          if (!this.currTask.project_id) {
217             this.promptForTask();
218             return;
219         }
220         
221         // are we working on the same project!!!!
222         if (this.currTask.project_id != this.commitRepo.project_id) {
223             this.promptForTask();
224             return;
225         }
226   
227         // has the ticket been closed...
228         
229         var is_project=  this.curTask.project_id_code[0] != '*' ;
230         // is there a ticket?
231         if (is_project && !this.currTask.ticket_id) {
232             this.promptForTask();
233             return;
234         }
235         if (is_project && this.currTask.ticket_status) {
236             //TODO - if status is closed.. then we need to prompt..
237             
238             
239         }
240         
241         
242         // we now working on same project..
243         
244         
245         var now = new Date();
246         
247         print(JSON.stringify(this.curTask));
248         
249         var endoftask = this.curTask.action_datetime.add(Date.HOUR, this.curTask.qtyvalue);
250         print("END OF TASK: " + endoftask);
251         
252         var max_stretch = now.add(Date.HOUR, 1);
253          print("Max stretch: " + max_stretch);
254         if (endoftask > max_stretch) {
255             this.fixEndCurrTask(); //
256             
257         }
258         // still needs to be verified..
259        
260         
261         
262         
263
264         
265         if (!this.nextPrompt && this.curTask) {
266             //var use_start = this.curTask.action_datetime < now ? now : 
267             // if we have a task, then the next verification should be 1 hour after it started.
268             // even if we have only just seen it.. so we could already need verification.
269             this.nextPrompt = this.curTask.action_datetime; // the start time recorded in the database.
270         }
271         
272         
273         if (!this.nextPrompt || (this.nextPrompt < (new Date()))) {
274             
275             this.promptForTask();
276             return;
277             
278         }
279         
280         // ok verified basic time...
281         //let's check to see if project matches..'
282         
283         
284         
285         
286     },
287     
288     
289     
290     
291     //---------- end verifying - now prompting..
292     
293     
294     fixEndCurrTask: function()
295     {
296         // set the end time of the current task to be now + 1 hours at most...
297         var now = new Date();
298         var eot = now.add(Date.HOUR, 1);
299         // now round it down to nearest 15 minutes..
300         var min = Math.round((eot.format('i')*1) / 15) * 15;
301         var reot = Date.parseDate(eot.format('Y-m-d H:') + (min ? min : '00') + ':00', 'Y-m-d H:i:s');
302         
303         print("REAL END TIME" + reot.format('Y-m-d H:i:s'))
304         print("Current start time" + this.curTask.action_datetime.format('Y-m-d H:i:s'))
305         
306         // how long between start and reot...
307         var hours = (reot - this.curTask.action_datetime) / (60*60 * 1000 );
308         var rounded =  Math.round(hours * 4) / 4.0;
309         print("Rounded : "  + rounded);
310         //return;
311         this.updateTask({ qtyvalue : rounded });
312         this.curTask.qtyvalue = rounded;
313         
314     },
315     
316     promptForTask : function()
317     {
318         /// fixme...
319         this.nextPrompt = (new Date()).add(Date.MINUTE, 60);
320         
321         
322     },
323     
324     updateTask: function(setv)
325     {
326         var args = {};
327         XObject.extend(args,setv);
328         args.id = _this.curTask.id;
329         
330         
331         //print(JSON.stringify(args));
332         //return;
333     
334     
335          _this = this;
336          // do the request to get the task..
337         var r = new XMLHttpRequest({
338             onreadystatechange : function() {
339                 print("Got result.");
340                 if (this.status != 4) {
341                     return;
342                 }
343                 
344                  print( this.responseText)
345                  
346                 var res = JSON.parse(this.responseText);
347                 
348                 print(JSON.stringify(res,null,4))
349                 //print([ res.success , res.data.length ]);
350             }
351             
352         });
353         var netrc  = Netrc.forHost('git.roojs.com');
354         
355         r.open('POST',
356                "http://roojs.com/admin.php/Roo/cash_invoice_entry?_current_task=1"
357                ,true, netrc.login, netrc.password  );
358         //print("SEding request");        
359         r.send(args);
360         
361         
362         
363         
364     }
365     
366 };
367
368
369
370
371
372 Task = XObject.define(
373     function(cfg) {
374         // cal parent?
375         if (typeof(cfg) != 'object') {
376             print("CFG not oboject?");
377             return;
378         } 
379         XObject.extend(this,cfg);
380  
381         // fix up the values.
382         this.action_datetime = Date.parseDate(this.action_dt,'Y-m-d H:i:s');
383       // print("ACT DT: " + this.action_dt);
384         
385     },
386     Object,
387     {
388         /**
389          * This is similar to the cash_invoice_entry data..
390          * 
391          */
392         action_dt: '', //"2012-11-23 11:00:00"
393         description: '', //"QA on new site"
394         qtyvalue: 0, //"2.25"
395         
396         hasExpired : function()
397         {
398             
399             var exp = this.action_datetime.add(Date.HOUR, this.qtyvalue);
400             return (new Date()) > exp;  
401             
402         }
403     }
404 );
405
406
407
408
409
410
411
412
413
414
415 //-------------- testing
416 /*
417 Gtk = imports.gi.Gtk;
418 Gtk.init(Seed.argv);
419 Tasks.notify( { repo : imports.Scm.Repo.Repo.get('gitlive') } );
420 Gtk.main();
421 */