1313import pytz
1414import re
1515import tarfile
16+ import tempfile
1617import markdown2
1718
1819
@@ -1702,55 +1703,27 @@ def upload_session_bluesheets(request, session_id, num):
17021703 if len (sessions ) > 1 :
17031704 session_number = 1 + sessions .index (session )
17041705
1705- bluesheet_sp = session .sessionpresentation_set .filter (document__type = 'bluesheets' ).first ()
1706-
17071706 if request .method == 'POST' :
17081707 form = UploadBlueSheetForm (request .POST ,request .FILES )
17091708 if form .is_valid ():
17101709 file = request .FILES ['file' ]
1711- _ , ext = os .path .splitext (file .name )
1712- if bluesheet_sp :
1713- doc = bluesheet_sp .document
1714- doc .rev = '%02d' % (int (doc .rev )+ 1 )
1715- bluesheet_sp .rev = doc .rev
1716- bluesheet_sp .save ()
1717- else :
1718- ota = session .official_timeslotassignment ()
1719- sess_time = ota and ota .timeslot .time
1720- if not sess_time :
1721- return HttpResponse ("Cannot receive uploads for an unscheduled session. Please check the session ID." , status = 410 , content_type = "text/plain" )
1722- if session .meeting .type_id == 'ietf' :
1723- name = 'bluesheets-%s-%s-%s' % (session .meeting .number ,
1724- session .group .acronym ,
1725- sess_time .strftime ("%Y%m%d%H%M" ))
1726- title = 'Bluesheets IETF%s: %s : %s' % (session .meeting .number ,
1727- session .group .acronym ,
1728- sess_time .strftime ("%a %H:%M" ))
1729- else :
1730- name = 'bluesheets-%s-%s' % (session .meeting .number , sess_time .strftime ("%Y%m%d%H%M" ))
1731- title = 'Bluesheets %s: %s' % (session .meeting .number , sess_time .strftime ("%a %H:%M" ))
1732- doc = Document .objects .create (
1733- name = name ,
1734- type_id = 'bluesheets' ,
1735- title = title ,
1736- group = session .group ,
1737- rev = '00' ,
1738- )
1739- doc .states .add (State .objects .get (type_id = 'bluesheets' ,slug = 'active' ))
1740- DocAlias .objects .create (name = doc .name ).docs .add (doc )
1741- session .sessionpresentation_set .create (document = doc ,rev = '00' )
1742- filename = '%s-%s%s' % ( doc .name , doc .rev , ext )
1743- doc .uploaded_filename = filename
1744- e = NewRevisionDocEvent .objects .create (doc = doc , rev = doc .rev , by = request .user .person , type = 'new_revision' , desc = 'New revision available: %s' % doc .rev )
1745- save_error = handle_upload_file (file , filename , session .meeting , 'bluesheets' , request = request , encoding = form .file_encoding [file .name ])
1710+
1711+ ota = session .official_timeslotassignment ()
1712+ sess_time = ota and ota .timeslot .time
1713+ if not sess_time :
1714+ return HttpResponse ("Cannot receive uploads for an unscheduled session. Please check the session ID." , status = 410 , content_type = "text/plain" )
1715+
1716+
1717+ save_error = save_bluesheet (request , session , file , encoding = form .file_encoding [file .name ])
17461718 if save_error :
17471719 form .add_error (None , save_error )
17481720 else :
1749- doc .save_with_history ([e ])
17501721 return redirect ('ietf.meeting.views.session_details' ,num = num ,acronym = session .group .acronym )
17511722 else :
17521723 form = UploadBlueSheetForm ()
17531724
1725+ bluesheet_sp = session .sessionpresentation_set .filter (document__type = 'bluesheets' ).first ()
1726+
17541727 return render (request , "meeting/upload_session_bluesheets.html" ,
17551728 {'session' : session ,
17561729 'session_number' : session_number ,
@@ -1759,6 +1732,47 @@ def upload_session_bluesheets(request, session_id, num):
17591732 })
17601733
17611734
1735+ def save_bluesheet (request , session , file , encoding = 'utf-8' ):
1736+ bluesheet_sp = session .sessionpresentation_set .filter (document__type = 'bluesheets' ).first ()
1737+ _ , ext = os .path .splitext (file .name )
1738+
1739+ if bluesheet_sp :
1740+ doc = bluesheet_sp .document
1741+ doc .rev = '%02d' % (int (doc .rev )+ 1 )
1742+ bluesheet_sp .rev = doc .rev
1743+ bluesheet_sp .save ()
1744+ else :
1745+ ota = session .official_timeslotassignment ()
1746+ sess_time = ota and ota .timeslot .time
1747+
1748+ if session .meeting .type_id == 'ietf' :
1749+ name = 'bluesheets-%s-%s-%s' % (session .meeting .number ,
1750+ session .group .acronym ,
1751+ sess_time .strftime ("%Y%m%d%H%M" ))
1752+ title = 'Bluesheets IETF%s: %s : %s' % (session .meeting .number ,
1753+ session .group .acronym ,
1754+ sess_time .strftime ("%a %H:%M" ))
1755+ else :
1756+ name = 'bluesheets-%s-%s' % (session .meeting .number , sess_time .strftime ("%Y%m%d%H%M" ))
1757+ title = 'Bluesheets %s: %s' % (session .meeting .number , sess_time .strftime ("%a %H:%M" ))
1758+ doc = Document .objects .create (
1759+ name = name ,
1760+ type_id = 'bluesheets' ,
1761+ title = title ,
1762+ group = session .group ,
1763+ rev = '00' ,
1764+ )
1765+ doc .states .add (State .objects .get (type_id = 'bluesheets' ,slug = 'active' ))
1766+ DocAlias .objects .create (name = doc .name ).docs .add (doc )
1767+ session .sessionpresentation_set .create (document = doc ,rev = '00' )
1768+ filename = '%s-%s%s' % ( doc .name , doc .rev , ext )
1769+ doc .uploaded_filename = filename
1770+ e = NewRevisionDocEvent .objects .create (doc = doc , rev = doc .rev , by = request .user .person , type = 'new_revision' , desc = 'New revision available: %s' % doc .rev )
1771+ save_error = handle_upload_file (file , filename , session .meeting , 'bluesheets' , request = request , encoding = encoding )
1772+ if not save_error :
1773+ doc .save_with_history ([e ])
1774+ return save_error
1775+
17621776class UploadMinutesForm (FileUploadForm ):
17631777 apply_to_all = forms .BooleanField (label = 'Apply to all group sessions at this meeting' ,initial = True ,required = False )
17641778
@@ -3024,6 +3038,64 @@ def err(code, text):
30243038 return HttpResponse ("Done" , status = 200 , content_type = 'text/plain' )
30253039
30263040
3041+ @require_api_key
3042+ @role_required ('Recording Manager' , 'Secretariat' )
3043+ @csrf_exempt
3044+ def api_upload_bluesheet (request ):
3045+ def err (code , text ):
3046+ return HttpResponse (text , status = code , content_type = 'text/plain' )
3047+ if request .method == 'POST' :
3048+ # parameters:
3049+ # apikey: the poster's personal API key
3050+ # meeting: number as string, i.e., '101', or 'interim-2018-quic-02'
3051+ # group: acronym or special, i.e., 'quic' or 'plenary'
3052+ # item: '1', '2', '3' (the group's first, second, third etc.
3053+ # session during the week)
3054+ # bluesheet: json blob with [{'name': 'Name', 'affiliation': 'Organization', }, ...]
3055+ for item in ['meeting' , 'group' , 'item' , 'bluesheet' ,]:
3056+ value = request .POST .get (item )
3057+ if not value :
3058+ return err (400 , "Missing %s parameter" % item )
3059+ number = request .POST .get ('meeting' )
3060+ sessions = Session .objects .filter (meeting__number = number )
3061+ if not sessions .exists ():
3062+ return err (400 , "No sessions found for meeting '%s'" % (number , ))
3063+ acronym = request .POST .get ('group' )
3064+ sessions = sessions .filter (group__acronym = acronym )
3065+ if not sessions .exists ():
3066+ return err (400 , "No sessions found in meeting '%s' for group '%s'" % (number , acronym ))
3067+ session_times = [ (s .official_timeslotassignment ().timeslot .time , s ) for s in sessions if s .official_timeslotassignment () ]
3068+ session_times .sort ()
3069+ item = request .POST .get ('item' )
3070+ if not item .isdigit ():
3071+ return err (400 , "Expected a numeric value for 'item', found '%s'" % (item , ))
3072+ n = int (item )- 1 # change 1-based to 0-based
3073+ try :
3074+ time , session = session_times [n ]
3075+ except IndexError :
3076+ return err (400 , "No item '%s' found in list of sessions for group" % (item , ))
3077+ bjson = request .POST .get ('bluesheet' )
3078+ try :
3079+ data = json .loads (bjson )
3080+ except json .decoder .JSONDecodeError :
3081+ return err (400 , "Invalid json value: '%s'" % (bjson , ))
3082+
3083+ fd , name = tempfile .mkstemp (suffix = ".txt" , text = True )
3084+ os .close (fd )
3085+ with open (name , "w" ) as file :
3086+ file .write ("Bluesheets for %s\n \n " % session )
3087+ for item in data :
3088+ file .write ("{name}\t {affiliation}\n " .format (** item ))
3089+ with open (name , "br" ) as file :
3090+ save_err = save_bluesheet (request , session , file )
3091+ if save_err :
3092+ return err (400 , save_err )
3093+ else :
3094+ return err (405 , "Method not allowed" )
3095+
3096+ return HttpResponse ("Done" , status = 200 , content_type = 'text/plain' )
3097+
3098+
30273099def important_dates (request , num = None ):
30283100 assert num is None or num .isdigit ()
30293101 preview_roles = ['Area Director' , 'Secretariat' , 'IETF Chair' , 'IAD' , ]
0 commit comments