diff --git a/ietf/secr/meetings/blue_sheets.py b/ietf/secr/meetings/blue_sheets.py deleted file mode 100644 index 617554121..000000000 --- a/ietf/secr/meetings/blue_sheets.py +++ /dev/null @@ -1,96 +0,0 @@ -# Copyright The IETF Trust 2013-2020, All Rights Reserved -# -*- coding: utf-8 -*- - - -import io - -from django.conf import settings -from django.utils.encoding import force_bytes - -r''' -RTF quick reference (from Word2007RTFSpec9.doc): -\fs24 : sets the font size to 24 half points -\header : header on all pages -\headerf : header on first page only -\pard : resets any previous paragraph formatting -\plain : resets any previous character formatting -\qr : right-aligned -\tqc : centered tab -\tqr : flush-right tab -\tx : tab position in twips (1440/inch) from the left margin -\nowidctlpar : no window/orphan control -\widctlpar : window/orphan control -''' - -def create_blue_sheets(meeting, groups): - file = io.open(settings.SECR_BLUE_SHEET_PATH, 'wb') - - header = b'''{\\rtf1\\ansi\\ansicpg1252\\uc1 \\deff0\\deflang1033\\deflangfe1033 - {\\fonttbl{\\f0\\froman\\fcharset0\\fprq2{\\*\\panose 02020603050405020304}Times New Roman;}} - {\\colortbl;\\red0\\green0\\blue0;\\red0\\green0\\blue255;\\red0\\green255\\blue255;\\red0\\green255\\blue0; -\\red255\\green0\\blue255;\\red255\\green0\\blue0;\\red255\\green255\\blue0;\\red255\\green255\\blue255; -\\red0\\green0\\blue128;\\red0\\green128\\blue128;\\red0\\green128\\blue0;\\red128\\green0\\blue128; -\\red128\\green0\\blue0;\\red128\\green128\\blue0;\\red128\\green128\\blue128; -\\red192\\green192\\blue192;} - \\widowctrl\\ftnbj\\aenddoc\\hyphcaps0\\formshade\\viewkind1\\viewscale100\\pgbrdrhead\\pgbrdrfoot - \\fet0\\sectd \\pgnrestart\\linex0\\endnhere\\titlepg\\sectdefaultcl''' - - file.write(header) - - for group in groups: - group_header = b''' {\\header \\pard\\plain \\s15\\nowidctlpar\\widctlpar\\tqc\\tx4320\\tqr\\tx8640\\adjustright \\fs20\\cgrid - { Mailing List: %s \\tab\\tab Meeting # %s %s (%s) \\par } - \\pard \\s15\\nowidctlpar\\widctlpar\\tqc\\tx4320\\tqr\\tx8640\\adjustright - {\\b\\fs24 - \\par - \\par \\tab The NOTE WELL statement applies to this meeting. Participants acknowledge that these attendance records will be made available to the public. - \\par - \\par NAME ORGANIZATION - \\par \\tab - \\par }} - {\\footer \\pard\\plain \\s16\\qc\\nowidctlpar\\widctlpar\\tqc\\tx4320\\tqr\\tx8640\\adjustright \\fs20\\cgrid {\\cs17 Page } - {\\field{\\*\\fldinst {\\cs17 PAGE }}} - { \\par }} - {\\headerf \\pard\\plain \\s15\\qr\\nowidctlpar\\widctlpar\\tqc\\tx4320\\tqr\\tx8640\\adjustright \\fs20\\cgrid - {\\b\\fs24 Meeting # %s %s (%s) \\par }} - {\\footerf \\pard\\plain \\s16\\qc\\nowidctlpar\\widctlpar\\tqc\\tx4320\\tqr\\tx8640\\adjustright \\fs20\\cgrid - {Page 1 \\par }} - \\pard\\plain \\qc\\nowidctlpar\\widctlpar\\adjustright \\fs20\\cgrid - {\\b\\fs32 %s IETF Working Group Roster \\par } - \\pard \\nowidctlpar\\widctlpar\\adjustright - {\\fs28 \\par Working Group Session: %s \\par \\par } -{\\b \\fs24 Mailing List: %s \\tx5300\\tab Date: ___________________ \\par \\par Chairperson:_________________________________________________________ \\par \\par } - {\\tab \\tab } -{\\par \\tab The NOTE WELL statement applies to this meeting. Participants acknowledge that these attendance records will be made available to the public. \\par -\\par\\b NAME ORGANIZATION -\\par } - \\pard \\fi-90\\li90\\nowidctlpar\\widctlpar\\adjustright - {\\fs16 -''' % (force_bytes(group.list_email), - force_bytes(meeting.number), - force_bytes(group.acronym), - force_bytes(group.type), - force_bytes(meeting.number), - force_bytes(group.acronym), - force_bytes(group.type), - force_bytes(meeting.number), - force_bytes(group.name), - force_bytes(group.list_email), - ) - - file.write(group_header) - for x in range(1,117): - line = b'''\\par %s._________________________________________________ \\tab _____________________________________________________ - \\par - ''' % force_bytes(x) - file.write(line) - - footer = b'''} -\\pard \\nowidctlpar\\widctlpar\\adjustright -{\\fs16 \\sect } -\\sectd \\pgnrestart\\linex0\\endnhere\\titlepg\\sectdefaultcl -''' - file.write(footer) - - file.write(b'\n}') - file.close() diff --git a/ietf/secr/meetings/forms.py b/ietf/secr/meetings/forms.py index 92c751418..1be22a9d6 100644 --- a/ietf/secr/meetings/forms.py +++ b/ietf/secr/meetings/forms.py @@ -238,17 +238,8 @@ class MiscSessionForm(TimeSlotForm): raise forms.ValidationError("ERROR: can't change group after materials have been uploaded") return group -class UploadBlueSheetForm(forms.Form): - file = forms.FileField(help_text='example: bluesheets-84-ancp-01.pdf') - - def clean_file(self): - file = self.cleaned_data['file'] - if not re.match(r'bluesheets-\d+',file.name): - raise forms.ValidationError('Incorrect filename format') - return file class RegularSessionEditForm(forms.ModelForm): class Meta: model = Session fields = ['agenda_note'] - diff --git a/ietf/secr/meetings/tests.py b/ietf/secr/meetings/tests.py index 66b7424c6..0e51ff8ca 100644 --- a/ietf/secr/meetings/tests.py +++ b/ietf/secr/meetings/tests.py @@ -6,9 +6,7 @@ import datetime import os import shutil -from pathlib import Path from pyquery import PyQuery -from io import StringIO import debug # pyflakes:ignore @@ -170,34 +168,6 @@ class SecrMeetingTestCase(TestCase): [cn.slug for cn in meeting.group_conflict_types.all()], post_data['group_conflict_types'], ) - - def test_blue_sheets_upload(self): - "Test Bluesheets" - meeting = make_meeting_test_data() - (Path(settings.SECR_PROCEEDINGS_DIR) / str(meeting.number) / 'bluesheets').mkdir(parents=True) - - url = reverse('ietf.secr.meetings.views.blue_sheet',kwargs={'meeting_id':meeting.number}) - self.client.login(username="secretary", password="secretary+password") - response = self.client.get(url) - self.assertEqual(response.status_code, 200) - - # test upload - group = Group.objects.filter(type='wg',state='active').first() - file = StringIO('dummy bluesheet') - file.name = "bluesheets-%s-%s.pdf" % (meeting.number,group.acronym) - files = {'file':file} - response = self.client.post(url, files) - self.assertEqual(response.status_code, 302) - path = os.path.join(settings.SECR_PROCEEDINGS_DIR,str(meeting.number),'bluesheets') - self.assertEqual(len(os.listdir(path)),1) - - def test_blue_sheets_generate(self): - meeting = make_meeting_test_data() - url = reverse('ietf.secr.meetings.views.blue_sheet_generate',kwargs={'meeting_id':meeting.number}) - self.client.login(username="secretary", password="secretary+password") - response = self.client.post(url) - self.assertEqual(response.status_code, 302) - self.assertTrue(os.path.exists(self.bluesheet_path)) def test_notifications(self): "Test Notifications" diff --git a/ietf/secr/meetings/urls.py b/ietf/secr/meetings/urls.py index 96c61d47b..cc51bb058 100644 --- a/ietf/secr/meetings/urls.py +++ b/ietf/secr/meetings/urls.py @@ -7,10 +7,7 @@ urlpatterns = [ url(r'^$', views.main), url(r'^add/$', views.add), # url(r'^ajax/get-times/(?P\d{1,6})/(?P\d)/$', views.ajax_get_times), # Not in use - url(r'^blue_sheet/$', views.blue_sheet_redirect), url(r'^(?P\d{1,6})/$', views.view), - url(r'^(?P\d{1,6})/blue_sheet/$', views.blue_sheet), - url(r'^(?P\d{1,6})/blue_sheet/generate/$', views.blue_sheet_generate), url(r'^(?P\d{1,6})/edit/$', views.edit_meeting), url(r'^(?P\d{1,6})/notifications/$', views.notifications), url(r'^(?P\d{1,6})/(?P[A-Za-z0-9_\-]+)/$', views.rooms), diff --git a/ietf/secr/meetings/views.py b/ietf/secr/meetings/views.py index 60fd61b46..8afcf5a11 100644 --- a/ietf/secr/meetings/views.py +++ b/ietf/secr/meetings/views.py @@ -2,8 +2,6 @@ # -*- coding: utf-8 -*- import datetime -import os -import time from django.conf import settings from django.contrib import messages @@ -21,17 +19,16 @@ from ietf.utils.mail import send_mail from ietf.meeting.forms import duration_string from ietf.meeting.helpers import get_meeting, make_materials_directories, populate_important_dates from ietf.meeting.models import Meeting, Session, Room, TimeSlot, SchedTimeSessAssignment, Schedule, SchedulingEvent -from ietf.meeting.utils import add_event_info_to_session_qs, handle_upload_file +from ietf.meeting.utils import add_event_info_to_session_qs from ietf.name.models import SessionStatusName from ietf.group.models import Group, GroupEvent -from ietf.secr.meetings.blue_sheets import create_blue_sheets from ietf.secr.meetings.forms import ( BaseMeetingRoomFormSet, MeetingModelForm, MeetingSelectForm, MeetingRoomForm, MiscSessionForm, TimeSlotForm, RegularSessionEditForm, - UploadBlueSheetForm, MeetingRoomOptionsForm ) + MeetingRoomOptionsForm ) from ietf.secr.sreq.views import get_initial_session from ietf.secr.utils.meeting import get_session, get_timeslot from ietf.mailtrigger.utils import gather_address_lists -from ietf.utils.timezone import date_today, make_aware +from ietf.utils.timezone import make_aware # prep for agenda changes @@ -256,72 +253,6 @@ def add(request): 'form': form}, ) -@role_required('Secretariat') -def blue_sheet(request, meeting_id): - ''' - Blue Sheet view. The user can generate blue sheets or upload scanned bluesheets - ''' - meeting = get_object_or_404(Meeting, number=meeting_id) - url = settings.SECR_BLUE_SHEET_URL - blank_sheets_path = settings.SECR_BLUE_SHEET_PATH - try: - last_run = time.ctime(os.stat(blank_sheets_path).st_ctime) - except OSError: - last_run = None - uploaded_sheets_path = os.path.join(settings.SECR_PROCEEDINGS_DIR,meeting.number,'bluesheets') - uploaded_files = sorted(os.listdir(uploaded_sheets_path)) - - if request.method == 'POST': - form = UploadBlueSheetForm(request.POST,request.FILES) - if form.is_valid(): - file = request.FILES['file'] - save_error = handle_upload_file(file,file.name,meeting,'bluesheets') - if save_error: - form.add_error(None, save_error) - else: - messages.success(request, 'File Uploaded') - return redirect('ietf.secr.meetings.views.blue_sheet', meeting_id=meeting.number) - else: - form = UploadBlueSheetForm() - - return render(request, 'meetings/blue_sheet.html', { - 'meeting': meeting, - 'url': url, - 'form': form, - 'last_run': last_run, - 'uploaded_files': uploaded_files}, - ) - -@role_required('Secretariat') -def blue_sheet_generate(request, meeting_id): - ''' - Generate bluesheets - ''' - meeting = get_object_or_404(Meeting, number=meeting_id) - - if request.method == "POST": - groups = Group.objects.filter( - type__in=['wg','rg','ag','rag','program'], - session__timeslotassignments__schedule__in=[meeting.schedule, meeting.schedule.base if meeting.schedule else None]).order_by('acronym') - create_blue_sheets(meeting, groups) - - messages.success(request, 'Blue Sheets generated') - return redirect('ietf.secr.meetings.views.blue_sheet', meeting_id=meeting.number) - -@role_required('Secretariat') -def blue_sheet_redirect(request): - ''' - This is the generic blue sheet URL. It gets the next IETF meeting and redirects - to the meeting specific URL. - ''' - today = date_today() - qs = Meeting.objects.filter(date__gt=today,type='ietf').order_by('date') - if qs: - meeting = qs[0] - else: - meeting = Meeting.objects.filter(type='ietf').order_by('-date')[0] - return redirect('ietf.secr.meetings.views.blue_sheet', meeting_id=meeting.number) - @role_required('Secretariat') def edit_meeting(request, meeting_id): ''' diff --git a/ietf/secr/templates/main.html b/ietf/secr/templates/main.html index 3d7970746..bf762851d 100644 --- a/ietf/secr/templates/main.html +++ b/ietf/secr/templates/main.html @@ -29,7 +29,6 @@ diff --git a/ietf/secr/templates/meetings/blue_sheet.html b/ietf/secr/templates/meetings/blue_sheet.html deleted file mode 100644 index 9bda80f2e..000000000 --- a/ietf/secr/templates/meetings/blue_sheet.html +++ /dev/null @@ -1,48 +0,0 @@ -{% extends "base_site.html" %} -{% load static %} - -{% block title %}Meetings - Blue Sheet{% endblock %} - -{% block extrahead %}{{ block.super }} - -{% endblock %} - -{% block breadcrumbs %}{{ block.super }} - » Meetings - » {{ meeting.number }} - » Blue Sheets -{% endblock %} - -{% block content %} - -
-

IETF {{ meeting.number }} - Blue Sheet

- -

Use this to generate blue sheets for meeting sessions.

-
    -
  • -
    {% csrf_token %} - -
    -   Last run: - {% if last_run %} - {{ last_run }} - {% else %} - Never - {% endif %} -
  • -
-

Use this to download the blue sheets from the server.

-
    -
  • - -
  • -
- -
-

- Use the session details page for a group to upload scanned bluesheets. The session details pages for a group can be reached from the meeting's materials page. -

-
- -{% endblock %} diff --git a/ietf/secr/templates/meetings/view.html b/ietf/secr/templates/meetings/view.html index d54346dae..89bd8f7e0 100644 --- a/ietf/secr/templates/meetings/view.html +++ b/ietf/secr/templates/meetings/view.html @@ -37,7 +37,6 @@
  • -