Skip to content

Commit bb2e2b1

Browse files
committed
Ported last call and expire scripts with tests to new schema
- Legacy-Id: 2878
1 parent 3ecd539 commit bb2e2b1

12 files changed

Lines changed: 426 additions & 136 deletions

File tree

ietf/bin/expire-ids

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,6 @@ if not in_id_expire_freeze():
1515
for doc in get_expired_ids():
1616
send_expire_notice_for_id(doc)
1717
expire_id(doc)
18-
syslog.syslog("Expired %s (id=%s)%s" % (doc.file_tag(), doc.id_document_tag, " in the ID Tracker" if doc.idinternal else ""))
18+
syslog.syslog("Expired %s (id=%s)%s" % (doc.file_tag(), doc.pk, " in the ID Tracker" if doc.latest_event(type="started_iesg_process") else ""))
1919

2020
clean_up_id_files()

ietf/bin/expire-last-calls

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,4 @@ from ietf.idrfc.lastcall import *
1414
drafts = get_expired_last_calls()
1515
for doc in drafts:
1616
expire_last_call(doc)
17-
syslog.syslog("Expired last call for %s (id=%s)" % (doc.file_tag(), doc.id_document_tag))
17+
syslog.syslog("Expired last call for %s (id=%s)" % (doc.file_tag(), doc.pk))

ietf/idrfc/expire.py

Lines changed: 127 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@
99
from ietf.idtracker.models import InternetDraft, IDDates, IDStatus, IDState, DocumentComment
1010
from ietf.utils.mail import send_mail
1111
from 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

1318
def 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+
3549
def 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

5081
def 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+
85162
def 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

Comments
 (0)