From 7d59456103d057cb76c37d36b011577d39cf467f Mon Sep 17 00:00:00 2001 From: Jennifer Richards Date: Wed, 22 Sep 2021 21:52:21 +0000 Subject: [PATCH] Update links in iCal description to be more useful. Fixes #3349. Commit ready for merge. - Legacy-Id: 19384 --- ietf/doc/templatetags/ietf_filters.py | 10 +++++++++- ietf/meeting/tests_views.py | 16 +++++++++++++--- ietf/templates/meeting/agenda.ics | 16 +++++++++++----- 3 files changed, 33 insertions(+), 9 deletions(-) diff --git a/ietf/doc/templatetags/ietf_filters.py b/ietf/doc/templatetags/ietf_filters.py index cf4785f62..d59a13ef6 100644 --- a/ietf/doc/templatetags/ietf_filters.py +++ b/ietf/doc/templatetags/ietf_filters.py @@ -5,6 +5,7 @@ import bleach import datetime import re +from urllib.parse import urljoin from email.utils import parseaddr @@ -413,7 +414,6 @@ def format_snippet(text, trunc_words=25): @register.simple_tag def doc_edit_button(url_name, *args, **kwargs): """Given URL name/args/kwargs, looks up the URL just like "url" tag and returns a properly formatted button for the document material tables.""" - from django.urls import reverse as urlreverse return mark_safe('Edit' % (urlreverse(url_name, args=args, kwargs=kwargs))) @register.filter @@ -613,3 +613,11 @@ def action_holder_badge(action_holder): else: return '' # no alert needed + +@register.simple_tag +def absurl(viewname, **kwargs): + """Get the absolute URL for a view by name + + Uses settings.IDTRACKER_BASE_URL as the base. + """ + return urljoin(settings.IDTRACKER_BASE_URL, urlreverse(viewname, kwargs=kwargs)) \ No newline at end of file diff --git a/ietf/meeting/tests_views.py b/ietf/meeting/tests_views.py index 44a32bddd..eb7a61b1b 100644 --- a/ietf/meeting/tests_views.py +++ b/ietf/meeting/tests_views.py @@ -247,6 +247,7 @@ class MeetingTests(BaseMeetingTestCase): # iCal r = self.client.get(urlreverse("ietf.meeting.views.agenda_ical", kwargs=dict(num=meeting.number)) + "?show=" + session.group.parent.acronym.upper()) + assert_ical_response_is_valid(self, r) self.assertContains(r, session.group.acronym) self.assertContains(r, session.group.name) self.assertContains(r, slot.location.name) @@ -254,9 +255,18 @@ class MeetingTests(BaseMeetingTestCase): self.assertContains(r, "END:VTIMEZONE") self.assertContains(r, session.agenda().get_href()) - self.assertContains(r, session.materials.filter(type='slides').exclude(states__type__slug='slides',states__slug='deleted').first().get_href()) - # TODO - the ics view uses .all on a queryset in a view so it's showing the deleted slides. - #self.assertNotContains(r, session.materials.filter(type='slides',states__type__slug='slides',states__slug='deleted').first().get_absolute_url()) + self.assertContains( + r, + urlreverse( + 'ietf.meeting.views.session_details', + kwargs=dict(num=meeting.number, acronym=session.group.acronym)), + msg_prefix='ical should contain link to meeting materials page for session') + self.assertContains( + r, + urlreverse( + 'ietf.meeting.views.agenda', kwargs=dict(num=meeting.number) + ) + f'#row-{session.official_timeslotassignment().slug()}', + msg_prefix='ical should contain link to agenda entry for session') # week view r = self.client.get(urlreverse("ietf.meeting.views.week_view", kwargs=dict(num=meeting.number))) diff --git a/ietf/templates/meeting/agenda.ics b/ietf/templates/meeting/agenda.ics index d0a23972f..4f207afae 100644 --- a/ietf/templates/meeting/agenda.ics +++ b/ietf/templates/meeting/agenda.ics @@ -1,4 +1,4 @@ -{% load humanize %}{% autoescape off %}{% load ietf_filters %}{% load cache %}{% cache 1800 ietf_meeting_agenda_ics schedule.meeting.number request.path request.GET %}BEGIN:VCALENDAR +{% load humanize %}{% autoescape off %}{% load ietf_filters textfilters %}{% load cache %}{% cache 1800 ietf_meeting_agenda_ics schedule.meeting.number request.path request.GET %}BEGIN:VCALENDAR VERSION:2.0 METHOD:PUBLISH PRODID:-//IETF//datatracker.ietf.org ical agenda//EN @@ -14,9 +14,15 @@ DTSTAMP:{{ item.timeslot.modified|date:"Ymd" }}T{{ item.timeslot.modified|date:" URL:{{item.session.agenda.get_versionless_href}}{% endif %} DESCRIPTION:{{item.timeslot.name|ics_esc}}\n{% if item.session.agenda_note %} Note: {{item.session.agenda_note|ics_esc}}\n{% endif %}{% if item.timeslot.location.webex_url %} - Webex: {{ item.timeslot.location.webex_url }}\n{% endif %}{% for material in item.session.materials.all %} - \n{{material.type}}{% if material.type.name != "Agenda" %} - ({{material.title|ics_esc}}){% endif %}: - {{material.get_versionless_href}}\n{% endfor %} + \n + Webex: {{ item.timeslot.location.webex_url }}\n{% endif %}{% if item.timeslot.location.video_stream_url %} + \n + Meetecho: {{ item.timeslot.location.video_stream_url|format:item.session }}\n{% endif %}{% if item.session.agenda %}{% with agenda=item.session.agenda %} + \n + {{agenda.type}} {{agenda.get_versionless_href}}\n{% endwith %}{% endif %} + \n + Session materials: {% absurl 'ietf.meeting.views.session_details' num=schedule.meeting.number acronym=item.session.group.acronym %}\n{% if schedule.meeting.get_number is not None %} + \n{# link agenda for ietf meetings #} + See in schedule: {% absurl 'ietf.meeting.views.agenda' num=schedule.meeting.number %}#row-{{ item.slug }}\n{% endif %} END:VEVENT {% endif %}{% endfor %}END:VCALENDAR{% endcache %}{% endautoescape %}