← Back to team overview

openerp-community-reviewer team mailing list archive

lp:~laetitia-gangloff/hr-timesheet/hr_attendance_analysis_externalise_contract_calendar_ into lp:hr-timesheet/7.0

 

Laetitia Gangloff (Acsone) has proposed merging lp:~laetitia-gangloff/hr-timesheet/hr_attendance_analysis_externalise_contract_calendar_ into lp:hr-timesheet/7.0.

Requested reviews:
  Guewen Baconnier @ Camptocamp (gbaconnier-c2c)
  Lorenzo Battistini - Agile BG (elbati)

For more details, see:
https://code.launchpad.net/~laetitia-gangloff/hr-timesheet/hr_attendance_analysis_externalise_contract_calendar_/+merge/195775

In order to be able to use another calendar in some extension modules:
- rename get_active_contracts to get_reference_calendar and return the possible calendar attached to retrieve contract
- update code to take account of this change (_get_attendance_duration and print_calendar method)
- externalise store part of column in _store_rules to easily extends it
-- 
https://code.launchpad.net/~laetitia-gangloff/hr-timesheet/hr_attendance_analysis_externalise_contract_calendar_/+merge/195775
Your team OpenERP Community Reviewer/Maintainer is subscribed to branch lp:hr-timesheet/7.0.
=== modified file 'hr_attendance_analysis/hr_attendance.py'
--- hr_attendance_analysis/hr_attendance.py	2013-08-30 10:27:51 +0000
+++ hr_attendance_analysis/hr_attendance.py	2013-11-19 13:34:26 +0000
@@ -127,7 +127,9 @@
             res.append((start_datetime, precision))
         return res   
         
-    def get_active_contracts(self, cr, uid, employee_id, date=datetime.now().strftime('%Y-%m-%d')):
+    def get_reference_calendar(self, cr, uid, employee_id, date=None, context=None):
+        if date is None:
+            date = fields.date.context_today(self, cr, uid, context=context)
         contract_pool = self.pool.get('hr.contract')
         active_contract_ids= contract_pool.search(cr, uid, [
             '&',
@@ -145,12 +147,15 @@
             '&',
             ('trial_date_end', '!=', False),
             ('trial_date_end', '>=', date),
-            ])
+            ], context=context)
         if len(active_contract_ids) > 1:
-            employee = self.pool.get('hr.employee').browse(cr,uid,employee_id)
+            employee = self.pool.get('hr.employee').browse(cr,uid,employee_id, context=context)
             raise orm.except_orm(_('Error'), _(
                 'Too many active contracts for employee %s'
                 ) % employee.name)
+        if active_contract_ids:
+            contract = contract_pool.browse(cr, uid, active_contract_ids[0], context=context)
+            return contract.working_hours
         return active_contract_ids
 
     def _ceil_rounding(self, rounding, datetime):
@@ -165,10 +170,9 @@
 
     def _get_attendance_duration(self, cr, uid, ids, field_name, arg, context=None):
         res = {}
-        contract_pool = self.pool.get('hr.contract')
         resource_pool = self.pool.get('resource.resource')
         attendance_pool = self.pool.get('resource.calendar.attendance')
-        precision = self.pool.get('res.users').browse(cr, uid, uid).company_id.working_time_precision
+        precision = self.pool.get('res.users').browse(cr, uid, uid, context=context).company_id.working_time_precision
         # 2012.10.16 LF FIX : Get timezone from context
         active_tz = pytz.timezone(context.get("tz","UTC") if context else "UTC")
         str_now = datetime.strftime(datetime.now(), '%Y-%m-%d %H:%M:%S')
@@ -176,7 +180,7 @@
             duration = 0.0
             outside_calendar_duration = 0.0
             inside_calendar_duration = 0.0
