Searching also returns full-day events of adjacent days
Maintainer thường phản hồi trong vòng 1 ngày
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức phù hợp với người mới
- 48/100
Hướng nghiên cứu
Start by reproducing the reported cases with the supplied calendar.search(start=..., end=..., event=True, expand=True) calls, then read the implementation and documentation for search() and its handling of full-day events and timezones. Done means searches return the expected events for the reported dates and timezone variants; clarify the intended CalDAV behavior before choosing a fix.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Problem:
I'm trying to find all events that occur today or later. In some cases, events from yesterday are returned.
I'm not completely sure if this is a bug or just the way CalDAV works, but at least it's not what I expected.
Test setup: There are there are three full-day events in the calendar, on 18.,19.,20.08.25. I created them with Thunderbird, the server is Baikal. I did not specify a timezone (nor could I for full-day events).
Code:
from datetime import datetime, timedelta, date, timezone
import caldav
url = "..."
username = "..."
password = "..."
client = caldav.DAVClient(url, username=username, password=password)
principal = client.principal()
calendars = principal.calendars()
calendar = next(cal for cal in calendars if cal.name == "Test-Cal")
# there are three full-day events in the calendar, on 18.,19.,20.08.25
dates = [
datetime(year=2025, month=8, day=17, hour=0, minute=10),
datetime(year=2025, month=8, day=17, hour=0, minute=10, tzinfo=timezone(timedelta(hours=2))),
datetime(year=2025, month=8, day=17, hour=0, minute=10, tzinfo=timezone(timedelta(hours=0))),
datetime(year=2025, month=8, day=17, hour=0, minute=0),
datetime(year=2025, month=8, day=17, hour=0, minute=0, tzinfo=timezone(timedelta(hours=2))),
datetime(year=2025, month=8, day=17, hour=0, minute=0, tzinfo=timezone(timedelta(hours=0))),
]
for test_time in dates:
print("Testing with", test_time)
print(" | 18 | 19 | 20 |")
for i in range(4):
print(f" +{i} |", end="")
t = test_time + timedelta(days=i)
results = calendar.search(start=t, end=t + timedelta(days=1), event=True, expand=True, sort_keys="dtstart")
summaries = [e.instance.vevent.summary.value for e in results]
for j in range(1, 4):
if f"Test{j}" in summaries:
print(f" X |", end="")
else:
print(f" |", end="")
print()
Output (with comments from me). Expected would be a diagonal in the last three lines.
Testing with 2025-08-17 00:10:00 //my actual code, running in UTC+2 just after midnight
| 18 | 19 | 20 |
+0 | | | |
+1 | X | | |
+2 | X | X | | //the bug I noticed
+3 | | X | X |
Testing with 2025-08-17 00:10:00+02:00 //add the timezone explicitly
| 18 | 19 | 20 |
+0 | | | |
+1 | X | | |
+2 | X | X | | //no change
+3 | | X | X |
Testing with 2025-08-17 00:10:00+00:00 //now in UTC
| 18 | 19 | 20 |
+0 | X | | | //this is correct b/c 00:10+1d contains the next day!
+1 | X | X | |
+2 | | X | X |
+3 | | | X |
Testing with 2025-08-17 00:00:00 // test on exactly midnight
| 18 | 19 | 20 |
+0 | | | |
+1 | X | | |
+2 | X | X | | //same problem
+3 | | X | X |
Testing with 2025-08-17 00:00:00+02:00
| 18 | 19 | 20 |
+0 | | | |
+1 | X | | |
+2 | X | X | | //dito
+3 | | X | X |
Testing with 2025-08-17 00:00:00+00:00 //midnight, UTC
| 18 | 19 | 20 |
+0 | | | |
+1 | X | | | //correct!
+2 | | X | |
+3 | | | X |
This is the pattern I could make up from this:
- without timezone infos, the datetime gets interpreted in the local timezone
- before matching against full-day events in the calendar, dates are shifted to UTC
- this causes the dates to move to the previous day
This is just my guesswork, someone with more insight to CalDAV can probably make more sense out of this.
- Ngôn ngữ chính
- Python
- Star
- 412
- Fork
- 113
- Merge trung bình
- 10 giờ 29 phút
- Pull request đã merge (30 ngày)
- 57
Chuẩn bị môi trường
- Không có Dockerfile hay tệp Docker Compose
- Không có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của python-caldav/caldav
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
python-caldav/caldav#792 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
python-caldav/caldav#788 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 62/100
python-caldav/caldav#687 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 3/5 1-2 ngày Mức phù hợp với người mới 75/100
python-caldav/caldav#796 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 48/100
python-caldav/caldav#784 · 2 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
Tất cả issue của python-caldav/caldav
Issue tương tự
-
bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
ansys/pyansys-common-mcp#213 ·
Maintainer thường phản hồi trong vòng 3 ngày
-
bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 67/100
freedomofpress/dangerzone#1594 ·
Maintainer thường phản hồi trong vòng 3 ngày
-
priority:P1 status:in-review type:bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
randomparity/kdive#3317 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
area:ci
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 90/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 66/100
mesonbuild/meson#16281 ·
Maintainer thường phản hồi trong vòng 1 ngày