99from ietf .idtracker .models import InternetDraft , IDDates , IDStatus , IDState , DocumentComment
1010from ietf .utils .mail import send_mail
1111from ietf .idrfc .utils import log_state_changed , add_document_comment
12+ from doc .models import Document , Event , save_document_in_history
13+ from name .models import IesgDocStateName , DocStateName , DocInfoTagName
14+ from person .models import Email
15+
16+ INTERNET_DRAFT_DAYS_TO_EXPIRE = 185
1217
1318def in_id_expire_freeze (when = None ):
1419 if when == None :
@@ -32,6 +37,15 @@ def get_expired_ids():
3237 review_by_rfc_editor = 0 ).filter (
3338 Q (idinternal = None ) | Q (idinternal__cur_state__document_state_id__gte = 42 ))
3439
40+ def get_expired_idsREDESIGN ():
41+ cut_off = datetime .date .today () - datetime .timedelta (days = INTERNET_DRAFT_DAYS_TO_EXPIRE )
42+
43+ docs = Document .objects .filter (state = "active" ).exclude (tags = "rfc-rev" ).filter (Q (iesg_state = None ) | Q (iesg_state__order__gte = 42 ))
44+ for d in docs :
45+ e = d .latest_event (type = "new_revision" )
46+ if e and e .time .date () <= cut_off :
47+ yield d
48+
3549def send_expire_notice_for_id (doc ):
3650 doc .dunn_sent_date = datetime .date .today ()
3751 doc .save ()
@@ -45,7 +59,24 @@ def send_expire_notice_for_id(doc):
4559 "I-D Expiring System <ietf-secretariat-reply@ietf.org>" ,
4660 u"I-D was expired %s" % doc .file_tag (),
4761 "idrfc/id_expired_email.txt" ,
48- dict (doc = doc ))
62+ dict (doc = doc ,
63+ state = doc .idstate ()))
64+
65+ def send_expire_notice_for_idREDESIGN (doc ):
66+ if not doc .ad :
67+ return
68+
69+ state = doc .iesg_state .name if doc .iesg_state else "I-D Exists"
70+
71+ request = None
72+ to = doc .ad .formatted_email ()
73+ send_mail (request , to ,
74+ "I-D Expiring System <ietf-secretariat-reply@ietf.org>" ,
75+ u"I-D was expired %s" % doc .file_tag (),
76+ "idrfc/id_expired_email.txt" ,
77+ dict (doc = doc ,
78+ state = state ,
79+ ))
4980
5081def expire_id (doc ):
5182 def move_file (f ):
@@ -82,6 +113,52 @@ def move_file(f):
82113
83114 add_document_comment (None , doc , "Document is expired by system" )
84115
116+ def expire_idREDESIGN (doc ):
117+ system_email = Email .objects .get (address = "(System)" )
118+
119+ # clean up files
120+ def move_file (f ):
121+ src = os .path .join (settings .INTERNET_DRAFT_PATH , f )
122+ dst = os .path .join (settings .INTERNET_DRAFT_ARCHIVE_DIR , f )
123+
124+ if os .path .exists (src ):
125+ shutil .move (src , dst )
126+
127+ file_types = ['txt' , 'ps' , 'pdf' ]
128+ for t in file_types :
129+ move_file ("%s-%s.%s" % (doc .name , doc .rev , t ))
130+
131+ # make tombstone
132+ new_revision = "%02d" % (int (doc .rev ) + 1 )
133+
134+ new_file = open (os .path .join (settings .INTERNET_DRAFT_PATH , "%s-%s.txt" % (doc .name , new_revision )), 'w' )
135+ txt = render_to_string ("idrfc/expire_textREDESIGN.txt" ,
136+ dict (doc = doc ,
137+ authors = [(e .get_name (), e .address ) for e in doc .authors .all ()],
138+ expire_days = InternetDraft .DAYS_TO_EXPIRE ))
139+ new_file .write (txt )
140+ new_file .close ()
141+
142+ # now change the states
143+
144+ save_document_in_history (doc )
145+ if doc .latest_event (type = 'started_iesg_process' ):
146+ dead_state = IesgDocStateName .objects .get (slug = "dead" )
147+ if doc .iesg_state != dead_state :
148+ prev = doc .iesg_state
149+ doc .iesg_state = dead_state
150+ log_state_changed (None , doc , system_email , prev )
151+
152+ e = Event (doc = doc , by = system_email )
153+ e .type = "expired_document"
154+ e .desc = "Document has expired"
155+ e .save ()
156+
157+ doc .rev = new_revision # FIXME: incrementing the revision like this is messed up
158+ doc .state = DocStateName .objects .get (slug = "expired" )
159+ doc .time = datetime .datetime .now ()
160+ doc .save ()
161+
85162def clean_up_id_files ():
86163 """Move unidentified and old files out of the Internet Draft directory."""
87164 cut_off = datetime .date .today () - datetime .timedelta (days = InternetDraft .DAYS_TO_EXPIRE )
@@ -120,3 +197,52 @@ def move_file_to(subdir):
120197
121198 except InternetDraft .DoesNotExist :
122199 move_file_to ("unknown_ids" )
200+
201+ def clean_up_id_filesREDESIGN ():
202+ """Move unidentified and old files out of the Internet Draft directory."""
203+ cut_off = datetime .date .today () - datetime .timedelta (days = INTERNET_DRAFT_DAYS_TO_EXPIRE )
204+
205+ pattern = os .path .join (settings .INTERNET_DRAFT_PATH , "draft-*.*" )
206+ files = []
207+ filename_re = re .compile ('^(.*)-(\d+)$' )
208+ for path in glob .glob (pattern ):
209+ basename = os .path .basename (path )
210+ stem , ext = os .path .splitext (basename )
211+ match = filename_re .search (stem )
212+ if not match :
213+ filename , revision = ("UNKNOWN" , "00" )
214+ else :
215+ filename , revision = match .groups ()
216+
217+ def move_file_to (subdir ):
218+ shutil .move (path ,
219+ os .path .join (settings .INTERNET_DRAFT_ARCHIVE_DIR , subdir , basename ))
220+
221+ try :
222+ doc = Document .objects .get (name = filename , rev = revision )
223+
224+ if doc .state_id == "rfc" :
225+ if ext != ".txt" :
226+ move_file_to ("unknown_ids" )
227+ elif doc .state_id in ("expired" , "auth-rm" , "repl" , "ietf-rm" ):
228+ e = doc .latest_event (type__in = ('expired_document' , 'new_revision' , "completed_resurrect" ))
229+ expiration_date = e .time .date () if e and e .type == "expired_document" else None
230+
231+ if expiration_date and expiration_date < cut_off :
232+ if os .path .getsize (path ) < 1500 :
233+ move_file_to ("deleted_tombstones" )
234+ # revert version after having deleted tombstone
235+ doc .rev = "%02d" % (int (revision ) - 1 ) # FIXME: messed up
236+ doc .save ()
237+ doc .tags .add (DocInfoTagName .objects .get (slug = 'exp-tomb' ))
238+ else :
239+ move_file_to ("expired_without_tombstone" )
240+
241+ except Document .DoesNotExist :
242+ move_file_to ("unknown_ids" )
243+
244+ if settings .USE_DB_REDESIGN_PROXY_CLASSES :
245+ get_expired_ids = get_expired_idsREDESIGN
246+ send_expire_notice_for_id = send_expire_notice_for_idREDESIGN
247+ expire_id = expire_idREDESIGN
248+ clean_up_id_files = clean_up_id_filesREDESIGN
0 commit comments