-            attendance = self.browse(cr, uid, attendance_id)
+            attendance = self.browse(cr, uid, attendance_id, context=context)
             res[attendance.id] = {}
             # 2012.10.16 LF FIX : Attendance in context timezone
             attendance_start = datetime.strptime(
@@ -188,9 +192,9 @@
             if attendance.action == 'sign_in':
                 next_attendance_ids = self.search(cr, uid, [
                     ('employee_id', '=', attendance.employee_id.id),
-                    ('name', '>', attendance.name)], order='name')
+                    ('name', '>', attendance.name)], order='name', context=context)
                 if next_attendance_ids:
-                    next_attendance = self.browse(cr, uid, next_attendance_ids[0])
+                    next_attendance = self.browse(cr, uid, next_attendance_ids[0], context=context)
                     if next_attendance.action == 'sign_in':
                          # 2012.10.16 LF FIX : Attendance in context timezone
                          raise orm.except_orm(_('Error'), _(
@@ -206,19 +210,18 @@
                 duration = round(duration / precision) * precision
             res[attendance.id]['duration'] = duration
             res[attendance.id]['end_datetime'] = next_attendance_date
-            # If contract is not specified: working days = 24/7
+            # If calendar is not specified: working days = 24/7
             res[attendance.id]['inside_calendar_duration'] = duration
             res[attendance.id]['outside_calendar_duration'] = 0.0
 
-            active_contract_ids = self.get_active_contracts(
-                cr, uid, attendance.employee_id.id, date=str_now[:10])
+            reference_calendar = self.get_reference_calendar(
+                cr, uid, attendance.employee_id.id, date=str_now[:10], context=context)
 
-            if active_contract_ids and next_attendance_ids:
-                contract = contract_pool.browse(cr, uid, active_contract_ids[0])
-                if contract.working_hours:
+            if reference_calendar and next_attendance_ids:
+                if reference_calendar:
                     # TODO applicare prima arrotondamento o tolleranza?
-                    if contract.working_hours.attendance_rounding:
-                        float_attendance_rounding = float(contract.working_hours.attendance_rounding)
+                    if reference_calendar.attendance_rounding:
+                        float_attendance_rounding = float(reference_calendar.attendance_rounding)
                         rounded_start_hour = self._ceil_rounding(
                             float_attendance_rounding, attendance_start)
                         rounded_stop_hour = self._floor_rounding(
@@ -243,7 +246,7 @@
                         
                     res[attendance.id]['inside_calendar_duration'] = 0.0
                     res[attendance.id]['outside_calendar_duration'] = 0.0
-                    calendar_id = contract.working_hours.id
+                    calendar_id = reference_calendar.id
                     intervals_within = 0
 
                     # split attendance in intervals = precision
@@ -273,7 +276,7 @@
                             ('calendar_id','=',calendar_id),
                             ('hour_to','>=',centered_attendance_hour),
                             ('hour_from','<=',centered_attendance_hour),
-                            ])
+                            ], context=context)
                         if len(matched_schedule_ids) > 1:
                             raise orm.except_orm(_('Error'),
                                 _('Wrongly configured working schedule with id %s') % str(calendar_id))
@@ -281,7 +284,7 @@
                             intervals_within += 1
                             # sign in tolerance
                             if intervals_within == 1:
-                                calendar_attendance = attendance_pool.browse(cr, uid, matched_schedule_ids[0])
+                                calendar_attendance = attendance_pool.browse(cr, uid, matched_schedule_ids[0], context=context)
                                 attendance_start_hour = (
                                     attendance_start.hour + attendance_start.minute / 60.0
                                     + attendance_start.second / 60.0 / 60.0
@@ -302,7 +305,7 @@
                                     attendance_stop.hour + attendance_stop.minute / 60.0
                                     + attendance_stop.second / 60.0 / 60.0
                                     )
