Skip to content

Commit 8c34e9d

Browse files
committed
Merged in ^/branch/proceedings/6.33.1.dev0 from rjsparks@nostrum.com and rcross@amsl.com. This provides new ietf meeting proceedings pages.
- Legacy-Id: 12028
2 parents 26b9641 + c7b82bd commit 8c34e9d

33 files changed

Lines changed: 932 additions & 1032 deletions

ietf/doc/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ class DocumentInfo(models.Model):
6060
abstract = models.TextField(blank=True)
6161
rev = models.CharField(verbose_name="revision", max_length=16, blank=True)
6262
pages = models.IntegerField(blank=True, null=True)
63-
order = models.IntegerField(default=1, blank=True)
63+
order = models.IntegerField(default=1, blank=True) # This is probably obviated by SessionPresentaion.order
6464
intended_std_level = models.ForeignKey(IntendedStdLevelName, verbose_name="Intended standardization level", blank=True, null=True)
6565
std_level = models.ForeignKey(StdLevelName, verbose_name="Standardization level", blank=True, null=True)
6666
ad = models.ForeignKey(Person, verbose_name="area director", related_name='ad_%(class)s_set', blank=True, null=True)

ietf/meeting/factories.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
import random
33
import datetime
44

5-
from django.db.models import Max
65
from django.core.files.base import ContentFile
76

87
from ietf.meeting.models import Meeting, Session, Schedule, TimeSlot, SessionPresentation, FloorPlan
@@ -31,7 +30,8 @@ class Meta:
3130
def number(self,n):
3231
if self.type_id == 'ietf':
3332
if Meeting.objects.filter(type='ietf').exists():
34-
return '%02d'%(int(Meeting.objects.filter(type='ietf').aggregate(Max('number'))['number__max'])+1)
33+
so_far = max([int(x.number) for x in Meeting.objects.filter(type='ietf')])
34+
return '%02d'%(so_far+1)
3535
else:
3636
return '%02d'%(n+80)
3737
else:
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_js.py

Lines changed: 65 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,13 @@
77

88
from django.contrib.staticfiles.testing import StaticLiveServerTestCase
99
from django.core.urlresolvers import reverse as urlreverse
10+
#from django.test.utils import override_settings
1011

1112
import debug # pyflakes:ignore
1213

14+
from ietf.doc.factories import DocumentFactory
1315
from ietf.group import colors
16+
from ietf.meeting.factories import SessionFactory
1417
from ietf.meeting.test_data import make_meeting_test_data
1518
from ietf.meeting.models import SchedTimeSessAssignment
1619
from ietf.utils.test_runner import set_coverage_checking
@@ -43,15 +46,23 @@ def condition_data():
4346

4447
@skipIf(skip_selenium, skip_message)
4548
class ScheduleEditTests(StaticLiveServerTestCase):
46-
def setUp(self):
49+
@classmethod
50+
def setUpClass(cls):
4751
set_coverage_checking(False)
48-
condition_data()
52+
super(ScheduleEditTests, cls).setUpClass()
53+
54+
@classmethod
55+
def tearDownClass(cls):
56+
super(ScheduleEditTests, cls).tearDownClass()
57+
set_coverage_checking(True)
58+
59+
def setUp(self):
4960
self.driver = webdriver.PhantomJS(port=0, service_log_path=settings.TEST_GHOSTDRIVER_LOG_PATH)
5061
self.driver.set_window_size(1024,768)
62+
condition_data()
5163

5264
def tearDown(self):
5365
self.driver.close()
54-
set_coverage_checking(True)
5566

5667
def debugSnapshot(self,filename='debug_this.png'):
5768
self.driver.execute_script("document.body.bgColor = 'white';")
@@ -88,6 +99,57 @@ def testUnschedule(self):
8899
time.sleep(0.1) # The API that modifies the database runs async
89100
self.assertEqual(SchedTimeSessAssignment.objects.filter(session__meeting__number=42,session__group__acronym='mars',schedule__name='test-agenda').count(),0)
90101

