Skip to content

Commit 8b1138b

Browse files
committed
Merged in changes from esanchez@yaco.es, changesets [3063],[3064],[3065],[3075],[3076],[3078] and [3085]. Fixes submission tool issues with wrong expected version for recently expired drafts, lacking announcement emails, too narrow date tolerance, and server state changes being possible through http GET, and more; with minor tweaks to setting names in settings.py.
- Legacy-Id: 3086 Note: SVN reference [3063] has been migrated to Git commit af039fb Note: SVN reference [3064] has been migrated to Git commit fe46690 Note: SVN reference [3065] has been migrated to Git commit be0f5e4 Note: SVN reference [3075] has been migrated to Git commit e0f4185 Note: SVN reference [3076] has been migrated to Git commit ccfd8b5 Note: SVN reference [3078] has been migrated to Git commit fe699f7 Note: SVN reference [3085] has been migrated to Git commit 7fb2775
2 parents 663113d + 7fb2775 commit 8b1138b

10 files changed

Lines changed: 162 additions & 22 deletions

File tree

ietf/settings.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,8 @@
196196
# ID Submission Tool settings
197197
IDSUBMIT_FROM_EMAIL = 'IETF I-D Submission Tool <idsubmission@ietf.org>'
198198
IDSUBMIT_TO_EMAIL = 'internet-drafts@ietf.org'
199+
IDST_ID_EMAIL = 'Internet-Drafts@ietf.org'
200+
IDST_ID_ANNOUNCE_LIST = 'i-d-announce@ietf.org'
199201

200202
# Days from meeting to cut off dates on submit
201203
FIRST_CUTOFF_DAYS = 5

ietf/submit/forms.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -392,9 +392,8 @@ def clean_creation_date(self):
392392
if not creation_date:
393393
return None
394394
submit_date = self.draft.submission_date
395-
if creation_date > submit_date:
396-
raise forms.ValidationError('Creation Date must not be set after submission date')
397-
if creation_date + datetime.timedelta(days=3) < submit_date:
395+
if (creation_date + datetime.timedelta(days=3) < submit_date or
396+
creation_date - datetime.timedelta(days=3) > submit_date):
398397
raise forms.ValidationError('Creation Date must be within 3 days of submission date')
399398
return creation_date
400399

@@ -410,7 +409,7 @@ def clean_version(self):
410409
raise forms.ValidationError('Version field is not in NN format')
411410
if version_int > 99 or version_int < 0:
412411
raise forms.ValidationError('Version must be set between 00 and 99')
413-
existing_revisions = [int(i.revision) for i in InternetDraft.objects.filter(filename=self.draft.filename)]
412+
existing_revisions = [int(i.revision_display()) for i in InternetDraft.objects.filter(filename=self.draft.filename)]
414413
expected = 0
415414
if existing_revisions:
416415
expected = max(existing_revisions) + 1

ietf/submit/templatetags/submit_tags.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ def show_two_pages(context, two_pages, validation):
2323

2424
@register.filter
2525
def two_pages_decorated_with_validation(value, validation):
26-
pages = value.first_two_pages
26+
pages = value.first_two_pages or ''
2727
if not 'revision' in validation.warnings.keys():
2828
return mark_safe('<pre class="twopages" style="display: none;">%s</pre>' % pages)
2929
result = '<pre class="twopages" style="display: none;">\n'

ietf/submit/utils.py

Lines changed: 78 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@
66
from django.contrib.sites.models import Site
77

88
from ietf.idtracker.models import (InternetDraft, PersonOrOrgInfo, IETFWG,
9-
IDAuthor, EmailAddress)
9+
IDAuthor, EmailAddress, IESGLogin)
1010
from ietf.utils.mail import send_mail
11+
from ietf.idrfc.utils import add_document_comment
1112

1213

1314
# Some usefull states
@@ -35,25 +36,34 @@ def request_full_url(request, submission):
3536

