From 2d6083060a2f711f6c77286414b168fedd857d72 Mon Sep 17 00:00:00 2001 From: Ryan Cross Date: Sat, 14 Jul 2018 19:25:09 +0000 Subject: [PATCH] Remove duplicate functionality in secr/drafts. Fixes #2540. Commit ready for merge. - Legacy-Id: 15345 --- ietf/secr/drafts/email.py | 49 --- ietf/secr/drafts/forms.py | 135 ------- ietf/secr/drafts/tests_views.py | 114 +----- ietf/secr/drafts/urls.py | 3 - ietf/secr/drafts/views.py | 373 +----------------- ietf/secr/templates/drafts/add.html | 32 -- .../templates/drafts/message_revision.txt | 7 - ietf/secr/templates/drafts/message_update.txt | 8 - ietf/secr/templates/drafts/revision.html | 32 -- ietf/secr/templates/drafts/search.html | 2 +- ietf/secr/templates/drafts/view.html | 2 - .../templates/includes/draft_upload_form.html | 11 - 12 files changed, 8 insertions(+), 760 deletions(-) delete mode 100644 ietf/secr/templates/drafts/add.html delete mode 100644 ietf/secr/templates/drafts/message_revision.txt delete mode 100644 ietf/secr/templates/drafts/message_update.txt delete mode 100644 ietf/secr/templates/drafts/revision.html delete mode 100644 ietf/secr/templates/includes/draft_upload_form.html diff --git a/ietf/secr/drafts/email.py b/ietf/secr/drafts/email.py index 64e3e113b..e1cdb09cd 100644 --- a/ietf/secr/drafts/email.py +++ b/ietf/secr/drafts/email.py @@ -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 @@ -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) @@ -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) diff --git a/ietf/secr/drafts/forms.py b/ietf/secr/drafts/forms.py index 623e7ca19..675da7944 100644 --- a/ietf/secr/drafts/forms.py +++ b/ietf/secr/drafts/forms.py @@ -1,4 +1,3 @@ -import datetime import re import os @@ -80,22 +79,6 @@ class AliasModelChoiceField(forms.ModelChoiceField): # --------------------------------------------- # 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): ''' @@ -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) @@ -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.') diff --git a/ietf/secr/drafts/tests_views.py b/ietf/secr/drafts/tests_views.py index 9f9961818..cbc1c5fc8 100644 --- a/ietf/secr/drafts/tests_views.py +++ b/ietf/secr/drafts/tests_views.py @@ -2,7 +2,6 @@ import datetime 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 @@ -11,15 +10,13 @@ import debug # pyflakes:ignore 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 @@ -54,26 +51,6 @@ class SecrDraftsTestCase(TestCase): 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', @@ -104,48 +81,8 @@ class SecrDraftsTestCase(TestCase): # 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() @@ -166,51 +103,6 @@ class SecrDraftsTestCase(TestCase): 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() diff --git a/ietf/secr/drafts/urls.py b/ietf/secr/drafts/urls.py index 4364667ba..16ea645e6 100644 --- a/ietf/secr/drafts/urls.py +++ b/ietf/secr/drafts/urls.py @@ -4,7 +4,6 @@ from ietf.utils.urls import url urlpatterns = [ url(r'^$', views.search), - url(r'^add/$', views.add), url(r'^approvals/$', views.approvals), url(r'^dates/$', views.dates), url(r'^nudge-report/$', views.nudge_report), @@ -17,7 +16,5 @@ urlpatterns = [ url(r'^(?P[A-Za-z0-9._\-\+]+)/edit/$', views.edit), url(r'^(?P[A-Za-z0-9._\-\+]+)/extend/$', views.extend), url(r'^(?P[A-Za-z0-9._\-\+]+)/email/$', views.email), - url(r'^(?P[A-Za-z0-9._\-\+]+)/revision/$', views.revision), - url(r'^(?P[A-Za-z0-9._\-\+]+)/update/$', views.update), url(r'^(?P[A-Za-z0-9._\-\+]+)/withdraw/$', views.withdraw), ] diff --git a/ietf/secr/drafts/views.py b/ietf/secr/drafts/views.py index 84184874e..f4fd7bfac 100644 --- a/ietf/secr/drafts/views.py +++ b/ietf/secr/drafts/views.py @@ -11,38 +11,21 @@ from django.shortcuts import render, get_object_or_404, redirect from django.urls import reverse from django.utils.http import urlencode -from ietf.doc.models import Document, DocumentAuthor, DocAlias, State +from ietf.doc.models import Document, DocumentAuthor, State from ietf.doc.models import DocEvent, NewRevisionDocEvent from ietf.doc.utils import add_state_change_event from ietf.ietfauth.utils import role_required from ietf.meeting.helpers import get_meeting -from ietf.name.models import StreamName -from ietf.person.models import Person from ietf.secr.drafts.email import announcement_from_form, get_email_initial -from ietf.secr.drafts.forms import ( AddModelForm, AuthorForm, BaseRevisionModelForm, EditModelForm, - EmailForm, ExtendForm, RevisionModelForm, - SearchForm, UploadForm, WithdrawForm ) -from ietf.secr.utils.ams_utils import get_base +from ietf.secr.drafts.forms import AuthorForm, EditModelForm, EmailForm, ExtendForm, SearchForm, WithdrawForm from ietf.secr.utils.document import get_rfc_num, get_start_date -from ietf.submit.models import Submission, Preapproval, DraftSubmissionStateName, SubmissionEvent -from ietf.submit.mail import announce_new_version, announce_to_lists, announce_to_authors -from ietf.utils.draft import Draft +from ietf.submit.models import Preapproval from ietf.utils.log import log # ------------------------------------------------- # Helper Functions # ------------------------------------------------- -def archive_draft_files(filename): - ''' - Takes a string representing the old draft filename, without extensions. - Moves any matching files to archive directory. - ''' - files = glob.glob(os.path.join(settings.INTERNET_DRAFT_PATH,filename) + '.*') - for file in files: - shutil.move(file,settings.INTERNET_DRAFT_ARCHIVE_DIR) - return - def get_action_details(draft, request): ''' This function takes a draft object and request object and returns a list of dictionaries @@ -71,72 +54,6 @@ def handle_uploaded_file(f): destination.write(chunk) destination.close() -def handle_substate(doc): - ''' - This function checks to see if the document has a revision needed tag, if so the - tag gets changed to ad followup, and a DocEvent is created. - ''' - qs = doc.tags.filter(slug__in=('need-rev','rev-wglc','rev-ad','rev-iesg')) - if qs: - for tag in qs: - doc.tags.remove(tag) - doc.tags.add('ad-f-up') - - # add DocEvent - system = Person.objects.get(name="(system)") - DocEvent.objects.create(type="changed_document", - doc=doc, - rev=doc.rev, - desc="Sub state has been changed to AD Followup from Revised ID Needed", - by=system) - -def process_files(request,draft): - ''' - This function takes a request object and draft object. - It obtains the list of file objects (ie from request.FILES), uploads - the files by calling handle_file_upload() and returns - the basename, revision number and a list of file types. Basename and revision - are assumed to be the same for all because this is part of the validation process. - ''' - files = request.FILES - file = files[files.keys()[0]] - filename = os.path.splitext(file.name)[0] - revision = os.path.splitext(file.name)[0][-2:] - file_type_list = [] - for file in files.values(): - extension = os.path.splitext(file.name)[1] - file_type_list.append(extension) - handle_uploaded_file(file) - - return (filename,revision,file_type_list) - -def post_submission(request, draft): - with open(draft.get_file_name()) as file: - wrapper = Draft(file.read().decode('utf8'), file.name) - submission = Submission( - name=draft.name, - title=draft.title, - rev=draft.rev, - pages=draft.pages, - file_size=os.path.getsize(draft.get_file_name()), - document_date=wrapper.get_creation_date(), - submission_date=datetime.date.today(), - group_id=draft.group.id, - remote_ip=request.META['REMOTE_ADDR'], - first_two_pages=''.join(wrapper.pages[:2]), - state=DraftSubmissionStateName.objects.get(slug="posted"), - abstract=draft.abstract, - file_types=','.join(file_types_for_draft(draft)), - ) - submission.save() - - SubmissionEvent.objects.create( - submission=submission, - by=request.user.person, - desc="Submitted and posted manually") - - return submission - def file_types_for_draft(draft): '''Returns list of file extensions that exist for this draft''' basename, ext = os.path.splitext(draft.get_file_name()) @@ -148,16 +65,6 @@ def file_types_for_draft(draft): file_types.append(ext) return file_types -def promote_files(draft, types): - ''' - This function takes one argument, a draft object. It then moves the draft files from - the temporary upload directory to the production directory. - ''' - filename = '%s-%s' % (draft.name,draft.rev) - for ext in types: - path = os.path.join(settings.IDSUBMIT_MANUAL_STAGING_DIR, filename + ext) - shutil.move(path,settings.INTERNET_DRAFT_PATH) - # ------------------------------------------------- # Action Button Functions # ------------------------------------------------- @@ -235,109 +142,6 @@ def do_resurrect(draft, request): return -def do_revision(draft, request, filename, file_type_list): - ''' - This function handles adding a new revision of an existing Internet-Draft. - Prerequisites: draft must be active - Input: title, revision_date, pages, abstract, file input fields to upload new - draft document(s) - Actions - - move current doc(s) to archive directory - - upload new docs to live dir - - save doc in history - - increment revision - - reset expires - - create DocEvent - - handle sub-state - - schedule notification - ''' - - # TODO this behavior may change with archive strategy - archive_draft_files(draft.name + '-' + draft.rev) - - # save form data - form = BaseRevisionModelForm(request.POST,instance=draft) - if form.is_valid(): - new_draft = form.save(commit=False) - else: - raise Exception(form.errors) - raise Exception('Problem with input data %s' % form.data) - - # set revision and expires - new_draft.rev = filename[-2:] - new_draft.expires = datetime.datetime.now() + datetime.timedelta(settings.INTERNET_DRAFT_DAYS_TO_EXPIRE) - - # create DocEvent - e = NewRevisionDocEvent.objects.create(type='new_revision', - by=request.user.person, - doc=draft, - rev=new_draft.rev, - desc='New revision available', - time=draft.time) - - new_draft.save_with_history([e]) - - handle_substate(new_draft) - - # move uploaded files to production directory - promote_files(new_draft, file_type_list) - - # save the submission record - submission = post_submission(request, new_draft) - - announce_to_lists(request, submission) - announce_new_version(request, submission, draft, '') - announce_to_authors(request, submission) - - return - -def do_update(draft,request,filename,file_type_list): - ''' - Actions - - increment revision # - - reset expires - - create DocEvent - - do substate check - - change state to Active - ''' - # save form data - form = BaseRevisionModelForm(request.POST,instance=draft) - if form.is_valid(): - new_draft = form.save(commit=False) - else: - raise Exception('Problem with input data %s' % form.data) - - handle_substate(new_draft) - - # update draft record - new_draft.rev = os.path.splitext(filename)[0][-2:] - new_draft.expires = datetime.datetime.now() + datetime.timedelta(settings.INTERNET_DRAFT_DAYS_TO_EXPIRE) - - new_draft.set_state(State.objects.get(type="draft", slug="active")) - - # create DocEvent - e = NewRevisionDocEvent.objects.create(type='new_revision', - by=request.user.person, - doc=new_draft, - rev=new_draft.rev, - desc='New revision available', - time=new_draft.time) - - new_draft.save_with_history([e]) - - # move uploaded files to production directory - promote_files(new_draft, file_type_list) - - # save the submission record - post_submission(request, new_draft) - -def do_update_announce(draft, request): - # send announcement - form = EmailForm(request.POST) - announcement_from_form(form.data,by=request.user.person) - - return - def do_withdraw(draft,request): ''' Actions @@ -390,96 +194,6 @@ def abstract(request, id): 'draft': draft}, ) -@role_required('Secretariat') -def add(request): - ''' - Add Internet Draft - - **Templates:** - - * ``drafts/add.html`` - - **Template Variables:** - - * form - ''' - - if request.method == 'POST': - button_text = request.POST.get('submit', '') - if button_text == 'Cancel': - return redirect('drafts') - - upload_form = UploadForm(request.POST, request.FILES) - form = AddModelForm(request.POST) - if form.is_valid() and upload_form.is_valid(): - draft = form.save(commit=False) - - # process files - filename,revision,file_type_list = process_files(request, draft) - name = get_base(filename) - - # set fields (set stream or intended status?) - draft.rev = revision - draft.name = name - draft.type_id = 'draft' - - # set stream based on document name - if not draft.stream: - stream_slug = None - if draft.name.startswith("draft-iab-"): - stream_slug = "iab" - elif draft.name.startswith("draft-irtf-"): - stream_slug = "irtf" - elif draft.name.startswith("draft-ietf-") and (draft.group.type_id != "individ"): - stream_slug = "ietf" - - if stream_slug: - draft.stream = StreamName.objects.get(slug=stream_slug) - - # set expires - draft.expires = datetime.datetime.now() + datetime.timedelta(settings.INTERNET_DRAFT_DAYS_TO_EXPIRE) - - draft.save(force_insert=True) - - # set state - draft.set_state(State.objects.get(type="draft", slug="active")) - - # automatically set state "WG Document" - if draft.stream_id == "ietf" and draft.group.type_id == "wg": - draft.set_state(State.objects.get(type="draft-stream-%s" % draft.stream_id, slug="wg-doc")) - - # create DocAlias - DocAlias.objects.get_or_create(name=name, document=draft) - - # create DocEvent - NewRevisionDocEvent.objects.create(type='new_revision', - by=request.user.person, - doc=draft, - rev=draft.rev, - time=draft.time, - desc="New revision available") - - # move uploaded files to production directory - promote_files(draft, file_type_list) - - # save the submission record - post_submission(request, draft) - - messages.success(request, 'New draft added successfully!') - params = dict(action='add') - url = reverse('ietf.secr.drafts.views.authors', kwargs={'id':draft.pk}) - url = url + '?' + urlencode(params) - return redirect(url) - - else: - form = AddModelForm() - upload_form = UploadForm() - - return render(request, 'drafts/add.html', { - 'form': form, - 'upload_form': upload_form}, - ) - @role_required('Secretariat') def approvals(request): ''' @@ -603,12 +317,8 @@ def do_action(request, id): action = request.POST.get('action') - if action == 'revision': - func = do_revision - elif action == 'resurrect': + if action == 'resurrect': func = do_resurrect - elif action == 'update': - func = do_update_announce elif action == 'extend': func = do_extend elif action == 'withdraw': @@ -758,41 +468,6 @@ def nudge_report(request): return render(request, 'drafts/report_nudge.html', { 'docs': docs}, ) - -@role_required('Secretariat') -def revision(request, id): - ''' - This function presents the input form for the New Revision action. - on POST, updates draft to new revision and sends notification. - ''' - - draft = get_object_or_404(Document, name=id) - - if request.method == 'POST': - button_text = request.POST.get('submit', '') - if button_text == 'Cancel': - return redirect('ietf.secr.drafts.views.view', id=id) - - upload_form = UploadForm(request.POST, request.FILES, draft=draft) - form = RevisionModelForm(request.POST, instance=draft) - if form.is_valid() and upload_form.is_valid(): - # process files - filename,revision,file_type_list = process_files(request,draft) - - do_revision(draft, request, filename, file_type_list) - - messages.success(request, 'New Revision successful!') - return redirect('ietf.secr.drafts.views.view', id=id) - - else: - form = RevisionModelForm(instance=draft,initial={'revision_date':datetime.date.today().isoformat()}) - upload_form = UploadForm(draft=draft) - - return render(request, 'drafts/revision.html', { - 'form': form, - 'upload_form': upload_form, - 'draft': draft}, - ) @role_required('Secretariat') def search(request): @@ -863,46 +538,6 @@ def search(request): 'form': form}, ) -@role_required('Secretariat') -def update(request, id): - ''' - This view handles the Update action for an Internet-Draft - Update is when an expired draft gets a new revision, (the state does not change?) - Prerequisites: draft must be expired - Input: upload new files, pages, abstract, title - ''' - - draft = get_object_or_404(Document, name=id) - - if request.method == 'POST': - button_text = request.POST.get('submit', '') - if button_text == 'Cancel': - return redirect('ietf.secr.drafts.views.view', id=id) - - upload_form = UploadForm(request.POST, request.FILES, draft=draft) - form = RevisionModelForm(request.POST, instance=draft) - if form.is_valid() and upload_form.is_valid(): - # process files - filename,revision,file_type_list = process_files(request,draft) - - do_update(draft, request, filename, file_type_list) - - params = dict(action='update') - params['filename'] = filename - url = reverse('ietf.secr.drafts.views.email', kwargs={'id':id}) - url = url + '?' + urlencode(params) - return redirect(url) - - else: - form = RevisionModelForm(instance=draft,initial={'revision_date':datetime.date.today().isoformat()}) - upload_form = UploadForm(draft=draft) - - return render(request, 'drafts/revision.html', { - 'form': form, - 'upload_form':upload_form, - 'draft': draft}, - ) - @role_required('Secretariat') def view(request, id): ''' diff --git a/ietf/secr/templates/drafts/add.html b/ietf/secr/templates/drafts/add.html deleted file mode 100644 index 5eac3b363..000000000 --- a/ietf/secr/templates/drafts/add.html +++ /dev/null @@ -1,32 +0,0 @@ -{% extends "base_site.html" %} -{% load staticfiles %} - -{% block title %}Drafts - Add{% endblock %} - -{% block extrahead %}{{ block.super }} - -{% endblock %} - -{% block breadcrumbs %}{{ block.super }} - » Drafts - » Add -{% endblock %} - -{% block content %} - -
-