102+
@skipIf(skip_selenium, skip_message)
103+
class SlideReorderTests(StaticLiveServerTestCase):
104+
@classmethod
105+
def setUpClass(cls):
106+
set_coverage_checking(False)
107+
super(SlideReorderTests, cls).setUpClass()
108+
109+
@classmethod
110+
def tearDownClass(cls):
111+
super(SlideReorderTests, cls).tearDownClass()
112+
set_coverage_checking(True)
113+
114+
def setUp(self):
115+
self.driver = webdriver.PhantomJS(port=0, service_log_path=settings.TEST_GHOSTDRIVER_LOG_PATH)
116+
self.driver.set_window_size(1024,768)
117+
self.session = SessionFactory(meeting__type_id='ietf')
118+
self.session.sessionpresentation_set.create(document=DocumentFactory(type_id='slides',name='one'),order=1)
119+
self.session.sessionpresentation_set.create(document=DocumentFactory(type_id='slides',name='two'),order=2)
120+
self.session.sessionpresentation_set.create(document=DocumentFactory(type_id='slides',name='three'),order=3)
121+
122+
def tearDown(self):
123+
self.driver.close()
124+
125+
def absreverse(self,*args,**kwargs):
126+
return '%s%s'%(self.live_server_url,urlreverse(*args,**kwargs))
127+
128+
def secr_login(self):
129+
url = '%s%s'%(self.live_server_url, urlreverse('django.contrib.auth.views.login'))
130+
self.driver.get(url)
131+
self.driver.find_element_by_name('username').send_keys('secretary')
132+
self.driver.find_element_by_name('password').send_keys('secretary+password')
133+
self.driver.find_element_by_xpath('//button[@type="submit"]').click()
134+
135+
#@override_settings(DEBUG=True)
136+
def testReorderSlides(self):
137+
return
138+
url = self.absreverse('ietf.meeting.views.session_details',
139+
kwargs=dict(
140+
num=self.session.meeting.number,
141+
acronym = self.session.group.acronym,))
142+
self.secr_login()
143+
self.driver.get(url)
144+
#debug.show('unicode(self.driver.page_source)')
145+
second = self.driver.find_element_by_css_selector('#slides tr:nth-child(2)')
146+
third = self.driver.find_element_by_css_selector('#slides tr:nth-child(3)')
147+
ActionChains(self.driver).drag_and_drop(second,third).perform()
148+
149+
time.sleep(0.1) # The API that modifies the database runs async
150+
names=self.session.sessionpresentation_set.values_list('document__name',flat=True)
151+
self.assertEqual(list(names),[u'one',u'three',u'two'])
152+
91153
# The following are useful debugging tools
92154

93155
# If you add this to a LiveServerTestCase and run just this test, you can browse

ietf/meeting/tests_views.py

Lines changed: 154 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,6 @@ def test_proceedings(self):
260260
self.write_materials_files(meeting, session)
261261

262262
url = urlreverse("ietf.meeting.views.proceedings", kwargs=dict(num=meeting.number))
263-
login_testing_unauthorized(self,"secretary",url)
264263
r = self.client.get(url)
265264
self.assertEqual(r.status_code, 200)
266265

@@ -1271,7 +1270,7 @@ def test_finalize_proceedings(self):
12711270
self.assertEqual(meeting.proceedings_final,True)
12721271
self.assertEqual(meeting.session_set.filter(group__acronym="mars").first().sessionpresentation_set.filter(document__type="draft").first().rev,'00')
12731272

1274-
class BluesheetsTests(TestCase):
1273+
class MaterialsTests(TestCase):
12751274

12761275
def setUp(self):
12771276
self.materials_dir = os.path.abspath(settings.TEST_MATERIALS_DIR)
@@ -1284,14 +1283,14 @@ def tearDown(self):
12841283
settings.AGENDA_PATH = self.saved_agenda_path
12851284
shutil.rmtree(self.materials_dir)
12861285

