Skip to content

Commit

Permalink
Remove duplicate functionality in secr/drafts. Fixes #2540. Commit re…
Browse files Browse the repository at this point in the history
…ady for merge.

 - Legacy-Id: 15345
  • Loading branch information
rpcross committed Jul 14, 2018
1 parent 9e09a1b commit 2d60830
Show file tree
Hide file tree
Showing 12 changed files with 8 additions and 760 deletions.
49 changes: 0 additions & 49 deletions ietf/secr/drafts/email.py
Expand Up @@ -97,40 +97,6 @@ def get_revision(name):
base,ext = os.path.splitext(name)
return base[-2:]

def get_revision_emails(draft):
"""
Dervied from the ColdFusion legacy app, we accumulate To: emails for a new
revision by adding:
1) the conents of id_internal.state_change_notice_to, this appears to be largely
custom mail lists for the document or group
2) the main AD, via id_internal.job_owner
3) any ad who has marked "discuss" in the ballot associated with this id_internal
4) And now, also, the RFC Editor if the draft is in the RFC Editor Queue
"""
# from legacy
if not draft.get_state('draft-iesg'):
return ''

emails = []
if draft.notify:
emails.append(draft.notify)
if draft.ad:
emails.append(draft.ad.role_email("ad").address)

if draft.active_ballot():
for ad, pos in draft.active_ballot().active_ad_positions().iteritems():
if pos and pos.pos_id == "discuss":
emails.append(ad.role_email("ad").address)

if draft.get_state('draft-iesg').slug == "rfcqueue":
emails.append('rfc-editor@rfc-editor.org')

return ', '.join(emails)

def add_email(emails,person):
if person.email() not in emails:
emails[person.email()] = '"%s %s"' % (person.first_name,person.last_name)

def get_fullcc_list(draft):
"""
This function takes a draft object and returns a string of emails to use in cc field
Expand Down Expand Up @@ -179,8 +145,6 @@ def get_email_initial(draft, action=None, input=None):
"""
expiration_date = (datetime.date.today() + datetime.timedelta(185)).strftime('%B %d, %Y')
new_revision = str(int(draft.rev)+1).zfill(2)
new_filename = draft.name + '-' + new_revision + '.txt'
curr_filename = draft.name + '-' + draft.rev + '.txt'
data = {}
data['cc'] = get_fullcc_list(draft)
Expand All @@ -201,19 +165,6 @@ def get_email_initial(draft, action=None, input=None):
data['body'] = render_to_string('drafts/message_resurrect.txt', context)
data['action'] = action

elif action == 'revision':
context = {'rev':new_revision,'doc':new_filename,'doc_base':new_filename[:-4]}
data['to'] = get_revision_emails(draft)
data['cc'] = ''
data['subject'] = 'New Version Notification - %s' % (new_filename)
data['body'] = render_to_string('drafts/message_revision.txt', context)

elif action == 'update':
context = {'doc':input['filename'],'expire_date':expiration_date}
data['subject'] = 'Posting of %s' % (input['filename'])
data['body'] = render_to_string('drafts/message_update.txt', context)
data['action'] = action

elif action == 'withdraw':
context = {'doc':curr_filename,'by':input['withdraw_type']}
data['subject'] = 'Withdrawl of %s' % (curr_filename)
Expand Down
135 changes: 0 additions & 135 deletions ietf/secr/drafts/forms.py
@@ -1,4 +1,3 @@
import datetime
import re
import os

Expand Down Expand Up @@ -80,22 +79,6 @@ def label_from_instance(self, obj):
# ---------------------------------------------
# Forms
# ---------------------------------------------
class AddModelForm(forms.ModelForm):
start_date = forms.DateField()
group = GroupModelChoiceField(required=True,help_text='Use group "none" for Individual Submissions.')

class Meta:
model = Document
fields = ('title','group','stream','start_date','pages','abstract','internal_comments')