-                                calendar_attendance = attendance_pool.browse(cr, uid, matched_schedule_ids[0])
+                                calendar_attendance = attendance_pool.browse(cr, uid, matched_schedule_ids[0], context=context)
                                 if attendance_stop_hour <= (
                                     calendar_attendance.hour_to and
                                     (attendance_stop_hour - (calendar_attendance.hour_to -
@@ -321,13 +324,13 @@
                         res[attendance.id]['inside_calendar_duration'],
                         res[attendance.id]['duration'])
 
-                    if contract.working_hours.overtime_rounding:
+                    if reference_calendar.overtime_rounding:
                         if res[attendance.id]['outside_calendar_duration']:
                             overtime = res[attendance.id]['outside_calendar_duration']
-                            if contract.working_hours.overtime_rounding_tolerance:
+                            if reference_calendar.overtime_rounding_tolerance:
                                 overtime = self.time_sum(overtime,
-                                    contract.working_hours.overtime_rounding_tolerance)
-                            float_overtime_rounding = float(contract.working_hours.overtime_rounding)
+                                    reference_calendar.overtime_rounding_tolerance)
+                            float_overtime_rounding = float(reference_calendar.overtime_rounding)
                             res[attendance.id]['outside_calendar_duration'] = math.floor(
                                 overtime * float_overtime_rounding) / float_overtime_rounding
 
@@ -337,7 +340,7 @@
         attendance_ids = []
         attendance_pool = self.pool.get('hr.attendance')
         for contract in self.pool.get('hr.contract').browse(cr, uid, ids, context=context):
-            att_ids = attendance_pool.search(cr, uid, [('employee_id', '=', contract.employee_id.id)])
+            att_ids = attendance_pool.search(cr, uid, [('employee_id', '=', contract.employee_id.id)], context=context)
             for att_id in att_ids:
                 if att_id not in attendance_ids:
                     attendance_ids.append(att_id)
@@ -348,7 +351,7 @@
         attendance_pool = self.pool.get('hr.attendance')
         contract_pool = self.pool.get('hr.contract')
         for calendar in self.pool.get('resource.calendar').browse(cr, uid, ids, context=context):
-            contract_ids = contract_pool.search(cr, uid, [('working_hours', '=', calendar.id)])
+            contract_ids = contract_pool.search(cr, uid, [('working_hours', '=', calendar.id)], context=context)
             att_ids = attendance_pool._get_by_contracts(cr, uid, contract_ids, context=None)
             for att_id in att_ids:
                 if att_id not in attendance_ids:
@@ -375,45 +378,31 @@
                     ('employee_id', '=', attendance.employee_id.id),
                     ('name', '<', attendance.name),
                     ('action', '=', 'sign_in'),
-                    ], order='name')
+                    ], order='name', context=context)
                 if previous_attendance_ids and previous_attendance_ids[len(previous_attendance_ids) - 1] not in attendance_ids:
                     attendance_ids.append(previous_attendance_ids[len(previous_attendance_ids) - 1])    
         return attendance_ids
 
     _inherit = "hr.attendance"
 