1287-
def test_upload_blusheets(self):
1286+
def test_upload_bluesheets(self):
12881287
session = SessionFactory(meeting__type_id='ietf')
12891288
url = urlreverse('ietf.meeting.views.upload_session_bluesheets',kwargs={'num':session.meeting.number,'session_id':session.id})
12901289
login_testing_unauthorized(self,"secretary",url)
12911290
r = self.client.get(url)
12921291
self.assertEqual(r.status_code, 200)
12931292
q = PyQuery(r.content)
1294-
self.assertFalse(q("div.alert"))
1293+
self.assertTrue('Upload' in unicode(q("title")))
12951294
self.assertFalse(session.sessionpresentation_set.exists())
12961295
test_file = StringIO('this is some text for a test')
12971296
test_file.name = "not_really.pdf"
@@ -1302,7 +1301,7 @@ def test_upload_blusheets(self):
13021301
r = self.client.get(url)
13031302
self.assertEqual(r.status_code, 200)
13041303
q = PyQuery(r.content)
1305-
self.assertTrue(q("div.alert"))
1304+
self.assertTrue('Revise' in unicode(q("title")))
13061305
test_file = StringIO('this is some different text for a test')
13071306
test_file.name = "also_not_really.pdf"
13081307
r = self.client.post(url,dict(file=test_file))
@@ -1317,11 +1316,160 @@ def test_upload_bluesheets_interim(self):
13171316
r = self.client.get(url)
13181317
self.assertEqual(r.status_code, 200)
13191318
q = PyQuery(r.content)
1320-
self.assertFalse(q("div.alert"))
1319+
self.assertTrue('Upload' in unicode(q("title")))
13211320
self.assertFalse(session.sessionpresentation_set.exists())
13221321
test_file = StringIO('this is some text for a test')
13231322
test_file.name = "not_really.pdf"
13241323
r = self.client.post(url,dict(file=test_file))
13251324
self.assertEqual(r.status_code, 302)
13261325
bs_doc = session.sessionpresentation_set.filter(document__type_id='bluesheets').first().document
13271326
self.assertEqual(bs_doc.rev,'00')
1327+
1328+
def test_upload_minutes_agenda(self):
1329+
for doctype in ('minutes','agenda'):
1330+
session = SessionFactory(meeting__type_id='ietf')
1331+
if doctype == 'minutes':
1332+
url = urlreverse('ietf.meeting.views.upload_session_minutes',kwargs={'num':session.meeting.number,'session_id':session.id})
1333+
else:
1334+
url = urlreverse('ietf.meeting.views.upload_session_agenda',kwargs={'num':session.meeting.number,'session_id':session.id})
1335+
self.client.logout()
1336+
login_testing_unauthorized(self,"secretary",url)
1337+
r = self.client.get(url)
1338+
self.assertEqual(r.status_code, 200)
1339+
q = PyQuery(r.content)
1340+
self.assertTrue('Upload' in unicode(q("Title")))
1341+
self.assertFalse(session.sessionpresentation_set.exists())
1342+
self.assertFalse(q('form input[type="checkbox"]'))
1343+
1344+
session2 = SessionFactory(meeting=session.meeting,group=session.group)
1345+
r = self.client.get(url)
1346+
self.assertEqual(r.status_code, 200)
1347+
q = PyQuery(r.content)
1348+
self.assertTrue(q('form input[type="checkbox"]'))
1349+
1350+
test_file = StringIO('this is some text for a test')
1351+
test_file.name = "not_really.json"
1352+
r = self.client.post(url,dict(file=test_file))
1353+
self.assertEqual(r.status_code, 200)
1354+
q = PyQuery(r.content)
1355+
self.assertTrue(q('form .has-error'))
1356+
1357+
test_file = StringIO('this is some text for a test'*1510000)
1358+
test_file.name = "not_really.pdf"
1359+
r = self.client.post(url,dict(file=test_file))
1360+
self.assertEqual(r.status_code, 200)
1361+
q = PyQuery(r.content)
1362+
self.assertTrue(q('form .has-error'))
1363+
1364+
test_file = StringIO('this is some text for a test')
1365+
test_file.name = "not_really.txt"
1366+
r = self.client.post(url,dict(file=test_file,apply_to_all=False))
1367+
self.assertEqual(r.status_code, 302)
1368+
doc = session.sessionpresentation_set.filter(document__type_id=doctype).first().document
1369+
self.assertEqual(doc.rev,'00')
1370+
self.assertFalse(session2.sessionpresentation_set.filter(document__type_id=doctype))
1371+
1372+
r = self.client.get(url)
1373+
self.assertEqual(r.status_code, 200)
1374+
q = PyQuery(r.content)
1375+
self.assertTrue('Revise' in unicode(q("Title")))
1376+
test_file = StringIO('this is some different text for a test')
1377+
test_file.name = "also_not_really.txt"
1378+
r = self.client.post(url,dict(file=test_file,apply_to_all=True))
1379+
self.assertEqual(r.status_code, 302)
1380+
doc = Document.objects.get(pk=doc.pk)
1381+
self.assertEqual(doc.rev,'01')
1382+
self.assertTrue(session2.sessionpresentation_set.filter(document__type_id=doctype))
1383+
1384+
def test_upload_minutes_agenda_interim(self):
1385+
session=SessionFactory(meeting__type_id='interim')
1386+
for doctype in ('minutes','agenda'):
1387+
if doctype=='minutes':
1388+
url = urlreverse('ietf.meeting.views.upload_session_minutes',kwargs={'num':session.meeting.number,'session_id':session.id})
1389+
else:
1390+
url = urlreverse('ietf.meeting.views.upload_session_agenda',kwargs={'num':session.meeting.number,'session_id':session.id})
1391+
self.client.logout()
1392+
login_testing_unauthorized(self,"secretary",url)
1393+
r = self.client.get(url)
1394+
self.assertEqual(r.status_code, 200)
1395+
q = PyQuery(r.content)
1396+
self.assertTrue('Upload' in unicode(q("title")))
1397+
self.assertFalse(session.sessionpresentation_set.filter(document__type_id=doctype))
1398+
test_file = StringIO('this is some text for a test')
1399+
test_file.name = "not_really.txt"
1400+
r = self.client.post(url,dict(file=test_file))
1401+
self.assertEqual(r.status_code, 302)
1402+
doc = session.sessionpresentation_set.filter(document__type_id=doctype).first().document
1403+
self.assertEqual(doc.rev,'00')
1404+
1405+
def test_upload_slides(self):
1406+
1407+
session1 = SessionFactory(meeting__type_id='ietf')
1408+
session2 = SessionFactory(meeting=session1.meeting,group=session1.group)
1409+
url = urlreverse('ietf.meeting.views.upload_session_slides',kwargs={'num':session1.meeting.number,'session_id':session1.id})
1410+
login_testing_unauthorized(self,"secretary",url)
1411+
r = self.client.get(url)
1412+
self.assertEqual(r.status_code, 200)
1413+
q = PyQuery(r.content)
1414+
self.assertTrue('Upload' in unicode(q("title")))
1415+
self.assertFalse(session1.sessionpresentation_set.filter(document__type_id='slides'))
1416+
test_file = StringIO('this is not really a slide')
1417+
test_file.name = 'not_really.txt'
1418+
r = self.client.post(url,dict(file=test_file,title='a test slide file',apply_to_all=True))
1419+
self.assertEqual(r.status_code, 302)
1420+
self.assertEqual(session1.sessionpresentation_set.count(),1)
1421+
self.assertEqual(session2.sessionpresentation_set.count(),1)
1422+
sp = session2.sessionpresentation_set.first()
1423+
self.assertEqual(sp.document.name, 'slides-%s-%s-a-test-slide-file' % (session1.meeting.number,session1.group.acronym ) )
1424+
self.assertEqual(sp.order,1)
1425+
1426+
url = urlreverse('ietf.meeting.views.upload_session_slides',kwargs={'num':session2.meeting.number,'session_id':session2.id})
1427+
test_file = StringIO('some other thing still not slidelike')
1428+
test_file.name = 'also_not_really.txt'
1429+
r = self.client.post(url,dict(file=test_file,title='a different slide file',apply_to_all=False))
1430+
self.assertEqual(r.status_code, 302)
1431+
self.assertEqual(session1.sessionpresentation_set.count(),1)
1432+
self.assertEqual(session2.sessionpresentation_set.count(),2)
1433+
sp = session2.sessionpresentation_set.get(document__name__endswith='-a-different-slide-file')
1434+
self.assertEqual(sp.order,2)
1435+
self.assertEqual(sp.rev,u'00')
1436+
self.assertEqual(sp.document.rev,u'00')
1437+
1438+
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})
1439+
r = self.client.get(url)
1440+
self.assertTrue(r.status_code, 200)
1441+
q = PyQuery(r.content)
1442+
self.assertTrue('Revise' in unicode(q("title")))
1443+
test_file = StringIO('new content for the second slide deck')
1444+
test_file.name = 'doesnotmatter.txt'
1445+
r = self.client.post(url,dict(file=test_file,title='rename the presentation',apply_to_all=False))
1446+
self.assertEqual(r.status_code, 302)
1447+
self.assertEqual(session1.sessionpresentation_set.count(),1)
1448+
self.assertEqual(session2.sessionpresentation_set.count(),2)
1449+
sp = session2.sessionpresentation_set.get(order=2)
1450+
self.assertEqual(sp.rev,u'01')
1451+
self.assertEqual(sp.document.rev,u'01')
1452+
1453+
def test_remove_sessionpresentation(self):
1454+
session = SessionFactory(meeting__type_id='ietf')
1455+
doc = DocumentFactory(type_id='slides')
1456+
session.sessionpresentation_set.create(document=doc)
1457+
1458+
url = urlreverse('ietf.meeting.views.remove_sessionpresentation',kwargs={'num':session.meeting.number,'session_id':session.id,'name':'no-such-doc'})
1459+
response = self.client.get(url)
1460+
self.assertEqual(response.status_code, 404)
1461+
1462+
url = urlreverse('ietf.meeting.views.remove_sessionpresentation',kwargs={'num':session.meeting.number,'session_id':0,'name':doc.name})
1463+
response = self.client.get(url)
1464+
self.assertEqual(response.status_code, 404)
1465+
1466+
url = urlreverse('ietf.meeting.views.remove_sessionpresentation',kwargs={'num':session.meeting.number,'session_id':session.id,'name':doc.name})
1467+
login_testing_unauthorized(self,"secretary",url)
1468+
response = self.client.get(url)
1469+
self.assertEqual(response.status_code, 200)
1470+
1471+
self.assertEqual(1,session.sessionpresentation_set.count())
1472+
response = self.client.post(url,{'remove_session':''})
1473+
self.assertEqual(response.status_code, 302)
1474+
self.assertEqual(0,session.sessionpresentation_set.count())
1475+
self.assertEqual(2,doc.docevent_set.count())

ietf/meeting/urls.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@
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),
17+
url(r'^session/(?P<session_id>\d+)/slides/%(name)s/order$' % settings.URL_REGEXPS, views.set_slide_order),
18+
url(r'^session/(?P<session_id>\d+)/doc/%(name)s/remove$' % settings.URL_REGEXPS, views.remove_sessionpresentation),
1419
]
1520

1621

0 commit comments

Comments
 (0)