3637
def perform_post(submission):
3738
group_id = submission.group_acronym and submission.group_acronym.pk or NONE_WG
39+
state_change_msg = ''
3840
try:
3941
draft = InternetDraft.objects.get(filename=submission.filename)
4042
draft.title = submission.id_document_name
4143
draft.group_id = group_id
4244
draft.filename = submission.filename
4345
draft.revision = submission.revision
44-
draft.revision_date = submission.creation_date
46+
draft.revision_date = submission.submission_date
4547
draft.file_type = submission.file_type
4648
draft.txt_page_count = submission.txt_page_count
4749
draft.last_modified_date = datetime.date.today()
4850
draft.abstract = submission.abstract
51+
draft.status_id = 1 # Active
52+
draft.expired_tombstone = 0
4953
draft.save()
54+
if draft.idinternal and draft.idinternal.cur_sub_state_id == 5 and draft.idinternal.rfc_flag == 0: # Substate 5 Revised ID Needed
55+
draft.idinternal.prev_sub_state_id = draft.idinternal.cur_sub_state_id
56+
draft.idinternal.cur_sub_state_id = 2 # Substate 2 AD Followup
57+
draft.idinternal.save()
58+
state_change_msg = "Sub state has been changed to AD Follow up from New Id Needed"
59+
add_document_comment(None, draft, state_change_msg)
5060
except InternetDraft.DoesNotExist:
5161
draft = InternetDraft.objects.create(
5262
title=submission.id_document_name,
5363
group_id=group_id,
5464
filename=submission.filename,
5565
revision=submission.revision,
56-
revision_date=submission.creation_date,
66+
revision_date=submission.submission_date,
5767
file_type=submission.file_type,
5868
txt_page_count=submission.txt_page_count,
5969
start_date=datetime.date.today(),
@@ -63,11 +73,73 @@ def perform_post(submission):
6373
intended_status_id=8, # None
6474
)
6575
update_authors(draft, submission)
76+
add_document_comment(None, draft, "New version available")
6677
move_docs(submission)
6778
submission.status_id = POSTED
79+
send_announcements(submission, draft, state_change_msg)
6880
submission.save()
6981

7082

83+
def send_announcements(submission, draft, state_change_msg):
84+
announce_to_lists(submission)
85+
if draft.idinternal and not draft.idinternal.rfc_flag:
86+
announce_new_version(submission, draft, state_change_msg)
87+
announce_to_authors(submission)
88+
89+
90+
def announce_to_lists(submission):
91+
subject = 'I-D Action: %s-%s.txt' % (submission.filename, submission.revision)
92+
from_email = settings.IDST_ID_EMAIL
93+
to_email = [settings.IDST_ID_ANNOUNCE_LIST]
94+
authors = []
95+
for i in submission.tempidauthors_set.order_by('author_order'):
96+
if not i.author_order:
97+
continue
98+
authors.append(i.get_full_name())
99+
if submission.group_acronym:
100+
cc = [submission.group_acronym.email_address]
101+
else:
102+
cc = None
103+
send_mail(None, to_email, from_email, subject, 'submit/announce_to_lists.txt',
104+
{'submission': submission,
105+
'authors': authors}, cc=cc)
106+
107+
108+
def announce_new_version(submission, draft, state_change_msg):
109+
to_email = []
110+
if draft.idinternal.state_change_notice_to:
111+
to_email.append(draft.idinternal.state_change_notice_to)
112+
if draft.idinternal.job_owner:
113+
to_email.append(draft.idinternal.job_owner.person.email()[1])
114+
if draft.idinternal.ballot:
115+
for p in draft.idinternal.ballot.positions.all():
116+
if p.discuss == 1 and p.ad.user_level == IESGLogin.AD_LEVEL:
117+
to_email.append(p.ad.person.email()[1])
118+
subject = 'New Version Notification - %s-%s.txt' % (submission.filename, submission.revision)
119+
from_email = settings.IDST_ID_EMAIL
120+
send_mail(None, to_email, from_email, subject, 'submit/announce_new_version.txt',
121+
{'submission': submission,
122+
'msg': state_change_msg})
123+
124+
125+
def announce_to_authors(submission):
126+
authors = submission.tempidauthors_set.order_by('author_order')
127+
cc = list(set([i.email()[1] for i in authors]))
128+
to_email = [authors[0].email()[1]] # First TempIdAuthor is submitter
129+
from_email = settings.IDST_ID_EMAIL
130+
subject = 'New Version Notification for %s-%s.txt' % (submission.filename, submission.revision)
131+
if submission.group_acronym:
132+
wg = submission.group_acronym.group_acronym.acronym
133+
elif submission.filename.startswith('draft-iesg'):
134+
wg = 'IESG'
135+
else:
136+
wg = 'Individual Submission'
137+
send_mail(None, to_email, from_email, subject, 'submit/announce_to_authors.txt',
138+
{'submission': submission,
139+
'submitter': authors[0].get_full_name(),
140+
'wg': wg}, cc=cc)
141+
142+
71143
def find_person(first_name, last_name, middle_initial, name_suffix, email):
72144
person_list = None
73145
if email:
@@ -212,7 +284,7 @@ def validate_revision(self):
212284
if self.draft.status_id in [POSTED, POSTED_BY_SECRETARIAT]:
213285
return
214286
revision = self.draft.revision
215-
existing_revisions = [int(i.revision) for i in InternetDraft.objects.filter(filename=self.draft.filename)]
287+
existing_revisions = [int(i.revision_display()) for i in InternetDraft.objects.filter(filename=self.draft.filename)]
216288
expected = 0
217289
if existing_revisions:
218290
expected = max(existing_revisions) + 1
@@ -233,9 +305,8 @@ def validate_creation_date(self):
233305
self.add_warning('creation_date', 'Creation Date field is empty or the creation date is not in a proper format')
234306
return
235307
submit_date = self.draft.submission_date
236-
if date > submit_date:
237-
self.add_warning('creation_date', 'Creation Date must not be set after submission date')
238-
if date + datetime.timedelta(days=3) < submit_date:
308+
if (date + datetime.timedelta(days=3) < submit_date or
309+
date - datetime.timedelta(days=3) > submit_date):
239310
self.add_warning('creation_date', 'Creation Date must be within 3 days of submission date')
240311

