Skip to content

Commit 53f41a6

Browse files
committed
Added an order field to SessionPresentation.
Set up removing the order field from Document. Modified the meeting materials, proceedings, and session details views to use the order field on SessionPresentation. Added bootstrapped views to upload session materials (agendas, slides, minutes, and bluesheets). Integrated upload into the session details view. Commit ready for merge. - Legacy-Id: 11989
1 parent 89a3afe commit 53f41a6

11 files changed

Lines changed: 631 additions & 111 deletions

ietf/doc/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ class DocumentInfo(models.Model):
5959
abstract = models.TextField(blank=True)
6060
rev = models.CharField(verbose_name="revision", max_length=16, blank=True)
6161
pages = models.IntegerField(blank=True, null=True)
62-
order = models.IntegerField(default=1, blank=True)
62+
order = models.IntegerField(default=1, blank=True) # This is probably obviated by SessionPresentaion.order
6363
intended_std_level = models.ForeignKey(IntendedStdLevelName, verbose_name="Intended standardization level", blank=True, null=True)
6464
std_level = models.ForeignKey(StdLevelName, verbose_name="Standardization level", blank=True, null=True)
6565
ad = models.ForeignKey(Person, verbose_name="area director", related_name='ad_%(class)s_set', blank=True, null=True)
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# -*- coding: utf-8 -*-
2+
from __future__ import unicode_literals
3+
4+
from django.db import migrations
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('meeting', '0036_add_order_to_sessionpresentation'),
11+
]
12+
13+
operations = [
14+
migrations.AlterModelOptions(
15+
name='sessionpresentation',
16+
options={'ordering': ('order',)},
17+
),
18+
]

ietf/meeting/models.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -963,6 +963,7 @@ class SessionPresentation(models.Model):
963963

964964
class Meta:
965965
db_table = 'meeting_session_materials'
966+
ordering = ('order',)
966967

967968
def __unicode__(self):
968969
return u"%s -> %s-%s" % (self.session, self.document.name, self.rev)
@@ -1005,7 +1006,7 @@ def get_material(self, material_type, only_one):
10051006
for d in l:
10061007
d.meeting_related = lambda: True
10071008
else:
1008-
l = self.materials.filter(type=material_type).exclude(states__type=material_type, states__slug='deleted').order_by("order")
1009+
l = self.materials.filter(type=material_type).exclude(states__type=material_type, states__slug='deleted').order_by('sessionpresentation__order')
10091010

10101011
if only_one:
10111012
if l:

ietf/meeting/tests_views.py

Lines changed: 131 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1271,7 +1271,7 @@ def test_finalize_proceedings(self):
12711271
self.assertEqual(meeting.proceedings_final,True)
12721272
self.assertEqual(meeting.session_set.filter(group__acronym="mars").first().sessionpresentation_set.filter(document__type="draft").first().rev,'00')
12731273

1274-
class BluesheetsTests(TestCase):
1274+
class MaterialsTests(TestCase):
12751275

12761276
def setUp(self):
12771277
self.materials_dir = os.path.abspath(settings.TEST_MATERIALS_DIR)
@@ -1284,14 +1284,14 @@ def tearDown(self):
12841284
settings.AGENDA_PATH = self.saved_agenda_path
12851285
shutil.rmtree(self.materials_dir)
12861286

