Skip to content

Commit 9df0994

Browse files
committed
Add ical download/subscription for important dates for meetings,
similar to the existing meeting view - Legacy-Id: 18419
1 parent ca05791 commit 9df0994

5 files changed

Lines changed: 64 additions & 7 deletions

File tree

ietf/meeting/tests_views.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -585,6 +585,16 @@ def test_important_dates(self):
585585
post_date = meeting.importantdate_set.get(name=idn).date
586586
self.assertEqual(pre_date, post_date+datetime.timedelta(days=1))
587587

588+
def test_important_dates_ical(self):
589+
meeting = MeetingFactory(type_id='ietf')
590+
meeting.show_important_dates = True
591+
meeting.save()
592+
populate_important_dates(meeting)
593+
url = urlreverse('ietf.meeting.views.important_dates', kwargs={'num': meeting.number, 'output_format': 'ics'})
594+
r = self.client.get(url)
595+
for d in meeting.importantdate_set.all():
596+
self.assertContains(r, d.date.isoformat())
597+
588598
def test_group_ical(self):
589599
meeting = make_meeting_test_data()
590600
s1 = Session.objects.filter(meeting=meeting, group__acronym="mars").first()

ietf/meeting/urls.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@
104104
url(r'^proceedings/overview/$', views.proceedings_overview),
105105
url(r'^proceedings/progress-report/$', views.proceedings_progress_report),
106106
url(r'^important-dates/$', views.important_dates),
107-
107+
url(r'^important-dates.(?P<output_format>ics)$', views.important_dates),
108108
]
109109

110110
urlpatterns = [

ietf/meeting/views.py

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3582,7 +3582,7 @@ def err(code, text):
35823582
return HttpResponse("Done", status=200, content_type='text/plain')
35833583

35843584

3585-
def important_dates(request, num=None):
3585+
def important_dates(request, num=None, output_format=None):
35863586
assert num is None or num.isdigit()
35873587
preview_roles = ['Area Director', 'Secretariat', 'IETF Chair', 'IAD', ]
35883588

@@ -3602,8 +3602,24 @@ def important_dates(request, num=None):
36023602
or (user and user.is_authenticated and has_role(user, preview_roles))):
36033603
meetings.append(future_meeting)
36043604

3605-
context={'meetings':meetings}
3606-
return render(request, 'meeting/important-dates.html', context)
3605+
if output_format == 'ics':
3606+
for m in meetings:
3607+
m.cached_updated = m.updated()
3608+
m.important_dates = m.importantdate_set.prefetch_related("name")
3609+
for d in m.important_dates:
3610+
d.midnight_cutoff = "UTC 23:59" in d.name.name
3611+
3612+
ics = render_to_string('meeting/important_dates.ics', {
3613+
'meetings': meetings,
3614+
}, request=request)
3615+
# icalendar response file should have '\r\n' line endings per RFC5545
3616+
response = HttpResponse(re.sub("\r(?!\n)|(?<!\r)\n", "\r\n", ics), content_type='text/calendar')
3617+
response['Content-Disposition'] = 'attachment; filename="important-dates.ics"'
3618+
return response
3619+
3620+
return render(request, 'meeting/important-dates.html', {
3621+
'meetings': meetings
3622+
})
36073623

36083624
TimeSlotTypeForm = modelform_factory(TimeSlot, fields=('type',))
36093625

ietf/templates/meeting/important-dates.html

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,18 @@
44

55
{% load ietf_filters static %}
66

7-
{% block title %}IETF {{meetings.0.number}} : Important Dates{% endblock %}
7+
{% block title %}IETF {{meetings.0.number}}: Important Dates{% endblock %}
88

99
{% block content %}
1010
{% origin %}
11-
<h2>Important Dates</h2>
11+
<h1>Important Dates</h1>
12+
13+
<p>iCalendar: <a href="webcal://{{request.get_host}}{% url 'ietf.meeting.views.important_dates' output_format='ics' %}">webcal subscription</a>
14+
&middot; <a href="{% url 'ietf.meeting.views.important_dates' output_format='ics' %}">download</a>
15+
</p>
16+
1217
{% for meeting in meetings %}
13-
<h3>IETF {{meeting.number}} : {{ meeting.date}}, {{meeting.city}}, {{meeting.country}}</h3>
18+
<h3>IETF {{meeting.number}}: {{ meeting.date}}, {{meeting.city}}, {{meeting.country}}</h3>
1419
<ul>
1520
{% with first=forloop.first %}
1621
{% for d in meeting.importantdate_set.all %}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
{% load humanize %}{% autoescape off %}{% load ietf_filters %}BEGIN:VCALENDAR
2+
VERSION:2.0
3+
METHOD:PUBLISH
4+
PRODID:-//IETF//datatracker.ietf.org ical importantdates//EN
5+
{% for meeting in meetings %}{% for d in meeting.important_dates %}BEGIN:VEVENT
6+
UID:ietf-{{ meeting.number }}-{{ d.name_id }}-{{ d.date.isoformat }}
7+
SUMMARY:IETF {{ meeting.number }}: {{ d.name.name }}
8+
CLASS:PUBLIC
9+
DTSTART{% if not d.midnight_cutoff %};VALUE=DATE{% endif %}:{{ d.date|date:"Ymd" }}{% if d.midnight_cutoff %}235900Z{% endif %}
10+
DTSTAMP:{{ meeting.cached_updated|date:"Ymd" }}T{{ meeting.cached_updated|date:"His" }}Z
11+
DESCRIPTION:{{ d.name.desc }} {% if first and d.name.slug == 'openreg' or first and d.name.slug == 'earlybird' %}
12+
Register here: https://www.ietf.org/how/meetings/register/{% endif %}{% if d.name.slug == 'opensched' %}
13+
To request a Working Group session, use the IETF Meeting Session Request Tool:
14+
{{ request.scheme }}://{{ request.get_host}}{% url 'ietf.secr.sreq.views.main' %}
15+
If you are working on a BoF request, it is highly recommended to tell the IESG
16+
now by sending an email to iesg@ietf.org to get advance help with the request.{% endif %}{% if d.name.slug == 'cutoffwgreq' %}
17+
To request a Working Group session, use the IETF Meeting Session Request Tool:
18+
{{ request.scheme }}://{{ request.get_host }}{% url 'ietf.secr.sreq.views.main' %}{% endif %}{% if d.name.slug == 'cutoffbofreq' %}
19+
To request a BOF, please see instructions on Requesting a BOF:
20+
https://www.ietf.org/how/bofs/bof-procedures/{% endif %}{% if d.name.slug == 'idcutoff' %}
21+
Upload using the ID Submission Tool:
22+
{{ request.scheme }}://{{ request.get_host }}{% url 'ietf.submit.views.upload_submission' %}{% endif %}{% if d.name.slug == 'draftwgagenda' or d.name.slug == 'revwgagenda' or d.name.slug == 'procsub' or d.name.slug == 'revslug' %}
23+
Upload using the Meeting Materials Management Tool:
24+
{{ request.scheme }}://{{ request.get_host }}{% url 'ietf.meeting.views.materials' num=meeting.number %}{% endif %}
25+
END:VEVENT
26+
{% endfor %}{% endfor %}END:VCALENDAR{% endautoescape %}

0 commit comments

Comments
 (0)