1212from django .conf import settings
1313from django .shortcuts import render_to_response
1414
15- from ietf .doc .models import Document , RelatedDocument , DocEvent
15+ from ietf .doc .models import Document , RelatedDocument , DocEvent , NewRevisionDocEvent , State
1616from ietf .group .models import Group , Role
1717from ietf .group .utils import get_charter_text
1818from ietf .meeting .helpers import get_schedule
1919from ietf .meeting .models import Session , Meeting , ScheduledSession
20+ from ietf .person .models import Person
2021from ietf .secr .proceedings .models import InterimMeeting # proxy model
2122from ietf .secr .proceedings .models import Registration
2223from ietf .secr .utils .document import get_rfc_num
2324from ietf .secr .utils .group import groups_by_session
24- from ietf .secr .utils .meeting import get_upload_root , get_proceedings_path , get_material , get_session
25-
25+ from ietf .secr .utils .meeting import get_upload_root , get_proceedings_path , get_materials , get_session
2626
2727
2828# -------------------------------------------------
2929# Helper Functions
3030# -------------------------------------------------
31+ def check_audio_files (group ,meeting ):
32+ '''
33+ Checks for audio files and creates corresponding materials (docs) for the Session
34+ Expects audio files in the format ietf[meeting num]-[room]-YYYMMDD-HHMM-*,
35+
36+ Example: ietf90-salonb-20140721-1710-pm3.mp3
37+
38+ '''
39+ for session in Session .objects .filter (group = group ,meeting = meeting ,status__in = ('sched' ,'schedw' )):
40+ timeslot = session .official_scheduledsession ().timeslot
41+ room = timeslot .location .name .lower ()
42+ room = room .replace (' ' ,'' )
43+ room = room .replace ('/' ,'' )
44+ time = timeslot .time .strftime ("%Y%m%d-%H%M" )
45+ filename = 'ietf{}-{}-{}-*' .format (meeting .number ,room ,time )
46+ path = os .path .join (settings .MEETING_RECORDINGS_DIR ,'ietf{}' .format (meeting .number ),filename )
47+ for file in glob .glob (path ):
48+ url = 'http://www.ietf.org/audio/ietf{}/{}' .format (meeting .number ,os .path .basename (file ))
49+ doc = Document .objects .filter (external_url = url ).first ()
50+ if not doc :
51+ create_recording (session ,meeting ,group ,url )
52+
53+ def create_recording (session ,meeting ,group ,url ):
54+ '''
55+ Creates the Document type=recording, setting external_url and creating
56+ NewRevisionDocEvent
57+ '''
58+ sequence = get_next_sequence (group ,meeting ,'recording' )
59+ name = 'recording-{}-{}-{}' .format (meeting .number ,group .acronym ,sequence )
60+ time = session .official_scheduledsession ().timeslot .time .strftime ('%Y-%m-%d %H:%M' )
61+ if url .endswith ('mp3' ):
62+ title = 'Audio recording for {}' .format (time )
63+ else :
64+ title = 'Video recording for {}' .format (time )
65+
66+ doc = Document .objects .create (name = name ,
67+ title = title ,
68+ external_url = url ,
69+ group = group ,
70+ rev = '00' ,
71+ type_id = 'recording' )
72+ doc .set_state (State .objects .get (type = 'recording' , slug = 'active' ))
73+
74+ # create DocEvent
75+ NewRevisionDocEvent .objects .create (type = 'new_revision' ,
76+ by = Person .objects .get (name = '(System)' ),
77+ doc = doc ,
78+ rev = doc .rev ,
79+ desc = 'New revision available' ,
80+ time = doc .time )
81+ session .materials .add (doc )
82+
3183def mycomp (timeslot ):
3284 '''
3385 This takes a timeslot object and returns a key to sort by the area acronym or None
@@ -141,6 +193,13 @@ def get_progress_stats(sdate,edate):
141193
142194 return data
143195
196+ def get_next_sequence (group ,meeting ,type ):
197+ '''
198+ Returns the next sequence number to use for a document of type = type.
199+ Takes a group=Group object, meeting=Meeting object, type = string
200+ '''
201+ return Document .objects .filter (name__startswith = '{}-{}-{}-' .format (type ,meeting .number ,group .acronym )).count () + 1
202+
144203def write_html (path ,content ):
145204 f = open (path ,'w' )
146205 f .write (content )
@@ -188,14 +247,8 @@ def create_proceedings(meeting, group, is_final=False):
188247 if meeting .type_id == 'ietf' and int (meeting .number ) < 79 :
189248 return
190249
191- sessions = Session .objects .filter (meeting = meeting ,group = group )
192- if sessions :
193- session = sessions [0 ]
194- agenda ,minutes ,slides = get_material (session )
195- else :
196- agenda = None
197- minutes = None
198- slides = None
250+ check_audio_files (group ,meeting )
251+ materials = get_materials (group ,meeting )
199252
200253 chairs = group .role_set .filter (name = 'chair' )
201254 secretaries = group .role_set .filter (name = 'secr' )
@@ -215,7 +268,7 @@ def create_proceedings(meeting, group, is_final=False):
215268 settings .MEDIA_URL ,
216269 meeting .date .strftime ('%Y/%m/%d' ),
217270 group .acronym )
218-
271+
219272 # Only do these tasks if we are running official proceedings generation,
220273 # otherwise skip them for expediency. This procedure is called any time meeting
221274 # materials are uploaded/deleted, and we don't want to do all this work each time.
@@ -313,9 +366,7 @@ def create_proceedings(meeting, group, is_final=False):
313366 'tas' : tas ,
314367 'meeting' : meeting ,
315368 'rfcs' : rfcs ,
316- 'slides' : slides ,
317- 'minutes' : minutes ,
318- 'agenda' : agenda }
369+ 'materials' : materials }
319370 )
320371
321372 # save proceedings
0 commit comments