1212import datetime , os
1313
1414class StateType (models .Model ):
15- slug = models .CharField (primary_key = True , max_length = 30 ) # draft, draft_iesg , charter, ...
16- label = models .CharField (max_length = 255 ) # State, IESG state, WG state, ...
15+ slug = models .CharField (primary_key = True , max_length = 30 ) # draft, draft-iesg , charter, ...
16+ label = models .CharField (max_length = 255 , help_text = "Label that should be used (e.g. in admin) for state drop-down for this type of state" ) # State, IESG state, WG state, ...
1717
1818 def __unicode__ (self ):
19- return self .label
19+ return self .slug
2020
2121class State (models .Model ):
2222 type = models .ForeignKey (StateType )
@@ -46,10 +46,10 @@ class DocumentInfo(models.Model):
4646 stream = models .ForeignKey (StreamName , blank = True , null = True ) # IETF, IAB, IRTF, Independent Submission
4747 group = models .ForeignKey (Group , blank = True , null = True ) # WG, RG, IAB, IESG, Edu, Tools
4848
49- abstract = models .TextField ()
49+ abstract = models .TextField (blank = True )
5050 rev = models .CharField (verbose_name = "revision" , max_length = 16 , blank = True )
5151 pages = models .IntegerField (blank = True , null = True )
52- order = models .IntegerField (default = 1 )
52+ order = models .IntegerField (default = 1 , blank = True )
5353 intended_std_level = models .ForeignKey (IntendedStdLevelName , verbose_name = "Intended standardization level" , blank = True , null = True )
5454 std_level = models .ForeignKey (StdLevelName , verbose_name = "Standardization level" , blank = True , null = True )
5555 ad = models .ForeignKey (Person , verbose_name = "area director" , related_name = 'ad_%(class)s_set' , blank = True , null = True )
@@ -149,15 +149,10 @@ def __unicode__(self):
149149
150150 def get_absolute_url (self ):
151151 name = self .name
152- if self .type_id == "charter" :
153- return urlreverse ('wg_view' , kwargs = { 'name' : self .group .acronym }, urlconf = "ietf.urls" )
154- elif self .type_id == "draft" :
155- if self .get_state_slug () == "rfc" :
156- aliases = self .docalias_set .filter (name__startswith = "rfc" )
157- if aliases :
158- name = aliases [0 ].name
159- return urlreverse ('doc_view' , kwargs = { 'name' : name }, urlconf = "ietf.urls" )
160-
152+ if self .type_id == "draft" and self .get_state_slug () == "rfc" :
153+ aliases = self .docalias_set .filter (name__startswith = "rfc" )
154+ if aliases :
155+ name = aliases [0 ].name
161156 elif self .type_id in ('slides' ,'agenda' ,'minutes' ):
162157 session = self .session_set .all ()[0 ]
163158 meeting = session .meeting
@@ -172,6 +167,9 @@ def get_absolute_url(self):
172167 self .type_id ,
173168 filename )
174169 return url
170+ return urlreverse ('doc_view' , kwargs = { 'name' : name }, urlconf = "ietf.urls" )
171+
172+
175173
176174 def file_tag (self ):
177175 return u"<%s>" % self .filename_with_rev ()
@@ -194,6 +192,9 @@ def canonical_name(self):
194192 a = self .docalias_set .filter (name__startswith = "rfc" )
195193 if a :
196194 name = a [0 ].name
195+ elif self .type_id == "charter" :
196+ return "charter-ietf-%s" % self .chartered_group .acronym
197+
197198 return name
198199
199200class RelatedDocHistory (models .Model ):
@@ -216,11 +217,19 @@ class Meta:
216217
217218class DocHistory (DocumentInfo ):
218219 doc = models .ForeignKey (Document , related_name = "history_set" )
219- name = models .CharField (max_length = 255 ) # WG charter names can change if the group acronym changes
220+ name = models .CharField (max_length = 255 ) # WG charter canonical names can change if the group acronym changes
220221 related = models .ManyToManyField ('DocAlias' , through = RelatedDocHistory , blank = True )
221222 authors = models .ManyToManyField (Email , through = DocHistoryAuthor , blank = True )
222223 def __unicode__ (self ):
223224 return unicode (self .doc .name )
225+
226+ def canonical_name (self ):
227+ return self .name
228+
229+ def latest_event (self , * args , ** kwargs ):
230+ kwargs ["time__lte" ] = self .time
231+ return self .doc .latest_event (* args , ** kwargs )
232+
224233 class Meta :
225234 verbose_name = "document history"
226235 verbose_name_plural = "document histories"
@@ -234,7 +243,7 @@ def get_model_fields_as_dict(obj):
234243 # copy fields
235244 fields = get_model_fields_as_dict (doc )
236245 fields ["doc" ] = doc
237- fields ["name" ] = doc .name
246+ fields ["name" ] = doc .canonical_name ()
238247
239248 dochist = DocHistory (** fields )
240249 dochist .save ()
@@ -311,6 +320,8 @@ class DocReminder(models.Model):
311320 # IESG events
312321 ("started_iesg_process" , "Started IESG process on document" ),
313322
323+ ("created_ballot" , "Created ballot" ),
324+ ("closed_ballot" , "Closed ballot" ),
314325 ("sent_ballot_announcement" , "Sent ballot announcement" ),
315326 ("changed_ballot_position" , "Changed ballot position" ),
316327
@@ -347,7 +358,26 @@ class NewRevisionDocEvent(DocEvent):
347358 rev = models .CharField (max_length = 16 )
348359
349360# IESG events
361+ class BallotType (models .Model ):
362+ doc_type = models .ForeignKey (DocTypeName , blank = True , null = True )
363+ slug = models .SlugField ()
364+ name = models .CharField (max_length = 255 )
365+ question = models .TextField (blank = True )
366+ used = models .BooleanField (default = True )
367+ order = models .IntegerField (default = 0 )
368+ positions = models .ManyToManyField (BallotPositionName , blank = True )
369+
370+ def __unicode__ (self ):
371+ return self .name
372+
373+ class Meta :
374+ ordering = ['order' ]
375+
376+ class BallotDocEvent (DocEvent ):
377+ ballot_type = models .ForeignKey (BallotType )
378+
350379class BallotPositionDocEvent (DocEvent ):
380+ ballot = models .ForeignKey (BallotDocEvent , null = True , default = None ) # default=None is a temporary migration period fix, should be removed when charter branch is live
351381 ad = models .ForeignKey (Person )
352382 pos = models .ForeignKey (BallotPositionName , verbose_name = "position" , default = "norecord" )
353383 discuss = models .TextField (help_text = "Discuss text if position is discuss" , blank = True )
@@ -365,14 +395,6 @@ class TelechatDocEvent(DocEvent):
365395 telechat_date = models .DateField (blank = True , null = True )
366396 returning_item = models .BooleanField (default = False )
367397
368- # Charter ballot events
369- class GroupBallotPositionDocEvent (DocEvent ):
370- ad = models .ForeignKey (Person )
371- pos = models .ForeignKey (GroupBallotPositionName , verbose_name = "position" , default = "norecord" )
372- block_comment = models .TextField (help_text = "Blocking comment if position is comment" , blank = True )
373- block_comment_time = models .DateTimeField (help_text = "Blocking comment was written" , blank = True , null = True )
374- comment = models .TextField (help_text = "Non-blocking comment" , blank = True )
375- comment_time = models .DateTimeField (help_text = "Time non-blocking comment was written" , blank = True , null = True )
376-
398+ # charter events
377399class InitialReviewDocEvent (DocEvent ):
378400 expires = models .DateTimeField (blank = True , null = True )
0 commit comments