Skip to content

Commit 2d60830

Browse files
committed
Remove duplicate functionality in secr/drafts. Fixes ietf-tools#2540. Commit ready for merge.
- Legacy-Id: 15345
1 parent 9e09a1b commit 2d60830

12 files changed

Lines changed: 8 additions & 760 deletions

File tree

ietf/secr/drafts/email.py

Lines changed: 0 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -97,40 +97,6 @@ def get_revision(name):
9797
base,ext = os.path.splitext(name)
9898
return base[-2:]
9999

100-
def get_revision_emails(draft):
101-
"""
102-
Dervied from the ColdFusion legacy app, we accumulate To: emails for a new
103-
revision by adding:
104-
1) the conents of id_internal.state_change_notice_to, this appears to be largely
105-
custom mail lists for the document or group
106-
2) the main AD, via id_internal.job_owner
107-
3) any ad who has marked "discuss" in the ballot associated with this id_internal
108-
4) And now, also, the RFC Editor if the draft is in the RFC Editor Queue
109-
"""
110-
# from legacy
111-
if not draft.get_state('draft-iesg'):
112-
return ''
113-
114-
emails = []
115-
if draft.notify:
116-
emails.append(draft.notify)
117-
if draft.ad:
118-
emails.append(draft.ad.role_email("ad").address)
119-
120-
if draft.active_ballot():
121-
for ad, pos in draft.active_ballot().active_ad_positions().iteritems():
122-
if pos and pos.pos_id == "discuss":
123-
emails.append(ad.role_email("ad").address)
124-
125-
if draft.get_state('draft-iesg').slug == "rfcqueue":
126-
emails.append('rfc-editor@rfc-editor.org')
127-
128-
return ', '.join(emails)
129-
130-
def add_email(emails,person):
131-
if person.email() not in emails:
132-
emails[person.email()] = '"%s %s"' % (person.first_name,person.last_name)
133-
134100
def get_fullcc_list(draft):
135101
"""
136102
This function takes a draft object and returns a string of emails to use in cc field
@@ -179,8 +145,6 @@ def get_email_initial(draft, action=None, input=None):
179145
180146
"""
181147
expiration_date = (datetime.date.today() + datetime.timedelta(185)).strftime('%B %d, %Y')
182-
new_revision = str(int(draft.rev)+1).zfill(2)
183-
new_filename = draft.name + '-' + new_revision + '.txt'
184148
curr_filename = draft.name + '-' + draft.rev + '.txt'
185149
data = {}
186150
data['cc'] = get_fullcc_list(draft)
@@ -201,19 +165,6 @@ def get_email_initial(draft, action=None, input=None):
201165
data['body'] = render_to_string('drafts/message_resurrect.txt', context)
202166
data['action'] = action
203167

204-
elif action == 'revision':
205-
context = {'rev':new_revision,'doc':new_filename,'doc_base':new_filename[:-4]}
206-
data['to'] = get_revision_emails(draft)
207-
data['cc'] = ''
208-
data['subject'] = 'New Version Notification - %s' % (new_filename)
209-
data['body'] = render_to_string('drafts/message_revision.txt', context)
210-
211-
elif action == 'update':
212-
context = {'doc':input['filename'],'expire_date':expiration_date}
213-
data['subject'] = 'Posting of %s' % (input['filename'])
214-
data['body'] = render_to_string('drafts/message_update.txt', context)
215-
data['action'] = action
216-
217168
elif action == 'withdraw':
218169
context = {'doc':curr_filename,'by':input['withdraw_type']}
219170
data['subject'] = 'Withdrawl of %s' % (curr_filename)

ietf/secr/drafts/forms.py

Lines changed: 0 additions & 135 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import datetime
21
import re
32
import os
43

@@ -80,22 +79,6 @@ def label_from_instance(self, obj):
8079
# ---------------------------------------------
8180
# Forms
8281
# ---------------------------------------------
83-
class AddModelForm(forms.ModelForm):
84-
start_date = forms.DateField()
85-
group = GroupModelChoiceField(required=True,help_text='Use group "none" for Individual Submissions.')
86-
87-
class Meta:
88-
model = Document
89-
fields = ('title','group','stream','start_date','pages','abstract','internal_comments')
90-
91-
# use this method to set attrs which keeps other meta info from model.
92-
def __init__(self, *args, **kwargs):
93-
super(AddModelForm, self).__init__(*args, **kwargs)
94-
self.fields['title'].label='Document Name'
95-
self.fields['title'].widget=forms.Textarea()
96-
self.fields['start_date'].initial=datetime.date.today
97-
self.fields['pages'].label='Number of Pages'
98-
self.fields['internal_comments'].label='Comments'
9982

