Skip to content

Commit 0f6e3f4

Browse files
committed
Closed off the old paths for materials upload (redirecting some old entry points). Commit ready for merge.
- Legacy-Id: 12000
1 parent c045f7e commit 0f6e3f4

14 files changed

Lines changed: 47 additions & 879 deletions

File tree

ietf/meeting/views.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
from django.shortcuts import render, redirect, get_object_or_404
2121
from django.http import HttpResponse, HttpResponseRedirect, HttpResponseForbidden, Http404
2222
from django.contrib import messages
23-
from django.core.urlresolvers import reverse
23+
from django.core.urlresolvers import reverse,reverse_lazy
2424
from django.db.models import Min, Max
2525
from django.conf import settings
2626
from django.forms.models import modelform_factory, inlineformset_factory
@@ -30,6 +30,7 @@
3030
from django.views.decorators.cache import cache_page
3131
from django.utils.text import slugify
3232
from django.views.decorators.csrf import ensure_csrf_cookie
33+
from django.views.generic import RedirectView
3334
from django.template.defaultfilters import filesizeformat
3435

3536
from ietf.doc.fields import SearchableDocumentsField
@@ -1989,3 +1990,6 @@ def proceedings_overview(request, num=None):
19891990
'template': template,
19901991
})
19911992

1993+
class OldUploadRedirect(RedirectView):
1994+
def get_redirect_url(self, **kwargs):
1995+
return reverse_lazy('ietf.meeting.views.session_details',kwargs=self.kwargs)

ietf/secr/meetings/views.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@
2525
from ietf.secr.meetings.forms import ( BaseMeetingRoomFormSet, MeetingModelForm,
2626
MeetingRoomForm, NewSessionForm, NonSessionEditForm, NonSessionForm, TimeSlotForm,
2727
UploadBlueSheetForm, get_next_slot )
28-
from ietf.secr.proceedings.views import build_choices, handle_upload_file
28+
from ietf.secr.proceedings.views import build_choices
29+
from ietf.secr.proceedings.utils import handle_upload_file
2930
from ietf.secr.sreq.forms import GroupSelectForm
3031
from ietf.secr.sreq.views import get_initial_session
3132
from ietf.secr.utils.meeting import get_session, get_timeslot

ietf/secr/proceedings/forms.py

Lines changed: 0 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
1-
import os
21

32
from django import forms
4-
from django.conf import settings
5-
from django.template.defaultfilters import filesizeformat
63

74
from ietf.doc.models import Document
8-
from ietf.name.models import DocTypeName
95
from ietf.meeting.models import Session
106

117

@@ -22,11 +18,6 @@
2218
# Forms
2319
#----------------------------------------------------------
2420

25-
class EditSlideForm(forms.ModelForm):
26-
class Meta:
27-
model = Document
28-
fields = ('title',)
29-
3021
class RecordingForm(forms.Form):
3122
external_url = forms.URLField(label='Url')
3223
session = forms.ModelChoiceField(queryset=Session.objects,empty_label='')
@@ -46,66 +37,3 @@ def __init__(self, *args, **kwargs):
4637
super(RecordingEditForm, self).__init__(*args, **kwargs)
4738
self.fields['external_url'].label='Url'
4839

