1111
1212import datetime , os
1313
14+ class 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, ...
17+
18+ def __unicode__ (self ):
19+ return self .label
20+
21+ class State (models .Model ):
22+ type = models .ForeignKey (StateType )
23+ slug = models .SlugField ()
24+ name = models .CharField (max_length = 255 )
25+ used = models .BooleanField (default = True )
26+ desc = models .TextField (blank = True )
27+ order = models .IntegerField (default = 0 )
28+
29+ next_states = models .ManyToManyField ('State' , related_name = "previous_states" )
30+
31+ def __unicode__ (self ):
32+ return self .name
33+
34+ class Meta :
35+ ordering = ["type" , "order" ]
36+
1437class DocumentInfo (models .Model ):
1538 """Any kind of document. Draft, RFC, Charter, IPR Statement, Liaison Statement"""
1639 time = models .DateTimeField (default = datetime .datetime .now ) # should probably have auto_now=True
1740 # Document related
1841 type = models .ForeignKey (DocTypeName , blank = True , null = True ) # Draft, Agenda, Minutes, Charter, Discuss, Guideline, Email, Review, Issue, Wiki, External ...
1942 title = models .CharField (max_length = 255 )
2043 # State
44+ states = models .ManyToManyField (State , blank = True )
45+
2146 state = models .ForeignKey (DocStateName , blank = True , null = True ) # Active/Expired/RFC/Replaced/Withdrawn
22- tags = models .ManyToManyField (DocInfoTagName , blank = True , null = True ) # Revised ID Needed, ExternalParty, AD Followup, ...
47+ tags = models .ManyToManyField (DocTagName , blank = True , null = True ) # Revised ID Needed, ExternalParty, AD Followup, ...
2348 stream = models .ForeignKey (DocStreamName , blank = True , null = True ) # IETF, IAB, IRTF, Independent Submission
2449 group = models .ForeignKey (Group , blank = True , null = True ) # WG, RG, IAB, IESG, Edu, Tools
25- wg_state = models .ForeignKey (WgDocStateName , verbose_name = "WG state" , blank = True , null = True ) # Not/Candidate/Active/Parked/LastCall/WriteUp/Submitted/Dead
26- iesg_state = models .ForeignKey (IesgDocStateName , verbose_name = "IESG state" , blank = True , null = True ) #
50+ iesg_state = models .ForeignKey (IesgDocStateName , verbose_name = "IESG state" , blank = True , null = True ) #
2751 iana_state = models .ForeignKey (IanaDocStateName , verbose_name = "IANA state" , blank = True , null = True )
2852 rfc_state = models .ForeignKey (RfcDocStateName , verbose_name = "RFC state" , blank = True , null = True )
2953 # Other
@@ -48,7 +72,24 @@ def get_file_path(self):
4872 return os .path .join (settings .AGENDA_PATH , meeting , self .type_id ) + "/"
4973 else :
5074 raise NotImplemented
51-
75+
76+ def set_state (self , state ):
77+ already_set = self .states .filter (type = state .type )
78+ others = [s for s in already_set if s != state ]
79+ if others :
80+ self .states .remove (* others )
81+ if state not in already_set :
82+ self .states .add (state )
83+
84+ def unset_state (self , state ):
85+ self .states .remove (state )
86+
87+ def get_state (self , state_type ):
88+ try :
89+ return self .states .get (type = state_type )
90+ except State .DoesNotExist :
91+ return None
92+
5293 class Meta :
5394 abstract = True
5495 def author_list (self ):
@@ -116,7 +157,6 @@ def canonical_name(self):
116157 if a :
117158 name = a [0 ].name
118159 return name
119-
120160
121161class RelatedDocHistory (models .Model ):
122162 source = models .ForeignKey ('DocHistory' )
@@ -144,6 +184,9 @@ class DocHistory(DocumentInfo):
144184 authors = models .ManyToManyField (Email , through = DocHistoryAuthor , blank = True )
145185 def __unicode__ (self ):
146186 return unicode (self .doc .name )
187+ class Meta :
188+ verbose_name = "document history"
189+ verbose_name_plural = "document histories"
147190
148191def save_document_in_history (doc ):
149192 def get_model_fields_as_dict (obj ):
@@ -198,20 +241,28 @@ class Meta:
198241 verbose_name = "document alias"
199242 verbose_name_plural = "document aliases"
200243
244+ class DocReminder (models .Model ):
245+ event = models .ForeignKey ('DocEvent' )
246+ type = models .ForeignKey (DocReminderTypeName )
247+ due = models .DateTimeField ()
248+ active = models .BooleanField (default = True )
249+
201250
202251EVENT_TYPES = [
203252 # core events
204253 ("new_revision" , "Added new revision" ),
205254 ("changed_document" , "Changed document metadata" ),
206255
207256 # misc document events
257+ ("changed_stream" , "Changed document stream" ),
208258 ("added_comment" , "Added comment" ),
209259 ("expired_document" , "Expired document" ),
210260 ("requested_resurrect" , "Requested resurrect" ),
211261 ("completed_resurrect" , "Completed resurrect" ),
212262 ("published_rfc" , "Published RFC" ),
213263
214264 # WG events
265+ ("changed_group" , "Changed group" ),
215266 ("changed_protocol_writeup" , "Changed protocol writeup" ),
216267
217268 # IESG events
0 commit comments