Skip to content

Commit 6aa16f2

Browse files
committed
Show state of a previous submission. Fixes ietf-tools#590
- Legacy-Id: 2836
1 parent 86229aa commit 6aa16f2

7 files changed

Lines changed: 282 additions & 41 deletions

File tree

ietf/submit/forms.py

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@
66
from django.conf import settings
77
from django.template.loader import render_to_string
88

9+
from ietf.idtracker.models import InternetDraft
910
from ietf.proceedings.models import Meeting
10-
from ietf.submit.models import IdSubmissionDetail
11+
from ietf.submit.models import IdSubmissionDetail, TempIdAuthors
1112
from ietf.submit.parsers.pdf_parser import PDFParser
1213
from ietf.submit.parsers.plain_parser import PlainParser
1314
from ietf.submit.parsers.ps_parser import PSParser
@@ -36,6 +37,7 @@ def __init__(self, *args, **kwargs):
3637
self.idnits_message = None
3738
self.shutdown = False
3839
self.draft = None
40+
self.filesize = None
3941
self.read_dates()
4042

4143
def read_dates(self):
@@ -85,6 +87,7 @@ def clean_txt(self):
8587
parsed_info = PlainParser(txt_file).critical_parse()
8688
if parsed_info.errors:
8789
raise forms.ValidationError(parsed_info.errors)
90+
self.filesize=txt_file.size
8891
return txt_file
8992

9093
def clean_pdf(self):
@@ -168,13 +171,57 @@ def check_idnits(self):
168171
self.idnits_message = p.stdout.read()
169172

170173
def save_draft_info(self, draft):
174+
document_id = 0
175+
existing_draft = InternetDraft.objects.filter(filename=draft.filename)
176+
if existing_draft:
177+
document_id = existing_draft[0].id_document_tag
171178
detail = IdSubmissionDetail.objects.create(
172179
id_document_name=draft.get_title(),
173180
filename=draft.filename,
174181
revision=draft.revision,
175182
txt_page_count=draft.get_pagecount(),
183+
filesize=self.filesize,
176184
creation_date=draft.get_creation_date(),
185+
submission_date=datetime.date.today(),
177186
idnits_message=self.idnits_message,
187+
temp_id_document_tag=document_id,
188+
first_two_pages=''.join(draft.pages[:2]),
178189
status_id=1, # Status 1 - upload
179190
)
191+
order = 0
192+
for author in draft.get_authors():
193+
name, email = author.rsplit(' ', 1)
194+
first_name, last_name = name.split(' ', 1)
195+
email = email.replace('<', '').replace('>', '')
196+
order += 1
197+
TempIdAuthors.objects.create(
198+
id_document_tag=document_id,
199+
first_name=first_name,
200+
last_name=last_name,
201+
email_address=email,
202+
author_order=order,
203+
submission=detail)
180204
return detail
205+
206+
207+
class AutoPostForm(forms.Form):
208+
209+
first_name = forms.CharField(label=u'Given name', required=True)
210+
last_name = forms.CharField(label=u'Last name', required=True)
211+
email = forms.EmailField(label=u'Email address', required=True)
212+
213+
def __init__(self, *args, **kwargs):
214+
self.draft = kwargs.pop('draft', None)
215+
self.validation = kwargs.pop('validation', None)
216+
super(AutoPostForm, self).__init__(*args, **kwargs)
217+
218+
def get_author_buttons(self):
219+
button_template = '<input type="button" onclick="jQuery(\'#id_first_name\').val(\'%(first_name)s\');jQuery(\'#id_last_name\').val(\'%(last_name)s\');jQuery(\'#id_email\').val(\'%(email)s\');" value="%(full_name)s" />'
220+
buttons = []
221+
for i in self.validation.authors:
222+
full_name = '%s. %s' % (i.first_name[0], i.last_name)
223+
buttons.append(button_template % {'first_name': i.first_name,
224+
'last_name': i.last_name,
225+
'email': i.email()[1],
226+
'full_name': full_name})
227+
return ''.join(buttons)

ietf/submit/models.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,3 +40,20 @@ class IdSubmissionDetail(models.Model):
4040

4141
class Meta:
4242
db_table = 'id_submission_detail'
43+
44+
class TempIdAuthors(models.Model):
45+
id = models.AutoField(primary_key=True)
46+
id_document_tag = models.IntegerField()
47+
first_name = models.CharField(blank=True, max_length=255)
48+
last_name = models.CharField(blank=True, max_length=255)
49+
email_address = models.CharField(blank=True, max_length=255)
50+
last_modified_date = models.DateField(null=True, blank=True)
51+
last_modified_time = models.CharField(blank=True, max_length=100)
52+
author_order = models.IntegerField(null=True, blank=True)
53+
submission = models.ForeignKey(IdSubmissionDetail)
54+
55+
class Meta:
56+
db_table = 'temp_id_authors'
57+
58+
def email(self):
59+
return ('%s %s' % (self.first_name, self.last_name), self.email_address)

ietf/submit/urls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
url(r'^$', 'submit_index', name='submit_index'),
66
url(r'^status/$', 'submit_status', name='submit_status'),
77
url(r'^status/(?P<submission_id>\d+)/$', 'draft_status', name='draft_status'),
8+
url(r'^status/(?P<submission_id>\d+)/edit/$', 'draft_edit', name='draft_edit'),
89
)
910

