X-Git-Url: http://git.inspyration.org/?a=blobdiff_plain;f=addons%2Fhr_timesheet_sheet%2Fhr_timesheet_sheet.py;h=1f948a557201fc7d0c0836423dee7a91ce03f8c9;hb=3e62ee3fa621893ff961a765cebfde4540f06b58;hp=5ace7f64ebd28a6bd8f56f9aadc3d549c4bb9879;hpb=38dd957438daddec06d314024009860ff5cfa9ed;p=odoo%2Fodoo.git diff --git a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py index 5ace7f6..1f948a5 100644 --- a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py +++ b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py @@ -20,55 +20,71 @@ ############################################################################## import time -from osv import fields -from osv import osv -import netsvc +from datetime import datetime +from dateutil.relativedelta import relativedelta, MO -from mx import DateTime +from osv import fields, osv from tools.translate import _ +import netsvc class one2many_mod2(fields.one2many): - def get(self, cr, obj, ids, name, user=None, offset=0, context={}, values={}): - res = {} - for id in ids: - res[id] = [] - - res5 = obj.read(cr, user, ids, ['date_current', 'user_id'], context=context) - res6 = {} - for r in res5: - res6[r['id']] = (r['date_current'], r['user_id'][0]) + def get(self, cr, obj, ids, name, user=None, offset=0, context=None, values=None): + if context is None: + context = {} - ids2 = [] - for id in ids: - dom = [] + if values is None: + values = {} + + # dict: + # {idn: (date_current, user_id), ... + # 1: ('2010-08-15', 1)} + res6 = dict([(rec['id'], (rec['date_current'], rec['user_id'][0])) + for rec + in obj.read(cr, user, ids, ['date_current', 'user_id'], context=context)]) + + # eg: ['|', '|', + # '&', '&', ('name', '>=', '2011-03-01'), ('name', '<=', '2011-03-01'), ('employee_id.user_id', '=', 1), + # '&', '&', ('name', '>=', '2011-02-01'), ('name', '<=', '2011-02-01'), ('employee_id.user_id', '=', 1)] + dom = [] + for c, id in enumerate(ids): if id in res6: - dom = [('name', '>=', res6[id][0] + ' 00:00:00'), - ('name', '<=', res6[id][0] + ' 23:59:59'), - ('employee_id.user_id', '=', res6[id][1])] - ids2.extend(obj.pool.get(self._obj).search(cr, user, - dom, limit=self._limit)) + if c: # skip first + dom.insert(0 ,'|') + dom.append('&') + dom.append('&') + dom.append(('name', '>=', res6[id][0])) + dom.append(('name', '<=', res6[id][0])) + dom.append(('employee_id.user_id', '=', res6[id][1])) - for r in obj.pool.get(self._obj)._read_flat(cr, user, ids2, - [self._fields_id], context=context, load='_classic_write'): + ids2 = obj.pool.get(self._obj).search(cr, user, dom, limit=self._limit) + + res = {} + for i in ids: + res[i] = [] + + for r in obj.pool.get(self._obj)._read_flat(cr, user, ids2, [self._fields_id], context=context, load='_classic_write'): if r[self._fields_id]: - res.setdefault(r[self._fields_id][0], []).append(r['id']) + res[r[self._fields_id][0]].append(r['id']) return res def set(self, cr, obj, id, field, values, user=None, context=None): if context is None: context = {} + context = context.copy() context['sheet_id'] = id - return super(one2many_mod2, self).set(cr, obj, id, field, values, user=user, - context=context) + return super(one2many_mod2, self).set(cr, obj, id, field, values, user=user, context=context) class one2many_mod(fields.one2many): - def get(self, cr, obj, ids, name, user=None, offset=0, context={}, values={}): - res = {} - for id in ids: - res[id] = [] + def get(self, cr, obj, ids, name, user=None, offset=0, context=None, values=None): + if context is None: + context = {} + + if values is None: + values = {} + res5 = obj.read(cr, user, ids, ['date_current', 'user_id'], context=context) res6 = {} @@ -82,11 +98,13 @@ class one2many_mod(fields.one2many): dom = [('date', '=', res6[id][0]), ('user_id', '=', res6[id][1])] ids2.extend(obj.pool.get(self._obj).search(cr, user, dom, limit=self._limit)) - + res = {} + for i in ids: + res[i] = [] for r in obj.pool.get(self._obj)._read_flat(cr, user, ids2, [self._fields_id], context=context, load='_classic_write'): if r[self._fields_id]: - res.setdefault(r[self._fields_id][0], []).append(r['id']) + res[r[self._fields_id][0]].append(r['id']) return res @@ -94,15 +112,16 @@ class hr_timesheet_sheet(osv.osv): _name = "hr_timesheet_sheet.sheet" _table = 'hr_timesheet_sheet_sheet' _order = "id desc" + _description="Timesheet" - def _total_day(self, cr, uid, ids, name, args, context): + def _total_day(self, cr, uid, ids, name, args, context=None): res = {} cr.execute('SELECT sheet.id, day.total_attendance, day.total_timesheet, day.total_difference\ FROM hr_timesheet_sheet_sheet AS sheet \ LEFT JOIN hr_timesheet_sheet_sheet_day AS day \ ON (sheet.id = day.sheet_id \ AND day.name = sheet.date_current) \ - WHERE sheet.id =ANY(%s)',(ids,)) + WHERE sheet.id IN %s',(tuple(ids),)) for record in cr.fetchall(): res[record[0]] = {} res[record[0]]['total_attendance_day'] = record[1] @@ -112,13 +131,11 @@ class hr_timesheet_sheet(osv.osv): def _total(self, cr, uid, ids, name, args, context=None): res = {} - if context is None: - context = {} cr.execute('SELECT s.id, COALESCE(SUM(d.total_attendance),0), COALESCE(SUM(d.total_timesheet),0), COALESCE(SUM(d.total_difference),0) \ FROM hr_timesheet_sheet_sheet s \ LEFT JOIN hr_timesheet_sheet_sheet_day d \ ON (s.id = d.sheet_id) \ - WHERE s.id =ANY(%s) GROUP BY s.id',(ids,)) + WHERE s.id IN %s GROUP BY s.id',(tuple(ids),)) for record in cr.fetchall(): res[record[0]] = {} res[record[0]]['total_attendance'] = record[1] @@ -131,13 +148,11 @@ class hr_timesheet_sheet(osv.osv): result = {} link_emp = {} emp_ids = [] - if context is None: - context = {} for sheet in self.browse(cr, uid, ids, context=context): result[sheet.id] = 'none' emp_ids2 = emp_obj.search(cr, uid, - [('user_id', '=', sheet.user_id.id)]) + [('user_id', '=', sheet.user_id.id)], context=context) if emp_ids2: link_emp[emp_ids2[0]] = sheet.id emp_ids.append(emp_ids2[0]) @@ -147,13 +162,35 @@ class hr_timesheet_sheet(osv.osv): result[sheet_id] = emp.state return result + def check_employee_attendance_state(self, cr, uid, sheet_id, context=None): + ids_signin = self.pool.get('hr.attendance').search(cr,uid,[('sheet_id', '=', sheet_id),('action','=','sign_in')]) + ids_signout = self.pool.get('hr.attendance').search(cr,uid,[('sheet_id', '=', sheet_id),('action','=','sign_out')]) + + if len(ids_signin) != len(ids_signout): + raise osv.except_osv(('Warning !'),_('The timesheet cannot be validated as it does not contain equal no. of sign ins and sign outs!')) + return True + def copy(self, cr, uid, ids, *args, **argv): - raise osv.except_osv(_('Error !'), _('You can not duplicate a timesheet !')) + raise osv.except_osv(_('Error !'), _('You cannot duplicate a timesheet !')) + + def create(self, cr, uid, vals, *args, **argv): + if 'employee_id' in vals: + if not self.pool.get('hr.employee').browse(cr, uid, vals['employee_id']).user_id: + raise osv.except_osv(_('Error !'), _('You cannot create a timesheet for an employee that does not have any user defined !')) + return super(hr_timesheet_sheet, self).create(cr, uid, vals, *args, **argv) + + def write(self, cr, uid, ids, vals, *args, **argv): + if 'employee_id' in vals: + new_user_id = self.pool.get('hr.employee').browse(cr, uid, vals['employee_id']).user_id.id or False + if not new_user_id: + raise osv.except_osv(_('Error !'), _('You cannot create a timesheet for an employee that does not have any user defined !')) + if not self._sheet_date(cr, uid, ids, forced_user_id=new_user_id): + raise osv.except_osv(_('Error !'), _('You can not have 2 timesheets that overlaps !\nPlease use the menu \'My Current Timesheet\' to avoid this problem.')) + return super(hr_timesheet_sheet, self).write(cr, uid, ids, vals, *args, **argv) def button_confirm(self, cr, uid, ids, context=None): - if context is None: - context = {} for sheet in self.browse(cr, uid, ids, context=context): + self.check_employee_attendance_state(cr, uid, sheet.id, context) di = sheet.user_id.company_id.timesheet_max_difference if (abs(sheet.total_difference) < di) or not di: wf_service = netsvc.LocalService("workflow") @@ -163,88 +200,76 @@ class hr_timesheet_sheet(osv.osv): return True def date_today(self, cr, uid, ids, context=None): - if context is None: - context = {} for sheet in self.browse(cr, uid, ids, context=context): - if DateTime.now() <= DateTime.strptime(sheet.date_from, '%Y-%m-%d'): - self.write(cr, uid, [sheet.id], {'date_current': sheet.date_from,}) - elif DateTime.now() >= DateTime.strptime(sheet.date_to, '%Y-%m-%d'): - self.write(cr, uid, [sheet.id], {'date_current': sheet.date_to,}) + if datetime.today() <= datetime.strptime(sheet.date_from, '%Y-%m-%d'): + self.write(cr, uid, [sheet.id], {'date_current': sheet.date_from,}, context=context) + elif datetime.now() >= datetime.strptime(sheet.date_to, '%Y-%m-%d'): + self.write(cr, uid, [sheet.id], {'date_current': sheet.date_to,}, context=context) else: - self.write(cr, uid, [sheet.id], {'date_current': time.strftime('%Y-%m-%d')}) + self.write(cr, uid, [sheet.id], {'date_current': time.strftime('%Y-%m-%d')}, context=context) return True def date_previous(self, cr, uid, ids, context=None): - if context is None: - context = {} for sheet in self.browse(cr, uid, ids, context=context): - if DateTime.strptime(sheet.date_current, '%Y-%m-%d') <= DateTime.strptime(sheet.date_from, '%Y-%m-%d'): - self.write(cr, uid, [sheet.id], {'date_current': sheet.date_from,}) + if datetime.strptime(sheet.date_current, '%Y-%m-%d') <= datetime.strptime(sheet.date_from, '%Y-%m-%d'): + self.write(cr, uid, [sheet.id], {'date_current': sheet.date_from,}, context=context) else: self.write(cr, uid, [sheet.id], { - 'date_current': (DateTime.strptime(sheet.date_current, '%Y-%m-%d') + DateTime.RelativeDateTime(days=-1)).strftime('%Y-%m-%d'), - }) + 'date_current': (datetime.strptime(sheet.date_current, '%Y-%m-%d') + relativedelta(days=-1)).strftime('%Y-%m-%d'), + }, context=context) return True def date_next(self, cr, uid, ids, context=None): - if context is None: - context = {} for sheet in self.browse(cr, uid, ids, context=context): - if DateTime.strptime(sheet.date_current, '%Y-%m-%d') >= DateTime.strptime(sheet.date_to, '%Y-%m-%d'): - self.write(cr, uid, [sheet.id], {'date_current': sheet.date_to,}) + if datetime.strptime(sheet.date_current, '%Y-%m-%d') >= datetime.strptime(sheet.date_to, '%Y-%m-%d'): + self.write(cr, uid, [sheet.id], {'date_current': sheet.date_to,}, context=context) else: self.write(cr, uid, [sheet.id], { - 'date_current': (DateTime.strptime(sheet.date_current, '%Y-%m-%d') + DateTime.RelativeDateTime(days=1)).strftime('%Y-%m-%d'), - }) + 'date_current': (datetime.strptime(sheet.date_current, '%Y-%m-%d') + relativedelta(days=1)).strftime('%Y-%m-%d'), + }, context=context) return True def button_dummy(self, cr, uid, ids, context=None): - if context is None: - context = {} for sheet in self.browse(cr, uid, ids, context=context): - if DateTime.strptime(sheet.date_current, '%Y-%m-%d') <= DateTime.strptime(sheet.date_from, '%Y-%m-%d'): - self.write(cr, uid, [sheet.id], {'date_current': sheet.date_from,}) - elif DateTime.strptime(sheet.date_current, '%Y-%m-%d') >= DateTime.strptime(sheet.date_to, '%Y-%m-%d'): - self.write(cr, uid, [sheet.id], {'date_current': sheet.date_to,}) + if datetime.strptime(sheet.date_current, '%Y-%m-%d') <= datetime.strptime(sheet.date_from, '%Y-%m-%d'): + self.write(cr, uid, [sheet.id], {'date_current': sheet.date_from,}, context=context) + elif datetime.strptime(sheet.date_current, '%Y-%m-%d') >= datetime.strptime(sheet.date_to, '%Y-%m-%d'): + self.write(cr, uid, [sheet.id], {'date_current': sheet.date_to,}, context=context) return True - def sign_in(self, cr, uid, ids, context=None): + def sign(self, cr, uid, ids, typ, context=None): emp_obj = self.pool.get('hr.employee') + sheet = self.browse(cr, uid, ids, context=context)[0] if context is None: context = {} - if not self.browse(cr, uid, ids, context)[0].date_current == time.strftime('%Y-%m-%d'): + if not sheet.date_current == time.strftime('%Y-%m-%d'): raise osv.except_osv(_('Error !'), _('You can not sign in from an other date than today')) - emp_id = emp_obj.search(cr, uid, [('user_id', '=', uid)]) + emp_id = sheet.employee_id.id context['sheet_id']=ids[0] - success = emp_obj.attendance_action_change(cr, uid, emp_id, type='sign_in', context=context,) + emp_obj.attendance_action_change(cr, uid, [emp_id], type=typ, context=context,) return True + def sign_in(self, cr, uid, ids, context=None): + return self.sign(cr,uid,ids,'sign_in',context=None) + def sign_out(self, cr, uid, ids, context=None): - emp_obj = self.pool.get('hr.employee') - if context is None: - context = {} - if not self.browse(cr, uid, ids, context)[0].date_current == time.strftime('%Y-%m-%d'): - raise osv.except_osv(_('Error !'), _('You can not sign out from an other date than today')) - emp_id = emp_obj.search(cr, uid, [('user_id', '=', uid)]) - context['sheet_id']=ids[0] - success = emp_obj.attendance_action_change(cr, uid, emp_id, type='sign_out', context=context,) - return True + return self.sign(cr,uid,ids,'sign_out',context=None) _columns = { 'name': fields.char('Description', size=64, select=1, states={'confirm':[('readonly', True)], 'done':[('readonly', True)]}), - 'user_id': fields.many2one('res.users', 'User', required=True, select=1, - states={'confirm':[('readonly', True)], 'done':[('readonly', True)]}), + 'employee_id': fields.many2one('hr.employee', 'Employee', required=True), + 'user_id': fields.related('employee_id', 'user_id', type="many2one", relation="res.users", store=True, string="User", required=False, readonly=True),#fields.many2one('res.users', 'User', required=True, select=1, states={'confirm':[('readonly', True)], 'done':[('readonly', True)]}), 'date_from': fields.date('Date from', required=True, select=1, readonly=True, states={'new':[('readonly', False)]}), 'date_to': fields.date('Date to', required=True, select=1, readonly=True, states={'new':[('readonly', False)]}), - 'date_current': fields.date('Current date', required=True), + 'date_current': fields.date('Current date', required=True, select=1), 'timesheet_ids' : one2many_mod('hr.analytic.timesheet', 'sheet_id', 'Timesheet lines', domain=[('date', '=', time.strftime('%Y-%m-%d'))], readonly=True, states={ 'draft': [('readonly', False)], 'new': [('readonly', False)]} ), - 'attendances_ids' : one2many_mod2('hr.attendance', 'sheet_id', 'Attendances', readonly=True, states={'draft':[('readonly',False)],'new':[('readonly',False)]}), + 'attendances_ids' : one2many_mod2('hr.attendance', 'sheet_id', 'Attendances', readonly=True,), 'state' : fields.selection([ ('new', 'New'), ('draft','Draft'), @@ -266,51 +291,56 @@ class hr_timesheet_sheet(osv.osv): 'department_id':fields.many2one('hr.department','Department'), } - def _default_date_from(self,cr, uid, context={}): + def _default_date_from(self,cr, uid, context=None): user = self.pool.get('res.users').browse(cr, uid, uid, context=context) r = user.company_id and user.company_id.timesheet_range or 'month' if r=='month': return time.strftime('%Y-%m-01') elif r=='week': - return (DateTime.now() + DateTime.RelativeDateTime(weekday=(DateTime.Monday,0))).strftime('%Y-%m-%d') + return (datetime.today() + relativedelta(weekday=MO(-1))).strftime('%Y-%m-%d') elif r=='year': return time.strftime('%Y-01-01') return time.strftime('%Y-%m-%d') - def _default_date_to(self,cr, uid, context={}): + def _default_date_to(self,cr, uid, context=None): user = self.pool.get('res.users').browse(cr, uid, uid, context=context) r = user.company_id and user.company_id.timesheet_range or 'month' if r=='month': - return (DateTime.now() + DateTime.RelativeDateTime(months=+1,day=1,days=-1)).strftime('%Y-%m-%d') + return (datetime.today() + relativedelta(months=+1,day=1,days=-1)).strftime('%Y-%m-%d') elif r=='week': - return (DateTime.now() + DateTime.RelativeDateTime(weekday=(DateTime.Sunday,0))).strftime('%Y-%m-%d') + return (datetime.today() + relativedelta(weekday=6)).strftime('%Y-%m-%d') elif r=='year': return time.strftime('%Y-12-31') return time.strftime('%Y-%m-%d') + def _default_employee(self,cr, uid, context=None): + emp_ids = self.pool.get('hr.employee').search(cr, uid, [('user_id','=',uid)], context=context) + return emp_ids and emp_ids[0] or False + _defaults = { - 'user_id': lambda self,cr,uid,c: uid, 'date_from' : _default_date_from, 'date_current' : lambda *a: time.strftime('%Y-%m-%d'), 'date_to' : _default_date_to, 'state': 'new', - 'company_id': lambda self, cr, uid, c: self.pool.get('res.company')._company_default_get(cr, uid, 'hr_timesheet_sheet.sheet', context=c) + 'employee_id': _default_employee, + 'company_id': lambda self, cr, uid, c: self.pool.get('res.company')._company_default_get(cr, uid, 'hr_timesheet_sheet.sheet', context=c) } - def _sheet_date(self, cr, uid, ids): - for sheet in self.browse(cr, uid, ids): - cr.execute('SELECT id \ + def _sheet_date(self, cr, uid, ids, forced_user_id=False, context=None): + for sheet in self.browse(cr, uid, ids, context=context): + new_user_id = forced_user_id or sheet.user_id and sheet.user_id.id + if new_user_id: + cr.execute('SELECT id \ FROM hr_timesheet_sheet_sheet \ WHERE (date_from < %s and %s < date_to) \ AND user_id=%s \ - AND id <> %s', (sheet.date_to, sheet.date_from, - sheet.user_id.id, sheet.id)) - if cr.fetchall(): - return False + AND id <> %s',(sheet.date_to, sheet.date_from, new_user_id, sheet.id)) + if cr.fetchall(): + return False return True - def _date_current_check(self, cr, uid, ids): - for sheet in self.browse(cr, uid, ids): + def _date_current_check(self, cr, uid, ids, context=None): + for sheet in self.browse(cr, uid, ids, context=context): if sheet.date_current < sheet.date_from or sheet.date_current > sheet.date_to: return False return True @@ -328,17 +358,15 @@ class hr_timesheet_sheet(osv.osv): wf_service.trg_create(uid, self._name, id, cr) return True - def name_get(self, cr, uid, ids, context={}): + def name_get(self, cr, uid, ids, context=None): if not len(ids): return [] return [(r['id'], r['date_from'] + ' - ' + r['date_to']) \ for r in self.read(cr, uid, ids, ['date_from', 'date_to'], - context, load='_classic_write')] + context=context, load='_classic_write')] def unlink(self, cr, uid, ids, context=None): - if context is None: - context = {} - sheets = self.read(cr, uid, ids, ['state','total_attendance']) + sheets = self.read(cr, uid, ids, ['state','total_attendance'], context=context) for sheet in sheets: if sheet['state'] in ('confirm', 'done'): raise osv.except_osv(_('Invalid action !'), _('Cannot delete Sheet(s) which are already confirmed !')) @@ -352,14 +380,15 @@ hr_timesheet_sheet() class hr_timesheet_line(osv.osv): _inherit = "hr.analytic.timesheet" - def _get_default_date(self, cr, uid, context={}): + def _get_default_date(self, cr, uid, context=None): + if context is None: + context = {} if 'date' in context: return context['date'] return time.strftime('%Y-%m-%d') - def _sheet(self, cursor, user, ids, name, args, context): + def _sheet(self, cursor, user, ids, name, args, context=None): sheet_obj = self.pool.get('hr_timesheet_sheet.sheet') - cursor.execute('SELECT l.id, COALESCE(MAX(s.id), 0) \ FROM hr_timesheet_sheet_sheet s \ LEFT JOIN (hr_analytic_timesheet l \ @@ -368,7 +397,7 @@ class hr_timesheet_line(osv.osv): ON (s.date_to >= al.date \ AND s.date_from <= al.date \ AND s.user_id = al.user_id) \ - WHERE l.id =ANY(%s) GROUP BY l.id',(ids,)) + WHERE l.id IN %s GROUP BY l.id',(tuple(ids),)) res = dict(cursor.fetchall()) sheet_names = {} for sheet_id, name in sheet_obj.name_get(cursor, user, res.values(), @@ -393,7 +422,7 @@ class hr_timesheet_line(osv.osv): fargs = args[i][0].split('.', 1) if len(fargs) > 1: args[i] = (fargs[0], 'in', sheet_obj.search(cursor, user, - [(fargs[1], args[i][1], args[i][2])])) + [(fargs[1], args[i][1], args[i][2])], context=context)) i += 1 continue if isinstance(args[i][2], basestring): @@ -470,12 +499,14 @@ hr_timesheet_line() class hr_attendance(osv.osv): _inherit = "hr.attendance" - def _get_default_date(self, cr, uid, context={}): + def _get_default_date(self, cr, uid, context=None): + if context is None: + context = {} if 'name' in context: return context['name'] + time.strftime(' %H:%M:%S') return time.strftime('%Y-%m-%d %H:%M:%S') - def _sheet(self, cursor, user, ids, name, args, context): + def _sheet(self, cursor, user, ids, name, args, context=None): sheet_obj = self.pool.get('hr_timesheet_sheet.sheet') cursor.execute("SELECT a.id, COALESCE(MAX(s.id), 0) \ FROM hr_timesheet_sheet_sheet s \ @@ -487,7 +518,7 @@ class hr_attendance(osv.osv): ON (s.date_to >= date_trunc('day',a.name) \ AND s.date_from <= a.name \ AND s.user_id = r.user_id) \ - WHERE a.id =ANY(%s) GROUP BY a.id",(ids,)) + WHERE a.id IN %s GROUP BY a.id",(tuple(ids),)) res = dict(cursor.fetchall()) sheet_names = {} for sheet_id, name in sheet_obj.name_get(cursor, user, res.values(), @@ -504,14 +535,14 @@ class hr_attendance(osv.osv): def _sheet_search(self, cursor, user, obj, name, args, context=None): if not len(args): return [] - sheet_obj = self.pool.get('hr_timesheet_sheet.sheet') + sheet_obj = self.pool.get('hr_timesheet_sheet.sheet') i = 0 while i < len(args): fargs = args[i][0].split('.', 1) if len(fargs) > 1: args[i] = (fargs[0], 'in', sheet_obj.search(cursor, user, - [(fargs[1], args[i][1], args[i][2])])) + [(fargs[1], args[i][1], args[i][2])], context=context)) i += 1 continue if isinstance(args[i][2], basestring): @@ -564,9 +595,11 @@ class hr_attendance(osv.osv): 'name': _get_default_date, } - def create(self, cr, uid, vals, context={}): + def create(self, cr, uid, vals, context=None): + if context is None: + context = {} if 'sheet_id' in context: - ts = self.pool.get('hr_timesheet_sheet.sheet').browse(cr, uid, context['sheet_id']) + ts = self.pool.get('hr_timesheet_sheet.sheet').browse(cr, uid, context['sheet_id'], context=context) if ts.state not in ('draft', 'new'): raise osv.except_osv(_('Error !'), _('You cannot modify an entry in a confirmed timesheet !')) res = super(hr_attendance,self).create(cr, uid, vals, context=context) @@ -580,7 +613,9 @@ class hr_attendance(osv.osv): self._check(cr, uid, ids) return super(hr_attendance,self).unlink(cr, uid, ids,*args, **kwargs) - def write(self, cr, uid, ids, vals, context={}): + def write(self, cr, uid, ids, vals, context=None): + if context is None: + context = {} self._check(cr, uid, ids) res = super(hr_attendance,self).write(cr, uid, ids, vals, context=context) if 'sheet_id' in context: @@ -606,7 +641,7 @@ class hr_timesheet_sheet_sheet_day(osv.osv): _columns = { 'name': fields.date('Date', readonly=True), 'sheet_id': fields.many2one('hr_timesheet_sheet.sheet', 'Sheet', readonly=True, select="1"), - 'total_timesheet': fields.float('Project Timesheet', readonly=True), + 'total_timesheet': fields.float('Total Timesheet', readonly=True), 'total_attendance': fields.float('Attendance', readonly=True), 'total_difference': fields.float('Difference', readonly=True), } @@ -718,13 +753,13 @@ class res_company(osv.osv): _inherit = 'res.company' _columns = { 'timesheet_range': fields.selection( - [('day','Day'),('week','Week'),('month','Month'),('year','Year')], 'Timeshet range'), - 'timesheet_max_difference': fields.float('Timesheet allowed difference', - help="Allowed difference between the sign in/out and the timesheet " \ + [('day','Day'),('week','Week'),('month','Month'),('year','Year')], 'Timesheet range'), + 'timesheet_max_difference': fields.float('Timesheet allowed difference(Hours)', + help="Allowed difference in hours between the sign in/out and the timesheet " \ "computation for one sheet. Set this to 0 if you do not want any control."), } _defaults = { - 'timesheet_range': lambda *args: 'month', + 'timesheet_range': lambda *args: 'week', 'timesheet_max_difference': lambda *args: 0.0 }