api: use correct DATE-TIME type for datetime values in ics (#64881)

This commit is contained in:
Frédéric Péters 2022-05-06 14:19:02 +02:00
parent 2ab6ed3a96
commit 5c0201e722
2 changed files with 32 additions and 1 deletions

View File

@ -102,6 +102,7 @@ def ics_data(local_user):
formdef.fields = [
fields.StringField(id='0', label='foobar', varname='foobar'),
fields.StringField(id='1', label='foobar2', varname='foobar2'),
fields.DateField(id='2', type='date', label='date', varname='date'),
]
formdef.digest_templates = {'default': 'plöp {{ form_var_foobar }} plÔp'}
formdef.store()
@ -114,6 +115,7 @@ def ics_data(local_user):
formdata = data_class()
formdata.data = {'0': (date + datetime.timedelta(days=i)).strftime('%Y-%m-%d %H:%M')}
formdata.data['1'] = (date + datetime.timedelta(days=i, minutes=i + 1)).strftime('%Y-%m-%d %H:%M')
formdata.data['2'] = (datetime.date(2014, 1, 20) + datetime.timedelta(days=i)).timetuple()
formdata.user_id = local_user.id
formdata.just_created()
if i % 3 == 0:
@ -2655,6 +2657,20 @@ def test_api_ics_formdata_custom_view(pub, local_user, ics_data):
assert resp.text.count('DTEND') == 10
def test_api_ics_formdata_dtstart_type(pub, local_user, ics_data):
role = pub.role_class.select()[0]
local_user.roles = [role.id]
local_user.store()
resp = get_app(pub).get(sign_uri('/api/forms/test/ics/date/date/', user=local_user))
assert 'DTSTART;VALUE=DATE:20140123\r\n' in resp.text
assert 'DTEND;VALUE=DATE:20140123\r\n' in resp.text
resp = get_app(pub).get(sign_uri('/api/forms/test/ics/foobar/foobar/', user=local_user))
assert 'DTSTART;VALUE=DATE-TIME:20140123T120000\r\n' in resp.text
assert 'DTEND;VALUE=DATE-TIME:20140123T120000\r\n' in resp.text
def test_api_invalid_http_basic_auth(pub, local_user, admin_user, ics_data):
app = get_app(pub)
app.get(

View File

@ -2549,11 +2549,15 @@ class FormPage(Directory):
start_date_field_id = None
end_date_field_id = None
start_date_field_type = None
end_date_field_type = None
for field in formdef.get_all_fields():
if getattr(field, 'varname', None) == start_date_field_varname:
start_date_field_id = field.id
start_date_field_type = field.type
if end_date_field_varname and getattr(field, 'varname', None) == end_date_field_varname:
end_date_field_id = field.id
end_date_field_type = field.type
if not start_date_field_id:
raise errors.TraversalError()
@ -2576,9 +2580,13 @@ class FormPage(Directory):
continue
try:
dtstart = make_datetime(formdata.data[start_date_field_id])
if start_date_field_type == 'date':
dtstart = dtstart.date()
dtend = None
if end_date_field_id and formdata.data.get(end_date_field_id):
dtend = make_datetime(formdata.data[end_date_field_id])
if end_date_field_type == 'date':
dtend = dtend.date()
except ValueError:
continue
@ -2593,9 +2601,16 @@ class FormPage(Directory):
summary += ' - %s' % force_text(formdata.default_digest, charset)
vevent.add('summary').value = summary
vevent.add('dtstart').value = dtstart
if isinstance(dtstart, datetime.datetime):
vevent.dtstart.value_param = 'DATE-TIME'
else:
vevent.dtstart.value_param = 'DATE'
if dtend:
vevent.add('dtend').value = dtend
vevent.dtstart.value_param = 'DATE'
if isinstance(dtend, datetime.datetime):
vevent.dtend.value_param = 'DATE-TIME'
else:
vevent.dtend.value_param = 'DATE'
backoffice_url = formdata.get_url(backoffice=True)
vevent.add('url').value = backoffice_url
form_name = force_text(formdef.name, charset)