3030# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3131# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3232
33- import re , os
34- from datetime import datetime , time
33+ import re , os , datetime
3534
3635from django .http import HttpResponse , Http404
3736from django .shortcuts import render_to_response , get_object_or_404 , redirect
5049from ietf .idrfc .models import RfcIndex , DraftVersions
5150from ietf .idrfc .idrfc_wrapper import BallotWrapper , IdWrapper , RfcWrapper
5251from ietf .ietfworkflows .utils import get_full_info_for_draft
53- from ietf .doc .models import Document , DocEvent , NewRevisionDocEvent , WriteupDocEvent , TelechatDocEvent
54- from ietf .doc .utils import get_chartering_type
52+ from ietf .doc .models import *
53+ from ietf .doc .utils import get_chartering_type , needed_ballot_positions
5554from ietf .utils .history import find_history_active_at
5655from ietf .ietfauth .decorators import has_role
5756
@@ -240,7 +239,74 @@ def document_writeup(request, name):
240239 ),
241240 context_instance = RequestContext (request ))
242241
242+ def document_ballot_content (request , name , ballot , editable = True ):
243+ doc = get_object_or_404 (Document , docalias__name = name )
244+
245+ if ballot != None :
246+ b = doc .latest_event (BallotDocEvent , type = "created_ballot" , id = ballot )
247+ else :
248+ b = doc .latest_event (BallotDocEvent , type = "created_ballot" )
249+
250+ if not b :
251+ raise Http404 ()
252+
253+ deferred = None
254+ if doc .get_state_slug ("%s-iesg" % doc .type ) == "defer" :
255+ # FIXME: fragile
256+ deferred = doc .latest_event (type = "changed_document" , desc__startswith = "State changed to <b>IESG Evaluation - Defer</b>" )
257+
258+ # collect positions
259+ active_ads = list (Person .objects .filter (role__name = "ad" , role__group__state = "active" ).distinct ())
260+
261+ positions = []
262+ seen = {}
263+ # FIXME: restrict on ballot
264+ for e in BallotPositionDocEvent .objects .filter (doc = doc , type = "changed_ballot_position" ).select_related ('ad' , 'pos' ).order_by ("-time" , '-id' ):
265+ if e .ad not in seen :
266+ e .old_ad = e .ad in active_ads
267+ e .old_positions = []
268+ positions .append (e )
269+ seen [e .ad ] = pos
270+ else :
271+ latest = seen [e .ad ]
272+ if latest .old_positions :
273+ prev = latest .old_positions [- 1 ]
274+ else :
275+ prev = latest
276+
277+ if e .pos != prev .pos :
278+ latest .old_positions .append (pos )
279+
280+ # add any missing ADs through fake No Record events
281+ for ad in active_ads :
282+ if ad not in seen :
283+ e = BallotPositionDocEvent (type = "changed_ballot_position" , doc = doc , ad = ad )
284+ e .pos_id = "norecord"
285+ e .old_ad = False
286+ e .old_positions = []
287+ positions .append (e )
288+
289+ # put into position groups
290+ position_groups = []
291+ for n in BallotPositionName .objects .filter (slug__in = [p .pos_id for p in positions ]).order_by ('order' ):
292+ g = (n , [p for p in positions if p .pos_id == n .slug ])
293+ if n .blocking :
294+ position_groups .insert (0 , g )
295+ else :
296+ position_groups .append (g )
243297
298+ summary = needed_ballot_positions (doc , [p for p in positions if not p .old_ad ])
299+
300+ return render_to_string ("idrfc/document_ballot_content.html" ,
301+ dict (doc = doc ,
302+ ballot = b ,
303+ position_groups = position_groups ,
304+ positions = positions ,
305+ editable = editable ,
306+ deferred = deferred ,
307+ summary = summary ,
308+ ),
309+ context_instance = RequestContext (request ))
244310
245311def document_ballot (request , name , ballot = None ):
246312 if name .lower ().startswith ("draft" ) or name .lower ().startswith ("rfc" ):
@@ -249,9 +315,14 @@ def document_ballot(request, name, ballot=None):
249315 doc = get_object_or_404 (Document , docalias__name = name )
250316 top = render_document_top (request , doc , "ballot" )
251317
252- # FIXME: port implementation from wgcharter
318+ c = document_ballot_content ( request , name , ballot , editable = True )
253319
254- raise Http404 ()
320+ return render_to_response ("idrfc/document_ballot.html" ,
321+ dict (doc = doc ,
322+ top = top ,
323+ ballot_content = c ,
324+ ),
325+ context_instance = RequestContext (request ))
255326
256327def document_debug (request , name ):
257328 r = re .compile ("^rfc([1-9][0-9]*)$" )
@@ -424,11 +495,11 @@ def _get_history(doc, versions):
424495
425496 # convert plain dates to datetimes (required for sorting)
426497 for x in results :
427- if not isinstance (x ['date' ], datetime ):
498+ if not isinstance (x ['date' ], datetime . datetime ):
428499 if x ['date' ]:
429- x ['date' ] = datetime .combine (x ['date' ], time (0 ,0 ,0 ))
500+ x ['date' ] = datetime .datetime . combine (x ['date' ], datetime . time (0 ,0 ,0 ))
430501 else :
431- x ['date' ] = datetime (1970 ,1 ,1 )
502+ x ['date' ] = datetime . datetime (1970 ,1 ,1 )
432503
433504 results .sort (key = lambda x : x ['date' ])
434505 results .reverse ()
0 commit comments