1011
urlpatterns += patterns('django.views.generic.simple',

ietf/submit/utils.py

Lines changed: 85 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,88 @@
11
import re
22

3-
def check_idnits_success(idnits_message):
4-
success_re = re.compile('\s+Summary:\s+0\s+|No nits found')
5-
if success_re.search(idnits_message):
3+
from ietf.idtracker.models import InternetDraft, EmailAddress
4+
5+
6+
class DraftValidation(object):
7+
8+
def __init__(self, draft):
9+
self.draft = draft
10+
self.warnings = {}
11+
self.passes_idnits = self.passes_idnits()
12+
self.wg = self.get_working_group()
13+
self.authors = self.get_authors()
14+
15+
def passes_idnits(self):
16+
passes_idnits = self.check_idnits_success(self.draft.idnits_message)
17+
return passes_idnits
18+
19+
def get_working_group(self):
20+
filename = self.draft.filename
21+
existing_draft = InternetDraft.objects.filter(filename=filename)
22+
if existing_draft:
23+
return existing_draft[0].group and existing_draft[0].group.ietfwg or None
24+
else:
25+
if filename.startswith('draft-ietf-'):
26+
# Extra check for WG that contains dashes
27+
for group in IETFWG.objects.filter(group_acronym__acronym__contains='-'):
28+
if filename.startswith('draft-ietf-%s-' % group.group_acronym.acronym):
29+
return group
30+
group_acronym = filename.split('-')[2]
31+
try:
32+
return IETFWG.objects.get(group_acronym__acronym=group_acronym)
33+
except IETFWG.DoesNotExist:
34+
self.add_warning('group', 'Invalid WG ID: %s' % group_acronym)
35+
return None
36+
else:
37+
return None
38+
39+
def check_idnits_success(self, idnits_message):
40+
success_re = re.compile('\s+Summary:\s+0\s+|No nits found')
41+
if success_re.search(idnits_message):
42+
return True
43+
return False
44+
45+
def is_valid_attr(self, key):
46+
if key in self.warnings.keys():
47+
return False
648
return True
7-
return False
49+
50+
def is_valid(self):
51+
self.validate_metadata()
52+
return not bool(self.warnings.keys()) and self.passes_idnits
53+
54+
def validate_metadata(self):
55+
self.validate_revision()
56+
self.validate_authors()
57+
58+
def add_warning(self, key, value):
59+
self.warnings.update({key: value})
60+
61+
def validate_revision(self):
62+
revision = self.draft.revision
63+
existing_revisions = [int(i.revision) for i in InternetDraft.objects.filter(filename=self.draft.filename)]
64+
expected = 0
65+
if existing_revisions:
66+
expected = max(existing_revisions) + 1
67+
if int(revision) != expected:
68+
self.add_warning('revision', 'Invalid Version Number (Version %00d is expected)' % expected)
69+
70+
def validate_authors(self):
71+
if not self.authors:
72+
self.add_warning('authors', 'No authors found')
73+
74+
def get_authors(self):
75+
tmpauthors = self.draft.tempidauthors_set.all().order_by('author_order')
76+
authors = []
77+
for i in tmpauthors:
78+
person = None
79+
for existing in EmailAddress.objects.filter(address=i.email_address):
80+
try:
81+
person = existing.person_or_org
82+
except PersonOrOrgInfo.DoesNotExist:
83+
pass
84+
if not person:
85+
authors.append(i)
86+
else:
87+
authors.append(person)
88+
return authors

ietf/submit/views.py

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
from django.template import RequestContext
77

88
from ietf.submit.models import IdSubmissionDetail
9-
from ietf.submit.forms import UploadForm
10-
from ietf.submit.utils import check_idnits_success
9+
from ietf.submit.forms import UploadForm, AutoPostForm
10+
from ietf.submit.utils import DraftValidation
1111

1212

1313
def submit_index(request):
@@ -43,10 +43,24 @@ def submit_status(request):
4343

4444
def draft_status(request, submission_id):
4545
detail = get_object_or_404(IdSubmissionDetail, submission_id=submission_id)
46-
idnits_success = check_idnits_success(detail.idnits_message)
46+
validation = DraftValidation(detail)
47+
is_valid = validation.is_valid()
48+
if request.method=='POST':
49+
if request.POST.get('autopost', False):
50+
auto_post_form = AutoPostForm(draft=detail, validation=validation, data=request.POST)
51+
else:
52+
return HttpResponseRedirect(reverse(draft_edit, None, kwargs={'submission_id': detail.submission_id}))
53+
else:
54+
auto_post_form = AutoPostForm(draft=detail, validation=validation)
4755
return render_to_response('submit/draft_status.html',
4856
{'selected': 'status',
4957
'detail': detail,
50-
'idnits_success': idnits_success,
58+
'validation': validation,
59+
'auto_post_form': auto_post_form,
60+
'is_valid': is_valid,
5161
},
5262
context_instance=RequestContext(request))
63+
64+
65+
def draft_edit(request, submission_id):
66+
pass

0 commit comments

Comments
 (0)