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:
parent
1f89174577
commit
c9e14cb45a
|
@ -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()
|
|
@ -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']
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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):
|
||||
'''
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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 }}
|
||||
» <a href="../../">Meetings</a>
|
||||
» <a href="../">{{ meeting.number }}</a>
|
||||
» 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>
|
||||
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 %}
|
|
@ -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] -->
|
||||
|
|
Loading…
Reference in a new issue