From 9b2d73b3656f6047b7e7c2824c9ef2115eb61e8f Mon Sep 17 00:00:00 2001 From: Robert Sparks Date: Tue, 9 Aug 2016 15:42:40 +0000 Subject: [PATCH] add status reports to proceedings. add a view for the applicable status report for a given meeting. Commit ready for merge. - Legacy-Id: 11766 --- ietf/group/models.py | 8 +++++++ ietf/group/tests_info.py | 8 +++++++ ietf/group/urls_info_details.py | 1 + ietf/group/views.py | 12 ++++++++++ ietf/meeting/models.py | 3 +++ .../templatetags/proceedings_filters.py | 4 ++++ .../group/group_about_status_meeting.html | 22 +++++++++++++++++++ ietf/templates/meeting/group_proceedings.html | 7 +++++- 8 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 ietf/templates/group/group_about_status_meeting.html diff --git a/ietf/group/models.py b/ietf/group/models.py index 4c90993c7..8be61f22e 100644 --- a/ietf/group/models.py +++ b/ietf/group/models.py @@ -157,6 +157,14 @@ class Group(GroupInfo): return self.role_set.filter(**role_kwargs) return self.role_set.none() + def status_for_meeting(self,meeting): + end_date = meeting.end_date()+datetime.timedelta(days=1) + previous_meeting = meeting.previous_meeting() + status_events = self.groupevent_set.filter(type='status_update',time__lte=end_date).order_by('-time') + if previous_meeting: + status_events = status_events.filter(time__gte=previous_meeting.end_date()+datetime.timedelta(days=1)) + return status_events.first() + class GroupHistory(GroupInfo): group = models.ForeignKey(Group, related_name='history_set') acronym = models.CharField(max_length=40) diff --git a/ietf/group/tests_info.py b/ietf/group/tests_info.py index fdaa56042..c5914c0c2 100644 --- a/ietf/group/tests_info.py +++ b/ietf/group/tests_info.py @@ -1193,6 +1193,14 @@ class StatusUpdateTests(TestCase): url = urlreverse('ietf.group.views.all_status') response = self.client.get(url) self.assertEqual(response.status_code,200) + + def test_view_status_update_for_meeting(self): + chair = RoleFactory(name_id='chair',group__type_id='wg') + GroupEventFactory(type='status_update',group=chair.group) + sess = SessionFactory.create(meeting__type_id='ietf',group=chair.group,meeting__date=datetime.datetime.today()-datetime.timedelta(days=1)) + url = urlreverse('ietf.group.views.group_about_status_meeting',kwargs={'acronym':chair.group.acronym,'num':sess.meeting.number}) + response = self.client.get(url) + self.assertEqual(response.status_code,200) class GroupParentLoopTests(TestCase): diff --git a/ietf/group/urls_info_details.py b/ietf/group/urls_info_details.py index 0c60d806a..ff1de23a3 100644 --- a/ietf/group/urls_info_details.py +++ b/ietf/group/urls_info_details.py @@ -14,6 +14,7 @@ urlpatterns = patterns('', (r'^about/$', 'ietf.group.views.group_about', None, 'group_about'), (r'^about/status/$', 'ietf.group.views.group_about_status'), (r'^about/status/edit/$', 'ietf.group.views.group_about_status_edit'), + (r'^about/status/meeting/(?P\d+)/$', 'ietf.group.views.group_about_status_meeting'), (r'^history/$','ietf.group.views.history'), (r'^email/$', 'ietf.group.views.email'), (r'^deps/(?P[\w-]+)/$', 'ietf.group.views.dependencies'), diff --git a/ietf/group/views.py b/ietf/group/views.py index 0394839e0..94a98e6ab 100644 --- a/ietf/group/views.py +++ b/ietf/group/views.py @@ -67,6 +67,7 @@ from ietf.settings import MAILING_LIST_INFO_URL from ietf.mailtrigger.utils import gather_relevant_expansions from ietf.ietfauth.utils import has_role from ietf.meeting.utils import group_sessions +from ietf.meeting.helpers import get_meeting def roles(group, role_name): return Role.objects.filter(group=group, name=role_name).select_related("email", "person") @@ -534,6 +535,17 @@ def group_about_status(request, acronym, group_type=None): } ) +def group_about_status_meeting(request, acronym, num, group_type=None): + meeting = get_meeting(num) + group = get_group_or_404(acronym, group_type) + status_update = group.status_for_meeting(meeting) + return render(request, 'group/group_about_status_meeting.html', + { 'group' : group, + 'status_update': status_update, + 'meeting': meeting, + } + ) + class StatusUpdateForm(forms.Form): content = forms.CharField(widget=forms.Textarea, label='Status update', help_text = 'Edit the status update', required=False) txt = forms.FileField(label='.txt format', help_text='Or upload a .txt file', required=False) diff --git a/ietf/meeting/models.py b/ietf/meeting/models.py index 621138dfc..900542d12 100644 --- a/ietf/meeting/models.py +++ b/ietf/meeting/models.py @@ -282,6 +282,9 @@ class Meeting(models.Model): ts = tz.localize(ts) return ts + def previous_meeting(self): + return Meeting.objects.filter(type=self.type,date__lt=self.date).order_by('-date').first() + class Meta: ordering = ["-date", "id"] diff --git a/ietf/meeting/templatetags/proceedings_filters.py b/ietf/meeting/templatetags/proceedings_filters.py index 4f6bac5f0..4e7924659 100644 --- a/ietf/meeting/templatetags/proceedings_filters.py +++ b/ietf/meeting/templatetags/proceedings_filters.py @@ -12,3 +12,7 @@ def hack_recording_title(recording,add_timestamp=False): return hacked_title else: return recording.title + +@register.filter +def status_for_meeting(group,meeting): + return group.status_for_meeting(meeting) diff --git a/ietf/templates/group/group_about_status_meeting.html b/ietf/templates/group/group_about_status_meeting.html new file mode 100644 index 000000000..596ebb817 --- /dev/null +++ b/ietf/templates/group/group_about_status_meeting.html @@ -0,0 +1,22 @@ +{% extends "base.html" %} +{# Copyright The IETF Trust 2015, All Rights Reserved #} +{% load origin %} +{% load staticfiles %} +{% load bootstrap3 %} +{% load ietf_filters %} + +{% block title %} + Status update for {{ group.type.name }} {{ group.acronym }} at {{meeting}} +{% endblock %} + +{% block content %} + {% origin %} +

+ Status update for {{ group.type.name }} {{ group.acronym }} at {{meeting}} +

+ +
{{ status_update.desc|default:"(none)"|escape|urlize }}
+ + Back + +{% endblock %} diff --git a/ietf/templates/meeting/group_proceedings.html b/ietf/templates/meeting/group_proceedings.html index 4c94c4528..de3001e60 100644 --- a/ietf/templates/meeting/group_proceedings.html +++ b/ietf/templates/meeting/group_proceedings.html @@ -38,13 +38,18 @@ {% endif %} {% if session.all_meeting_bluesheets %} {% if session.all_meeting_bluesheets|length == 1 %} - Bluesheets
+ Bluesheets
{% else %} {% for bs in session.all_meeting_bluesheets %} Bluesheets {{bs.sessionpresentation_set.first.session.official_timeslotassignment.timeslot.time|date:"D G:i"}}
{% endfor %} {% endif %} {% endif %} + {% with session.group|status_for_meeting:meeting as status %} + {% if status %} + Status
+ {% endif %} + {% endwith %}