241312
def get_authors(self):

ietf/submit/views.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from django.conf import settings
33
from django.core.urlresolvers import reverse
44
from django.contrib.sites.models import Site
5-
from django.http import HttpResponseRedirect, Http404, HttpResponseForbidden
5+
from django.http import HttpResponseRedirect, Http404, HttpResponseForbidden, HttpResponseNotAllowed
66
from django.shortcuts import get_object_or_404
77
from django.shortcuts import render_to_response
88
from django.template import RequestContext
@@ -167,6 +167,8 @@ def draft_status(request, submission_id, submission_hash=None, message=None):
167167

168168

169169
def draft_cancel(request, submission_id, submission_hash=None):
170+
if request.method!='POST':
171+
return HttpResponseNotAllowed(['POST'])
170172
detail = get_object_or_404(IdSubmissionDetail, submission_id=submission_id)
171173
can_cancel = _can_cancel(request.user, detail, submission_hash)
172174
if not can_cancel:
@@ -212,12 +214,19 @@ def draft_confirm(request, submission_id, auth_key):
212214
elif detail.status_id != WAITING_AUTHENTICATION:
213215
message = ('error', 'The submission can not be autoposted because it is in state: %s' % detail.status.status_value)
214216
else:
215-
message = ('success', 'Authorization key accepted. Auto-Post complete')
216-
perform_post(detail)
217+
if request.method=='POST':
218+
message = ('success', 'Authorization key accepted. Auto-Post complete')
219+
perform_post(detail)
220+
else:
221+
return render_to_response('submit/last_confirmation_step.html',
222+
{'detail': detail, },
223+
context_instance=RequestContext(request))
217224
return draft_status(request, submission_id, message=message)
218225

219226

220227
def draft_approve(request, submission_id, check_function=_can_approve):
228+
if request.method!='POST':
229+
return HttpResponseNotAllowed(['POST'])
221230
detail = get_object_or_404(IdSubmissionDetail, submission_id=submission_id)
222231
can_perform = check_function(request.user, detail)
223232
if not can_perform:
@@ -229,10 +238,14 @@ def draft_approve(request, submission_id, check_function=_can_approve):
229238

230239

231240
def draft_force(request, submission_id):
241+
if request.method!='POST':
242+
return HttpResponseNotAllowed(['POST'])
232243
return draft_approve(request, submission_id, check_function=_can_force_post)
233244

234245