49-
class ReplaceSlideForm(forms.ModelForm):
50-
file = forms.FileField(label='Select File')
51-
52-
class Meta:
53-
model = Document
54-
fields = ('title',)
55-
56-
def clean_file(self):
57-
file = self.cleaned_data.get('file')
58-
ext = os.path.splitext(file.name)[1].lower()
59-
if ext not in VALID_SLIDE_EXTENSIONS:
60-
raise forms.ValidationError('Only these file types supported for presentation slides: %s' % ','.join(VALID_SLIDE_EXTENSIONS))
61-
if file._size > settings.SECR_MAX_UPLOAD_SIZE:
62-
raise forms.ValidationError('Please keep filesize under %s. Current filesize %s' % (filesizeformat(settings.SECR_MAX_UPLOAD_SIZE), filesizeformat(file._size)))
63-
return file
64-
65-
class UnifiedUploadForm(forms.Form):
66-
acronym = forms.CharField(widget=forms.HiddenInput())
67-
meeting_id = forms.CharField(widget=forms.HiddenInput())
68-
material_type = forms.ModelChoiceField(queryset=DocTypeName.objects.filter(slug__in=('minutes','agenda','slides','bluesheets')),empty_label=None)
69-
slide_name = forms.CharField(label='Name of Presentation',max_length=255,required=False,help_text="For presentations only")
70-
file = forms.FileField(label='Select File',help_text='<div id="id_file_help">Note 1: You can only upload a presentation file in txt, pdf, doc, or ppt/pptx. System will not accept presentation files in any other format.<br><br>Note 2: All uploaded files will be available to the public immediately on the Preliminary Page. However, for the Proceedings, ppt/pptx files will be converted to html format and doc files will be converted to pdf format manually by the Secretariat staff.</div>')
71-
72-
def clean_file(self):
73-
file = self.cleaned_data['file']
74-
if file._size > settings.SECR_MAX_UPLOAD_SIZE:
75-
raise forms.ValidationError('Please keep filesize under %s. Current filesize %s' % (filesizeformat(settings.SECR_MAX_UPLOAD_SIZE), filesizeformat(file._size)))
76-
return file
77-
78-
def clean(self):
79-
super(UnifiedUploadForm, self).clean()
80-
# if an invalid file type is supplied no file attribute will exist
81-
if self.errors:
82-
return self.cleaned_data
83-
cleaned_data = self.cleaned_data
84-
material_type = cleaned_data['material_type']
85-
slide_name = cleaned_data['slide_name']
86-
file = cleaned_data['file']
87-
ext = os.path.splitext(file.name)[1].lower()
88-
89-
if material_type.slug == 'slides' and not slide_name:
90-
raise forms.ValidationError('ERROR: Name of Presentaion cannot be blank')
91-
92-
# only supporting PDFs per Alexa 04-05-2011
93-
#if material_type == 1 and not file_ext[1] == '.pdf':
94-
# raise forms.ValidationError('Presentations must be a PDF file')
95-
96-
# validate file extensions based on material type (slides,agenda,minutes,bluesheets)
97-
# valid extensions per online documentation: meeting-materials.html
98-
# 09-14-11 added ppt, pdf per Alexa
99-
# 04-19-12 txt/html for agenda, +pdf for minutes per Russ
100-
if material_type.slug == 'slides' and ext not in VALID_SLIDE_EXTENSIONS:
101-
raise forms.ValidationError('Only these file types supported for presentation slides: %s' % ','.join(VALID_SLIDE_EXTENSIONS))
102-
if material_type.slug == 'agenda' and ext not in VALID_AGENDA_EXTENSIONS:
103-
raise forms.ValidationError('Only these file types supported for agendas: %s' % ','.join(VALID_AGENDA_EXTENSIONS))
104-
if material_type.slug == 'minutes' and ext not in VALID_MINUTES_EXTENSIONS:
105-
raise forms.ValidationError('Only these file types supported for minutes: %s' % ','.join(VALID_MINUTES_EXTENSIONS))
106-
if material_type.slug == 'bluesheets' and ext not in VALID_BLUESHEET_EXTENSIONS:
107-
raise forms.ValidationError('Only these file types supported for bluesheets: %s' % ','.join(VALID_BLUESHEET_EXTENSIONS))
108-
109-
return cleaned_data
110-
111-

ietf/secr/proceedings/tests.py

Lines changed: 21 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,19 @@
22
import os
33
import shutil
44

5-
from StringIO import StringIO
6-
7-
from django.core.urlresolvers import reverse
85
from django.conf import settings
6+
from django.core.urlresolvers import reverse
97

10-
from ietf.doc.models import Document
118
from ietf.group.models import Group
12-
from ietf.meeting.models import Meeting, Session
9+
from ietf.meeting.models import Session
1310
from ietf.meeting.test_data import make_meeting_test_data
1411
from ietf.utils.test_data import make_test_data
15-
from ietf.utils.test_utils import TestCase, unicontent
12+
from ietf.utils.test_utils import TestCase
1613

1714
from ietf.name.models import SessionStatusName
18-
from ietf.secr.utils.meeting import get_proceedings_path
15+
from ietf.meeting.factories import SessionFactory
16+
17+
from ietf.secr.proceedings.proc_utils import create_proceedings
1918

2019
SECR_USER='secretary'
2120

@@ -64,47 +63,23 @@ def test_post(self):
6463
self.assertEqual(response.status_code, 200)
6564
self.failUnless(external_url in response.content)
6665

