From e3c3b716cd423cc355eef5363805c3e85d5fc277 Mon Sep 17 00:00:00 2001 From: Robert Sparks Date: Fri, 11 Nov 2016 06:48:26 +0000 Subject: [PATCH] Add a view of past meetings. Commit ready for merge. - Legacy-Id: 12315 --- ietf/meeting/tests_views.py | 13 +++ ietf/meeting/urls.py | 1 + ietf/meeting/views.py | 30 +++++++ ietf/templates/base/menu.html | 1 + ietf/templates/meeting/past.html | 129 +++++++++++++++++++++++++++ ietf/templates/meeting/upcoming.html | 4 +- 6 files changed, 176 insertions(+), 2 deletions(-) create mode 100644 ietf/templates/meeting/past.html diff --git a/ietf/meeting/tests_views.py b/ietf/meeting/tests_views.py index 527616ed9..4012c398a 100644 --- a/ietf/meeting/tests_views.py +++ b/ietf/meeting/tests_views.py @@ -672,6 +672,19 @@ class InterimTests(TestCase): for session in meeting.session_set.all(): self.assertEqual(session.status.slug, 'scheda') + def test_past(self): + today = datetime.date.today() + last_week = today - datetime.timedelta(days=7) + ietf = SessionFactory(meeting__type_id='ietf',meeting__date=last_week,group__state_id='active',group__parent=GroupFactory(state_id='active')) + interim = SessionFactory(meeting__type_id='interim',meeting__date=last_week,status_id='canceled',group__state_id='active',group__parent=GroupFactory(state_id='active')) + url = urlreverse('ietf.meeting.views.past') + r = self.client.get(url) + self.assertEqual(r.status_code, 200) + self.assertTrue('IETF - %02d'%int(ietf.meeting.number) in unicontent(r)) + q = PyQuery(r.content) + id="-%s" % interim.group.acronym + self.assertTrue('CANCELLED' in q('[id*="'+id+'"]').text()) + def test_upcoming(self): make_meeting_test_data() url = urlreverse("ietf.meeting.views.upcoming") diff --git a/ietf/meeting/urls.py b/ietf/meeting/urls.py index ef30e5891..02f7b8f5f 100644 --- a/ietf/meeting/urls.py +++ b/ietf/meeting/urls.py @@ -95,6 +95,7 @@ urlpatterns = [ url(r'^interim/request/(?P[A-Za-z0-9._+-]+)/cancel/?$', views.interim_request_cancel), url(r'^interim/pending/?$', views.interim_pending), url(r'^requests.html$', RedirectView.as_view(url='/meeting/requests', permanent=True)), + url(r'^past/?$', views.past), url(r'^upcoming/?$', views.upcoming), url(r'^upcoming.ics/?$', views.upcoming_ical), # Then patterns from more specific to less diff --git a/ietf/meeting/views.py b/ietf/meeting/views.py index c4179297a..99d59c36f 100644 --- a/ietf/meeting/views.py +++ b/ietf/meeting/views.py @@ -1883,6 +1883,36 @@ def interim_request_edit(request, number): "form": form, "formset": formset}) +@cache_page(60*60) +def past(request): + '''List of past meetings''' + today = datetime.datetime.today() + meetings = Meeting.objects.filter(date__lte=today).exclude( + session__status__in=('apprw', 'scheda', 'canceledpa')).order_by('-date') + + # extract groups hierarchy for display filter + seen = set() + groups = [m.session_set.first().group for m + in meetings.filter(type='interim')] + group_parents = [] + for g in groups: + if g.parent.acronym not in seen: + group_parents.append(g.parent) + seen.add(g.parent.acronym) + + seen = set() + for p in group_parents: + p.group_list = [] + for g in groups: + if g.acronym not in seen and g.parent == p: + p.group_list.append(g) + seen.add(g.acronym) + + p.group_list.sort(key=lambda g: g.acronym) + + return render(request, 'meeting/past.html', { + 'meetings': meetings, + 'group_parents': group_parents}) def upcoming(request): '''List of upcoming meetings''' diff --git a/ietf/templates/base/menu.html b/ietf/templates/base/menu.html index 10828bb83..2f9bd19a1 100644 --- a/ietf/templates/base/menu.html +++ b/ietf/templates/base/menu.html @@ -86,6 +86,7 @@
  • Materials
  • Past proceedings
  • Upcoming
  • +
  • Past
  • Request a session
  • Session requests
  • {% if flavor == "top" %}{% endif %} diff --git a/ietf/templates/meeting/past.html b/ietf/templates/meeting/past.html new file mode 100644 index 000000000..92f536e41 --- /dev/null +++ b/ietf/templates/meeting/past.html @@ -0,0 +1,129 @@ +{% extends "base.html" %} +{# Copyright The IETF Trust 2015, All Rights Reserved #} +{% load origin %} + +{% load ietf_filters staticfiles %} + +{% block pagehead %} + +{% endblock %} + +{% block bodyAttrs %}data-spy="scroll" data-target="#affix"{% endblock %} + +{% block title %}Past Meetings{% endblock %} + +{% block content %} + {% origin %} +
    +
    + +

    Past Meetings

    + +
    +
    + + +
    +
    +

    + You can customize the list to show only selected groups + by clicking on groups and areas in the table below. + To be able to return to the customized view later, bookmark the resulting URL. +

    + + {% if group_parents|length %} +

    Groups displayed in italics are BOFs.

    + + + + + {% for p in group_parents %} + + {% endfor %} + + + + + {% for p in group_parents %} + + {% endfor %} + + +
    + +
    +
    + {% for group in p.group_list %} +
    + +
    + {% endfor %} +
    +
    + {% else %} +
    No past meetings are available.
    + {% endif %} + +
    +
    +
    +
    + + {% if meetings %} +

    + + + + + + + + + + {% for meeting in meetings %} + {% if meeting.type.slug == 'interim' %} + + {% else %} + + {% endif %} + + {% if meeting.type.slug == 'interim' %} + + {% else %} + + {% endif %} + + + {% endfor %} + +
    DateGroupName
    {{ meeting.date }}{{ meeting.session_set.all.0.group.acronym }}ietf + {% if meeting.type.slug == "interim" %} + {{ meeting.number }}{% if meeting.session_set.all.0.status.slug == "canceled" %}  CANCELLED{% endif %} + {% else %} + IETF - {{ meeting.number }} + {% endif %} +
    + {% else %} +

    No past meetings

    + {% endif %} + +
    +
    +{% endblock %} + +{% block js %} + + +{% endblock %} diff --git a/ietf/templates/meeting/upcoming.html b/ietf/templates/meeting/upcoming.html index ac474d862..74c68f511 100644 --- a/ietf/templates/meeting/upcoming.html +++ b/ietf/templates/meeting/upcoming.html @@ -10,14 +10,14 @@ {% block bodyAttrs %}data-spy="scroll" data-target="#affix"{% endblock %} -{% block title %}Upcoming IETF Meetings{% endblock %} +{% block title %}Upcoming Meetings{% endblock %} {% block content %} {% origin %}
    -

    IETF Upcoming Meetings

    +

    Upcoming Meetings

    For more on regular IETF meetings see here