Tasks.js
[gitlive] / 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     fetchRepo: function()
93     {
94         
95         var repo = this.lastCommit.repo;
96         
97          _this = this;
98         var r = new XMLHttpRequest({
99             onreadystatechange : function() {
100                 print("Got result.");
101                 if (this.status != 4) {
102                     return;
103                 }
104                 
105                   
106                 var res = JSON.parse(this.responseText);
107                 
108                 print(JSON.stringify(res,null,4))
109                 //print([ res.success , res.data.length ]);
110                 _this.commitRepo = (res.success && res.data.length) ? res.data[0] : false;
111                 print(JSON.stringify(_this.commitRepo))
112                 _this.verifyCommit();
113             }
114             
115         });
116         var netrc  = Netrc.forHost('git.roojs.com');
117         
118         r.open('GET',
119                "http://roojs.com/admin.php/Roo/mtrack_repos?shortname=" + repo.name
120                ,true, netrc.login, netrc.password  );
121         //print("SEding request");        
122         r.send();
123         
124         
125     },
126     
127         //---------- end fetching - now verifying..
128
129     
130     
131     verifyCommit : function()
132     {
133         // using curTask + lastCommit decide what to do.
134         this.inQuery = 0;
135         //tests:::
136        
137         // check to see if current task is being planned for too long..
138         // you should only enter task, and allow it to span over an hour.
139         // if you do the whole day on a task, then it will need to verify with you every so often that you
140         // need to confirm that you are still working on it..
141         
142         /*
143           
144            Example:
145            
146             Start at 10am, marked working on it till 3pm.
147             
148             So:
149                 at 11am, the system will pop up a warning - are you still working on it?
150                 -> if yes pressed, then next warning will be at 11pm
151                 
152           
153          */
154         
155         if (!this.currTask) {
156             
157         }
158         
159         
160         
161         var now = new Date();
162         if ( this.curTask) {
163             print(JSON.stringify(this.curTask));
164             
165             var endoftask = this.curTask.action_datetime.add(Date.HOUR, this.curTask.qtyvalue);
166             print("END OF TASK: " + endoftask);
167             
168             var max_stretch = now.add(Date.HOUR, 1);
169              print("Max stretch: " + max_stretch);
170             if (endoftask > max_stretch) {
171                 this.fixEndCurrTask(); //
172                 
173             }
174             return;
175             
176         }
177         
178         
179         
180         
181
182         
183         if (!this.nextPrompt && this.curTask) {
184             //var use_start = this.curTask.action_datetime < now ? now : 
185             // if we have a task, then the next verification should be 1 hour after it started.
186             // even if we have only just seen it.. so we could already need verification.
187             this.nextPrompt = this.curTask.action_datetime; // the start time recorded in the database.
188         }
189         
190         
191         if (!this.nextPrompt || (this.nextPrompt < (new Date()))) {
192             
193             this.promptForTask();
194             return;
195             
196         }
197         
198         // ok verified basic time...
199         //let's check to see if project matches..'
200         
201         
202         
203         
204     },
205     
206     
207     
208     
209     //---------- end verifying - now prompting..
210     
211     
212     fixEndCurrTask: function()
213     {
214         // set the end time of the current task to be now + 1 hours at most...
215         var now = new Date();
216         var eot = now.add(Date.HOUR, 1);
217         // now round it down to nearest 15 minutes..
218         var min = Math.round((eot.format('i')*1) / 15) * 15;
219         var reot = Date.parseDate(eot.format('Y-m-d H:') + (min ? min : '00') + ':00', 'Y-m-d H:i:s');
220         
221         print("REAL END TIME" + reot.format('Y-m-d H:i:s'))
222         print("Current start time" + this.curTask.action_datetime.format('Y-m-d H:i:s'))
223         
224         // how long between start and reot...
225         var hours = (reot - this.curTask.action_datetime) / (60*60 * 1000 );
226         var rounded =  Math.round(hours * 4) / 4.0;
227         print("Rounded : "  + rounded);
228         //return;
229         this.updateTask({ qtyvalue : rounded });
230         this.curTask.qtyvalue = rounded;
231         
232     },
233     
234     promptForTask : function()
235     {
236         /// fixme...
237         this.nextPrompt = (new Date()).add(Date.MINUTE, 60);
238         
239         
240     },
241     
242     updateTask: function(setv)
243     {
244         var args = {};
245         XObject.extend(args,setv);
246         args.id = _this.curTask.id;
247         
248         
249         //print(JSON.stringify(args));
250         //return;
251     
252     
253          _this = this;
254          // do the request to get the task..
255         var r = new XMLHttpRequest({
256             onreadystatechange : function() {
257                 print("Got result.");
258                 if (this.status != 4) {
259                     return;
260                 }
261                 
262                  print( this.responseText)
263                  
264                 var res = JSON.parse(this.responseText);
265                 
266                 print(JSON.stringify(res,null,4))
267                 //print([ res.success , res.data.length ]);
268             }
269             
270         });
271         var netrc  = Netrc.forHost('git.roojs.com');
272         
273         r.open('POST',
274                "http://roojs.com/admin.php/Roo/cash_invoice_entry?_current_task=1"
275                ,true, netrc.login, netrc.password  );
276         //print("SEding request");        
277         r.send(args);
278         
279         
280         
281         
282     }
283     
284 };
285
286
287
288
289
290 Task = XObject.define(
291     function(cfg) {
292         // cal parent?
293         if (typeof(cfg) != 'object') {
294             print("CFG not oboject?");
295             return;
296         } 
297         XObject.extend(this,cfg);
298  
299         // fix up the values.
300         this.action_datetime = Date.parseDate(this.action_dt,'Y-m-d H:i:s');
301       // print("ACT DT: " + this.action_dt);
302         
303     },
304     Object,
305     {
306         /**
307          * This is similar to the cash_invoice_entry data..
308          * 
309          */
310         action_dt: '', //"2012-11-23 11:00:00"
311         description: '', //"QA on new site"
312         qtyvalue: 0, //"2.25"
313         
314         hasExpired : function()
315         {
316             
317             var exp = this.action_datetime.add(Date.HOUR, this.qtyvalue);
318             return (new Date()) > exp;  
319             
320         }
321     }
322 );
323
324
325
326
327
328
329
330
331
332
333 //-------------- testing
334 Gtk = imports.gi.Gtk;
335 Gtk.init(Seed.argv);
336 Tasks.notify( { repo : imports.Scm.Repo.Repo.get('gitlive') } );
337 Gtk.main();