# use this method to set attrs which keeps other meta info from model.
def __init__(self, *args, **kwargs):
super(AddModelForm, self).__init__(*args, **kwargs)
self.fields['title'].label='Document Name'
self.fields['title'].widget=forms.Textarea()
self.fields['start_date'].initial=datetime.date.today
self.fields['pages'].label='Number of Pages'
self.fields['internal_comments'].label='Comments'

class AuthorForm(forms.Form):
'''
Expand Down Expand Up @@ -245,73 +228,6 @@ class ExtendForm(forms.Form):
action = forms.CharField(max_length=255, widget=forms.HiddenInput(),initial='extend')
expiration_date = forms.DateField()

class BaseRevisionModelForm(forms.ModelForm):
class Meta:
model = Document
fields = ('title','pages','abstract')

class RevisionModelForm(forms.ModelForm):
class Meta:
model = Document
fields = ('title','pages','abstract')

# use this method to set attrs which keeps other meta info from model.
def __init__(self, *args, **kwargs):
super(RevisionModelForm, self).__init__(*args, **kwargs)
self.fields['title'].label='Document Name'
self.fields['title'].widget=forms.Textarea()
self.fields['pages'].label='Number of Pages'

# class RfcModelForm(forms.ModelForm):
# rfc_number = forms.IntegerField()
# rfc_published_date = forms.DateField(initial=datetime.datetime.now)
# group = GroupModelChoiceField(required=True)
#
# class Meta:
# model = Document
# fields = ('title','group','pages','std_level','internal_comments')
#
# # use this method to set attrs which keeps other meta info from model.
# def __init__(self, *args, **kwargs):
# super(RfcModelForm, self).__init__(*args, **kwargs)
# self.fields['title'].widget = forms.Textarea()
# self.fields['std_level'].required = True
#
# def save(self, force_insert=False, force_update=False, commit=False):
# obj = super(RfcModelForm, self).save(commit=False)
#
# # create DocAlias
# DocAlias.objects.create(document=self.instance,name="rfc%d" % self.cleaned_data['rfc_number'])
#
# return obj
#
# def clean_rfc_number(self):
# rfc_number = self.cleaned_data['rfc_number']
# if DocAlias.objects.filter(name='rfc' + str(rfc_number)):
# raise forms.ValidationError("RFC %d already exists" % rfc_number)
# return rfc_number

# class RfcObsoletesForm(forms.Form):
# relation = forms.ModelChoiceField(queryset=DocRelationshipName.objects.filter(slug__in=('updates','obs')),required=False)
# rfc = forms.IntegerField(required=False)
#
# # ensure that RFC exists
# def clean_rfc(self):
# rfc = self.cleaned_data.get('rfc','')
# if rfc:
# if not Document.objects.filter(docalias__name="rfc%s" % rfc):
# raise forms.ValidationError("RFC does not exist")
# return rfc
#
# def clean(self):
# super(RfcObsoletesForm, self).clean()
# cleaned_data = self.cleaned_data
# relation = cleaned_data.get('relation','')
# rfc = cleaned_data.get('rfc','')
# if (relation and not rfc) or (rfc and not relation):
# raise forms.ValidationError('You must select a relation and enter RFC #')
# return cleaned_data

class SearchForm(forms.Form):
intended_std_level = forms.ModelChoiceField(queryset=IntendedStdLevelName.objects,label="Intended Status",required=False)
document_title = forms.CharField(max_length=80,label='Document Title',required=False)
Expand All @@ -321,57 +237,6 @@ class SearchForm(forms.Form):
revision_date_start = forms.DateField(label='Revision Date (start)',required=False)
revision_date_end = forms.DateField(label='Revision Date (end)',required=False)

class UploadForm(forms.Form):
txt = DocumentField(label=u'.txt format', required=True,extension='.txt',filename=None,rev=None)
xml = DocumentField(label=u'.xml format', required=False,extension='.xml',filename=None,rev=None)
pdf = DocumentField(label=u'.pdf format', required=False,extension='.pdf',filename=None,rev=None)
ps = DocumentField(label=u'.ps format', required=False,extension='.ps',filename=None,rev=None)

def __init__(self, *args, **kwargs):
if 'draft' in kwargs:
self.draft = kwargs.pop('draft')
else:
self.draft = None
super(UploadForm, self).__init__(*args, **kwargs)
if self.draft:
for field in self.fields.itervalues():
field.filename = self.draft.name
field.rev = self.draft.rev


def clean(self):
# Checks that all files have the same base
if any(self.errors):
# Don't bother validating unless each field is valid on its own
return
txt = self.cleaned_data['txt']
xml = self.cleaned_data['xml']
pdf = self.cleaned_data['pdf']
ps = self.cleaned_data['ps']

# we only need to do these validations for new drafts
if not self.draft:
names = []
for file in (txt,xml,pdf,ps):
if file:
base = os.path.splitext(file.name)[0]
if base not in names:
names.append(base)

if len(names) > 1:
raise forms.ValidationError, "All files must have the same base name"

# ensure that the basename is unique
base = os.path.splitext(txt.name)[0]
if Document.objects.filter(name=base[:-3]):
raise forms.ValidationError, "This document filename already exists: %s" % base[:-3]

# ensure that rev is 00
if base[-2:] != '00':
raise forms.ValidationError, "New Drafts must start with 00 revision number."

return self.cleaned_data

class WithdrawForm(forms.Form):
withdraw_type = forms.CharField(widget=forms.Select(choices=WITHDRAW_CHOICES),help_text='Select which type of withdraw to perform.')

114 changes: 3 additions & 111 deletions ietf/secr/drafts/tests_views.py
Expand Up @@ -2,7 +2,6 @@
import os
import shutil

from StringIO import StringIO
from django.conf import settings
from django.urls import reverse as urlreverse
from django.utils.http import urlencode
Expand All @@ -11,15 +10,13 @@

from ietf.doc.expire import expire_draft
from ietf.doc.factories import DocumentFactory
from ietf.doc.models import State, Document
from ietf.doc.models import Document
from ietf.meeting.factories import MeetingFactory
from ietf.person.factories import PersonFactory
from ietf.person.models import Person
from ietf.submit.models import Preapproval
from ietf.submit.tests import submission_file
from ietf.utils.test_utils import TestCase, login_testing_unauthorized
from ietf.utils.test_data import make_test_data
from ietf.utils.mail import empty_outbox
from ietf.secr.drafts.email import get_email_initial


Expand Down Expand Up @@ -54,26 +51,6 @@ def test_abstract(self):
response = self.client.get(url)
self.assertEqual(response.status_code, 200)

def test_add(self):
draft = make_test_data()
url = urlreverse('ietf.secr.drafts.views.add')
self.client.login(username="secretary", password="secretary+password")
response = self.client.get(url)
self.assertEqual(response.status_code, 200)

# dummy upload file
txt_file = StringIO('This is a simple text file.')
txt_file.name = "draft-dummy-00.txt"

post = dict(title='A test draft',
group=draft.group.pk,
start_date='2015-01-01',
pages='10',
txt=txt_file
)
response = self.client.post(url,post)
self.assertEqual(response.status_code, 302)

def test_approvals(self):
make_test_data()
Preapproval.objects.create(name='draft-dummy',
Expand Down Expand Up @@ -104,48 +81,8 @@ def test_get_email_initial(self):
# Makes sure that a manual posting by the Secretariat of an I-D that is
# in the RFC Editor Queue will result in notification of the RFC Editor
draft = make_test_data()
state = State.objects.get(type='draft-iesg',slug='rfcqueue')
draft.set_state(state)
data = get_email_initial(draft,action='revision')
self.assertTrue('rfc-editor@rfc-editor.org' in data['to'])

def test_revision(self):
draft = make_test_data()
url = urlreverse('ietf.secr.drafts.views.revision', kwargs={'id':draft.name})
view_url = urlreverse('ietf.secr.drafts.views.view', kwargs={'id':draft.name})
self.client.login(username="secretary", password="secretary+password")
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
post_data = {
'title': draft.title,
'pages': str(draft.pages),
'abstract': draft.abstract,
}
files = {}
files['txt'] = submission_file(draft.name, '02', draft.group, 'txt', "test_submission.txt")
post_data.update(files)
response = self.client.post(url, post_data)
self.assertRedirects(response, view_url)
draft = Document.objects.get(name=draft.name)
self.assertEqual(draft.rev, '02')

def test_revision_rfcqueue(self):
# Makes sure that a manual posting by the Secretariat of an I-D that is
# in the RFC Editor Queue will result in notification of the RFC Editor
draft = make_test_data()
empty_outbox()
state = State.objects.get(type='draft-iesg',slug='rfcqueue')
draft.set_state(state)
url = urlreverse('ietf.secr.drafts.views.revision', kwargs={'id':draft.name})
self.client.login(username="secretary", password="secretary+password")
rev = str(int(draft.rev) + 1).zfill(2)
file = StringIO("This is a test.")
file.name = "%s-%s.txt" % (draft.name, rev)
post = {'title':'The Title','pages':'10','txt':file}
response = self.client.post(url,post,follow=True)
self.assertEqual(response.status_code, 200)
# addresses = ','.join([ m['To'] for m in outbox ])
# self.assertTrue('rfc-editor@rfc-editor.org' in addresses)
data = get_email_initial(draft,action='extend',input={'expiration_date': '2050-01-01'})
self.assertTrue('Extension of Expiration Date' in data['subject'])

def test_makerfc(self):
draft = make_test_data()
Expand All @@ -166,51 +103,6 @@ def test_search(self):
response = self.client.post(url, post)
self.assertEqual(response.status_code, 200)
self.assertTrue(draft.name in response.content)

def test_update(self):
draft = make_test_data()
path = os.path.join(self.repository_dir, draft.filename_with_rev())
with open(path, 'w') as file:
file.write('test')
expire_draft(draft)
url = urlreverse('ietf.secr.drafts.views.update', kwargs={'id':draft.name})
email_url = urlreverse('ietf.secr.drafts.views.email', kwargs={'id':draft.name})
confirm_url = urlreverse('ietf.secr.drafts.views.confirm', kwargs={'id':draft.name})
do_action_url = urlreverse('ietf.secr.drafts.views.do_action', kwargs={'id':draft.name})
view_url = urlreverse('ietf.secr.drafts.views.view', kwargs={'id':draft.name})
self.client.login(username="secretary", password="secretary+password")
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
post_data = {
'title': draft.title,
'pages': str(draft.pages),
'abstract': draft.abstract,
}
formats = ['txt',]
files = {}
for format in formats:
files[format] = submission_file(draft.name, '02', draft.group, format, "test_submission.%s" % format)
post_data.update(files)
response = self.client.post(url, post_data)
self.assertRedirects(response, email_url + '?action=update&filename=%s-02' % (draft.name))
post_data = {
'action': 'update',
'to': 'john@example.com',
'cc': 'joe@example.com',
'subject': 'test',
'body': 'text',
'submit': 'Save'
}
response = self.client.post(email_url + '?action=update&filename=%s-02' % (draft.name), post_data)
response = self.client.post(confirm_url, post_data)
response = self.client.post(do_action_url, post_data)
self.assertRedirects(response, view_url)
draft = Document.objects.get(name=draft.name)
expires = datetime.datetime.now() + datetime.timedelta(settings.INTERNET_DRAFT_DAYS_TO_EXPIRE)
self.assertTrue(draft.get_state_slug('draft') == 'active')
self.assertEqual(draft.rev, '02')
expiration_discrepancy_seconds = abs((draft.expires - expires).total_seconds())
self.assertLess(expiration_discrepancy_seconds, 60)

def test_view(self):
draft = make_test_data()
Expand Down

0 comments on commit 2d60830

Please sign in to comment.