235246
def full_url_request(request, submission_id):
247+
if request.method!='POST':
248+
return HttpResponseNotAllowed(['POST'])
236249
detail = get_object_or_404(IdSubmissionDetail, submission_id=submission_id)
237250
request_full_url(request, detail)
238251
message = ('success', 'An email has been sent to draft authors to inform them of the full access url')
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
New version (-{{ submission.revision }}) has been submitted for {{ submission.filename }}-{{ submission.revision }}.txt.
2+
http://www.ietf.org/internet-drafts/{{ submission.filename }}-{{ submission.revision }}.txt
3+
{{ msg }}
4+
5+
Diff from previous version:
6+
http://tools.ietf.org/rfcdiff?url2={{ submission.filename }}-{{ submission.revision }}
7+
8+
IETF Secretariat.
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
A new version of I-D, {{ submission.filename }}-{{ submission.revision }}.txt has been successfully submitted by {{ submitter }} and posted to the IETF repository.
2+
3+
Filename: {{ submission.filename }}
4+
Revision: {{ submission.revision }}
5+
Title: {{ submission.id_document_name }}
6+
Creation date: {{ submission.creation_date|date:"Y-m-d" }}
7+
WG ID: {{ wg }}
8+
Number of pages: {{ submission.txt_page_count }}
9+
10+
Abstract:
11+
{{ submission.abstract }}
12+
13+
{{ submission.comment_to_sec|default:"" }}
14+
15+
The IETF Secretariat
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
A New Internet-Draft is available from the on-line Internet-Drafts directories.{% if submission.group_acronym %} This draft is a work item of the {{ submission.group_acronym.group_acronym.name }} Working Group of the IETF.{% endif %}
2+
3+
Title : {{ submission.id_document_name }}
4+
Author(s) : {% for author in authors %}{{ author }}{% if not forloop.last %}
5+
{% endif %}{% endfor %}
6+
Filename : {{ submission.filename }}-{{ submission.revision }}.txt
7+
Pages : {{ submission.txt_page_count }}
8+
Date : {{ submission.submission_date|date:"Y-m-d" }}
9+
10+
{{ submission.abstract }}
11+
12+
A URL for this Internet-Draft is:
13+
http://www.ietf.org/internet-drafts/{{ submission.filename }}-{{ submission.revision }}.txt
14+
15+
Internet-Drafts are also available by anonymous FTP at:
16+
ftp://ftp.ietf.org/internet-drafts/
17+
18+
This Internet-Draft can be retrieved at:
19+
ftp://ftp.ietf.org/internet-drafts/{{ submission.filename }}-{{ submission.revision }}.txt

ietf/templates/submit/draft_status.html

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,8 @@
2424
{% if can_cancel %}
2525
<script type="text/javascript">
2626
function confirmCancelation(){
27-
{% if is_valid %}if (confirm("Cancel this submission?")){% endif %}
28-
{% if submission_hash %}
29-
document.location = "{% url draft_cancel_by_hash detail.submission_id submission_hash %}";
30-
{% else %}
31-
document.location = "{% url draft_cancel detail.submission_id %}";
32-
{% endif %}
27+
{% if is_valid %}if (!confirm("Cancel this submission?")) return false;{% endif %}
28+
return true;
3329
}
3430
</script>
3531
{% endif %}
@@ -198,7 +194,9 @@ <h3>Submitter information</h3>
198194
{% if can_cancel %}
199195
<h2>Cancel submission</h2>
200196
<p>
201-
<input type="button" onclick="confirmCancelation();" value="Cancel Submission" /><br>
197+
<form method="post" onsubmit="return confirmCancelation();" action="{% url draft_cancel_by_hash detail.submission_id submission_hash %}">
198+
<input type="submit" value="Cancel Submission" /><br>
199+
</form>
202200
This submission will be canceled, and its uploaded document(s) permanently deleted.
203201
</p>
204202
{% endif %}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{% extends "submit/submit_base.html" %}
2+
3+
{% block title %}Confirm Auto-Post{% endblock %}
4+
5+
6+
{% block submit_content %}
7+
8+
<h2>Confirm auto-post</h2>
9+
<p>
10+
Authorization key accepted. Please the button below to finish Auto-Post of <strong>{{ detail.filename }}-{{ detail.revision }}</strong>
11+
</p>
12+
<form action="" method="post">
13+
<input type="submit" value="Auto-Post" />
14+
</form>
15+
{% endblock %}

0 commit comments

Comments
 (0)