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+ Example: ietf90-salonb-20140721-1710-pm3.mp3
36+ '''
37+ for session in Session .objects .filter (group = group ,meeting = meeting ,status__in = ('sched' ,'schedw' )):
38+ timeslot = session .official_scheduledsession ().timeslot
39+ room = timeslot .location .name .lower ()
40+ room = room .replace (' ' ,'' )
41+ room = room .replace ('/' ,'' )
42+ time = timeslot .time .strftime ("%Y%m%d-%H%M" )
43+ filename = 'ietf{}-{}-{}-*' .format (meeting .number ,room ,time )
44+ path = os .path .join (settings .MEETING_RECORDINGS_DIR ,'ietf{}' .format (meeting .number ),filename )
45+ for file in glob .glob (path ):
46+ url = 'http://www.ietf.org/audio/ietf{}/{}' .format (meeting .number ,os .path .basename (file ))
47+ doc = Document .objects .filter (external_url = url ).first ()
48+ if not doc :
49+ create_recording (session ,meeting ,group ,url )
50+
51+ def create_recording (session ,meeting ,group ,url ):
52+ sequence = get_next_sequence (group ,meeting ,'record' )
53+ name = 'record-{}-{}-{}' .format (meeting .number ,group .acronym ,sequence )
54+ time = session .official_scheduledsession ().timeslot .time .strftime ('%Y-%m-%d %H:%M' )
55+ if url .endswith ('mp3' ):
56+ title = 'Audio recording for {}' .format (time )
57+ else :
58+ title = 'Video recording for {}' .format (time )
59+
60+ doc = Document .objects .create (name = name ,
61+ title = title ,
62+ external_url = url ,
63+ group = group ,
64+ rev = '00' ,
65+ type_id = 'record' )
66+ doc .set_state (State .objects .get (type = 'record' , slug = 'active' ))
67+
68+ # create DocEvent
69+ NewRevisionDocEvent .objects .create (type = 'new_revision' ,
70+ by = Person .objects .get (name = '(system)' ),
71+ doc = doc ,
72+ rev = doc .rev ,
73+ desc = 'New revision available' ,
74+ time = doc .time )
75+ session .materials .add (doc )
76+
3177def mycomp (timeslot ):
3278 '''
3379 This takes a timeslot object and returns a key to sort by the area acronym or None
@@ -141,6 +187,13 @@ def get_progress_stats(sdate,edate):
141187
142188 return data
143189
190+ def get_next_sequence (group ,meeting ,type ):
191+ '''
192+ Returns the next sequence number to use for a document of type = type.
193+ Takes a group=Group object, meeting=Meeting object, type = string
194+ '''
195+ return Document .objects .filter (name__startswith = '{}-{}-{}-' .format (type ,meeting .number ,group .acronym )).count () + 1
196+
144197def write_html (path ,content ):
145198 f = open (path ,'w' )
146199 f .write (content )
@@ -188,14 +241,8 @@ def create_proceedings(meeting, group, is_final=False):
188241 if meeting .type_id == 'ietf' and int (meeting .number ) < 79 :
189242 return
190243
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
244+ check_audio_files (group ,meeting )
245+ materials = get_materials (group ,meeting )
199246
200247 chairs = group .role_set .filter (name = 'chair' )
201248 secretaries = group .role_set .filter (name = 'secr' )
@@ -215,7 +262,7 @@ def create_proceedings(meeting, group, is_final=False):
215262 settings .MEDIA_URL ,
216263 meeting .date .strftime ('%Y/%m/%d' ),
217264 group .acronym )
218-
265+
219266 # Only do these tasks if we are running official proceedings generation,
220267 # otherwise skip them for expediency. This procedure is called any time meeting
221268 # materials are uploaded/deleted, and we don't want to do all this work each time.
@@ -313,9 +360,7 @@ def create_proceedings(meeting, group, is_final=False):
313360 'tas' : tas ,
314361 'meeting' : meeting ,
315362 'rfcs' : rfcs ,
316- 'slides' : slides ,
317- 'minutes' : minutes ,
318- 'agenda' : agenda }
363+ 'materials' : materials }
319364 )
320365
321366 # save proceedings
0 commit comments