67-
68-
class BluesheetTestCase(TestCase):
66+
class OldProceedingsTestCase(TestCase):
67+
''' Ensure coverage of fragments of old proceedings generation until those are removed '''
6968
def setUp(self):
69+
self.session = SessionFactory(meeting__type_id='ietf')
7070
self.proceedings_dir = os.path.abspath("tmp-proceedings-dir")
71-
if not os.path.exists(self.proceedings_dir):
72-
os.mkdir(self.proceedings_dir)
71+
72+
# This unintuitive bit is a consequence of the surprising implementation of meeting.get_materials_path
7373
self.saved_agenda_path = settings.AGENDA_PATH
74-
settings.AGENDA_PATH = self.proceedings_dir
75-
76-
self.interim_listing_dir = os.path.abspath("tmp-interim-listing-dir")
77-
if not os.path.exists(self.interim_listing_dir):
78-
os.mkdir(self.interim_listing_dir)
79-
self.saved_secr_interim_listing_dir = settings.SECR_INTERIM_LISTING_DIR
80-
settings.SECR_INTERIM_LISTING_DIR = self.interim_listing_dir
81-
74+
settings.AGENDA_PATH= self.proceedings_dir
75+
76+
target_path = self.session.meeting.get_materials_path()
77+
if not os.path.exists(target_path):
78+
os.makedirs(target_path)
79+
8280
def tearDown(self):
83-
settings.AGENDA_PATH = self.saved_agenda_path
8481
shutil.rmtree(self.proceedings_dir)
85-
settings.SECR_INTERIM_LISTING_DIR = self.saved_secr_interim_listing_dir
86-
shutil.rmtree(self.interim_listing_dir)
87-
88-
def test_upload(self):
89-
make_meeting_test_data()
90-
meeting = Meeting.objects.filter(type='interim',session__status='sched').first()
91-
#self.assertTrue(meeting)
92-
group = Group.objects.get(acronym='mars')
93-
#Session.objects.create(meeting=meeting,group=group,requested_by_id=1,status_id='sched',type_id='session')
94-
url = reverse('proceedings_upload_unified', kwargs={'meeting_num':meeting.number,'acronym':'mars'})
95-
upfile = StringIO('dummy file')
96-
upfile.name = "scan1.pdf"
97-
self.client.login(username="marschairman", password="marschairman+password")
98-
r = self.client.post(url,
99-
dict(acronym='mars',meeting_id=meeting.id,material_type='bluesheets',file=upfile),follow=True)
100-
self.assertEqual(r.status_code, 200)
101-
doc = Document.objects.get(type='bluesheets')
102-
self.failUnless(doc.external_url in unicontent(r))
103-
self.failUnless(os.path.exists(os.path.join(doc.get_file_path(),doc.external_url)))
104-
# test that proceedings has bluesheets on it
105-
path = get_proceedings_path(meeting,group)
106-
self.failUnless(os.path.exists(path))
107-
with open(path) as f:
108-
data = f.read()
109-
self.failUnless(doc.external_url.encode('utf-8') in data)
110-
82+
settings.AGENDA_PATH = self.saved_agenda_path
83+
84+
def test_old_generate(self):
85+
create_proceedings(self.session.meeting,self.session.group,is_final=True)

ietf/secr/proceedings/urls.py

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,16 @@
11
from django.conf.urls import patterns, url
22
from django.conf import settings
3+
from ietf.meeting.views import OldUploadRedirect
34

45
urlpatterns = patterns('ietf.secr.proceedings.views',
56
url(r'^$', 'main', name='proceedings'),
67
url(r'^ajax/generate-proceedings/(?P<meeting_num>\d{1,3})/$', 'ajax_generate_proceedings', name='proceedings_ajax_generate_proceedings'),
7-
url(r'^ajax/order-slide/$', 'ajax_order_slide', name='proceedings_ajax_order_slide'),
88
# special offline URL for testing proceedings build
9-
url(r'^build/(?P<meeting_num>\d{1,3}|interim-\d{4}-[A-Za-z0-9_\-\+]+)/(?P<acronym>[-a-z0-9]+)/$',
10-
'build', name='proceedings_build'),
11-
url(r'^delete/(?P<slide_id>[A-Za-z0-9._\-\+]+)/$', 'delete_material', name='proceedings_delete_material'),
12-
url(r'^edit-slide/(?P<slide_id>[A-Za-z0-9._\-\+]+)/$', 'edit_slide', name='proceedings_edit_slide'),
13-
url(r'^move-slide/(?P<slide_id>[A-Za-z0-9._\-\+]+)/(?P<direction>(up|down))/$',
14-
'move_slide', name='proceedings_move_slide'),
159
url(r'^process-pdfs/(?P<meeting_num>\d{1,3})/$', 'process_pdfs', name='proceedings_process_pdfs'),
1610
url(r'^progress-report/(?P<meeting_num>\d{1,3})/$', 'progress_report', name='proceedings_progress_report'),
17-
url(r'^replace-slide/(?P<slide_id>[A-Za-z0-9._\-\+]+)/$', 'replace_slide', name='proceedings_replace_slide'),
1811
url(r'^(?P<meeting_num>\d{1,3})/$', 'select', name='proceedings_select'),
1912
url(r'^(?P<meeting_num>\d{1,3})/recording/$', 'recording', name='proceedings_recording'),
2013
url(r'^(?P<meeting_num>\d{1,3})/recording/edit/(?P<name>[A-Za-z0-9_\-\+]+)$', 'recording_edit', name='proceedings_recording_edit'),
21-
# NOTE: we have two entries here which both map to upload_unified, passing session_id or acronym
22-
url(r'^(?P<meeting_num>\d{1,3}|interim-\d{4}-[A-Za-z0-9_\-\+]+)/(?P<session_id>\d{1,6})/$',
23-
'upload_unified', name='proceedings_upload_unified'),
24-
url(r'^(?P<meeting_num>\d{1,3}|interim-\d{4}-[A-Za-z0-9_\-\+]+)/%(acronym)s/$' % settings.URL_REGEXPS,
25-
'upload_unified', name='proceedings_upload_unified'),
14+
url(r'^(?P<num>\d{1,3}|interim-\d{4}-[A-Za-z0-9_\-\+]+)/%(acronym)s/$' % settings.URL_REGEXPS,
15+
OldUploadRedirect.as_view()),
2616
)

0 commit comments

Comments
 (0)