+    _store_rules = {
+                    'hr.attendance': (_get_attendances, ['name', 'action', 'employee_id'], 20),
+                    'hr.contract': (_get_by_contracts, ['employee_id', 'date_start', 'date_end', 'trial_date_start', 'trial_date_end', 'working_hours'], 20),
+                    'resource.calendar': (_get_by_calendars, ['attendance_ids'], 20),
+                    'resource.calendar.attendance': (_get_by_calendar_attendances, ['dayofweek', 'date_from', 'hour_from', 'hour_to', 'calendar_id'], 20),
+                    }
+
     _columns = {
         'duration': fields.function(_get_attendance_duration, method=True, multi='duration', string="Attendance duration",
-            store={
-                'hr.attendance': (_get_attendances, ['name', 'action', 'employee_id'], 20),
-                'hr.contract': (_get_by_contracts, ['employee_id', 'date_start', 'date_end', 'trial_date_start', 'trial_date_end', 'working_hours'], 20),
-                'resource.calendar': (_get_by_calendars, ['attendance_ids'], 20),
-                'resource.calendar.attendance': (_get_by_calendar_attendances, ['dayofweek', 'date_from', 'hour_from', 'hour_to', 'calendar_id'], 20),
-                }
-            ),
+            store=_store_rules),
         'end_datetime': fields.function(_get_attendance_duration, method=True, multi='duration', type="datetime", string="End date time",
-            store={
-                'hr.attendance': (_get_attendances, ['name', 'action', 'employee_id'], 20),
-                'hr.contract': (_get_by_contracts, ['employee_id', 'date_start', 'date_end', 'trial_date_start', 'trial_date_end', 'working_hours'], 20),
-                'resource.calendar': (_get_by_calendars, ['attendance_ids'], 20),
-                'resource.calendar.attendance': (_get_by_calendar_attendances, ['dayofweek', 'date_from', 'hour_from', 'hour_to', 'calendar_id'], 20),
-                }),
+            store=_store_rules),
         'outside_calendar_duration': fields.function(_get_attendance_duration, method=True, multi='duration',
             string="Overtime",
-            store={
-                'hr.attendance': (_get_attendances, ['name', 'action', 'employee_id'], 20),
-                'hr.contract': (_get_by_contracts, ['employee_id', 'date_start', 'date_end', 'trial_date_start', 'trial_date_end', 'working_hours'], 20),
-                'resource.calendar': (_get_by_calendars, ['attendance_ids'], 20),
-                'resource.calendar.attendance': (_get_by_calendar_attendances, ['dayofweek', 'date_from', 'hour_from', 'hour_to', 'calendar_id'], 20),
-                }),
+            store=_store_rules),
         'inside_calendar_duration': fields.function(_get_attendance_duration, method=True, multi='duration',
             string="Duration within working schedule",
-            store={
-                'hr.attendance': (_get_attendances, ['name', 'action', 'employee_id'], 20),
-                'hr.contract': (_get_by_contracts, ['employee_id', 'date_start', 'date_end', 'trial_date_start', 'trial_date_end', 'working_hours'], 20),
-                'resource.calendar': (_get_by_calendars, ['attendance_ids'], 20),
-                'resource.calendar.attendance': (_get_by_calendar_attendances, ['dayofweek', 'date_from', 'hour_from', 'hour_to', 'calendar_id'], 20),
-                }),
+            store=_store_rules),
     }
 
 

=== modified file 'hr_attendance_analysis/wizard/print_calendar_report.py'
--- hr_attendance_analysis/wizard/print_calendar_report.py	2013-07-16 07:39:48 +0000
+++ hr_attendance_analysis/wizard/print_calendar_report.py	2013-11-19 13:34:26 +0000
@@ -55,7 +55,7 @@
         'year': lambda * a: datetime.now().year,
         'from_date': lambda * a: (datetime.now()-timedelta(30)).strftime('%Y-%m-%d'),
         'to_date': lambda * a: datetime.now().strftime('%Y-%m-%d'),
-        'employee_ids': lambda s, cr, uid, c: s.pool.get('hr.employee').search(cr, uid, []),        
+        'employee_ids': lambda s, cr, uid, c: s.pool.get('hr.employee').search(cr, uid, [], context=None),
     }
 
     _name = "attendance_analysis.wizard.calendar_report"
@@ -74,12 +74,11 @@
         if context is None:
             context = {}
         attendance_pool = self.pool.get('hr.attendance')
-        contract_pool = self.pool.get('hr.contract')
         holidays_pool = self.pool.get('hr.holidays')
 
         days_by_employee = {}
         
-        form = self.read(cr, uid, ids)[0]
+        form = self.read(cr, uid, ids, context=context)[0]
         from_date = datetime.strptime(form['from_date'], '%Y-%m-%d')
         to_date = datetime.strptime(form['to_date'], '%Y-%m-%d')
         if from_date > to_date:
@@ -97,7 +96,7 @@
                 current_total_attendances = 0.0
                 current_total_overtime = 0.0
                 current_total_leaves = 0.0
-                current_total_due = 24.0 # If contract is not specified: working days = 24/7
+                current_total_due = 24.0 # If calendar is not specified: working days = 24/7
                 current_total_inside_calendar = 0.0
                 str_current_date = current_date.strftime('%Y-%m-%d')
                 days_by_employee[employee_id][str_current_date] = {
@@ -121,9 +120,9 @@
                     ('name','>=',str_current_date_beginning),
                     ('name','<=',str_current_date_end),
                     ('action','=','sign_in'),
-                    ])
+                    ], context=context)
                 # computing attendance totals
