Skip to content

Commit 9f60ff3

Browse files
author
jomae
committed
1.7.1dev: merge [17887] from 1.6-stable (fix for #13871)
git-svn-id: http://trac.edgewall.org/intertrac/log:/trunk@17888 af82e41b-90c4-0310-8c96-b1721e28e2e2
2 parents 0b0526b + 1f26eed commit 9f60ff3

File tree

2 files changed

+51
-9
lines changed

2 files changed

+51
-9
lines changed

trac/timeline/tests/web_ui.py

+50-8
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ def test_daysback_less_than_min(self):
169169

170170
data = TimelineModule(self.env).process_request(req)[1]
171171

172-
self.assertEqual(1, data['daysback'])
172+
self.assertEqual(0, data['daysback'])
173173

174174
def test_daysback_greater_than_max(self):
175175
"""Daysback is limited to [timeline] max_daysback."""
@@ -219,13 +219,15 @@ class TimelineEventProvider(Component):
219219
implements(ITimelineEventProvider)
220220

221221
def __init__(self):
222-
self._events = None
222+
self._events = ()
223223

224224
def get_timeline_filters(self, req):
225225
yield ('test', 'Test')
226226

227227
def get_timeline_events(self, req, start, stop, filters):
228-
return iter(self._events or ())
228+
for event in self._events:
229+
if start <= event[1] <= stop:
230+
yield event
229231

230232
def render_timeline_event(self, context, field, event):
231233
return event[3].render(context, field, event)
@@ -263,15 +265,16 @@ def render(context, field, event):
263265
if field == 'description':
264266
return tag(tag.h1('Title 2nd'), tag.p('body & < >'))
265267

266-
provider = self.timeline_event_providers['normal'](self.env)
268+
provider = self._get_event_provider('normal')
267269
provider._events = [
268270
('test&1', datetime(2018, 4, 27, 12, 34, 56, 123456, utc),
269271
'jo&hn', Mock(render=render)),
270272
('test&2', datetime(2018, 3, 19, 23, 56, 12, 987654, utc),
271273
'Joe <[email protected]>', Mock(render=render)),
272274
]
273-
req = MockRequest(self.env, path_info='/timeline',
274-
args={'format': 'rss'})
275+
req = MockRequest(self.env, path_info='/timeline', tz=utc,
276+
args={'format': 'rss', 'daysback': '90',
277+
'from': '2018-04-30T00:00:00Z'})
275278
rv = self._process_request(req)
276279
self.assertEqual('timeline.rss', rv[0])
277280
self.assertEqual({'content_type': 'application/rss+xml'}, rv[2])
@@ -307,10 +310,49 @@ def render(context, field, event):
307310
self.assertEqual('<?xml version="1.0"?>', output[:21])
308311
minidom.parseString(output) # verify valid xml
309312

313+
def test_daysback(self):
314+
provider = self._get_event_provider('normal')
315+
base_datetime = datetime(2025, 2, 20, 12, tzinfo=utc)
316+
provider._events = [
317+
('test', base_datetime - timedelta(days=days), 'trac', None)
318+
for days in range(-30, 120)
319+
]
320+
321+
def render_and_get_events(daysback):
322+
req = MockRequest(self.env, path_info='/timeline', tz=utc,
323+
args={'from': '2025-02-19T12:34:56.012345Z',
324+
'daysback': daysback})
325+
rv = self._process_request(req)
326+
data = rv[1]
327+
return data['events']
328+
329+
def get_datetimes(events):
330+
return [event['datetime'] for event in events]
331+
332+
events = render_and_get_events('0')
333+
self.assertEqual([datetime(2025, 2, 19, 12, tzinfo=utc)],
334+
get_datetimes(events))
335+
336+
events = render_and_get_events('1')
337+
self.assertEqual([datetime(2025, 2, 19, 12, tzinfo=utc),
338+
datetime(2025, 2, 18, 12, tzinfo=utc)],
339+
get_datetimes(events))
340+
341+
events = render_and_get_events('90')
342+
self.assertEqual(datetime(2024, 11, 21, 12, tzinfo=utc),
343+
get_datetimes(events)[-1])
344+
self.assertEqual(91, len(events))
345+
346+
events = render_and_get_events('91')
347+
self.assertEqual(datetime(2024, 11, 21, 12, tzinfo=utc),
348+
get_datetimes(events)[-1])
349+
self.assertEqual(91, len(events))
350+
351+
def _get_event_provider(self, name):
352+
return self.timeline_event_providers[name](self.env)
353+
310354
def _process_request(self, req):
311355
mod = TimelineModule(self.env)
312-
req = MockRequest(self.env, path_info='/timeline',
313-
args={'format': 'rss'})
314356
self.assertTrue(mod.match_request(req))
315357
return mod.process_request(req)
316358

trac/timeline/web_ui.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ def process_request(self, req):
136136
pref = req.session.as_int('timeline.daysback', self.default_daysback)
137137
default = 90 if format == 'rss' else pref
138138
daysback = req.args.as_int('daysback', default,
139-
min=1, max=self.max_daysback)
139+
min=0, max=self.max_daysback)
140140

141141
authors = req.args.get('authors')
142142
if authors is None and format != 'rss':

0 commit comments

Comments
 (0)