visit_time_ranges() reuses a single "original_duration" variable for two unrelated purposes: the DTSTART->DUE span and the CREATED->COMPLETED span. When a VTODO carries all four properties (a completed task, which most clients write with CREATED and COMPLETED), the second assignment clobbers the first, and the DTSTART/DUE branch of the rfc4791-9.9 table then reconstructs DUE as DTSTART + (COMPLETED - CREATED). The elif chain already implements the RFC table correctly (DTSTART/DUE take precedence over CREATED/COMPLETED), so the CREATED/COMPLETED value is never wanted there. Keep it in its own variable. Effect: such a VTODO is filtered against a bogus interval, both in calendar-query REPORT and in item.find_time_range() (the enclosing range cached for the storage prefilter), so completed tasks go missing from - or wrongly appear in - client results. Co-Authored-By: Claude <noreply@anthropic.com>
14 lines
253 B
Plaintext
14 lines
253 B
Plaintext
BEGIN:VCALENDAR
|
|
VERSION:2.0
|
|
PRODID:-//Radicale//NONSGML Radicale Server//EN
|
|
BEGIN:VTODO
|
|
UID:todo10
|
|
SUMMARY:todo10
|
|
DTSTART:20130901T180000Z
|
|
DUE:20130903T180000Z
|
|
CREATED:20130901T170000Z
|
|
COMPLETED:20130901T173000Z
|
|
STATUS:COMPLETED
|
|
END:VTODO
|
|
END:VCALENDAR
|