From c9e14cb45af44f1dad233e07baf2f8f8bbdfed06 Mon Sep 17 00:00:00 2001
From: Ryan Cross <rcross@amsl.com>
Date: Mon, 23 Oct 2023 16:31:47 -0700
Subject: [PATCH] refactor: remove unused physical bluesheet functions (#6525)

* refactor: remove unused secr/console app

* refactor: remove unused secr/areas app

* refactor: remove unused physical bluesheets functions

---------

Co-authored-by: Robert Sparks <rjsparks@nostrum.com>
---
 ietf/secr/meetings/blue_sheets.py            | 96 --------------------
 ietf/secr/meetings/forms.py                  |  9 --
 ietf/secr/meetings/tests.py                  | 30 ------
 ietf/secr/meetings/urls.py                   |  3 -
 ietf/secr/meetings/views.py                  | 75 +--------------
 ietf/secr/templates/main.html                |  1 -
 ietf/secr/templates/meetings/blue_sheet.html | 48 ----------
 ietf/secr/templates/meetings/view.html       |  1 -
 8 files changed, 3 insertions(+), 260 deletions(-)
 delete mode 100644 ietf/secr/meetings/blue_sheets.py
 delete mode 100644 ietf/secr/templates/meetings/blue_sheet.html

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<meeting_id>\d{1,6})/(?P<day>\d)/$', views.ajax_get_times), # Not in use
-    url(r'^blue_sheet/$', views.blue_sheet_redirect),
     url(r'^(?P<meeting_id>\d{1,6})/$', views.view),
-    url(r'^(?P<meeting_id>\d{1,6})/blue_sheet/$', views.blue_sheet),
-    url(r'^(?P<meeting_id>\d{1,6})/blue_sheet/generate/$', views.blue_sheet_generate),
     url(r'^(?P<meeting_id>\d{1,6})/edit/$', views.edit_meeting),
     url(r'^(?P<meeting_id>\d{1,6})/notifications/$', views.notifications),
     url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[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 @@
                         <ul>
                         <li> <a href="{% url "ietf.secr.sreq.views.main" %}"><b>Session Requests</b></a></li>
                         <li> <a href="{% url "ietf.secr.meetings.views.main" %}"><b>Meeting Manager</b></a></li>
-                        <li> <a href="{% url "ietf.secr.meetings.views.blue_sheet_redirect" %}"><b>Blue Sheets</b></a></li>
                         </ul>
                     </td>
                     <td>
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 }}
-    <script src="{% static 'secr/js/utils.js' %}"></script>
-{% endblock %}
-
-{% block breadcrumbs %}{{ block.super }}
-    &raquo; <a href="../../">Meetings</a>
-    &raquo; <a href="../">{{ meeting.number }}</a>
-    &raquo; Blue Sheets
-{% endblock %}
-
-{% block content %}
-
-    <div  class="module">
-        <h2>IETF {{ meeting.number }} - Blue Sheet</h2>
-
-        <p>Use this to generate blue sheets for meeting sessions.</p>
-        <ul class="none">
-            <li>
-                <form class="d-inline" method="post" action="{% url "ietf.secr.meetings.views.blue_sheet_generate" meeting_id=meeting.number%}">{% csrf_token %}
-                    <button type="submit">Generate Blue Sheets</button>
-                </form>
-                &nbsp;&nbsp;Last run:
-                {% if last_run %}
-                    {{ last_run }}
-                {% else %}
-                    Never
-                {% endif %}
-            </li>
-        </ul>
-        <p>Use this to download the blue sheets from the server.</p>
-        <ul class="none">
-            <li>
-                <button type="button" onclick="window.location='{{ url }}'">Download Blue Sheets</button>
-            </li>
-        </ul>
-
-        <hr>
-        <p>
-            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 <a href="{% url 'ietf.meeting.views.materials' num=meeting.number %}">materials page</a>.
-        </p>
-    </div> <!-- module -->
-
-{% 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 @@
             <ul>
                 <li><button type="button" onclick="window.location='{% url "ietf.secr.meetings.views.edit_meeting" meeting_id=meeting.number %}'">Edit</button></li>
                 <li><button type="button" onclick="window.location='{% url "ietf.secr.meetings.views.notifications" meeting_id=meeting.number %}'">Notifications</button></li>
-                <li><button type="button" onclick="window.location='{% url "ietf.secr.meetings.views.blue_sheet" meeting_id=meeting.number %}'">Blue Sheets</button></li>
                 <li><button type="button" onclick="window.location='{% url "ietf.meeting.views.list_schedules" num=meeting.number %}'">Agenda List</button></li>
                 <li>
                     <!-- [html-validate-disable-block wcag/h32 -- FIXME: no submit button] -->