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>
This commit is contained in:
Ryan Cross 2023-10-23 16:31:47 -07:00 committed by GitHub
parent 1f89174577
commit c9e14cb45a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 3 additions and 260 deletions

View file

@ -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()

View file

@ -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']

View file

@ -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"

View file

@ -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),

View file

@ -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):
'''

View file

@ -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>

View file

@ -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 %}

View file

@ -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] -->