kopia lustrzana https://github.com/jazzband/icalevents
Merge pull request #58 from fscs/none-returned-as-string
Fix string "None" being set as summary instead of object Nonepull/61/head
commit
aa1b4f7fe1
|
@ -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')
|
||||
|
|
|
@ -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
|
|
@ -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)
|
||||
|
|
Ładowanie…
Reference in New Issue