1287-
def test_upload_blusheets(self):
1287+
def test_upload_bluesheets(self):
12881288
session = SessionFactory(meeting__type_id='ietf')
12891289
url = urlreverse('ietf.meeting.views.upload_session_bluesheets',kwargs={'num':session.meeting.number,'session_id':session.id})
12901290
login_testing_unauthorized(self,"secretary",url)
12911291
r = self.client.get(url)
12921292
self.assertEqual(r.status_code, 200)
12931293
q = PyQuery(r.content)
1294-
self.assertFalse(q("div.alert"))
1294+
self.assertTrue('Upload' in unicode(q("title")))
12951295
self.assertFalse(session.sessionpresentation_set.exists())
12961296
test_file = StringIO('this is some text for a test')
12971297
test_file.name = "not_really.pdf"
@@ -1302,7 +1302,7 @@ def test_upload_blusheets(self):
13021302
r = self.client.get(url)
13031303
self.assertEqual(r.status_code, 200)
13041304
q = PyQuery(r.content)
1305-
self.assertTrue(q("div.alert"))
1305+
self.assertTrue('Revise' in unicode(q("title")))
13061306
test_file = StringIO('this is some different text for a test')
13071307
test_file.name = "also_not_really.pdf"
13081308
r = self.client.post(url,dict(file=test_file))
@@ -1317,11 +1317,137 @@ def test_upload_bluesheets_interim(self):
13171317
r = self.client.get(url)
13181318
self.assertEqual(r.status_code, 200)
13191319
q = PyQuery(r.content)
1320-
self.assertFalse(q("div.alert"))
1320+
self.assertTrue('Upload' in unicode(q("title")))
13211321
self.assertFalse(session.sessionpresentation_set.exists())
13221322
test_file = StringIO('this is some text for a test')
13231323
test_file.name = "not_really.pdf"
13241324
r = self.client.post(url,dict(file=test_file))
13251325
self.assertEqual(r.status_code, 302)
13261326
bs_doc = session.sessionpresentation_set.filter(document__type_id='bluesheets').first().document
13271327
self.assertEqual(bs_doc.rev,'00')
1328+
1329+
def test_upload_minutes_agenda(self):
1330+
for doctype in ('minutes','agenda'):
1331+
session = SessionFactory(meeting__type_id='ietf')
1332+
if doctype == 'minutes':
1333+
url = urlreverse('ietf.meeting.views.upload_session_minutes',kwargs={'num':session.meeting.number,'session_id':session.id})
1334+
else:
1335+
url = urlreverse('ietf.meeting.views.upload_session_agenda',kwargs={'num':session.meeting.number,'session_id':session.id})
1336+
self.client.logout()
1337+
login_testing_unauthorized(self,"secretary",url)
1338+
r = self.client.get(url)
1339+
self.assertEqual(r.status_code, 200)
1340+
q = PyQuery(r.content)
1341+
self.assertTrue('Upload' in unicode(q("Title")))
1342+
self.assertFalse(session.sessionpresentation_set.exists())
1343+
self.assertFalse(q('form input[type="checkbox"]'))
1344+
1345+
session2 = SessionFactory(meeting=session.meeting,group=session.group)
1346+
r = self.client.get(url)
1347+
self.assertEqual(r.status_code, 200)
1348+
q = PyQuery(r.content)
1349+
self.assertTrue(q('form input[type="checkbox"]'))
1350+
1351+
test_file = StringIO('this is some text for a test')
1352+
test_file.name = "not_really.json"
1353+
r = self.client.post(url,dict(file=test_file))
1354+
self.assertEqual(r.status_code, 200)
1355+
q = PyQuery(r.content)
1356+
self.assertTrue(q('form .has-error'))
1357+
1358+
test_file = StringIO('this is some text for a test'*1510000)
1359+
test_file.name = "not_really.pdf"
1360+
r = self.client.post(url,dict(file=test_file))
1361+
self.assertEqual(r.status_code, 200)
1362+
q = PyQuery(r.content)
1363+
self.assertTrue(q('form .has-error'))
1364+
1365+
test_file = StringIO('this is some text for a test')
1366+
test_file.name = "not_really.txt"
1367+
r = self.client.post(url,dict(file=test_file,apply_to_all=False))
1368+
self.assertEqual(r.status_code, 302)
1369+
doc = session.sessionpresentation_set.filter(document__type_id=doctype).first().document
1370+
self.assertEqual(doc.rev,'00')
1371+
self.assertFalse(session2.sessionpresentation_set.filter(document__type_id=doctype))
1372+
1373+
r = self.client.get(url)
1374+
self.assertEqual(r.status_code, 200)
1375+
q = PyQuery(r.content)
1376+
self.assertTrue('Revise' in unicode(q("Title")))
1377+
test_file = StringIO('this is some different text for a test')
1378+
test_file.name = "also_not_really.txt"
1379+
r = self.client.post(url,dict(file=test_file,apply_to_all=True))
1380+
self.assertEqual(r.status_code, 302)
1381+
doc = Document.objects.get(pk=doc.pk)
1382+
self.assertEqual(doc.rev,'01')
1383+
self.assertTrue(session2.sessionpresentation_set.filter(document__type_id=doctype))
1384+
1385+
def test_upload_minutes_agenda_interim(self):
1386+
session=SessionFactory(meeting__type_id='interim')
1387+
for doctype in ('minutes','agenda'):
1388+
if doctype=='minutes':
1389+
url = urlreverse('ietf.meeting.views.upload_session_minutes',kwargs={'num':session.meeting.number,'session_id':session.id})
1390+
else:
1391+
url = urlreverse('ietf.meeting.views.upload_session_agenda',kwargs={'num':session.meeting.number,'session_id':session.id})
1392+
self.client.logout()
1393+
login_testing_unauthorized(self,"secretary",url)
1394+
r = self.client.get(url)
1395+
self.assertEqual(r.status_code, 200)
1396+
q = PyQuery(r.content)
1397+
self.assertTrue('Upload' in unicode(q("title")))
1398+
self.assertFalse(session.sessionpresentation_set.filter(document__type_id=doctype))
1399+
test_file = StringIO('this is some text for a test')
1400+
test_file.name = "not_really.txt"
1401+
r = self.client.post(url,dict(file=test_file))
1402+
self.assertEqual(r.status_code, 302)
1403+
doc = session.sessionpresentation_set.filter(document__type_id=doctype).first().document
1404+
self.assertEqual(doc.rev,'00')
1405+
1406+
def test_upload_slides(self):
1407+
1408+
session1 = SessionFactory(meeting__type_id='ietf')
1409+
session2 = SessionFactory(meeting=session1.meeting,group=session1.group)
1410+
url = urlreverse('ietf.meeting.views.upload_session_slides',kwargs={'num':session1.meeting.number,'session_id':session1.id})
1411+
login_testing_unauthorized(self,"secretary",url)
1412+
r = self.client.get(url)
1413+
self.assertEqual(r.status_code, 200)
1414+
q = PyQuery(r.content)
1415+
self.assertTrue('Upload' in unicode(q("title")))
1416+
self.assertFalse(session1.sessionpresentation_set.filter(document__type_id='slides'))
1417+
test_file = StringIO('this is not really a slide')
1418+
test_file.name = 'not_really.txt'
1419+
r = self.client.post(url,dict(file=test_file,title='a test slide file',apply_to_all=True))
1420+
self.assertEqual(r.status_code, 302)
1421+
self.assertEqual(session1.sessionpresentation_set.count(),1)
1422+
self.assertEqual(session2.sessionpresentation_set.count(),1)
1423+
sp = session2.sessionpresentation_set.first()
1424+
self.assertEqual(sp.document.name, 'slides-%s-%s-a-test-slide-file' % (session1.meeting.number,session1.group.acronym ) )
1425+
self.assertEqual(sp.order,1)
1426+
1427+
url = urlreverse('ietf.meeting.views.upload_session_slides',kwargs={'num':session2.meeting.number,'session_id':session2.id})
1428+
test_file = StringIO('some other thing still not slidelike')
1429+
test_file.name = 'also_not_really.txt'
1430+
r = self.client.post(url,dict(file=test_file,title='a different slide file',apply_to_all=False))
1431+
self.assertEqual(r.status_code, 302)
1432+
self.assertEqual(session1.sessionpresentation_set.count(),1)
1433+
self.assertEqual(session2.sessionpresentation_set.count(),2)
1434+
sp = session2.sessionpresentation_set.get(document__name__endswith='-a-different-slide-file')
1435+
self.assertEqual(sp.order,2)
1436+
self.assertEqual(sp.rev,u'00')
1437+
self.assertEqual(sp.document.rev,u'00')
1438+
1439+
url = urlreverse('ietf.meeting.views.upload_session_slides',kwargs={'num':session2.meeting.number,'session_id':session2.id,'name':session2.sessionpresentation_set.get(order=2).document.name})
1440+
r = self.client.get(url)
1441+
self.assertTrue(r.status_code, 200)
1442+
q = PyQuery(r.content)
1443+
self.assertTrue('Revise' in unicode(q("title")))
1444+
test_file = StringIO('new content for the second slide deck')
1445+
test_file.name = 'doesnotmatter.txt'
1446+
r = self.client.post(url,dict(file=test_file,title='rename the presentation',apply_to_all=False))
1447+
self.assertEqual(r.status_code, 302)
1448+
self.assertEqual(session1.sessionpresentation_set.count(),1)
1449+
self.assertEqual(session2.sessionpresentation_set.count(),2)
1450+
sp = session2.sessionpresentation_set.get(order=2)
1451+
self.assertEqual(sp.rev,u'01')
1452+
self.assertEqual(sp.document.rev,u'01')
1453+

ietf/meeting/urls.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
url(r'^session/(?P<acronym>[-a-z0-9]+)/?$', views.session_details),
1212
url(r'^session/(?P<session_id>\d+)/drafts$', views.add_session_drafts),
1313
url(r'^session/(?P<session_id>\d+)/bluesheets$', views.upload_session_bluesheets),
14+
url(r'^session/(?P<session_id>\d+)/minutes$', views.upload_session_minutes),
15+
url(r'^session/(?P<session_id>\d+)/agenda$', views.upload_session_agenda),
16+
url(r'^session/(?P<session_id>\d+)/slides(?:/%(name)s)?$' % settings.URL_REGEXPS, views.upload_session_slides),
1417
]
1518

1619

0 commit comments

Comments
 (0)