0001-agendas-treat-remote-ICS-as-UTF-8-if-it-looks-like-i.patch
chrono/agendas/models.py | ||
---|---|---|
578 | 578 | |
579 | 579 |
if source is None: |
580 | 580 |
source = TimePeriodExceptionSource(desk=self, ics_url=ics_url) |
581 |
try: |
|
582 |
# override response encoding received in HTTP headers as it may |
|
583 |
# often be missing and defaults to iso-8859-15. |
|
584 |
response.content.decode('utf-8') |
|
585 |
response.encoding = 'utf-8' |
|
586 |
except UnicodeDecodeError as e: |
|
587 |
pass |
|
581 | 588 |
return self._import_timeperiod_exceptions_from_ics(source=source, data=response.text) |
582 | 589 | |
583 | 590 |
def import_timeperiod_exceptions_from_ics_file(self, ics_file, source=None): |
tests/test_agendas.py | ||
---|---|---|
30 | 30 |
DTSTART:20170831T170800Z |
31 | 31 |
DTEND:20170831T203400Z |
32 | 32 |
SEQUENCE:1 |
33 |
SUMMARY:Event 1
|
|
33 |
SUMMARY:Événement 1
|
|
34 | 34 |
END:VEVENT |
35 | 35 |
BEGIN:VEVENT |
36 | 36 |
DTSTAMP:20170824T092855Z |
... | ... | |
211 | 211 |
ics_sample = ContentFile("\n".join(lines), name='sample.ics') |
212 | 212 |
with pytest.raises(ICSError) as e: |
213 | 213 |
desk.import_timeperiod_exceptions_from_ics_file(ics_sample) |
214 |
assert 'Event "Event 1" has no start date.' == str(e.value)
|
|
214 |
assert 'Event "Événement 1" has no start date.' == str(e.value)
|
|
215 | 215 | |
216 | 216 | |
217 | 217 |
def test_timeperiodexception_creation_from_ics_without_enddt(): |
... | ... | |
299 | 299 |
mocked_get.return_value = mocked_response |
300 | 300 |
exceptions_count = desk.import_timeperiod_exceptions_from_remote_ics('http://example.com/sample.ics') |
301 | 301 |
assert exceptions_count == 2 |
302 |
assert 'Événement 1' in [x.label for x in desk.timeperiodexception_set.all()] |
|
302 | 303 | |
303 | 304 |
mocked_response.text = ICS_SAMPLE_WITH_NO_EVENTS |
304 | 305 |
mocked_get.return_value = mocked_response |
... | ... | |
307 | 308 |
assert str(e.value) == "The file doesn't contain any events." |
308 | 309 | |
309 | 310 | |
311 |
@mock.patch('chrono.agendas.models.requests.get') |
|
312 |
def test_timeperiodexception_remote_ics_encoding(mocked_get): |
|
313 |
agenda = Agenda(label=u'Test 8 agenda') |
|
314 |
agenda.save() |
|
315 |
desk = Desk(label='Test 8 desk', agenda=agenda) |
|
316 |
desk.save() |
|
317 |
mocked_response = mock.Mock() |
|
318 |
mocked_response.content = ICS_SAMPLE.encode('iso-8859-15') |
|
319 |
mocked_response.text = ICS_SAMPLE |
|
320 |
mocked_get.return_value = mocked_response |
|
321 |
exceptions_count = desk.import_timeperiod_exceptions_from_remote_ics('http://example.com/sample.ics') |
|
322 |
assert exceptions_count == 2 |
|
323 |
assert 'Événement 1' in [x.label for x in desk.timeperiodexception_set.all()] |
|
324 | ||
325 | ||
310 | 326 |
@mock.patch('chrono.agendas.models.requests.get') |
311 | 327 |
def test_timeperiodexception_creation_from_unreachable_remote_ics(mocked_get): |
312 | 328 |
agenda = Agenda(label=u'Test 9 agenda') |
313 |
- |