Merge pull request #58 from fscs/none-returned-as-string

Fix string "None" being set as summary instead of object None
pull/61/head
Thomas Irgang 2019-08-20 08:04:36 +02:00 zatwierdzone przez GitHub
commit aa1b4f7fe1
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 4AEE18F83AFDEB23
3 zmienionych plików z 36 dodań i 13 usunięć

Wyświetl plik

@ -4,12 +4,14 @@ Parse iCal data to Events.
# for UID generation
from random import randint
from datetime import datetime, timedelta, date
from typing import Optional
from dateutil.relativedelta import relativedelta
from dateutil.rrule import rrule, rruleset, rrulestr
from dateutil.tz import UTC, gettz
from icalendar import Calendar
from icalendar.prop import vDDDLists
from icalendar.prop import vDDDLists, vText
def now():
@ -125,6 +127,15 @@ class Event:
return ne
def encode(value: Optional[vText]) -> Optional[str]:
if value is None:
return None
try:
return str(value)
except UnicodeEncodeError:
return str(value.encode('utf-8'))
def create_event(component, tz=UTC):
"""
Create an event from its iCal representation.
@ -145,21 +156,12 @@ def create_event(component, tz=UTC):
else: # compute implicit end as start + 0
event.end = event.start
try:
event.summary = str(component.get('summary'))
except UnicodeEncodeError as e:
event.summary = str(component.get('summary').encode('utf-8'))
try:
event.description = str(component.get('description'))
except UnicodeEncodeError as e:
event.description = str(component.get('description').encode('utf-8'))
event.summary = encode(component.get('summary'))
event.description = encode(component.get('description'))
event.all_day = type(component.get('dtstart').dt) is date
if component.get('rrule'):
event.recurring = True
try:
event.location = str(component.get('location'))
except UnicodeEncodeError as e:
event.location = str(component.get('location').encode('utf-8'))
event.location = encode(component.get('location'))
if component.get('attendee'):
event.attendee = component.get('attendee')

Wyświetl plik

@ -0,0 +1,10 @@
BEGIN:VCALENDAR
BEGIN:VTIMEZONE
TZID:Europe/Berlin
END:VTIMEZONE
BEGIN:VEVENT
DTSTART;VALUE=DATE:20181030
DTEND;VALUE=DATE:20181031
RRULE:FREQ=WEEKLY;BYDAY=TU
END:VEVENT
END:VCALENDAR

Wyświetl plik

@ -223,6 +223,17 @@ class ICalEventsTests(unittest.TestCase):
self.assertIsNotNone(search(r"hours left", str(e2.copy_to(n + relativedelta(hours=3)))), "stringify future event")
self.assertIsNotNone(search(r"days left", str(e2.copy_to(n + relativedelta(days=3)))), "stringify future event")
def test_events_no_description(self):
ical = "test/test_data/no_description.ics"
start = date(2018, 10, 15)
end = date(2018, 11, 15)
e1 = icalevents.events(file=ical, start=start, end=end)[0]
self.assertEqual(e1.description, None)
self.assertEqual(e1.summary, None)
self.assertEqual(e1.location, None)
def test_event_created_last_modified(self):
ical = "test/test_data/created_last_modified.ics"
start = date(2017, 7, 12)