@@ -36,6 +36,9 @@ def __unicode__(self):
3636 class Meta :
3737 ordering = ["type" , "order" ]
3838
39+ IESG_BALLOT_ACTIVE_STATES = ("lc" , "writeupw" , "goaheadw" , "iesg-eva" , "defer" )
40+ IESG_SUBSTATE_TAGS = ('point' , 'ad-f-up' , 'need-rev' , 'extpty' )
41+
3942class DocumentInfo (models .Model ):
4043 """Any kind of document. Draft, RFC, Charter, IPR Statement, Liaison Statement"""
4144 time = models .DateTimeField (default = datetime .datetime .now ) # should probably have auto_now=True
@@ -186,9 +189,7 @@ def __unicode__(self):
186189 def get_absolute_url (self ):
187190 name = self .name
188191 if self .type_id == "draft" and self .get_state_slug () == "rfc" :
189- aliases = self .docalias_set .filter (name__startswith = "rfc" )
190- if aliases :
191- name = aliases [0 ].name
192+ name = self .canonical_name ()
192193 elif self .type_id in ('slides' ,'agenda' ,'minutes' ):
193194 session = self .session_set .all ()[0 ]
194195 meeting = session .meeting
@@ -248,11 +249,10 @@ def related_that_doc(self, relationship):
248249 """Return the doc aliases that are target of relationship originating from self."""
249250 return DocAlias .objects .filter (relateddocument__source = self , relateddocument__relationship = relationship )
250251
251- #TODO can/should this be a function instead of a property? Currently a view uses it as a property
252- @property
253- def telechat_date (self ):
254- e = self .latest_event (TelechatDocEvent , type = "scheduled_for_telechat" )
255- return e .telechat_date if e else None
252+ def telechat_date (self , e = None ):
253+ if not e :
254+ e = self .latest_event (TelechatDocEvent , type = "scheduled_for_telechat" )
255+ return e .telechat_date if e and e .telechat_date and e .telechat_date >= datetime .date .today () else None
256256
257257 def area_acronym (self ):
258258 g = self .group
@@ -271,10 +271,6 @@ def group_acronym(self):
271271 else :
272272 return "none"
273273
274- def on_upcoming_agenda (self ):
275- e = self .latest_event (TelechatDocEvent , type = "scheduled_for_telechat" )
276- return bool (e and e .telechat_date and e .telechat_date >= datetime .date .today ())
277-
278274 def returning_item (self ):
279275 e = self .latest_event (TelechatDocEvent , type = "scheduled_for_telechat" )
280276 return e .returning_item if e else None
@@ -299,56 +295,56 @@ def displayname_with_link(self):
299295 return '<a href="%s">%s-%s</a>' % (self .get_absolute_url (), self .name , self .rev )
300296
301297 def rfc_number (self ):
302- qs = self .docalias_set . filter ( name__startswith = 'rfc' )
303- return qs [ 0 ]. name [ 3 :] if qs else None
298+ n = self .canonical_name ( )
299+ return n [ 3 :] if n . startswith ( "rfc" ) else None
304300
305301 def friendly_state (self ):
306- """ Return a concise text description of the document's current state """
307- if self .type_id == 'draft' :
308- # started_iesg_process is is how the redesigned database schema (as of May2012) captured what
309- # used to be "has an IDInternal", aka *Wrapper.in_ietf_process()=True
310- in_iesg_process = self .latest_event (type = 'started_iesg_process' )
311- iesg_state_summary = None
312- if in_iesg_process :
313- iesg_state = self .states .get (type = 'draft-iesg' )
302+ """ Return a concise text description of the document's current state."""
303+ state = self .get_state ()
304+ if not state :
305+ return "Unknown state"
306+
307+ if self .type_id == 'draft' :
308+ iesg_state = self .get_state ("draft-iesg" )
309+ iesg_state_summary = None
310+ if iesg_state :
314311 # This knowledge about which tags are reportable IESG substate tags is duplicated in idrfc
315- IESG_SUBSTATE_TAGS = ('point' , 'ad-f-up' , 'need-rev' , 'extpty' )
316312 iesg_substate = self .tags .filter (slug__in = IESG_SUBSTATE_TAGS )
317313 # There really shouldn't be more than one tag in iesg_substate, but this will do something sort-of-sensible if there is
318314 iesg_state_summary = iesg_state .name
319315 if iesg_substate :
320316 iesg_state_summary = iesg_state_summary + "::" + "::" .join (tag .name for tag in iesg_substate )
321317
322- if self .get_state_slug () == "rfc" :
323- n = self .rfc_number ()
324- return "<a href=\" %s\" >RFC %s</a>" % (urlreverse ('doc_view' , kwargs = dict (name = 'rfc%s' % n )), n )
325- elif self .get_state_slug () == "repl" :
318+ if state .slug == "rfc" :
319+ return "RFC %s (%s)" % (self .rfc_number (), self .std_level )
320+ elif state .slug == "repl" :
326321 rs = self .related_that ("replaces" )
327322 if rs :
328- return mark_safe ("Replaced by " + ", " .join ("<a href=\" %s\" >%s</a>" % (urlreverse ('doc_view' , args = [ name ] ), name ) for name in rs ))
323+ return mark_safe ("Replaced by " + ", " .join ("<a href=\" %s\" >%s</a>" % (urlreverse ('doc_view' , kwargs = dict ( name = name ) ), name ) for name in rs ))
329324 else :
330325 return "Replaced"
331- elif self . get_state_slug () == "active" :
332- if in_iesg_process :
326+ elif state . slug == "active" :
327+ if iesg_state :
333328 if iesg_state .slug == "dead" :
334329 # Many drafts in the draft-iesg "Dead" state are not dead
335330 # in other state machines; they're just not currently under
336331 # IESG processing. Show them as "I-D Exists (IESG: Dead)" instead...
337- return "I-D Exists (IESG: " + iesg_state_summary + ")"
332+ return "I-D Exists (IESG: %s)" % iesg_state_summary
338333 elif iesg_state .slug == "lc" :
339- expiration_date = str (self .latest_event (LastCallDocEvent ,type = "sent_last_call" ).expires .date ())
340- return iesg_state_summary + " (ends " + expiration_date + ")"
341- else :
342- return iesg_state_summary
334+ e = self .latest_event (LastCallDocEvent , type = "sent_last_call" )
335+ if e :
336+ return iesg_state_summary + " (ends %s)" % e .expires .date ().isoformat ()
337+
338+ return iesg_state_summary
343339 else :
344340 return "I-D Exists"
345341 else :
346- if in_iesg_process and iesg_state .slug == "dead" :
347- return self . get_state (). name + " (IESG: " + iesg_state_summary + ")"
342+ if iesg_state and iesg_state .slug == "dead" :
343+ return state . name + " (IESG: %s)" % iesg_state_summary
348344 # Expired/Withdrawn by Submitter/IETF
349- return self . get_state () .name
345+ return state .name
350346 else :
351- return self . get_state () .name
347+ return state .name
352348
353349 def ipr (self ):
354350 """Returns the IPR disclosures against this document (as a queryset over IprDocAlias)."""
0 commit comments