Draft - Add

-
{% csrf_token %} - - - {{ form.as_table }} -
- - {% include "includes/draft_upload_form.html" %} - - {% include "includes/buttons_save_cancel.html" %} - -
-
- -{% endblock %} diff --git a/ietf/secr/templates/drafts/message_revision.txt b/ietf/secr/templates/drafts/message_revision.txt deleted file mode 100644 index 65e4dd7f1..000000000 --- a/ietf/secr/templates/drafts/message_revision.txt +++ /dev/null @@ -1,7 +0,0 @@ -A new version (-{{ rev }}) has been submitted for {{ doc }}: -https://www.ietf.org/internet-drafts/{{ doc }} - -Diff from previous version: -https://tools.ietf.org/rfcdiff?url2={{ doc_base }} - -The IETF Secretariat. diff --git a/ietf/secr/templates/drafts/message_update.txt b/ietf/secr/templates/drafts/message_update.txt deleted file mode 100644 index d89f5d10b..000000000 --- a/ietf/secr/templates/drafts/message_update.txt +++ /dev/null @@ -1,8 +0,0 @@ -As you requested, {{ doc }} an updated -version of an expired Internet-Draft, has been posted. The draft will expire -on {{ expire_date }} unless it is replaced by an updated version, or the -Secretariat has been notified that the document is under official review by the -IESG or has been passed to the IRSG or RFC Editor for review and/or publication -as an RFC. - -IETF Secretariat. diff --git a/ietf/secr/templates/drafts/revision.html b/ietf/secr/templates/drafts/revision.html deleted file mode 100644 index d24547dcb..000000000 --- a/ietf/secr/templates/drafts/revision.html +++ /dev/null @@ -1,32 +0,0 @@ -{% extends "base_site.html" %} -{% load staticfiles %} - -{% block title %}Drafts - Revision{% endblock %} - -{% block extrahead %}{{ block.super }} - -{% endblock %} - -{% block breadcrumbs %}{{ block.super }} - » Drafts - » {{ draft.name }} - » Revision -{% endblock %} - -{% block content %} - -
-