10083
class AuthorForm(forms.Form):
10184
'''
@@ -245,73 +228,6 @@ class ExtendForm(forms.Form):
245228
action = forms.CharField(max_length=255, widget=forms.HiddenInput(),initial='extend')
246229
expiration_date = forms.DateField()
247230

248-
class BaseRevisionModelForm(forms.ModelForm):
249-
class Meta:
250-
model = Document
251-
fields = ('title','pages','abstract')
252-
253-
class RevisionModelForm(forms.ModelForm):
254-
class Meta:
255-
model = Document
256-
fields = ('title','pages','abstract')
257-
258-
# use this method to set attrs which keeps other meta info from model.
259-
def __init__(self, *args, **kwargs):
260-
super(RevisionModelForm, self).__init__(*args, **kwargs)
261-
self.fields['title'].label='Document Name'
262-
self.fields['title'].widget=forms.Textarea()
263-
self.fields['pages'].label='Number of Pages'
264-
265-
# class RfcModelForm(forms.ModelForm):
266-
# rfc_number = forms.IntegerField()
267-
# rfc_published_date = forms.DateField(initial=datetime.datetime.now)
268-
# group = GroupModelChoiceField(required=True)
269-
#
270-
# class Meta:
271-
# model = Document
272-
# fields = ('title','group','pages','std_level','internal_comments')
273-
#
274-
# # use this method to set attrs which keeps other meta info from model.
275-
# def __init__(self, *args, **kwargs):
276-
# super(RfcModelForm, self).__init__(*args, **kwargs)
277-
# self.fields['title'].widget = forms.Textarea()
278-
# self.fields['std_level'].required = True
279-
#
280-
# def save(self, force_insert=False, force_update=False, commit=False):
281-
# obj = super(RfcModelForm, self).save(commit=False)
282-
#
283-
# # create DocAlias
284-
# DocAlias.objects.create(document=self.instance,name="rfc%d" % self.cleaned_data['rfc_number'])
285-
#
286-
# return obj
287-
#
288-
# def clean_rfc_number(self):
289-
# rfc_number = self.cleaned_data['rfc_number']
290-
# if DocAlias.objects.filter(name='rfc' + str(rfc_number)):
291-
# raise forms.ValidationError("RFC %d already exists" % rfc_number)
292-
# return rfc_number
293-
294-
# class RfcObsoletesForm(forms.Form):
295-
# relation = forms.ModelChoiceField(queryset=DocRelationshipName.objects.filter(slug__in=('updates','obs')),required=False)
296-
# rfc = forms.IntegerField(required=False)
297-
#
298-
# # ensure that RFC exists
299-
# def clean_rfc(self):
300-
# rfc = self.cleaned_data.get('rfc','')
301-
# if rfc:
302-
# if not Document.objects.filter(docalias__name="rfc%s" % rfc):
303-
# raise forms.ValidationError("RFC does not exist")
304-
# return rfc
305-
#
306-
# def clean(self):
307-
# super(RfcObsoletesForm, self).clean()
308-
# cleaned_data = self.cleaned_data
309-
# relation = cleaned_data.get('relation','')
310-
# rfc = cleaned_data.get('rfc','')
311-
# if (relation and not rfc) or (rfc and not relation):
312-
# raise forms.ValidationError('You must select a relation and enter RFC #')
313-
# return cleaned_data
314-
315231
class SearchForm(forms.Form):
316232
intended_std_level = forms.ModelChoiceField(queryset=IntendedStdLevelName.objects,label="Intended Status",required=False)
317233
document_title = forms.CharField(max_length=80,label='Document Title',required=False)
@@ -321,57 +237,6 @@ class SearchForm(forms.Form):
321237
revision_date_start = forms.DateField(label='Revision Date (start)',required=False)
322238
revision_date_end = forms.DateField(label='Revision Date (end)',required=False)
323239

324-
class UploadForm(forms.Form):
325-
txt = DocumentField(label=u'.txt format', required=True,extension='.txt',filename=None,rev=None)
326-
xml = DocumentField(label=u'.xml format', required=False,extension='.xml',filename=None,rev=None)
327-
pdf = DocumentField(label=u'.pdf format', required=False,extension='.pdf',filename=None,rev=None)
328-
ps = DocumentField(label=u'.ps format', required=False,extension='.ps',filename=None,rev=None)
329-
330-
def __init__(self, *args, **kwargs):
331-
if 'draft' in kwargs:
332-
self.draft = kwargs.pop('draft')
333-
else:
334-
self.draft = None
335-
super(UploadForm, self).__init__(*args, **kwargs)
336-
if self.draft:
337-
for field in self.fields.itervalues():
338-
field.filename = self.draft.name
339-
field.rev = self.draft.rev
340-
341-
342-
def clean(self):
343-
# Checks that all files have the same base
344-
if any(self.errors):
345-
# Don't bother validating unless each field is valid on its own
346-
return
347-
txt = self.cleaned_data['txt']
348-
xml = self.cleaned_data['xml']
349-
pdf = self.cleaned_data['pdf']
350-
ps = self.cleaned_data['ps']
351-
352-
# we only need to do these validations for new drafts
353-
if not self.draft:
354-
names = []
355-
for file in (txt,xml,pdf,ps):
356-
if file:
357-
base = os.path.splitext(file.name)[0]
358-
if base not in names:
359-
names.append(base)
360-
361-
if len(names) > 1:
362-
raise forms.ValidationError, "All files must have the same base name"
363-
364-
# ensure that the basename is unique
365-
base = os.path.splitext(txt.name)[0]
366-
if Document.objects.filter(name=base[:-3]):
367-
raise forms.ValidationError, "This document filename already exists: %s" % base[:-3]
368-
369-
# ensure that rev is 00
370-
if base[-2:] != '00':
371-
raise forms.ValidationError, "New Drafts must start with 00 revision number."
372-
373-
return self.cleaned_data
374-
375240
class WithdrawForm(forms.Form):
376241
withdraw_type = forms.CharField(widget=forms.Select(choices=WITHDRAW_CHOICES),help_text='Select which type of withdraw to perform.')
377242

ietf/secr/drafts/tests_views.py

Lines changed: 3 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
import os
33
import shutil
44

5-
from StringIO import StringIO
65
from django.conf import settings
76
from django.urls import reverse as urlreverse
87
from django.utils.http import urlencode
@@ -11,15 +10,13 @@
1110

1211
from ietf.doc.expire import expire_draft
1312
from ietf.doc.factories import DocumentFactory
14-
from ietf.doc.models import State, Document
13+
from ietf.doc.models import Document
1514
from ietf.meeting.factories import MeetingFactory
1615
from ietf.person.factories import PersonFactory
1716
from ietf.person.models import Person
1817
from ietf.submit.models import Preapproval
19-
from ietf.submit.tests import submission_file
2018
from ietf.utils.test_utils import TestCase, login_testing_unauthorized
2119
from ietf.utils.test_data import make_test_data
22-
from ietf.utils.mail import empty_outbox
2320
from ietf.secr.drafts.email import get_email_initial
2421

2522

@@ -54,26 +51,6 @@ def test_abstract(self):
5451
response = self.client.get(url)
5552
self.assertEqual(response.status_code, 200)
5653

57-
def test_add(self):
58-
draft = make_test_data()
59-
url = urlreverse('ietf.secr.drafts.views.add')
60-
self.client.login(username="secretary", password="secretary+password")
61-
response = self.client.get(url)
62-
self.assertEqual(response.status_code, 200)
63-
64-
# dummy upload file
65-
txt_file = StringIO('This is a simple text file.')
66-
txt_file.name = "draft-dummy-00.txt"
67-
68-
post = dict(title='A test draft',
69-
group=draft.group.pk,
70-
start_date='2015-01-01',
71-
pages='10',
72-
txt=txt_file
73-
)
74-
response = self.client.post(url,post)
75-
self.assertEqual(response.status_code, 302)
76-
7754
def test_approvals(self):
7855
make_test_data()
7956
Preapproval.objects.create(name='draft-dummy',
@@ -104,48 +81,8 @@ def test_get_email_initial(self):
10481
# Makes sure that a manual posting by the Secretariat of an I-D that is
10582
# in the RFC Editor Queue will result in notification of the RFC Editor
10683
draft = make_test_data()
107-
state = State.objects.get(type='draft-iesg',slug='rfcqueue')
108-
draft.set_state(state)
109-
data = get_email_initial(draft,action='revision')
110-
self.assertTrue('rfc-editor@rfc-editor.org' in data['to'])
111-
112-
def test_revision(self):
113-
draft = make_test_data()
114-
url = urlreverse('ietf.secr.drafts.views.revision', kwargs={'id':draft.name})
115-
view_url = urlreverse('ietf.secr.drafts.views.view', kwargs={'id':draft.name})
116-
self.client.login(username="secretary", password="secretary+password")
117-
response = self.client.get(url)
118-
self.assertEqual(response.status_code, 200)
119-
post_data = {
120-
'title': draft.title,
121-
'pages': str(draft.pages),
122-
'abstract': draft.abstract,
123-
}
124-
files = {}
125-
files['txt'] = submission_file(draft.name, '02', draft.group, 'txt', "test_submission.txt")
126-
post_data.update(files)
127-
response = self.client.post(url, post_data)
128-
self.assertRedirects(response, view_url)
129-
draft = Document.objects.get(name=draft.name)
130-
self.assertEqual(draft.rev, '02')
131-
132-
def test_revision_rfcqueue(self):
133-
# Makes sure that a manual posting by the Secretariat of an I-D that is
134-
# in the RFC Editor Queue will result in notification of the RFC Editor
135-
draft = make_test_data()
136-
empty_outbox()
137-
state = State.objects.get(type='draft-iesg',slug='rfcqueue')
138-
draft.set_state(state)
139-
url = urlreverse('ietf.secr.drafts.views.revision', kwargs={'id':draft.name})
140-
self.client.login(username="secretary", password="secretary+password")
141-
rev = str(int(draft.rev) + 1).zfill(2)
142-
file = StringIO("This is a test.")
143-
file.name = "%s-%s.txt" % (draft.name, rev)
144-
post = {'title':'The Title','pages':'10','txt':file}
145-
response = self.client.post(url,post,follow=True)
146-
self.assertEqual(response.status_code, 200)
147-
# addresses = ','.join([ m['To'] for m in outbox ])
148-
# self.assertTrue('rfc-editor@rfc-editor.org' in addresses)
84+
data = get_email_initial(draft,action='extend',input={'expiration_date': '2050-01-01'})
85+
self.assertTrue('Extension of Expiration Date' in data['subject'])
14986

15087
def test_makerfc(self):
15188
draft = make_test_data()
@@ -166,51 +103,6 @@ def test_search(self):
166103
response = self.client.post(url, post)
167104
self.assertEqual(response.status_code, 200)
168105
self.assertTrue(draft.name in response.content)
169-
170-
def test_update(self):
171-
draft = make_test_data()
172-
path = os.path.join(self.repository_dir, draft.filename_with_rev())
173-
with open(path, 'w') as file:
174-
file.write('test')
175-
expire_draft(draft)
176-
url = urlreverse('ietf.secr.drafts.views.update', kwargs={'id':draft.name})
177-
email_url = urlreverse('ietf.secr.drafts.views.email', kwargs={'id':draft.name})
178-
confirm_url = urlreverse('ietf.secr.drafts.views.confirm', kwargs={'id':draft.name})
179-
do_action_url = urlreverse('ietf.secr.drafts.views.do_action', kwargs={'id':draft.name})
180-
view_url = urlreverse('ietf.secr.drafts.views.view', kwargs={'id':draft.name})
181-
self.client.login(username="secretary", password="secretary+password")
182-
response = self.client.get(url)
183-
self.assertEqual(response.status_code, 200)
184-
post_data = {
185-
'title': draft.title,
186-
'pages': str(draft.pages),
187-
'abstract': draft.abstract,
188-
}
189-
formats = ['txt',]
190-
files = {}
191-
for format in formats:
192-
files[format] = submission_file(draft.name, '02', draft.group, format, "test_submission.%s" % format)
193-
post_data.update(files)
194-
response = self.client.post(url, post_data)
195-
self.assertRedirects(response, email_url + '?action=update&filename=%s-02' % (draft.name))
196-
post_data = {
197-
'action': 'update',
198-
'to': 'john@example.com',
199-
'cc': 'joe@example.com',
200-
'subject': 'test',
201-
'body': 'text',
202-
'submit': 'Save'
203-
}
204-
response = self.client.post(email_url + '?action=update&filename=%s-02' % (draft.name), post_data)
205-
response = self.client.post(confirm_url, post_data)
206-
response = self.client.post(do_action_url, post_data)
207-
self.assertRedirects(response, view_url)
208-
draft = Document.objects.get(name=draft.name)
209-
expires = datetime.datetime.now() + datetime.timedelta(settings.INTERNET_DRAFT_DAYS_TO_EXPIRE)
210-
self.assertTrue(draft.get_state_slug('draft') == 'active')
211-
self.assertEqual(draft.rev, '02')
212-
expiration_discrepancy_seconds = abs((draft.expires - expires).total_seconds())
213-
self.assertLess(expiration_discrepancy_seconds, 60)
214106

215107
def test_view(self):
216108
draft = make_test_data()

0 commit comments

Comments
 (0)