openerp 7.0 升级笔记 ---HR考勤(二)
要想实现在一定条件下,点击签到图标弹出对话窗口,还是有一定的麻烦,使用一般的窗口弹出代码没有效果,经过2个晚上的研究,才通过修改js程序实现了这个目的。
在hr_attendance下有个static目录,全部copy到extension目录下,删除css和xml,只保留js,因为hr_attendance_extension类继承自hr_attendance,因此这个新的js文件将完全代替原目录下的js文件,这点和django是一样的。
修改原来的do_update_attendance函数,如下:
do_update_attendance: function () { var self = this; //jerry add start 弹出考勤说明对话框 var action = { type: 'ir.actions.act_window', res_model: 'hr.attendance.reason', view_mode: 'form', view_type: 'form', views: [[false, 'form']], target: 'new', context: {} }; var hr_attendance_extension =new instance.web.Model("hr.attendance") var self = this; hr_attendance_extension.call('get_status', [[]]).then(function (result){ //员工迟到1小时之内,或者下班前一小时之内,弹出对话框 if(result=='late' || result=='leave_early'){ instance.client.action_manager.do_action(action); } //原计划弹出对话框后,先不要将考勤情况写入,图标也不要变化,但是实现不了。 //因此改成,点击对话框的确定按钮后,更新之前的记录,加入考勤说明 //jerry add end************************************* var hr_employee = new instance.web.DataSet(self, 'hr.employee'); hr_employee.call('attendance_action_change', [ [self.employee.id] ]).done(function (result) { //签到图标更换 self.last_sign = new Date(); self.set({"signed_in": ! self.get("signed_in")}); }); }); },
由于对js一点也不熟悉,导致走了好多冤枉路,不过最终有成果,还是令人欣慰的。
这里记录一下遇到的问题,和仍有价值的弯路。
1、javescript时间计算,copy自网络,感谢原作者。
/* * 获得时间差,时间格式为 年-月-日 小时:分钟:秒 或者 年/月/日 小时:分钟:秒 * 其中,年月日为全格式,例如 : 2010-10-12 01:00:00 * 返回精度为:秒,分,小时,天 */ GetDateDiff:function(startTime, endTime, diffType) { //将xxxx-xx-xx的时间格式,转换为 xxxx/xx/xx的格式 //startTime = startTime.replace(/\-/g, "/"); //endTime = endTime.replace(/\-/g, "/"); //将计算间隔类性字符转换为小写 diffType = diffType.toLowerCase(); var sTime = new Date(startTime); //开始时间 var eTime = new Date(endTime); //结束时间 //作为除数的数字 var divNum = 1; switch (diffType) { case "second": divNum = 1000; break; case "minute": divNum = 1000 * 60; break; case "hour": divNum = 1000 * 3600; break; case "day": divNum = 1000 * 3600 * 24; break; default: break; } return parseInt((eTime.getTime() - sTime.getTime()) / parseInt(divNum)); },
一开始为了使用这个函数,计算当前时间和设定的工作时间的差,在py文件中建立了一个获取work_time的函数,并且转为datetime类型的,然后在js中调用,结果总是提示internal 500 error,耽误了不少时间,后来直接将所有的动作都在py中完成,只将status传进来,就再也没有问题了。
2、Float转datetime的函数,也许以后会用到。
def _time_to_datetime(self,time): now=datetime.datetime.now() float_time=string.atof(time) h=int(float_time) m=int((float_time-h)*60) datetime_time=datetime.datetime(year=now.year,month=now.month,day=now.day,hour=h,minute=m) return datetime_time
考勤的基本功能就是这样,接下来是数据统计,准备来尝试实现考勤的报表,另外与工资模块结合,晚点再做。