diff --git a/beesdoo_shift/data/cron.xml b/beesdoo_shift/data/cron.xml index d9bbc29..6fbfadc 100644 --- a/beesdoo_shift/data/cron.xml +++ b/beesdoo_shift/data/cron.xml @@ -49,7 +49,7 @@ days -1 - + model._cron_non_validated_sheets() @@ -62,7 +62,7 @@ -1 _cron_send_weekly_emails() diff --git a/beesdoo_shift/models/attendance_sheet.py b/beesdoo_shift/models/attendance_sheet.py index da499a5..a70a6c7 100644 --- a/beesdoo_shift/models/attendance_sheet.py +++ b/beesdoo_shift/models/attendance_sheet.py @@ -223,26 +223,19 @@ class AttendanceSheet(models.Model): @api.depends("start_time", "end_time") def _compute_time_slot(self): for rec in self: - start_time_dt = fields.Datetime.from_string(rec.start_time) - start_time_dt = fields.Datetime.context_timestamp( - rec, start_time_dt - ) - end_time_dt = fields.Datetime.from_string(rec.end_time) - end_time_dt = fields.Datetime.context_timestamp(rec, end_time_dt) + start_time = fields.Datetime.context_timestamp(rec, rec.start_time) + end_time = fields.Datetime.context_timestamp(rec, rec.end_time) rec.time_slot = ( - start_time_dt.strftime("%H:%M") + start_time.strftime("%H:%M") + "-" - + end_time_dt.strftime("%H:%M") + + end_time.strftime("%H:%M") ) @api.depends("start_time", "end_time", "week", "day_abbrevation") def _compute_name(self): for rec in self: - start_time_dt = fields.Datetime.from_string(rec.start_time) - start_time_dt = fields.Datetime.context_timestamp( - rec, start_time_dt - ) - name = "[%s] " % fields.Date.to_string(start_time_dt) + start_time = fields.Datetime.context_timestamp(rec, rec.start_time) + name = "[%s] " % fields.Date.to_string(start_time) if rec.week: name += rec.week + " " if rec.day_abbrevation: @@ -254,7 +247,7 @@ class AttendanceSheet(models.Model): @api.depends("start_time") def _compute_day(self): for rec in self: - rec.day = fields.Date.from_string(rec.start_time) + rec.day = rec.start_time.date() @api.depends("expected_shift_ids") def _compute_day_abbrevation(self): @@ -397,19 +390,16 @@ class AttendanceSheet(models.Model): # to the time range tasks = self.env["beesdoo.shift.shift"] expected_shift = self.env["beesdoo.shift.sheet.expected"] - s_time = fields.Datetime.from_string(new_sheet.start_time) - e_time = fields.Datetime.from_string(new_sheet.end_time) # Fix issues with equality check on datetime # by searching on a small intervall instead delta = timedelta(minutes=1) - to_string = fields.Datetime.to_string tasks = tasks.search( [ - ("start_time", ">", to_string(s_time - delta)), - ("start_time", "<", to_string(s_time + delta)), - ("end_time", ">", to_string(e_time - delta)), - ("end_time", "<", to_string(e_time + delta)), + ("start_time", ">", new_sheet.start_time - delta), + ("start_time", "<", new_sheet.start_time + delta), + ("end_time", ">", new_sheet.end_time - delta), + ("end_time", "<", new_sheet.end_time + delta), ] ) for task in tasks: @@ -484,17 +474,14 @@ class AttendanceSheet(models.Model): # Fix issues with equality check on datetime # by searching on a small intervall instead delta = timedelta(minutes=1) - s_time = fields.Datetime.from_string(self.start_time) - e_time = fields.Datetime.from_string(self.end_time) - to_string = fields.Datetime.to_string non_assigned_shifts = self.env["beesdoo.shift.shift"].search( [ ("worker_id", "=", False), - ("start_time", ">", to_string(s_time - delta)), - ("start_time", "<", to_string(s_time + delta)), - ("end_time", ">", to_string(e_time - delta)), - ("end_time", "<", to_string(e_time + delta)), + ("start_time", ">", self.start_time - delta), + ("start_time", "<", self.start_time + delta), + ("end_time", ">", self.end_time - delta), + ("end_time", "<", self.end_time + delta), ("task_type_id", "=", added_shift.task_type_id.id), ], limit=1, @@ -530,11 +517,11 @@ class AttendanceSheet(models.Model): @api.multi def validate_with_checks(self): self.ensure_one() - start_time_dt = fields.Datetime.from_string(self.start_time) + if self.state == "validated": raise UserError(_("The sheet has already been validated.")) - if start_time_dt > datetime.now(): + if self.start_time > datetime.now(): raise UserError( _("Attendance sheet can only be validated once the shifts have started.") ) diff --git a/beesdoo_shift/models/cooperative_status.py b/beesdoo_shift/models/cooperative_status.py index d86aacd..f4171ad 100644 --- a/beesdoo_shift/models/cooperative_status.py +++ b/beesdoo_shift/models/cooperative_status.py @@ -10,8 +10,8 @@ PERIOD = 28 # TODO: use system parameter def add_days_delta(date_from, days_delta): if not date_from: return date_from - next_date = fields.Date.from_string(date_from) + timedelta(days=days_delta) - return fields.Date.to_string(next_date) + next_date = date_from + timedelta(days=days_delta) + return next_date class ExemptReason(models.Model): _name = 'cooperative.exempt.reason' @@ -220,9 +220,8 @@ class CooperativeStatus(models.Model): This does not take holiday and other status into account. """ today = today or fields.Date.today() - today_dt = fields.Date.from_string(today) - irregular_start_dt = fields.Date.from_string(irregular_start_date) - delta = (today_dt - irregular_start_dt).days + + delta = (today - irregular_start_date).days if not delta % PERIOD: return today return add_days_delta(today, PERIOD - (delta % PERIOD)) @@ -381,7 +380,7 @@ class CooperativeStatus(models.Model): def clear_history(self): self.ensure_one() self.history_ids.unlink() - + @api.model def _cron_compute_counter_irregular(self, today=False): today = today or fields.Date.today() @@ -398,11 +397,10 @@ class CooperativeStatus(models.Model): '|', ('holiday_start_time', '>', today), ('holiday_end_time', '<', today), ] irregular = self.search(domain) - today_date = fields.Date.from_string(today) for status in irregular: if status.status == 'exempted': continue - delta = (today_date - fields.Date.from_string(status.irregular_start_date)).days + delta = (today - status.irregular_start_date).days if delta and delta % PERIOD == 0 and status not in journal.line_ids: if status.sr > 0: status.sr -= 1 @@ -411,27 +409,27 @@ class CooperativeStatus(models.Model): else: status.sr -= 2 journal.line_ids |= status - - + + class ShiftCronJournal(models.Model): _name = 'beesdoo.shift.journal' _order = 'date desc' _rec_name = 'date' - + date = fields.Date() line_ids = fields.Many2many('cooperative.status') - + _sql_constraints = [ ('one_entry_per_day', 'unique (date)', _('You can only create one journal per day')), ] - + @api.multi def run(self): self.ensure_one() if not self.user_has_groups('beesdoo_shift.group_cooperative_admin'): raise ValidationError(_("You don't have the access to perform this action")) self.sudo().env['cooperative.status']._cron_compute_counter_irregular(today=self.date) - + class ResPartner(models.Model): _inherit = 'res.partner' diff --git a/beesdoo_shift/models/planning.py b/beesdoo_shift/models/planning.py index 361fe8e..ad39e29 100644 --- a/beesdoo_shift/models/planning.py +++ b/beesdoo_shift/models/planning.py @@ -4,7 +4,7 @@ from odoo.exceptions import UserError from pytz import timezone, UTC import math -from datetime import datetime, timedelta +from datetime import datetime, time, timedelta def float_to_time(f): @@ -17,7 +17,7 @@ def floatime_to_hour_minute(f): def get_first_day_of_week(): today = datetime.now() - return (datetime.now() - timedelta(days=today.weekday())).strftime("%Y-%m-%d") + return (datetime.now() - timedelta(days=today.weekday())).date() class TaskType(models.Model): _name = 'beesdoo.shift.type' @@ -55,7 +55,7 @@ class Planning(models.Model): def _get_next_planning_date(self, date): self.ensure_one() nb_of_day = max(self.task_template_ids.mapped('day_nb_id.number')) - return fields.Date.to_string(fields.Date.from_string(date) + timedelta(days=nb_of_day)) + return date + timedelta(days=nb_of_day) @api.model def _generate_next_planning(self): @@ -98,19 +98,15 @@ class TaskTemplate(models.Model): end_date = fields.Datetime(compute="_get_fake_date", search="_dummy_search") def _get_utc_date(self, day, hour, minute): - #Don't catch error since the error should be raise on the log as an error - #because generate time with UTC timezone is worse than not generate them context_tz = timezone(self._context.get('tz') or self.env.user.tz) - day_time = day.replace(hour=hour, minute=minute) - day_local_time = context_tz.localize(day_time) - day_utc_time = day_local_time.astimezone(UTC) - return day_utc_time - + day_local_time=datetime.combine(day, time(hour=hour, minute=minute), tzinfo=context_tz) + day_utc_time=day_local_time.astimezone(UTC) + # Return naïve datetime so as to be saved in database + return day_utc_time.replace(tzinfo=None) @api.depends('start_time', 'end_time') def _get_fake_date(self): today = self._context.get('visualize_date', get_first_day_of_week()) - today = datetime.strptime(today, '%Y-%m-%d') for rec in self: # Find the day of this task template 'rec'. day = today + timedelta(days=rec.day_nb_id.number - 1) @@ -160,10 +156,10 @@ class TaskTemplate(models.Model): if worker_id and worker_id.cooperative_status_ids: status = worker_id.cooperative_status_ids[0] if status.holiday_start_time and status.holiday_end_time and \ - status.holiday_start_time <= rec.start_date[:10] and status.holiday_end_time >= rec.end_date[:10]: + status.holiday_start_time <= rec.start_date.date() and status.holiday_end_time >= rec.end_date.date(): worker_id = False if status.temporary_exempt_start_date and status.temporary_exempt_end_date and \ - status.temporary_exempt_start_date <= rec.start_date[:10] and status.temporary_exempt_end_date >= rec.end_date[:10]: + status.temporary_exempt_start_date <= rec.start_date.date() and status.temporary_exempt_end_date >= rec.end_date.date(): worker_id = False tasks |= tasks.create({ 'name' : "%s %s (%s - %s) [%s]" % (rec.name, rec.day_nb_id.name, float_to_time(rec.start_time), float_to_time(rec.end_time), i), diff --git a/beesdoo_shift/models/task.py b/beesdoo_shift/models/task.py index de5903a..01b060f 100644 --- a/beesdoo_shift/models/task.py +++ b/beesdoo_shift/models/task.py @@ -148,7 +148,7 @@ class Task(models.Model): today += ' 00:00:00' date_domain = [('start_time', '>', today)] if end_date: - end_date += ' 23:59:59' + end_date = datetime.combine(end_date,time(hour=23, minute=59, second=59)) date_domain.append(('end_time', '<=', end_date)) to_unsubscribe = self.search([('worker_id', 'in', worker_ids)] + date_domain) @@ -258,7 +258,7 @@ class Task(models.Model): if new_state == "absent_2" or new_state == "absent_1": if new_state == "absent_2": data['sr'] = -1 - data['irregular_absence_date'] = self.start_time[:10] + data['irregular_absence_date'] = self.start_time.date() data['irregular_absence_counter'] = -1 else: @@ -282,8 +282,8 @@ class Task(models.Model): confirmed_tasks = tasks.search( [ - ("start_time", ">", start_time.strftime("%Y-%m-%d 00:00:01")), - ("start_time", "<", end_time.strftime("%Y-%m-%d 23:59:59")), + ("start_time", ">", start_time), + ("start_time", "<", end_time), ("worker_id", "!=", False), ("state", "=", "open"), ] diff --git a/beesdoo_shift/tests/test_beesdoo_shift.py b/beesdoo_shift/tests/test_beesdoo_shift.py index 06194b4..3dcfad4 100644 --- a/beesdoo_shift/tests/test_beesdoo_shift.py +++ b/beesdoo_shift/tests/test_beesdoo_shift.py @@ -155,8 +155,6 @@ class TestBeesdooShift(TransactionCase): def search_sheets(self, start_time, end_time): if (type(start_time) and type(end_time)) == datetime: - start_time = fields.Datetime.to_string(start_time) - end_time = fields.Datetime.to_string(end_time) return self.attendance_sheet_model.search( [("start_time", "=", start_time), ("end_time", "=", end_time)] ) diff --git a/beesdoo_shift/views/attendance_sheet.xml b/beesdoo_shift/views/attendance_sheet.xml index a9d4142..79ff159 100644 --- a/beesdoo_shift/views/attendance_sheet.xml +++ b/beesdoo_shift/views/attendance_sheet.xml @@ -231,8 +231,8 @@ name="Daily attendance sheets" res_model="beesdoo.shift.sheet" view_mode="tree,form" - domain="[('end_time','>', datetime.date.today().strftime('%Y-%m-%d 00:00:00')), - ('start_time','<', datetime.date.today().strftime('%Y-%m-%d 23:59:59'))]" + domain="[('end_time','>', datetime.combine(datetime.now(), time(hour=00, minute=00, second=10))), + ('start_time','<', datetime.combine(datetime.now(), time(hour=23, minute=59, second=59)))]" /> diff --git a/beesdoo_shift/views/task.xml b/beesdoo_shift/views/task.xml index 6a82b11..4c803bb 100644 --- a/beesdoo_shift/views/task.xml +++ b/beesdoo_shift/views/task.xml @@ -104,13 +104,11 @@ options="{'no_create': True, 'no_open': True}" domain="[('working_mode', '=', 'regular')]" attrs="{'invisible': [('working_mode', '!=', 'regular')]}" /> - - - - - + + + diff --git a/beesdoo_shift/wizard/extension.py b/beesdoo_shift/wizard/extension.py index 39856bb..bb20eea 100644 --- a/beesdoo_shift/wizard/extension.py +++ b/beesdoo_shift/wizard/extension.py @@ -26,9 +26,7 @@ class Subscribe(models.TransientModel): status_id = self.env['cooperative.status'].search([('cooperator_id', '=', self.cooperator_id.id)]) if not status_id.extension_start_time: raise UserError(_('You should not make a manual extension when the grace delay has not been triggered yet')) - extension_date = fields.Date.from_string(status_id.extension_start_time) - today = fields.Date.from_string(status_id.today) - today_delay = (today - extension_date).days - grace_delay + today_delay = (status_id.today - status_id.extension_start_time).days - grace_delay if today_delay < 0: raise UserError(_('You should not start a manual extension during the grace delay')) status_id.sudo().write({'time_extension': self.extension_days + today_delay})