Merge lp:~openerp-dev/openobject-addons/6.1-opw-575176-bth into lp:openobject-addons/6.1

Proposed by Bhumi Thakkar (Open ERP)
Status: Needs review
Proposed branch: lp:~openerp-dev/openobject-addons/6.1-opw-575176-bth
Merge into: lp:openobject-addons/6.1
Diff against target: 114 lines (+64/-14)
1 file modified
base_calendar/base_calendar.py (+64/-14)
To merge this branch: bzr merge lp:~openerp-dev/openobject-addons/6.1-opw-575176-bth
Reviewer Review Type Date Requested Status
OpenERP Core Team Pending
Review via email: mp+112539@code.launchpad.net

Description of the change

Hello,

     Click on meeting error is coming in command prompt 'day is out of range for month' and 'TypeError: can't compare offset-naive and offset-aware datetimes'.

1. Sales => Meetings => Meetings
2. Open any meeting and set reminder.

Observed: Error is coming in command prompt 'day is out of range for month' and meetings can not open.
Expected: 'Meetings should open without any error.'

'day is out of range for month' this error is coming because date should pass in list so passed in list. This error is solved but another error is coming 'TypeError: can't compare offset-naive and offset-aware datetimes'.

when rrule contains UNTIL keyword then should parse value of until keyword with datetime and set untildate. which is not done when passed value in get_recurrent_dates () function from do_run_scheduler () in base_calendar.py file.

Thanks.

To post a comment you must log in.
6865. By Xavier ALT

[FIX] base_calendar: enforce 'UNTIL' limit on recurrent rules

 - if recurrent rules doesn't defined an UNTIL value, we enforce it to TODAY + 150 years.
   We have to enforce a limit for rrule calculation otherwise we will never ends (until = forever)

 - on 'get_recurrrent_ids' we enforce 'UNTIL' depending on requested domain. If use requested
   reccurent values for date between '2012-01-01' and '2012-12-21' we do not need to compute
   values later than requested upper limit (here: until = '2012-12-22')
   NOTE: added one extra day of to be sure handling of '>=' will be timezone safe.

6866. By Xavier ALT

[FIX] base_calendar: get_recurrent_ids() have to respect provided 'limit'

6867. By Xavier ALT

[FIX] base_calendar: fix stupid condition error - check for upper bound if domain ask for date before _

Revision history for this message
Naresh(OpenERP) (nch-openerp) wrote :

Hello,

This bug was qualified as Not Reproducible on Trunk . If this Merge Proposal could not be merged in v6.1 at the release of v7.0, it will be closed.

Thanks,
Naresh Soni

Unmerged revisions

6867. By Xavier ALT

[FIX] base_calendar: fix stupid condition error - check for upper bound if domain ask for date before _

6866. By Xavier ALT

[FIX] base_calendar: get_recurrent_ids() have to respect provided 'limit'

6865. By Xavier ALT

[FIX] base_calendar: enforce 'UNTIL' limit on recurrent rules

 - if recurrent rules doesn't defined an UNTIL value, we enforce it to TODAY + 150 years.
   We have to enforce a limit for rrule calculation otherwise we will never ends (until = forever)

 - on 'get_recurrrent_ids' we enforce 'UNTIL' depending on requested domain. If use requested
   reccurent values for date between '2012-01-01' and '2012-12-21' we do not need to compute
   values later than requested upper limit (here: until = '2012-12-22')
   NOTE: added one extra day of to be sure handling of '>=' will be timezone safe.

6864. By Bhumi Thakkar (Open ERP)

