diff --git a/addons/calendar/models/calendar_event.py b/addons/calendar/models/calendar_event.py index 4570465ffce..0f2468b47b3 100644 --- a/addons/calendar/models/calendar_event.py +++ b/addons/calendar/models/calendar_event.py @@ -196,13 +196,13 @@ class Meeting(models.Model): help="Repeat every (Days/Week/Month/Year)") count = fields.Integer( string='Repeat', help="Repeat x times", compute='_compute_recurrence', readonly=False) - mo = fields.Boolean('Mon', compute='_compute_recurrence', readonly=False) - tu = fields.Boolean('Tue', compute='_compute_recurrence', readonly=False) - we = fields.Boolean('Wed', compute='_compute_recurrence', readonly=False) - th = fields.Boolean('Thu', compute='_compute_recurrence', readonly=False) - fr = fields.Boolean('Fri', compute='_compute_recurrence', readonly=False) - sa = fields.Boolean('Sat', compute='_compute_recurrence', readonly=False) - su = fields.Boolean('Sun', compute='_compute_recurrence', readonly=False) + mon = fields.Boolean(compute='_compute_recurrence', readonly=False) + tue = fields.Boolean(compute='_compute_recurrence', readonly=False) + wed = fields.Boolean(compute='_compute_recurrence', readonly=False) + thu = fields.Boolean(compute='_compute_recurrence', readonly=False) + fri = fields.Boolean(compute='_compute_recurrence', readonly=False) + sat = fields.Boolean(compute='_compute_recurrence', readonly=False) + sun = fields.Boolean(compute='_compute_recurrence', readonly=False) month_by = fields.Selection( MONTH_BY_SELECTION, string='Option', compute='_compute_recurrence', readonly=False) day = fields.Integer('Date of month', compute='_compute_recurrence', readonly=False) @@ -908,8 +908,8 @@ class Meeting(models.Model): @api.model def _get_recurrent_fields(self): return {'byday', 'until', 'rrule_type', 'month_by', 'event_tz', 'rrule', - 'interval', 'count', 'end_type', 'mo', 'tu', 'we', 'th', 'fr', 'sa', - 'su', 'day', 'weekday'} + 'interval', 'count', 'end_type', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat', + 'sun', 'day', 'weekday'} @api.model def _get_time_fields(self): diff --git a/addons/calendar/models/calendar_recurrence.py b/addons/calendar/models/calendar_recurrence.py index c7bddeb7634..160b87dbed3 100644 --- a/addons/calendar/models/calendar_recurrence.py +++ b/addons/calendar/models/calendar_recurrence.py @@ -30,15 +30,17 @@ RRULE_FREQ_TO_SELECT = { } RRULE_WEEKDAY_TO_FIELD = { - rrule.MO.weekday: 'mo', - rrule.TU.weekday: 'tu', - rrule.WE.weekday: 'we', - rrule.TH.weekday: 'th', - rrule.FR.weekday: 'fr', - rrule.SA.weekday: 'sa', - rrule.SU.weekday: 'su', + rrule.MO.weekday: 'mon', + rrule.TU.weekday: 'tue', + rrule.WE.weekday: 'wed', + rrule.TH.weekday: 'thu', + rrule.FR.weekday: 'fri', + rrule.SA.weekday: 'sat', + rrule.SU.weekday: 'sun', } +RRULE_WEEKDAYS = {'SUN': 'SU', 'MON': 'MO', 'TUE': 'TU', 'WED': 'WE', 'THU': 'TH', 'FRI': 'FR', 'SAT': 'SA'} + RRULE_TYPE_SELECTION = [ ('daily', 'Days'), ('weekly', 'Weeks'), @@ -58,13 +60,13 @@ MONTH_BY_SELECTION = [ ] WEEKDAY_SELECTION = [ - ('MO', 'Monday'), - ('TU', 'Tuesday'), - ('WE', 'Wednesday'), - ('TH', 'Thursday'), - ('FR', 'Friday'), - ('SA', 'Saturday'), - ('SU', 'Sunday'), + ('MON', 'Monday'), + ('TUE', 'Tuesday'), + ('WED', 'Wednesday'), + ('THU', 'Thursday'), + ('FRI', 'Friday'), + ('SAT', 'Saturday'), + ('SUN', 'Sunday'), ] BYDAY_SELECTION = [ @@ -104,13 +106,13 @@ class RecurrenceRule(models.Model): end_type = fields.Selection(END_TYPE_SELECTION, default='count') interval = fields.Integer(default=1) count = fields.Integer(default=1) - mo = fields.Boolean() - tu = fields.Boolean() - we = fields.Boolean() - th = fields.Boolean() - fr = fields.Boolean() - sa = fields.Boolean() - su = fields.Boolean() + mon = fields.Boolean() + tue = fields.Boolean() + wed = fields.Boolean() + thu = fields.Boolean() + fri = fields.Boolean() + sat = fields.Boolean() + sun = fields.Boolean() month_by = fields.Selection(MONTH_BY_SELECTION, default='date') day = fields.Integer(default=1) weekday = fields.Selection(WEEKDAY_SELECTION, string='Weekday') @@ -160,7 +162,7 @@ class RecurrenceRule(models.Model): @api.depends( 'byday', 'until', 'rrule_type', 'month_by', 'interval', 'count', 'end_type', - 'mo', 'tu', 'we', 'th', 'fr', 'sa', 'su', 'day', 'weekday') + 'mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun', 'day', 'weekday') def _compute_rrule(self): for recurrence in self: recurrence.rrule = recurrence._rrule_serialize() @@ -302,7 +304,7 @@ class RecurrenceRule(models.Model): def _rrule_parse(self, rule_str, date_start): # LUL TODO clean this mess data = {} - day_list = ['mo', 'tu', 'we', 'th', 'fr', 'sa', 'su'] + day_list = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'] if 'Z' in rule_str and not date_start.tzinfo: date_start = pytz.utc.localize(date_start) @@ -432,13 +434,13 @@ class RecurrenceRule(models.Model): return tuple( rrule.weekday(weekday_index) for weekday_index, weekday in { - rrule.MO.weekday: self.mo, - rrule.TU.weekday: self.tu, - rrule.WE.weekday: self.we, - rrule.TH.weekday: self.th, - rrule.FR.weekday: self.fr, - rrule.SA.weekday: self.sa, - rrule.SU.weekday: self.su, + rrule.MO.weekday: self.mon, + rrule.TU.weekday: self.tue, + rrule.WE.weekday: self.wed, + rrule.TH.weekday: self.thu, + rrule.FR.weekday: self.fri, + rrule.SA.weekday: self.sat, + rrule.SU.weekday: self.sun, }.items() if weekday ) @@ -458,7 +460,7 @@ class RecurrenceRule(models.Model): if freq == 'monthly' and self.month_by == 'date': # e.g. every 15th of the month rrule_params['bymonthday'] = self.day elif freq == 'monthly' and self.month_by == 'day': # e.g. every 2nd Monday in the month - rrule_params['byweekday'] = getattr(rrule, self.weekday)(int(self.byday)) # e.g. MO(+2) for the second Monday of the month + rrule_params['byweekday'] = getattr(rrule, RRULE_WEEKDAYS[self.weekday])(int(self.byday)) # e.g. MO(+2) for the second Monday of the month elif freq == 'weekly': weekdays = self._get_week_days() if not weekdays: diff --git a/addons/calendar/tests/test_calendar_recurrent_event_case2.py b/addons/calendar/tests/test_calendar_recurrent_event_case2.py index 036bbc0a0c4..af5ffec13a9 100644 --- a/addons/calendar/tests/test_calendar_recurrent_event_case2.py +++ b/addons/calendar/tests/test_calendar_recurrent_event_case2.py @@ -38,11 +38,11 @@ class TestRecurrentEvent(common.TransactionCase): 'duration': 1.0, 'until': '2011-04-30', 'end_type': 'end_date', - 'fr': True, - 'mo': True, - 'th': True, - 'tu': True, - 'we': True, + 'fri': True, + 'mon': True, + 'thu': True, + 'tue': True, + 'wed': True, 'name': 'Review code with programmer', 'recurrency': True, 'rrule_type': 'weekly' diff --git a/addons/calendar/tests/test_event_recurrence.py b/addons/calendar/tests/test_event_recurrence.py index 5e2375a1a87..ea857fdfb85 100644 --- a/addons/calendar/tests/test_event_recurrence.py +++ b/addons/calendar/tests/test_event_recurrence.py @@ -43,7 +43,7 @@ class TestCreateRecurrentEvents(TestRecurrentEvents): """ Every week, on Tuesdays, for 3 occurences """ detached_events = self.event._apply_recurrence_values({ 'rrule_type': 'weekly', - 'tu': True, + 'tue': True, 'interval': 1, 'count': 3, 'event_tz': 'UTC', @@ -63,7 +63,7 @@ class TestCreateRecurrentEvents(TestRecurrentEvents): self.event._apply_recurrence_values({ 'interval': 2, 'rrule_type': 'weekly', - 'tu': True, + 'tue': True, 'count': 2, 'event_tz': 'UTC', }) @@ -81,7 +81,7 @@ class TestCreateRecurrentEvents(TestRecurrentEvents): self.event._apply_recurrence_values({ 'interval': 2, 'rrule_type': 'weekly', - 'tu': True, + 'tue': True, 'count': 2, 'event_tz': 'UTC', }) @@ -96,7 +96,7 @@ class TestCreateRecurrentEvents(TestRecurrentEvents): def test_weekly_until(self): self.event._apply_recurrence_values({ 'rrule_type': 'weekly', - 'tu': True, + 'tue': True, 'interval': 2, 'end_type': 'end_date', 'until': datetime(2019, 11, 15), @@ -156,7 +156,7 @@ class TestCreateRecurrentEvents(TestRecurrentEvents): 'interval': 2, 'month_by': 'day', 'byday': '3', - 'weekday': 'TU', + 'weekday': 'TUE', 'end_type': 'end_date', 'until': date(2020, 3, 15), 'event_tz': 'UTC', @@ -176,7 +176,7 @@ class TestCreateRecurrentEvents(TestRecurrentEvents): 'interval': 2, 'rrule_type': 'monthly', 'month_by': 'day', - 'weekday': 'WE', + 'weekday': 'WED', 'byday': '-1', 'end_type': 'end_date', 'until': date(2020, 1, 15), @@ -211,7 +211,7 @@ class TestCreateRecurrentEvents(TestRecurrentEvents): self.event._apply_recurrence_values({ 'interval': 2, 'rrule_type': 'weekly', - 'mo': True, + 'mon': True, 'count': '2', 'event_tz': 'US/Eastern', # DST change on 2002/10/27 }) @@ -232,7 +232,7 @@ class TestCreateRecurrentEvents(TestRecurrentEvents): self.event._apply_recurrence_values({ 'interval': 1, 'rrule_type': 'weekly', - 'su': True, + 'sun': True, 'count': '2', 'event_tz': 'US/Eastern' # DST change on 2002/4/7 }) @@ -254,7 +254,7 @@ class TestCreateRecurrentEvents(TestRecurrentEvents): self.event._apply_recurrence_values({ 'interval': 1, 'rrule_type': 'weekly', - 'su': True, + 'sun': True, 'count': '2', 'event_tz': 'US/Eastern' # DST change on 2002/4/7 }) @@ -276,7 +276,7 @@ class TestCreateRecurrentEvents(TestRecurrentEvents): self.event._apply_recurrence_values({ 'interval': 1, 'rrule_type': 'weekly', - 'mo': True, + 'mon': True, 'count': 2, 'event_tz': 'Europe/Brussels' # DST change on 2020/3/23 }) @@ -298,7 +298,7 @@ class TestUpdateRecurrentEvents(TestRecurrentEvents): 'stop': datetime(2019, 10, 24, 18, 0), 'recurrency': True, 'rrule_type': 'weekly', - 'tu': True, + 'tue': True, 'interval': 1, 'count': 3, 'event_tz': 'Etc/GMT-4', @@ -322,8 +322,8 @@ class TestUpdateRecurrentEvents(TestRecurrentEvents): self.assertNotEqual(self.recurrence, new_recurrence) self.assertEqual(new_recurrence.count, 2) self.assertEqual(new_recurrence.dtstart, datetime(2019, 11, 2, 1, 0)) - self.assertFalse(new_recurrence.tu) - self.assertTrue(new_recurrence.sa) + self.assertFalse(new_recurrence.tue) + self.assertTrue(new_recurrence.sat) self.assertEventDates(new_recurrence.calendar_event_ids, [ (datetime(2019, 11, 2, 1, 0), datetime(2019, 11, 5, 18, 0)), (datetime(2019, 11, 9, 1, 0), datetime(2019, 11, 12, 18, 0)), @@ -340,8 +340,8 @@ class TestUpdateRecurrentEvents(TestRecurrentEvents): self.assertFalse(self.recurrence.exists()) self.assertEqual(new_recurrence.count, 3) self.assertEqual(new_recurrence.dtstart, datetime(2019, 10, 26, 1, 0)) - self.assertFalse(new_recurrence.tu) - self.assertTrue(new_recurrence.sa) + self.assertFalse(new_recurrence.tue) + self.assertTrue(new_recurrence.sat) self.assertEventDates(new_recurrence.calendar_event_ids, [ (datetime(2019, 10, 26, 1, 0), datetime(2019, 10, 29, 18, 0)), (datetime(2019, 11, 2, 1, 0), datetime(2019, 11, 5, 18, 0)), @@ -374,8 +374,8 @@ class TestUpdateRecurrentEvents(TestRecurrentEvents): def test_change_week_day_rrule(self): recurrence = self.events.recurrence_id recurrence.rrule = 'FREQ=WEEKLY;COUNT=3;BYDAY=WE' # from TU to WE - self.assertFalse(self.recurrence.tu) - self.assertTrue(self.recurrence.we) + self.assertFalse(self.recurrence.tue) + self.assertTrue(self.recurrence.wed) def test_shift_all_base_inactive(self): self.recurrence.base_event_id.active = False @@ -406,7 +406,7 @@ class TestUpdateRecurrentEvents(TestRecurrentEvents): event = self.events[1] event.write({ 'recurrence_update': 'future_events', - 'fr': True, # recurrence is now Tuesday AND Friday + 'fri': True, # recurrence is now Tuesday AND Friday 'count': 4, }) self.assertEventDates(self.recurrence.calendar_event_ids, [ @@ -425,14 +425,14 @@ class TestUpdateRecurrentEvents(TestRecurrentEvents): self.assertEqual(events[2], self.events[2], "Events on Tuesdays should not have changed") self.assertNotEqual(events.recurrence_id, self.recurrence, "Events should no longer be linked to the original recurrence") self.assertEqual(events.recurrence_id.count, 4, "The new recurrence should have 4") - self.assertTrue(event.recurrence_id.tu) - self.assertTrue(event.recurrence_id.fr) + self.assertTrue(event.recurrence_id.tue) + self.assertTrue(event.recurrence_id.fri) def test_update_recurrence_all(self): with self.assertRaises(UserError): self.events[1].write({ 'recurrence_update': 'all_events', - 'mo': True, # recurrence is now Tuesday AND Monday + 'mon': True, # recurrence is now Tuesday AND Monday }) def test_shift_single(self): @@ -484,7 +484,7 @@ class TestUpdateRecurrentEvents(TestRecurrentEvents): 'stop_date': datetime(2019, 10, 24), 'recurrency': True, 'rrule_type': 'weekly', - 'tu': True, + 'tue': True, 'interval': 1, 'count': 3, 'event_tz': 'Etc/GMT-4', @@ -506,8 +506,8 @@ class TestUpdateRecurrentEvents(TestRecurrentEvents): self.assertNotEqual(recurrence, new_recurrence) self.assertEqual(new_recurrence.count, 2) self.assertEqual(new_recurrence.dtstart, datetime(2019, 11, 2, 8, 0)) - self.assertFalse(new_recurrence.tu) - self.assertTrue(new_recurrence.sa) + self.assertFalse(new_recurrence.tue) + self.assertTrue(new_recurrence.sat) self.assertEventDates(new_recurrence.calendar_event_ids, [ (datetime(2019, 11, 2, 8, 0), datetime(2019, 11, 5, 18, 0)), (datetime(2019, 11, 9, 8, 0), datetime(2019, 11, 12, 18, 0)), @@ -527,8 +527,8 @@ class TestUpdateMultiDayWeeklyRecurrentEvents(TestRecurrentEvents): 'stop': datetime(2019, 10, 24, 18, 0), 'recurrency': True, 'rrule_type': 'weekly', - 'tu': True, - 'fr': True, + 'tue': True, + 'fri': True, 'interval': 1, 'count': 3, 'event_tz': 'Etc/GMT-4', @@ -564,11 +564,11 @@ class TestUpdateMultiDayWeeklyRecurrentEvents(TestRecurrentEvents): 'start': event.start + relativedelta(days=3), 'stop': event.stop + relativedelta(days=3), }) - self.assertTrue(self.recurrence.fr) - self.assertTrue(self.recurrence.tu) - self.assertTrue(event.recurrence_id.tu) - self.assertTrue(event.recurrence_id.mo) - self.assertFalse(event.recurrence_id.fr) + self.assertTrue(self.recurrence.fri) + self.assertTrue(self.recurrence.tue) + self.assertTrue(event.recurrence_id.tue) + self.assertTrue(event.recurrence_id.mon) + self.assertFalse(event.recurrence_id.fri) self.assertEqual(event.recurrence_id.count, 2) @@ -586,7 +586,7 @@ class TestUpdateMonthlyByDay(TestRecurrentEvents): 'interval': 1, 'count': 3, 'month_by': 'day', - 'weekday': 'TU', + 'weekday': 'TUE', 'byday': '3', 'event_tz': 'Etc/GMT-4', }) diff --git a/addons/calendar/views/calendar_views.xml b/addons/calendar/views/calendar_views.xml index e5496704d36..d02418f5f37 100644 --- a/addons/calendar/views/calendar_views.xml +++ b/addons/calendar/views/calendar_views.xml @@ -180,13 +180,13 @@ - - - - - - - + + + + + + + - - - - - - - + + + + + + +