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")
|
raise forms.ValidationError("ERROR: can't change group after materials have been uploaded")
|
||||||
return group
|
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 RegularSessionEditForm(forms.ModelForm):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Session
|
model = Session
|
||||||
fields = ['agenda_note']
|
fields = ['agenda_note']
|
||||||
|
|
||||||
|
|
|
@ -6,9 +6,7 @@ import datetime
|
||||||
import os
|
import os
|
||||||
import shutil
|
import shutil
|
||||||
|
|
||||||
from pathlib import Path
|
|
||||||
from pyquery import PyQuery
|
from pyquery import PyQuery
|
||||||
from io import StringIO
|
|
||||||
|
|
||||||
import debug # pyflakes:ignore
|
import debug # pyflakes:ignore
|
||||||
|
|
||||||
|
@ -170,34 +168,6 @@ class SecrMeetingTestCase(TestCase):
|
||||||
[cn.slug for cn in meeting.group_conflict_types.all()],
|
[cn.slug for cn in meeting.group_conflict_types.all()],
|
||||||
post_data['group_conflict_types'],
|
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):
|
def test_notifications(self):
|
||||||
"Test Notifications"
|
"Test Notifications"
|
||||||
|
|
|
@ -7,10 +7,7 @@ urlpatterns = [
|
||||||
url(r'^$', views.main),
|
url(r'^$', views.main),
|
||||||
url(r'^add/$', views.add),
|
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'^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})/$', 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})/edit/$', views.edit_meeting),
|
||||||
url(r'^(?P<meeting_id>\d{1,6})/notifications/$', views.notifications),
|
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),
|
url(r'^(?P<meeting_id>\d{1,6})/(?P<schedule_name>[A-Za-z0-9_\-]+)/$', views.rooms),
|
||||||
|
|
|
@ -2,8 +2,6 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
import datetime
|
import datetime
|
||||||
import os
|
|
||||||
import time
|
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.contrib import messages
|
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.forms import duration_string
|
||||||
from ietf.meeting.helpers import get_meeting, make_materials_directories, populate_important_dates
|
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.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.name.models import SessionStatusName
|
||||||
from ietf.group.models import Group, GroupEvent
|
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,
|
from ietf.secr.meetings.forms import ( BaseMeetingRoomFormSet, MeetingModelForm, MeetingSelectForm,
|
||||||
MeetingRoomForm, MiscSessionForm, TimeSlotForm, RegularSessionEditForm,
|
MeetingRoomForm, MiscSessionForm, TimeSlotForm, RegularSessionEditForm,
|
||||||
UploadBlueSheetForm, MeetingRoomOptionsForm )
|
MeetingRoomOptionsForm )
|
||||||
from ietf.secr.sreq.views import get_initial_session
|
from ietf.secr.sreq.views import get_initial_session
|
||||||
from ietf.secr.utils.meeting import get_session, get_timeslot
|
from ietf.secr.utils.meeting import get_session, get_timeslot
|
||||||
from ietf.mailtrigger.utils import gather_address_lists
|
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
|
# prep for agenda changes
|
||||||
|
@ -256,72 +253,6 @@ def add(request):
|
||||||
'form': form},
|
'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')
|
@role_required('Secretariat')
|
||||||
def edit_meeting(request, meeting_id):
|
def edit_meeting(request, meeting_id):
|
||||||
'''
|
'''
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
<ul>
|
<ul>
|
||||||
<li> <a href="{% url "ietf.secr.sreq.views.main" %}"><b>Session Requests</b></a></li>
|
<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.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>
|
</ul>
|
||||||
</td>
|
</td>
|
||||||
<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>
|
<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.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.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><button type="button" onclick="window.location='{% url "ietf.meeting.views.list_schedules" num=meeting.number %}'">Agenda List</button></li>
|
||||||
<li>
|
<li>
|
||||||
<!-- [html-validate-disable-block wcag/h32 -- FIXME: no submit button] -->
|
<!-- [html-validate-disable-block wcag/h32 -- FIXME: no submit button] -->
|
||||||
|
|
Loading…
Reference in a new issue