Draft - Revision Data

-
{% csrf_token %} - - {{ form.as_table }} -
- - {% include "includes/draft_upload_form.html" %} - - {% include "includes/buttons_save_cancel.html" %} - -
-
- -{% endblock %} diff --git a/ietf/secr/templates/drafts/search.html b/ietf/secr/templates/drafts/search.html index 35fa810a1..5d4298ad9 100644 --- a/ietf/secr/templates/drafts/search.html +++ b/ietf/secr/templates/drafts/search.html @@ -14,7 +14,7 @@ {% block content %}
-

Draft - Search Add

+

Draft - Search

{% csrf_token %} {{ form.as_table }} diff --git a/ietf/secr/templates/drafts/view.html b/ietf/secr/templates/drafts/view.html index 4a3782b51..9e4517bb6 100644 --- a/ietf/secr/templates/drafts/view.html +++ b/ietf/secr/templates/drafts/view.html @@ -80,8 +80,6 @@
- - {{ upload_form.non_field_errors }} - - - - -
{{ upload_form.txt.errors }}{{ upload_form.txt }}
{{ upload_form.xml.errors }}{{ upload_form.xml }}
{{ upload_form.pdf.errors }}{{ upload_form.pdf }}
{{ upload_form.ps.errors }}{{ upload_form.ps }}
-