diff --git a/ietf/meeting/tests_views.py b/ietf/meeting/tests_views.py index f26287e42..b02607697 100644 --- a/ietf/meeting/tests_views.py +++ b/ietf/meeting/tests_views.py @@ -10,7 +10,6 @@ import debug # pyflakes:ignore from django.core.urlresolvers import reverse as urlreverse from django.conf import settings from django.contrib.auth.models import User -from django.http import HttpRequest from mock import patch from pyquery import PyQuery @@ -268,42 +267,21 @@ class MeetingTests(TestCase): self.assertEqual(r.status_code, 200) def test_proceedings_acknowledgements(self): - meeting = make_meeting_test_data() + make_meeting_test_data() + meeting = MeetingFactory(type_id='ietf', date=datetime.date(2016,7,14), number="96") + meeting.acknowledgements = 'test acknowledgements' + meeting.save() url = urlreverse('ietf.meeting.views.proceedings_acknowledgements',kwargs={'num':meeting.number}) - login_testing_unauthorized(self,"secretary",url) - r = self.client.get(url) - self.assertEqual(r.status_code, 200) + response = self.client.get(url) + self.assertEqual(response.status_code, 200) + self.assertTrue('test acknowledgements' in response.content) @patch('urllib2.urlopen') def test_proceedings_attendees(self, mock_urlopen): mock_urlopen.return_value = StringIO('[{"LastName":"Smith","FirstName":"John","Company":"ABC","Country":"US"}]') make_meeting_test_data() - - # add recent meeting - date = datetime.date(2016,4,3) - Meeting.objects.create(type_id='ietf',date=date,number=95) - url = urlreverse('ietf.secr.meetings.views.add') - post_data = dict(number='96',city='Berlin',date='2016-07-14',country='DE', - time_zone='Europe/Berlin',venue_name='Intercontinental Berlin', - venue_addr='', - idsubmit_cutoff_day_offset_00=13, - idsubmit_cutoff_day_offset_01=20, - idsubmit_cutoff_time_utc =datetime.timedelta(hours=23, minutes=59, seconds=59), - idsubmit_cutoff_warning_days =datetime.timedelta(days=21), - submission_start_day_offset=90, - submission_cutoff_day_offset=26, - submission_correction_day_offset=50, - ) - self.client.login(username='secretary', password='secretary+password') - response = self.client.post(url, post_data) - self.assertRedirects(response,urlreverse('ietf.secr.meetings.views.main')) - self.assertTrue(Meeting.objects.filter(number=96).exists()) - meeting = Meeting.objects.get(number=96) - - # finalize the meeting proceedings - finalize(HttpRequest(),meeting) - - # check attendees + meeting = MeetingFactory(type_id='ietf', date=datetime.date(2016,7,14), number="96") + finalize(meeting) url = urlreverse('ietf.meeting.views.proceedings_attendees',kwargs={'num':96}) response = self.client.get(url) self.assertEqual(response.status_code, 200) @@ -311,60 +289,23 @@ class MeetingTests(TestCase): q = PyQuery(response.content) self.assertEqual(1,len(q("#id_attendees tbody tr"))) - def test_proceedings_overview(self): '''Test proceedings IETF Overview page. Note: old meetings aren't supported so need to add a new meeting then test. ''' make_meeting_test_data() - # add meeting requires a previous meeting to work - date = datetime.date(2016,7,14) - Meeting.objects.create(type_id='ietf',date=date,number=96) - url = urlreverse('ietf.secr.meetings.views.add') - post_data = dict(number='97',city='Seoul',date='2016-11-13',country='KR', - time_zone='Asia/Seoul',venue_name='Conrad Seoul', - venue_addr='10 Gukjegeumyung-ro', - idsubmit_cutoff_day_offset_00=13, - idsubmit_cutoff_day_offset_01=20, - idsubmit_cutoff_time_utc =datetime.timedelta(hours=23, minutes=59, seconds=59), - idsubmit_cutoff_warning_days =datetime.timedelta(days=21), - submission_start_day_offset=90, - submission_cutoff_day_offset=26, - submission_correction_day_offset=50, - ) - self.client.login(username='secretary', password='secretary+password') - - response = self.client.post(url, post_data) - self.assertRedirects(response,urlreverse('ietf.secr.meetings.views.main')) - url = urlreverse('ietf.meeting.views.proceedings_overview',kwargs={'num':97}) + meeting = MeetingFactory(type_id='ietf', date=datetime.date(2016,7,14), number="96") + finalize(meeting) + url = urlreverse('ietf.meeting.views.proceedings_overview',kwargs={'num':96}) response = self.client.get(url) self.assertEqual(response.status_code, 200) self.assertTrue('The Internet Engineering Task Force' in response.content) def test_proceedings_progress_report(self): make_meeting_test_data() - - # add recent meeting - date = datetime.date(2016,4,3) - Meeting.objects.create(type_id='ietf',date=date,number=95) - url = urlreverse('ietf.secr.meetings.views.add') - post_data = dict(number='96',city='Berlin',date='2016-07-14',country='DE', - time_zone='Europe/Berlin',venue_name='Intercontinental Berlin', - venue_addr='', - idsubmit_cutoff_day_offset_00=13, - idsubmit_cutoff_day_offset_01=20, - idsubmit_cutoff_time_utc =datetime.timedelta(hours=23, minutes=59, seconds=59), - idsubmit_cutoff_warning_days =datetime.timedelta(days=21), - submission_start_day_offset=90, - submission_cutoff_day_offset=26, - submission_correction_day_offset=50, - ) - self.client.login(username='secretary', password='secretary+password') - response = self.client.post(url, post_data) - self.assertRedirects(response,urlreverse('ietf.secr.meetings.views.main')) - self.assertTrue(Meeting.objects.filter(number=96).exists()) + MeetingFactory(type_id='ietf', date=datetime.date(2016,4,3), number="95") + MeetingFactory(type_id='ietf', date=datetime.date(2016,7,14), number="96") - # check progress report url = urlreverse('ietf.meeting.views.proceedings_progress_report',kwargs={'num':96}) response = self.client.get(url) self.assertEqual(response.status_code, 200) diff --git a/ietf/meeting/utils.py b/ietf/meeting/utils.py index 8d5be0b44..4828881d6 100644 --- a/ietf/meeting/utils.py +++ b/ietf/meeting/utils.py @@ -4,7 +4,6 @@ import urllib2 import urlparse from django.conf import settings -from django.contrib import messages from django.template.loader import render_to_string from ietf.dbtemplate.models import DBTemplate @@ -80,23 +79,13 @@ def sort_sessions(sessions): return meeting_sorted -def finalize(request, meeting): - end_date = meeting.end_date() - end_time = datetime.datetime.combine(end_date, datetime.datetime.min.time())+datetime.timedelta(days=1) - for session in meeting.session_set.all(): - for sp in session.sessionpresentation_set.filter(document__type='draft',rev=None): - rev_before_end = [e for e in sp.document.docevent_set.filter(newrevisiondocevent__isnull=False).order_by('-time') if e.time <= end_time ] - if rev_before_end: - sp.rev = rev_before_end[-1].newrevisiondocevent.rev - else: - sp.rev = '00' - sp.save() - # get attendees +def create_proceedings_templates(meeting): + '''Create DBTemplates for meeting proceedings''' + # Get meeting attendees from registration system url = urlparse.urljoin(settings.REGISTRATION_ATTENDEES_BASE_URL,meeting.number) try: attendees = json.load(urllib2.urlopen(url)) except (ValueError, urllib2.HTTPError): - messages.warning(request,'Could not retrieve attendee list from registration system (%s)' % url, fail_silently=True) attendees = [] if attendees: @@ -108,7 +97,30 @@ def finalize(request, meeting): title='IETF %s Attendee List' % meeting.number, type_id='django', content=content) + + # Make copy of default IETF Overview template + if not meeting.overview: + template = DBTemplate.objects.get(path='/meeting/proceedings/defaults/overview.rst') + template.id = None + template.path = '/meeting/proceedings/%s/overview.rst' % (meeting.number) + template.title = 'IETF %s Proceedings Overview' % (meeting.number) + template.save() + meeting.overview = template + meeting.save() +def finalize(meeting): + end_date = meeting.end_date() + end_time = datetime.datetime.combine(end_date, datetime.datetime.min.time())+datetime.timedelta(days=1) + for session in meeting.session_set.all(): + for sp in session.sessionpresentation_set.filter(document__type='draft',rev=None): + rev_before_end = [e for e in sp.document.docevent_set.filter(newrevisiondocevent__isnull=False).order_by('-time') if e.time <= end_time ] + if rev_before_end: + sp.rev = rev_before_end[-1].newrevisiondocevent.rev + else: + sp.rev = '00' + sp.save() + + create_proceedings_templates(meeting) meeting.proceedings_final = True meeting.save() return diff --git a/ietf/meeting/views.py b/ietf/meeting/views.py index b7b5add8e..56051ac56 100644 --- a/ietf/meeting/views.py +++ b/ietf/meeting/views.py @@ -25,6 +25,7 @@ from django.db.models import Min, Max from django.conf import settings from django.forms.models import modelform_factory, inlineformset_factory from django.forms import ModelForm +from django.template import TemplateDoesNotExist from django.template.loader import render_to_string from django.utils.functional import curry from django.views.decorators.cache import cache_page @@ -1985,55 +1986,63 @@ def finalize_proceedings(request, num=None): raise Http404 if request.method=='POST': - finalize(request, meeting) + finalize(meeting) return HttpResponseRedirect(reverse('ietf.meeting.views.proceedings',kwargs={'num':meeting.number})) return render(request, "meeting/finalize.html", {'meeting':meeting,}) -@role_required('Secretariat') def proceedings_acknowledgements(request, num=None): - + '''Display Acknowledgements for meeting''' meeting = get_meeting(num) - if meeting.number < 95: + if not num.isdigit(): + raise Http404 + if int(meeting.number) < settings.NEW_PROCEEDINGS_START: return HttpResponseRedirect( 'https://www.ietf.org/proceedings/%s/acknowledgement.html' % num ) return render(request, "meeting/proceedings_acknowledgements.html", { 'meeting': meeting, }) - -@role_required('Secretariat') def proceedings_attendees(request, num=None): - + '''Display list of meeting attendees''' meeting = get_meeting(num) - if meeting.number < 95: + if not num.isdigit(): + raise Http404 + if int(meeting.number) < settings.NEW_PROCEEDINGS_START: return HttpResponseRedirect( 'https://www.ietf.org/proceedings/%s/attendees.html' % num ) overview_template = '/meeting/proceedings/%s/attendees.html' % meeting.number - template = render_to_string(overview_template, {}) - + try: + template = render_to_string(overview_template, {}) + except TemplateDoesNotExist: + raise Http404 return render(request, "meeting/proceedings_attendees.html", { 'meeting': meeting, 'template': template, }) - -@role_required('Secretariat') def proceedings_overview(request, num=None): '''Display Overview for given meeting''' meeting = get_meeting(num) - if meeting.number < 95: + if not num.isdigit(): + raise Http404 + if int(meeting.number) < settings.NEW_PROCEEDINGS_START: return HttpResponseRedirect( 'https://www.ietf.org/proceedings/%s/overview.html' % num ) overview_template = '/meeting/proceedings/%s/overview.rst' % meeting.number - template = render_to_string(overview_template, {}) - + try: + template = render_to_string(overview_template, {}) + except TemplateDoesNotExist: + raise Http404 return render(request, "meeting/proceedings_overview.html", { 'meeting': meeting, 'template': template, }) -@role_required('Secretariat') +@cache_page( 60 * 60 ) def proceedings_progress_report(request, num=None): + '''Display Progress Report (stats since last meeting)''' meeting = get_meeting(num) - if meeting.number < 95: + if not num.isdigit(): + raise Http404 + if int(meeting.number) < settings.NEW_PROCEEDINGS_START: return HttpResponseRedirect( 'https://www.ietf.org/proceedings/%s/progress-report.html' % num ) sdate = meeting.previous_meeting().date edate = meeting.date diff --git a/ietf/secr/meetings/tests.py b/ietf/secr/meetings/tests.py index 929ac45dd..cb890f7e5 100644 --- a/ietf/secr/meetings/tests.py +++ b/ietf/secr/meetings/tests.py @@ -85,8 +85,6 @@ class SecrMeetingTestCase(TestCase): response = self.client.post(url, post_data, follow=True) self.assertEqual(response.status_code, 200) self.assertEqual(Meeting.objects.count(),count + 1) - meeting = Meeting.objects.order_by('id').last() - self.assertEqual(meeting.overview.path,'/meeting/proceedings/%s/overview.rst' % meeting.number) def test_edit_meeting(self): "Edit Meeting" diff --git a/ietf/secr/meetings/views.py b/ietf/secr/meetings/views.py index ad47992f0..882fb2410 100644 --- a/ietf/secr/meetings/views.py +++ b/ietf/secr/meetings/views.py @@ -14,7 +14,6 @@ from django.shortcuts import render_to_response, get_object_or_404, redirect from django.template import RequestContext from django.utils.functional import curry -from ietf.dbtemplate.models import DBTemplate from ietf.ietfauth.utils import role_required from ietf.utils.mail import send_mail from ietf.meeting.helpers import get_meeting, make_materials_directories @@ -317,16 +316,7 @@ def add(request): # Create Physical new meeting directory and subdirectories make_materials_directories(meeting) - - # Make copy of IETF Overview template - template = DBTemplate.objects.get(path='/meeting/proceedings/defaults/overview.rst') - template.id = None - template.path = '/meeting/proceedings/%s/overview.rst' % (meeting.number) - template.title = 'IETF %s Proceedings Overview' % (meeting.number) - template.save() - meeting.overview = template - meeting.save() - + messages.success(request, 'The Meeting was created successfully!') return redirect('meetings') else: diff --git a/ietf/settings.py b/ietf/settings.py index 6e4b9c901..41708e2fa 100644 --- a/ietf/settings.py +++ b/ietf/settings.py @@ -600,6 +600,7 @@ SECR_MAX_UPLOAD_SIZE = 40960000 SECR_PROCEEDINGS_DIR = '/a/www/www6s/proceedings/' SECR_PPT2PDF_COMMAND = ['/usr/bin/soffice','--headless','--convert-to','pdf','--outdir'] REGISTRATION_ATTENDEES_BASE_URL = 'https://ietf.org/registration/attendees/' +NEW_PROCEEDINGS_START = 95 USE_ETAGS=True PRODUCTION_TIMEZONE = "America/Los_Angeles"