-                for attendance in attendance_pool.browse(cr, uid, attendance_ids):
+                for attendance in attendance_pool.browse(cr, uid, attendance_ids, context=context):
                     current_total_attendances = attendance_pool.time_sum(
                         current_total_attendances,attendance.duration)
                     current_total_overtime = attendance_pool.time_sum(current_total_overtime,
@@ -135,7 +134,7 @@
                 #printing up to 4 attendances
                 if len(attendance_ids) < 5:
                     count = 1
-                    for attendance in sorted(attendance_pool.browse(cr, uid, attendance_ids),
+                    for attendance in sorted(attendance_pool.browse(cr, uid, attendance_ids, context=context),
                         key=lambda x: x['name']):
                         days_by_employee[employee_id][str_current_date][
                             'signin_'+str(count)] = attendance.name[11:16]
@@ -152,14 +151,13 @@
                     'overtime'
                     ] = current_total_overtime
                 
-                active_contract_ids = attendance_pool.get_active_contracts(
-                    cr, uid, int(employee_id), date=str_current_date)
+                reference_calendar = attendance_pool.get_reference_calendar(
+                    cr, uid, int(employee_id), date=str_current_date, context=context)
                 # computing due total
-                if active_contract_ids:
-                    contract = contract_pool.browse(cr, uid, active_contract_ids[0])
-                    if contract.working_hours and contract.working_hours.attendance_ids:
+                if reference_calendar:
+                    if reference_calendar.attendance_ids:
                         current_total_due = 0.0
-                        for calendar_attendance in contract.working_hours.attendance_ids:
+                        for calendar_attendance in reference.attendance_ids:
                             if ((
                                 not calendar_attendance.dayofweek
                                 or int(calendar_attendance.dayofweek) == current_date.weekday()
@@ -200,8 +198,8 @@
                     ('date_to', '>', str_current_date_end),
                     ('state', '=', 'validate'),
                     ('employee_id', '=', int(employee_id)),
-                    ])
-                for holiday in holidays_pool.browse(cr, uid, holidays_ids):
+                    ], context=context)
+                for holiday in holidays_pool.browse(cr, uid, holidays_ids, context=context):
                     date_from = datetime.strptime(holiday.date_from, '%Y-%m-%d %H:%M:%S')
                     date_to = datetime.strptime(holiday.date_to, '%Y-%m-%d %H:%M:%S')
                     # if beginned before today
@@ -230,10 +228,9 @@
                         ] = attendance_pool.time_difference(
                         current_total_inside_calendar, due_minus_leaves)
 
-                if active_contract_ids:
-                    contract = contract_pool.browse(cr, uid, active_contract_ids[0])
-                    if contract.working_hours and contract.working_hours.leave_rounding:
-                        float_rounding = float(contract.working_hours.leave_rounding)
+                if reference_calendar:
+                    if reference_calendar.leave_rounding:
+                        float_rounding = float(reference_calendar.leave_rounding)
                         days_by_employee[employee_id][str_current_date][
                             'negative'
                             ] = math.floor(
@@ -272,13 +269,12 @@
                     days_by_employee[employee_id][str_date]['due'])
                 
                 # computing overtime types
-                active_contract_ids = attendance_pool.get_active_contracts(
-                    cr, uid, int(employee_id), date=str_date)
-                if active_contract_ids:
-                    contract = contract_pool.browse(cr, uid, active_contract_ids[0])                
-                    if contract.working_hours and contract.working_hours.overtime_type_ids:
+                reference_calendar = attendance_pool.get_reference_calendar(
+                    cr, uid, int(employee_id), date=str_date, context=context)
+                if reference_calendar:
+                    if reference_calendar.overtime_type_ids:
                         sorted_types = sorted(
-                            contract.working_hours.overtime_type_ids,
+                            reference_calendar.overtime_type_ids,
                             key=lambda k: k.sequence)
                         current_overtime = days_by_employee[employee_id][
                             str_date]['overtime']


Follow ups