22from redesign .person .models import Email
33from redesign .proxy_utils import TranslatingManager
44
5+ from django .conf import settings
6+
7+ import glob , os
8+
59
610class InternetDraft (Document ):
711 objects = TranslatingManager (dict (filename = "name" ,
@@ -12,53 +16,61 @@ class InternetDraft(Document):
1216
1317 # things from InternetDraft
1418
15- # id_document_tag = models.AutoField(primary_key=True)
19+ # id_document_tag = models.AutoField(primary_key=True)
1620 @property
1721 def id_document_tag (self ):
1822 return self .name # Will only work for some use cases
19- # title = models.CharField(max_length=255, db_column='id_document_name') # same name
20- # id_document_key = models.CharField(max_length=255, editable=False)
23+ # title = models.CharField(max_length=255, db_column='id_document_name') # same name
24+ # id_document_key = models.CharField(max_length=255, editable=False)
2125 @property
2226 def id_document_key (self ):
2327 return self .title .upper ()
24- # group = models.ForeignKey(Acronym, db_column='group_acronym_id')
28+ # group = models.ForeignKey(Acronym, db_column='group_acronym_id')
2529 @property
2630 def group (self ):
27- return super (self .__class__ , self ).group
28- # filename = models.CharField(max_length=255, unique=True)
31+ from group .proxy import Acronym as AcronymProxy
32+ return AcronymProxy (super (self .__class__ , self ).group )
33+ #filename = models.CharField(max_length=255, unique=True)
2934 @property
3035 def filename (self ):
3136 return self .name
32- # revision = models.CharField(max_length=2)
37+ # revision = models.CharField(max_length=2)
3338 @property
3439 def revision (self ):
3540 return self .rev
36- # revision_date = models.DateField()
41+ # revision_date = models.DateField()
3742 @property
3843 def revision_date (self ):
3944 e = self .latest_event (type = "new_revision" )
40- return e .time if e else None
41- # file_type = models.CharField(max_length=20)
45+ return e .time . date () if e else None
46+ # file_type = models.CharField(max_length=20)
4247 @property
4348 def file_type (self ):
44- return ".txt" # FIXME XXX should look in the repository to see what's available
45- # txt_page_count = models.IntegerField()
49+ matches = glob .glob (os .path .join (settings .INTERNET_DRAFT_PATH , self .filename + "*.*" ))
50+ possible_types = [".txt" , ".pdf" , ".xml" , ".ps" ]
51+ res = set ()
52+ for m in matches :
53+ for t in possible_types :
54+ if m .endswith (t ):
55+ res .add (t )
56+ return "," .join (res )
57+ #txt_page_count = models.IntegerField()
4658 @property
4759 def txt_page_count (self ):
4860 return self .pages
49- # local_path = models.CharField(max_length=255, blank=True) # unused
50- # start_date = models.DateField()
61+ # local_path = models.CharField(max_length=255, blank=True) # unused
62+ # start_date = models.DateField()
5163 @property
5264 def start_date (self ):
5365 return self .dochistory_set .dates ("time" ,"day" ,"ASC" )[0 ]
54- # expiration_date = models.DateField()
66+ # expiration_date = models.DateField()
5567 @property
5668 def expiration_date (self ):
5769 return self .expiration ()
58- # abstract = models.TextField() # same name
59- # dunn_sent_date = models.DateField(null=True, blank=True) # unused
60- # extension_date = models.DateField(null=True, blank=True) # unused
61- # status = models.ForeignKey(IDStatus)
70+ # abstract = models.TextField() # same name
71+ # dunn_sent_date = models.DateField(null=True, blank=True) # unused
72+ # extension_date = models.DateField(null=True, blank=True) # unused
73+ # status = models.ForeignKey(IDStatus)
6274 @property
6375 def status (self ):
6476 from redesign .name .proxy import IDStatus
@@ -69,63 +81,63 @@ def status_id(self):
6981 from redesign .name .proxy import IDStatus
7082 return { 'active' : 1 , 'repl' : 5 , 'expired' : 2 , 'rfc' : 3 , 'auth-rm' : 4 , 'ietf-rm' : 6 }[self .state_id ]
7183
72- # intended_status = models.ForeignKey(IDIntendedStatus)
84+ # intended_status = models.ForeignKey(IDIntendedStatus)
7385 @property
7486 def intended_status (self ):
7587 return self .intended_std_level
7688
77- # lc_sent_date = models.DateField(null=True, blank=True)
89+ # lc_sent_date = models.DateField(null=True, blank=True)
7890 @property
7991 def lc_sent_date (self ):
8092 e = self .latest_event (type = "sent_last_call" )
8193 return e .time if e else None
8294
83- # lc_changes = models.CharField(max_length=3) # used in DB, unused in Django code?
95+ # lc_changes = models.CharField(max_length=3) # used in DB, unused in Django code?
8496
85- # lc_expiration_date = models.DateField(null=True, blank=True)
97+ # lc_expiration_date = models.DateField(null=True, blank=True)
8698 @property
8799 def lc_expiration_date (self ):
88100 e = self .latest_event (type = "sent_last_call" )
89101 return e .expiration .expires if e else None
90102
91- # b_sent_date = models.DateField(null=True, blank=True)
103+ # b_sent_date = models.DateField(null=True, blank=True)
92104 @property
93105 def b_sent_date (self ):
94106 e = self .latest_event (type = "sent_ballot_announcement" )
95107 return e .time if e else None
96108
97- # b_discussion_date = models.DateField(null=True, blank=True) # unused
109+ # b_discussion_date = models.DateField(null=True, blank=True) # unused
98110
99- # b_approve_date = models.DateField(null=True, blank=True)
111+ # b_approve_date = models.DateField(null=True, blank=True)
100112 @property
101113 def b_approve_date (self ):
102114 e = self .latest_event (type = "approved_ballot" )
103115 return e .time if e else None
104116
105- # wgreturn_date = models.DateField(null=True, blank=True) # unused
117+ # wgreturn_date = models.DateField(null=True, blank=True) # unused
106118
107- # rfc_number = models.IntegerField(null=True, blank=True, db_index=True)
119+ # rfc_number = models.IntegerField(null=True, blank=True, db_index=True)
108120 @property
109121 def rfc_number (self ):
110122 try :
111123 self .docalias_set .filter (name__startswith = "rfc" )[0 ].name [3 :]
112124 except IndexError :
113125 return None
114126
115- # comments = models.TextField(blank=True) # unused
127+ # comments = models.TextField(blank=True) # unused
116128
117- # last_modified_date = models.DateField()
129+ # last_modified_date = models.DateField()
118130 @property
119131 def last_modified_date (self ):
120132 return self .time
121133
122- # replaced_by = models.ForeignKey('self', db_column='replaced_by', blank=True, null=True, related_name='replaces_set')
134+ # replaced_by = models.ForeignKey('self', db_column='replaced_by', blank=True, null=True, related_name='replaces_set')
123135 @property
124136 def replaced_by (self ):
125137 r = InternetDraft .objects .filter (docalias__relateddoc__relationship = "replaces" , docalias__relateddoc__related_document_set = self )
126138 return r [0 ] if r else None
127139
128- # replaces = FKAsOneToOne('replaces', reverse=True)
140+ # replaces = FKAsOneToOne('replaces', reverse=True)
129141 @property
130142 def replaces (self ):
131143 r = InternetDraft .objects .filter (related__doc_alias__document = self , related__relationship = "replaces" )
@@ -137,17 +149,17 @@ def replaces_set(self):
137149 # this is replaced_by
138150 return InternetDraft .objects .filter (docalias__relateddoc__relationship = "replaces" , docalias__relateddoc__related_document_set = self )
139151
140- # review_by_rfc_editor = models.BooleanField()
152+ # review_by_rfc_editor = models.BooleanField()
141153 @property
142154 def review_by_rfc_editor (self ): raise NotImplemented # should use tag
143155
144- # expired_tombstone = models.BooleanField()
156+ # expired_tombstone = models.BooleanField()
145157 @property
146158 def expired_tombstone (self ):
147159 # FIXME: this is probably not perfect, what happens when we delete it again
148160 return self .latest_event (type = "added_tombstone" )
149161
150- # idinternal = FKAsOneToOne('idinternal', reverse=True, query=models.Q(rfc_flag = 0))
162+ # idinternal = FKAsOneToOne('idinternal', reverse=True, query=models.Q(rfc_flag = 0))
151163 @property
152164 def idinternal (self ):
153165 return self if self .iesg_state else None
@@ -246,7 +258,9 @@ def token_email(self):
246258
247259 #status_date = models.DateField(blank=True,null=True)
248260 @property
249- def status_date (self ): raise NotImplemented # FIXME
261+ def status_date (self ):
262+ e = self .latest_event (Status , type = "changed_status_date" )
263+ return e .date if e else None
250264
251265 #email_display = models.CharField(blank=True, max_length=50) # unused
252266 #agenda = models.IntegerField(null=True, blank=True)
@@ -276,7 +290,8 @@ def mark_by(self):
276290 # job_owner = models.ForeignKey(IESGLogin, db_column='job_owner', related_name='documents')
277291 @property
278292 def job_owner (self ):
279- return self .ad
293+ from person .proxy import IESGLogin as IESGLoginProxy
294+ return IESGLoginProxy (self .ad )
280295
281296 #event_date = models.DateField(null=True)
282297 @property
@@ -485,7 +500,7 @@ def needed(self, standardsTrack=True):
485500
486501 yes = noobj = discuss = recuse = 0
487502 for position in positions :
488- p = position .pos_id
503+ p = position .ballotposition . pos_id
489504 if p == "yes" :
490505 yes += 1
491506 if p == "noobj" :
@@ -505,7 +520,7 @@ def needed(self, standardsTrack=True):
505520 if standardsTrack :
506521 # For standards-track, need positions from 2/3 of the
507522 # non-recused current IESG.
508- needed = ( len (ads ) - recuse ) * 2 / 3
523+ needed = int (( len (ads ) - recuse ) * 2 / 3 )
509524 else :
510525 # Info and experimental only need one position.
511526 needed = 1
0 commit comments