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
1=== modified file 'base_calendar/base_calendar.py'
2--- base_calendar/base_calendar.py 2012-03-05 14:35:54 +0000
3+++ base_calendar/base_calendar.py 2012-08-10 11:11:20 +0000
4@@ -63,8 +63,47 @@
5 if exrule:
6 rset1.exrule(rrule.rrulestr(str(exrule), dtstart=startdate))
7
8+ # FIXME: no API-break rule won't permit to remove that list() cast, but this
9+ # should be a good idea as rruleset is iterable we don't need that case
10+ # (will help reducing memory usage for big rrule end dates)
11 return list(rset1)
12
13+def get_recurrent_dates_max_limit():
14+ """ return the maximum date we should consider for last recurrent event date """
15+ # even with extension of lifetime, 150 years should be a good maximum...
16+ return datetime.now(tz=pytz.timezone('UTC')) + relativedelta(years=150)
17+
18+def force_recurrent_dates_until(rrulestring, until_max=None):
19+ """
20+ Enforce recurrent rule UNTIL to be present
21+ @param rrulestring: Rulestring
22+ @param until_max: Maximum reccurent date or TODAY + X years if None
23+ @return: New reccurrent rule string
24+ """
25+ if until_max is None:
26+ until_max = get_recurrent_dates_max_limit()
27+ new_rrulestring = []
28+ is_until = False
29+ for rule in rrulestring.split(';'):
30+ name, value = rule.split('=')
31+ if name == "UNTIL":
32+ is_until = True
33+ value = parser.parse(value)
34+ # take earliest until limit between the one from event and maximum date
35+ value = min(value, until_max)
36+ value = value.strftime("%Y%m%d%H%M%S")
37+ new_rule = '%s=%s' % (name, value)
38+ new_rrulestring.append(new_rule)
39+
40+ if not is_until:
41+ # there is no upper range time limit, we should really set one
42+ # take user-request limit or default data_max_limit
43+ is_until = True
44+ value = until_max.strftime("%Y%m%d%H%M%S")
45+ new_rrulestring.append('%s=%s' % ('UNTIL', value))
46+
47+ return ';'.join(new_rrulestring)
48+
49 def base_calendar_id2real_id(base_calendar_id=None, with_date=False):
50 """
51 This function converts virtual event id into real id of actual event
52@@ -830,7 +869,10 @@
53
54 if res_obj.rrule:
55 event_date = datetime.strptime(res_obj.date, '%Y-%m-%d %H:%M:%S')
56- recurrent_dates = get_recurrent_dates(res_obj.rrule, res_obj.exdate, event_date, res_obj.exrule)
57+ exdate = res_obj.exdate and res_obj.exdate.split(',') or []
58+ rrule_str = res_obj.rrule
59+ new_rrule_str = force_recurrent_dates_until(rrule_str)
60+ recurrent_dates = get_recurrent_dates(str(new_rrule_str), exdate, event_date, res_obj.exrule)
61
62 trigger_interval = alarm.trigger_interval
63 if trigger_interval == 'days':
64@@ -1133,22 +1175,27 @@
65 if not data['rrule']:
66 continue
67
68+ # compute upper max date from domain
69+ date_max_limit = None
70+ for arg in domain:
71+ if arg[0] in ('date', 'date_deadline'):
72+ if arg[1] in ('=','<','<='):
73+ value = arg[2]
74+ if date_max_limit is None or value > date_max_limit:
75+ # increase upper limit
76+ date_max_limit = value
77+ # force an upper max data from user-request domain or reasonable max
78+ # otherwise we may end compute recurring dates until the ends of life!
79+ if date_max_limit:
80+ date_max_limit = datetime.strptime(date_max_limit, '%Y-%m-%d')
81+ date_max_limit = pytz.timezone('UTC').localize(date_max_limit)
82+ date_max_limit += relativedelta(days=1)
83+
84 exdate = data['exdate'] and data['exdate'].split(',') or []
85 rrule_str = data['rrule']
86- new_rrule_str = []
87- rrule_until_date = False
88- is_until = False
89- for rule in rrule_str.split(';'):
90- name, value = rule.split('=')
91- if name == "UNTIL":
92- is_until = True
93- value = parser.parse(value)
94- rrule_until_date = parser.parse(value.strftime("%Y-%m-%d %H:%M:%S"))
95- value = value.strftime("%Y%m%d%H%M%S")
96- new_rule = '%s=%s' % (name, value)
97- new_rrule_str.append(new_rule)
98- new_rrule_str = ';'.join(new_rrule_str)
99+ new_rrule_str = force_recurrent_dates_until(rrule_str, until_max=date_max_limit)
100 rdates = get_recurrent_dates(str(new_rrule_str), exdate, event_date, data['exrule'])
101+ count = 0
102 for r_date in rdates:
103 ok = True
104 for arg in domain:
105@@ -1167,6 +1214,9 @@
106 continue
107 idval = real_id2base_calendar_id(data['id'], r_date.strftime("%Y-%m-%d %H:%M:%S"))
108 result.append(idval)
109+ if limit and count > limit:
110+ # do not compute more than `limit` number of recurrent dates per event
111+ break
112
113 if isinstance(select, (str, int, long)):
114 return ids and ids[0] or False