diff --git a/ietf/dbtemplate/templates/dbtemplate/template_list.html b/ietf/dbtemplate/templates/dbtemplate/template_list.html index e12ef6c2c..51d8f3fda 100644 --- a/ietf/dbtemplate/templates/dbtemplate/template_list.html +++ b/ietf/dbtemplate/templates/dbtemplate/template_list.html @@ -6,7 +6,7 @@ {% if template_list %}
block - # however, because this forces a fixed-width font, different than the rest of - # the document we modify the charter by adding replacing linefeeds with 's - if group.charter: - charter = get_charter_text(group).replace('\n','') - ctime = group.charter.time - else: - charter = None - ctime = None - - status_update = group.latest_event(type='status_update',time__lte=meeting.get_submission_correction_date()) - - # rather than return the response as in a typical view function we save it as the snapshot - # proceedings.html - response = render_to_response('proceedings/proceedings.html',{ - 'bluesheets': bluesheets, - 'charter': charter, - 'ctime': ctime, - 'drafts': drafts, - 'group': group, - 'chairs': chairs, - 'secretaries': secretaries, - 'ads': ads, - 'tas': tas, - 'meeting': meeting, - 'rfcs': rfcs, - 'materials': materials, - 'status_update': status_update,} - ) - - # save proceedings - proceedings_path = get_proceedings_path(meeting,group) - - f = open(proceedings_path,'w') - f.write(response.content) - f.close() - try: - os.chmod(proceedings_path, 0664) - except OSError: - pass - - # rebuild the directory - if meeting.type.slug == 'interim': - create_interim_directory() - -# ------------------------------------------------- -# Functions for generating Proceedings Pages -# ------------------------------------------------- - -def gen_areas(context): - meeting = context['meeting'] - gmet, gnot = groups_by_session(None,meeting) - - # append proceedings URL - for group in gmet + gnot: - group.proceedings_url = "%sproceedings/%s/%s.html" % (settings.IETF_HOST_URL,meeting.number,group.acronym) - - for (counter,area) in enumerate(context['areas'], start=1): - groups_met = {'wg':filter(lambda a: a.parent==area and a.state.slug not in ('bof','bof-conc') and a.type_id=='wg',gmet), - 'bof':filter(lambda a: a.parent==area and a.state.slug in ('bof','bof-conc') and a.type_id=='wg',gmet), - 'ag':filter(lambda a: a.parent==area and a.type_id=='ag',gmet)} - - groups_not = {'wg':filter(lambda a: a.parent==area and a.state.slug not in ('bof','bof-conc') and a.type_id=='wg',gnot), - 'bof':filter(lambda a: a.parent==area and a.state.slug=='bof' and a.type_id=='wg',gnot), - 'ag':filter(lambda a: a.parent==area and a.type_id=='ag',gnot)} - - html = render_to_response('proceedings/area.html',{ - 'area': area, - 'meeting': meeting, - 'groups_met': groups_met, - 'groups_not': groups_not, - 'index': counter} - ) - - path = os.path.join(settings.SECR_PROCEEDINGS_DIR,meeting.number,'%s.html' % area.acronym) - write_html(path,html.content) - -def gen_acknowledgement(context): - meeting = context['meeting'] - - html = render_to_response('proceedings/acknowledgement.html',{ - 'meeting': meeting} - ) - - path = os.path.join(settings.SECR_PROCEEDINGS_DIR,meeting.number,'acknowledgement.html') - write_html(path,html.content) - -def gen_agenda(context): - meeting = context['meeting'] - schedule = get_schedule(meeting) - schedtimesessassignments = SchedTimeSessAssignment.objects.filter(schedule=schedule).exclude(session__isnull=True) - - html = render_to_response('proceedings/agenda.html',{ - 'meeting': meeting, - 'schedtimesessassignments': schedtimesessassignments} - ) - - path = os.path.join(settings.SECR_PROCEEDINGS_DIR,meeting.number,'agenda.html') - write_html(path,html.content) - - # get the text agenda from datatracker - url = 'https://datatracker.ietf.org/meeting/%s/agenda.txt' % meeting.number - text = urlopen(url).read() - path = os.path.join(settings.SECR_PROCEEDINGS_DIR,meeting.number,'agenda.txt') - write_html(path,text) - -def gen_attendees(context): - meeting = context['meeting'] - - attendees = Registration.objects.using('ietf' + meeting.number).all().order_by('lname') - - if settings.SERVER_MODE!='production': - try: - attendees.count() - except ConnectionDoesNotExist: - attendees = Registration.objects.none() - - html = render_to_response('proceedings/attendee.html',{ - 'meeting': meeting, - 'attendees': attendees} - ) - - path = os.path.join(settings.SECR_PROCEEDINGS_DIR,meeting.number,'attendee.html') - write_html(path,html.content) - -def gen_group_pages(context): - meeting = context['meeting'] - - for group in Group.objects.filter(type__in=('wg','ag','rg'), state__in=('bof','proposed','active')): - create_proceedings(meeting,group,is_final=True) - -def gen_index(context): - index = render_to_response('proceedings/index.html',context) - path = os.path.join(settings.SECR_PROCEEDINGS_DIR,context['meeting'].number,'index.html') - write_html(path,index.content) - -def gen_irtf(context): - meeting = context['meeting'] - irtf_chair = Role.objects.filter(group__acronym='irtf',name='chair')[0] - - html = render_to_response('proceedings/irtf.html',{ - 'irtf_chair':irtf_chair} - ) - path = os.path.join(settings.SECR_PROCEEDINGS_DIR,meeting.number,'irtf.html') - write_html(path,html.content) - -def gen_overview(context): - meeting = context['meeting'] - - ietf_chair = Role.objects.get(group__acronym='ietf',name='chair') - ads = Role.objects.filter(group__type='area',group__state='active',name='ad') - sorted_ads = sorted(ads, key = lambda a: a.person.name_parts()[3]) - - html = render_to_response('proceedings/overview.html',{ - 'meeting': meeting, - 'ietf_chair': ietf_chair, - 'ads': sorted_ads} - ) - - path = os.path.join(settings.SECR_PROCEEDINGS_DIR,meeting.number,'overview.html') - write_html(path,html.content) - -def gen_plenaries(context): - ''' - This function generates pages for the Plenaries. At meeting 85 the Plenary sessions - were combined into one, so we need to handle not finding one of the sessions. - ''' - meeting = context['meeting'] - - # Administration Plenary - try: - admin_session = Session.objects.get(meeting=meeting,name__contains='Administration Plenary') - admin_slides = admin_session.materials.filter(type='slides') - admin_minutes = admin_session.materials.filter(type='minutes') - admin = render_to_response('proceedings/plenary.html',{ - 'title': 'Administrative', - 'meeting': meeting, - 'slides': admin_slides, - 'minutes': admin_minutes} - ) - path = os.path.join(settings.SECR_PROCEEDINGS_DIR,context['meeting'].number,'administrative-plenary.html') - write_html(path,admin.content) - except Session.DoesNotExist: - pass - - # Technical Plenary - try: - tech_session = Session.objects.get(meeting=meeting,name__contains='Technical Plenary') - tech_slides = tech_session.materials.filter(type='slides') - tech_minutes = tech_session.materials.filter(type='minutes') - tech = render_to_response('proceedings/plenary.html',{ - 'title': 'Technical', - 'meeting': meeting, - 'slides': tech_slides, - 'minutes': tech_minutes} - ) - path = os.path.join(settings.SECR_PROCEEDINGS_DIR,context['meeting'].number,'technical-plenary.html') - write_html(path,tech.content) - except Session.DoesNotExist: - pass - -def gen_progress(context, final=True): - ''' - This function generates the Progress Report. This report is actually produced twice. First - for inclusion in the Admin Plenary, then for the final proceedings. When produced the first - time we want to exclude the headers because they are broken links until all the proceedings - are generated. - ''' - meeting = context['meeting'] - - # proceedings are run sometime after the meeting, so end date = the passed meeting - # date and start date = the date of the meeting before that - previous_meetings = Meeting.objects.filter(type='ietf',date__lt=meeting.date).order_by('-date') - start_date = previous_meetings[0].date - end_date = meeting.date - data = get_progress_stats(start_date,end_date) - data['meeting'] = meeting - data['final'] = final - - html = render_to_response('proceedings/progress.html',data) - - path = os.path.join(settings.SECR_PROCEEDINGS_DIR,meeting.number,'progress-report.html') - write_html(path,html.content) - -def gen_research(context): - meeting = context['meeting'] - gmet, gnot = groups_by_session(None,meeting) - - groups = [ g for g in gmet if g.type_id=='rg' or (g.type_id=='ag' and g.parent.acronym=='irtf') ] - - # append proceedings URL - for group in groups: - group.proceedings_url = "%sproceedings/%s/%s.html" % (settings.IETF_HOST_URL,meeting.number,group.acronym) - - html = render_to_response('proceedings/rg_irtf.html',{ - 'meeting': meeting, - 'groups': groups} - ) - - path = os.path.join(settings.SECR_PROCEEDINGS_DIR,meeting.number,'rg_irtf.html') - write_html(path,html.content) - -def gen_training(context): - meeting = context['meeting'] - timeslots = context['others'] - sessions = [ get_session(t) for t in timeslots ] - for counter,session in enumerate(sessions, start=1): - slides = session.materials.filter(type='slides') - minutes = session.materials.filter(type='minutes') - html = render_to_response('proceedings/training.html',{ - 'title': '4.%s %s' % (counter, session.name), - 'meeting': meeting, - 'slides': slides, - 'minutes': minutes} - ) - path = os.path.join(settings.SECR_PROCEEDINGS_DIR,meeting.number,'train-%s.html' % counter ) - write_html(path,html.content) - def is_powerpoint(doc): ''' Returns true if document is a Powerpoint presentation diff --git a/ietf/secr/proceedings/tests.py b/ietf/secr/proceedings/tests.py index 82b034b61..4a7bc3273 100644 --- a/ietf/secr/proceedings/tests.py +++ b/ietf/secr/proceedings/tests.py @@ -14,9 +14,8 @@ from ietf.utils.test_utils import TestCase from ietf.utils.mail import outbox from ietf.name.models import SessionStatusName -from ietf.meeting.factories import SessionFactory -from ietf.secr.proceedings.proc_utils import (create_proceedings, import_audio_files, +from ietf.secr.proceedings.proc_utils import (import_audio_files, get_timeslot_for_filename, normalize_room_name, send_audio_import_warning, get_or_create_recording_document, create_recording, get_next_sequence) @@ -175,24 +174,3 @@ class RecordingTestCase(TestCase): send_audio_import_warning(['recording-43-badroom-20000101-0800.mp3']) self.assertEqual(len(outbox), length_before + 1) self.assertTrue('Audio file import' in outbox[-1]['Subject']) - -class OldProceedingsTestCase(TestCase): - ''' Ensure coverage of fragments of old proceedings generation until those are removed ''' - def setUp(self): - self.session = SessionFactory(meeting__type_id='ietf') - self.proceedings_dir = self.tempdir('proceedings') - - # This unintuitive bit is a consequence of the surprising implementation of meeting.get_materials_path - self.saved_agenda_path = settings.AGENDA_PATH - settings.AGENDA_PATH= self.proceedings_dir - - target_path = self.session.meeting.get_materials_path() - if not os.path.exists(target_path): - os.makedirs(target_path) - - def tearDown(self): - shutil.rmtree(self.proceedings_dir) - settings.AGENDA_PATH = self.saved_agenda_path - - def test_old_generate(self): - create_proceedings(self.session.meeting,self.session.group,is_final=True) diff --git a/ietf/secr/proceedings/urls.py b/ietf/secr/proceedings/urls.py index c120baf92..5091a01e9 100644 --- a/ietf/secr/proceedings/urls.py +++ b/ietf/secr/proceedings/urls.py @@ -6,10 +6,8 @@ from ietf.secr.proceedings import views urlpatterns = [ url(r'^$', views.main), - url(r'^ajax/generate-proceedings/(?P\d{1,3})/$', views.ajax_generate_proceedings), # special offline URL for testing proceedings build url(r'^process-pdfs/(?P\d{1,3})/$', views.process_pdfs), - url(r'^progress-report/(?P\d{1,3})/$', views.progress_report), url(r'^(?P\d{1,3})/$', views.select), url(r'^(?P\d{1,3})/recording/$', views.recording), url(r'^(?P\d{1,3})/recording/edit/(?P[A-Za-z0-9_\-\+]+)$', views.recording_edit), diff --git a/ietf/secr/proceedings/views.py b/ietf/secr/proceedings/views.py index cb1adaa56..34af4d2cf 100644 --- a/ietf/secr/proceedings/views.py +++ b/ietf/secr/proceedings/views.py @@ -16,15 +16,12 @@ from ietf.secr.utils.decorators import sec_only from ietf.secr.utils.group import get_my_groups from ietf.secr.utils.meeting import get_timeslot, get_proceedings_url from ietf.doc.models import Document, DocEvent -from ietf.group.models import Group from ietf.person.models import Person from ietf.ietfauth.utils import has_role, role_required -from ietf.meeting.models import Meeting, Session, TimeSlot +from ietf.meeting.models import Meeting, Session from ietf.secr.proceedings.forms import RecordingForm, RecordingEditForm -from ietf.secr.proceedings.proc_utils import ( gen_acknowledgement, gen_agenda, gen_areas, - gen_attendees, gen_group_pages, gen_index, gen_irtf, gen_overview, gen_plenaries, - gen_progress, gen_research, gen_training, create_proceedings, create_recording ) +from ietf.secr.proceedings.proc_utils import (create_recording) # ------------------------------------------------- # Globals @@ -139,60 +136,11 @@ def parsedate(d): This function takes a date object and returns a tuple of year,month,day ''' return (d.strftime('%Y'),d.strftime('%m'),d.strftime('%d')) - - -# ------------------------------------------------- -# AJAX Functions -# ------------------------------------------------- -@sec_only -def ajax_generate_proceedings(request, meeting_num): - ''' - Ajax function which takes a meeting number and generates the proceedings - pages for the meeting. It returns a snippet of HTML that gets placed in the - Secretariat Only section of the select page. - ''' - meeting = get_object_or_404(Meeting, number=meeting_num) - areas = Group.objects.filter(type='area',state='active').order_by('name') - others = TimeSlot.objects.filter(sessionassignments__schedule=meeting.agenda,type='other').order_by('time') - extras = get_extras(meeting) - context = {'meeting':meeting, - 'areas':areas, - 'others':others, - 'extras':extras, - 'request':request} - proceedings_url = get_proceedings_url(meeting) - - # the acknowledgement page can be edited manually so only produce if it doesn't already exist - path = os.path.join(settings.SECR_PROCEEDINGS_DIR,meeting.number,'acknowledgement.html') - if not os.path.exists(path): - gen_acknowledgement(context) - gen_overview(context) - gen_progress(context) - gen_agenda(context) - gen_attendees(context) - gen_index(context) - gen_areas(context) - gen_plenaries(context) - gen_training(context) - gen_irtf(context) - gen_research(context) - gen_group_pages(context) - - # get the time proceedings were generated - path = os.path.join(settings.SECR_PROCEEDINGS_DIR,meeting.number,'index.html') - last_run = datetime.datetime.fromtimestamp(os.path.getmtime(path)) - - return render(request, 'includes/proceedings_functions.html',{ - 'meeting':meeting, - 'last_run':last_run, - 'proceedings_url':proceedings_url}, - ) # -------------------------------------------------- # STANDARD VIEW FUNCTIONS # -------------------------------------------------- - @role_required(*AUTHORIZED_ROLES) def main(request): ''' @@ -269,17 +217,6 @@ def process_pdfs(request, meeting_num): url = reverse('ietf.secr.proceedings.views.select', kwargs={'meeting_num':meeting_num}) return HttpResponseRedirect(url) -@role_required('Secretariat') -def progress_report(request, meeting_num): - ''' - This function generates the proceedings progress report for use at the Plenary. - ''' - meeting = get_object_or_404(Meeting, number=meeting_num) - gen_progress({'meeting':meeting},final=False) - - url = reverse('ietf.secr.proceedings.views.select', kwargs={'meeting_num':meeting_num}) - return HttpResponseRedirect(url) - @role_required('Secretariat') def recording(request, meeting_num): ''' @@ -303,9 +240,6 @@ def recording(request, meeting_num): else: create_recording(session,external_url) - # rebuild proceedings - create_proceedings(meeting,session.group) - messages.success(request,'Recording added') return redirect('ietf.secr.proceedings.views.recording', meeting_num=meeting_num) @@ -345,7 +279,6 @@ def recording_edit(request, meeting_num, name): ) recording.save_with_history([e]) - create_proceedings(meeting,recording.group) messages.success(request,'Recording saved') return redirect('ietf.secr.proceedings.views.recording', meeting_num=meeting_num) else: diff --git a/ietf/secr/templates/includes/proceeding_area.html b/ietf/secr/templates/includes/proceeding_area.html deleted file mode 100644 index f7a133ea7..000000000 --- a/ietf/secr/templates/includes/proceeding_area.html +++ /dev/null @@ -1,24 +0,0 @@ -{% if set.wg %} - Working Groups - - {% for group in set.wg %} - {{ group.name }} ({{group.acronym}}) - {% endfor %} - -{% endif %} -{% if set.bof %} - BoFs - - {% for group in set.bof %} - {{ group.name }} ({{group.acronym}}) - {% endfor %} - -{% endif %} -{% if set.ag %} - Area Group - - {% for group in set.ag %} - {{ group.name }} ({{group.acronym}}) - {% endfor %} - -{% endif %} \ No newline at end of file diff --git a/ietf/secr/templates/includes/proceeding_footer.html b/ietf/secr/templates/includes/proceeding_footer.html deleted file mode 100644 index 20634945b..000000000 --- a/ietf/secr/templates/includes/proceeding_footer.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - -