Skip to content

Commit db98a1d

Browse files
committed
Imported events with no DTEND or DURATION will now last one hour (for DATETIME) or one day (for DATE). Fixes #1071
1 parent 4493273 commit db98a1d

File tree

4 files changed

+17
-9
lines changed

4 files changed

+17
-9
lines changed

CHANGELOG.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ not released
1616
* CHANGE ikhal: tab (and shift tab) jump from the events back to the calendar
1717
* NEW Add symbol for events with at least one alarm
1818
* FIX URL can now be set/updated from ikhal
19+
* FIX Imported events without an end or duration will now last one day if
20+
`DTSTART` is a date (as per RFC) or one hour if it is a datetime.
1921

2022
0.10.3
2123
======

khal/icalendar.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -413,8 +413,9 @@ def sanitize_timerange(dtstart, dtend, duration=None):
413413

414414
if dtend is None and duration is None:
415415
if isinstance(dtstart, dt.datetime):
416-
dtstart = dtstart.date()
417-
dtend = dtstart + dt.timedelta(days=1)
416+
dtend = dtstart + dt.timedelta(hours=1)
417+
else:
418+
dtend = dtstart + dt.timedelta(days=1)
418419
elif dtend is not None:
419420
if dtend < dtstart:
420421
raise ValueError('The event\'s end time (DTEND) is older than '
@@ -424,7 +425,10 @@ def sanitize_timerange(dtstart, dtend, duration=None):
424425
"Event start time and end time are the same. "
425426
"Assuming the event's duration is one hour."
426427
)
427-
dtend += dt.timedelta(hours=1)
428+
if isinstance(dtstart, dt.datetime):
429+
dtend += dt.timedelta(hours=1)
430+
else:
431+
dtend += dt.timedelta(days=1)
428432

429433
return dtstart, dtend
430434

tests/backend_test.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -564,11 +564,13 @@ def test_no_dtend():
564564
"""test support for events with no dtend"""
565565
db = backend.SQLiteDb([calname], ':memory:', locale=LOCALE_BERLIN)
566566
db.update(_get_text('event_dt_no_end'), href='event_dt_no_end', calendar=calname)
567-
events = db.get_floating(
568-
dt.datetime(2016, 1, 16, 0, 0), dt.datetime(2016, 1, 17, 0, 0))
567+
events = db.get_localized(
568+
BERLIN.localize(dt.datetime(2016, 1, 16, 0, 0)),
569+
BERLIN.localize(dt.datetime(2016, 1, 17, 0, 0)),
570+
)
569571
event = list(events)[0]
570-
assert event[2] == dt.date(2016, 1, 16)
571-
assert event[3] == dt.date(2016, 1, 17)
572+
assert event[2] == BERLIN.localize(dt.datetime(2016, 1, 16, 8, 0))
573+
assert event[3] == BERLIN.localize(dt.datetime(2016, 1, 16, 9, 0))
572574

573575

574576
event_rdate_period = """BEGIN:VEVENT

tests/khalendar_utils_test.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -791,8 +791,8 @@ def test_noend_date(self):
791791
def test_noend_datetime(self):
792792
vevent = _get_vevent(noend_datetime)
793793
vevent = icalendar_helpers.sanitize(vevent, berlin, '', '')
794-
assert vevent['DTSTART'].dt == dt.date(2014, 8, 29)
795-
assert vevent['DTEND'].dt == dt.date(2014, 8, 30)
794+
assert vevent['DTSTART'].dt == BERLIN.localize(dt.datetime(2014, 8, 29, 8))
795+
assert vevent['DTEND'].dt == BERLIN.localize(dt.datetime(2014, 8, 29, 9))
796796

797797
def test_duration(self):
798798
vevent = _get_vevent_file('event_dtr_exdatez')

0 commit comments

Comments
 (0)