[FIX] if rule contains UNTIL keyword then parse value with time and set rrule_until_date.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'base_calendar/base_calendar.py'
--- base_calendar/base_calendar.py 2012-03-05 14:35:54 +0000
+++ base_calendar/base_calendar.py 2012-08-10 11:11:20 +0000
@@ -63,8 +63,47 @@
63 if exrule:63 if exrule:
64 rset1.exrule(rrule.rrulestr(str(exrule), dtstart=startdate))64 rset1.exrule(rrule.rrulestr(str(exrule), dtstart=startdate))
6565
66 # FIXME: no API-break rule won't permit to remove that list() cast, but this
67 # should be a good idea as rruleset is iterable we don't need that case
68 # (will help reducing memory usage for big rrule end dates)
66 return list(rset1)69 return list(rset1)
6770
71def get_recurrent_dates_max_limit():
72 """ return the maximum date we should consider for last recurrent event date """
73 # even with extension of lifetime, 150 years should be a good maximum...
74 return datetime.now(tz=pytz.timezone('UTC')) + relativedelta(years=150)
75
76def force_recurrent_dates_until(rrulestring, until_max=None):
77 """
78 Enforce recurrent rule UNTIL to be present
79 @param rrulestring: Rulestring
80 @param until_max: Maximum reccurent date or TODAY + X years if None
81 @return: New reccurrent rule string
82 """
83 if until_max is None:
84 until_max = get_recurrent_dates_max_limit()
85 new_rrulestring = []
86 is_until = False
87 for rule in rrulestring.split(';'):
88 name, value = rule.split('=')
89 if name == "UNTIL":
90 is_until = True
91 value = parser.parse(value)
92 # take earliest until limit between the one from event and maximum date
93 value = min(value, until_max)
94 value = value.strftime("%Y%m%d%H%M%S")
95 new_rule = '%s=%s' % (name, value)
96 new_rrulestring.append(new_rule)
97
98 if not is_until:
99 # there is no upper range time limit, we should really set one
100 # take user-request limit or default data_max_limit
101 is_until = True
102 value = until_max.strftime("%Y%m%d%H%M%S")
103 new_rrulestring.append('%s=%s' % ('UNTIL', value))
104
105 return ';'.join(new_rrulestring)
106
68def base_calendar_id2real_id(base_calendar_id=None, with_date=False):107def base_calendar_id2real_id(base_calendar_id=None, with_date=False):
69 """108 """
70 This function converts virtual event id into real id of actual event109 This function converts virtual event id into real id of actual event
@@ -830,7 +869,10 @@
830869
831 if res_obj.rrule:870 if res_obj.rrule:
832 event_date = datetime.strptime(res_obj.date, '%Y-%m-%d %H:%M:%S')871 event_date = datetime.strptime(res_obj.date, '%Y-%m-%d %H:%M:%S')
833 recurrent_dates = get_recurrent_dates(res_obj.rrule, res_obj.exdate, event_date, res_obj.exrule)872 exdate = res_obj.exdate and res_obj.exdate.split(',') or []
873 rrule_str = res_obj.rrule
874 new_rrule_str = force_recurrent_dates_until(rrule_str)
875 recurrent_dates = get_recurrent_dates(str(new_rrule_str), exdate, event_date, res_obj.exrule)
834876
835 trigger_interval = alarm.trigger_interval877 trigger_interval = alarm.trigger_interval
836 if trigger_interval == 'days':878 if trigger_interval == 'days':
@@ -1133,22 +1175,27 @@
1133 if not data['rrule']:1175 if not data['rrule']:
1134 continue1176 continue
11351177
1178 # compute upper max date from domain
1179 date_max_limit = None
1180 for arg in domain:
1181 if arg[0] in ('date', 'date_deadline'):
1182 if arg[1] in ('=','<','<='):
1183 value = arg[2]
1184 if date_max_limit is None or value > date_max_limit:
1185 # increase upper limit
1186 date_max_limit = value
1187 # force an upper max data from user-request domain or reasonable max
1188 # otherwise we may end compute recurring dates until the ends of life!
1189 if date_max_limit:
1190 date_max_limit = datetime.strptime(date_max_limit, '%Y-%m-%d')
1191 date_max_limit = pytz.timezone('UTC').localize(date_max_limit)
1192 date_max_limit += relativedelta(days=1)
1193
1136 exdate = data['exdate'] and data['exdate'].split(',') or []1194 exdate = data['exdate'] and data['exdate'].split(',') or []
1137 rrule_str = data['rrule']1195 rrule_str = data['rrule']
1138 new_rrule_str = []1196 new_rrule_str = force_recurrent_dates_until(rrule_str, until_max=date_max_limit)
1139 rrule_until_date = False
1140 is_until = False
1141 for rule in rrule_str.split(';'):
1142 name, value = rule.split('=')
1143 if name == "UNTIL":
1144 is_until = True
1145 value = parser.parse(value)
1146 rrule_until_date = parser.parse(value.strftime("%Y-%m-%d %H:%M:%S"))
1147 value = value.strftime("%Y%m%d%H%M%S")
1148 new_rule = '%s=%s' % (name, value)
1149 new_rrule_str.append(new_rule)
1150 new_rrule_str = ';'.join(new_rrule_str)
1151 rdates = get_recurrent_dates(str(new_rrule_str), exdate, event_date, data['exrule'])1197 rdates = get_recurrent_dates(str(new_rrule_str), exdate, event_date, data['exrule'])
1198 count = 0
1152 for r_date in rdates:1199 for r_date in rdates:
1153 ok = True1200 ok = True
1154 for arg in domain:1201 for arg in domain:
@@ -1167,6 +1214,9 @@
1167 continue1214 continue
1168 idval = real_id2base_calendar_id(data['id'], r_date.strftime("%Y-%m-%d %H:%M:%S"))1215 idval = real_id2base_calendar_id(data['id'], r_date.strftime("%Y-%m-%d %H:%M:%S"))
1169 result.append(idval)1216 result.append(idval)
1217 if limit and count > limit:
1218 # do not compute more than `limit` number of recurrent dates per event
1219 break
11701220
1171 if isinstance(select, (str, int, long)):1221 if isinstance(select, (str, int, long)):
1172 return ids and ids[0] or False1222 return ids and ids[0] or False