Skip to content

Commit 2070bbf

Browse files
committed
Merged in [13722] and [13712] from rcross@amsl.com:
Remove all use of request.session from secretariat apps. Add tests for affected views. Fixes ietf-tools#1455. - Legacy-Id: 13724 Note: SVN reference [13712] has been migrated to Git commit 915b445 Note: SVN reference [13722] has been migrated to Git commit 3a2cb9d
1 parent 3b7f320 commit 2070bbf

24 files changed

Lines changed: 572 additions & 328 deletions

File tree

ietf/secr/announcement/forms.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,10 @@ class Meta:
138138
fields = ('nomcom', 'to','to_custom','frm','cc','bcc','reply_to','subject','body')
139139

140140
def __init__(self, *args, **kwargs):
141+
if 'hidden' in kwargs:
142+
self.hidden = kwargs.pop('hidden')
143+
else:
144+
self.hidden = False
141145
user = kwargs.pop('user')
142146
person = user.person
143147
super(AnnounceForm, self).__init__(*args, **kwargs)
@@ -154,6 +158,10 @@ def __init__(self, *args, **kwargs):
154158
if not nomcom_roles and not secr_roles:
155159
self.fields['nomcom'].widget = forms.HiddenInput()
156160
self.initial['reply_to'] = 'ietf@ietf.org'
161+
162+
if self.hidden:
163+
for key in self.fields.keys():
164+
self.fields[key].widget = forms.HiddenInput()
157165

158166
def clean(self):
159167
super(AnnounceForm, self).clean()

ietf/secr/announcement/tests.py

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,12 @@
44
from pyquery import PyQuery
55

66
from ietf.utils.test_utils import TestCase
7+
from ietf.group.models import Group
8+
from ietf.message.models import Message
9+
from ietf.nomcom.test_data import nomcom_test_data
710
from ietf.person.models import Person
811
from ietf.utils.test_data import make_test_data
9-
12+
from ietf.utils.mail import outbox, empty_outbox
1013

1114
SECR_USER='secretary'
1215
WG_USER=''
@@ -41,7 +44,6 @@ def test_invalid_submit(self):
4144
make_test_data()
4245
url = reverse('ietf.secr.announcement.views.main')
4346
post_data = {'id_subject':''}
44-
#self.client.login(username='rcross', password='rcross+password")
4547
self.client.login(username="secretary", password="secretary+password")
4648
r = self.client.post(url,post_data)
4749
self.assertEqual(r.status_code, 200)
@@ -51,17 +53,26 @@ def test_invalid_submit(self):
5153
def test_valid_submit(self):
5254
"Valid Submit"
5355
make_test_data()
54-
#ietf.utils.mail.test_mode = True
56+
nomcom_test_data()
57+
empty_outbox()
5558
url = reverse('ietf.secr.announcement.views.main')
56-
redirect = reverse('ietf.secr.announcement.views.confirm')
57-
post_data = {'to':'Other...',
59+
confirm_url = reverse('ietf.secr.announcement.views.confirm')
60+
nomcom = Group.objects.get(type='nomcom')
61+
post_data = {'nomcom': nomcom.pk,
62+
'to':'Other...',
5863
'to_custom':'rcross@amsl.com',
5964
'frm':'IETF Secretariat <ietf-secretariat@ietf.org>',
6065
'subject':'Test Subject',
6166
'body':'This is a test.'}
6267
self.client.login(username="secretary", password="secretary+password")
63-
r = self.client.post(url,post_data,follow=True)
64-
self.assertRedirects(r, redirect)
65-
# good enough if we get to confirm page
66-
#self.assertEqual(len(outbox), 1)
67-
#self.assertTrue(len(outbox) > mailbox_before)
68+
response = self.client.post(url,post_data)
69+
self.assertEqual(response.status_code, 200)
70+
self.assertTrue('Confirm Announcement' in response.content)
71+
response = self.client.post(confirm_url,post_data,follow=True)
72+
self.assertRedirects(response, url)
73+
self.assertEqual(len(outbox),1)
74+
self.assertEqual(outbox[0]['subject'],'Test Subject')
75+
self.assertEqual(outbox[0]['to'],'<rcross@amsl.com>')
76+
message = Message.objects.last()
77+
self.assertEqual(message.subject,'Test Subject')
78+
self.assertTrue(nomcom in message.related_groups.all())

ietf/secr/announcement/views.py

Lines changed: 33 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from ietf.group.models import Role
77
from ietf.ietfauth.utils import has_role
88
from ietf.secr.announcement.forms import AnnounceForm
9-
from ietf.secr.utils.decorators import check_for_cancel, clear_non_auth
9+
from ietf.secr.utils.decorators import check_for_cancel
1010
from ietf.utils.mail import send_mail_text
1111

1212
# -------------------------------------------------
@@ -59,51 +59,45 @@ def main(request):
5959
form = AnnounceForm(request.POST or None,user=request.user)
6060

6161
if form.is_valid():
62-
# nomcom is a ModelChoice, store pk, not Group object
63-
data = form.cleaned_data
64-
if data['nomcom']:
65-
data['nomcom'] = data['nomcom'].pk
66-
request.session['data'] = data
62+
# recast as hidden form for next page of process
63+
form = AnnounceForm(request.POST, user=request.user, hidden=True)
64+
if form.data['to'] == 'Other...':
65+
to = form.data['to_custom']
66+
else:
67+
to = form.data['to']
6768

68-
return redirect('ietf.secr.announcement.views.confirm')
69+
return render(request, 'announcement/confirm.html', {
70+
'message': form.data,
71+
'to': to,
72+
'form': form},
73+
)
6974

7075
return render(request, 'announcement/main.html', { 'form': form} )
7176

7277
@login_required
7378
@check_for_cancel('../')
7479
def confirm(request):
7580

76-
if request.session.get('data',None):
77-
data = request.session['data']
78-
else:
79-
messages.error(request, 'No session data. Your session may have expired or cookies are disallowed.')
80-
return redirect('ietf.secr.announcement.views.main')
81+
if not check_access(request.user):
82+
return HttpResponseForbidden('Restricted to: Secretariat, IAD, or chair of IETF, IAB, RSOC, RSE, IAOC, ISOC, NomCom.')
8183

8284
if request.method == 'POST':
83-
form = AnnounceForm(data, user=request.user)
84-
message = form.save(user=request.user,commit=True)
85-
extra = {'Reply-To':message.reply_to}
86-
send_mail_text(None,
87-
message.to,
88-
message.frm,
89-
message.subject,
90-
message.body,
91-
cc=message.cc,
92-
bcc=message.bcc,
93-
extra=extra)
94-
95-
# clear session
96-
clear_non_auth(request.session)
97-
98-
messages.success(request, 'The announcement was sent.')
99-
return redirect('ietf.secr.announcement.views.main')
100-
101-
if data['to'] == 'Other...':
102-
to = ','.join(data['to_custom'])
103-
else:
104-
to = data['to']
105-
106-
return render(request, 'announcement/confirm.html', {
107-
'message': data,
108-
'to': to},
109-
)
85+
form = AnnounceForm(request.POST, user=request.user)
86+
if request.method == 'POST':
87+
message = form.save(user=request.user,commit=True)
88+
extra = {'Reply-To':message.reply_to}
89+
send_mail_text(None,
90+
message.to,
91+
message.frm,
92+
message.subject,
93+
message.body,
94+
cc=message.cc,
95+
bcc=message.bcc,
96+
extra=extra)
97+
98+
messages.success(request, 'The announcement was sent.')
99+
return redirect('ietf.secr.announcement.views.main')
100+
101+
102+
103+

ietf/secr/drafts/email.py

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ def get_fullcc_list(draft):
170170

171171
return ','.join(result_list)
172172

173-
def get_email_initial(draft, type=None, input=None):
173+
def get_email_initial(draft, action=None, input=None):
174174
"""
175175
Takes a draft object, a string representing the email type:
176176
(extend,new,replace,resurrect,revision,update,withdraw) and
@@ -182,20 +182,22 @@ def get_email_initial(draft, type=None, input=None):
182182
It appears datatracker abbreviates the list with "et al". Datatracker scheduled_announcement
183183
entries have "Action" in subject whereas this app uses "ACTION"
184184
"""
185-
# assert False, (draft, type, input)
186185
expiration_date = (datetime.date.today() + datetime.timedelta(185)).strftime('%B %d, %Y')
187186
new_revision = str(int(draft.rev)+1).zfill(2)
188187
new_filename = draft.name + '-' + new_revision + '.txt'
189188
curr_filename = draft.name + '-' + draft.rev + '.txt'
190189
data = {}
191190
data['cc'] = get_fullcc_list(draft)
192191
data['to'] = ''
193-
if type == 'extend':
192+
data['action'] = action
193+
194+
if action == 'extend':
194195
context = {'doc':curr_filename,'expire_date':input['expiration_date']}
195196
data['subject'] = 'Extension of Expiration Date for %s' % (curr_filename)
196197
data['body'] = render_to_string('drafts/message_extend.txt', context)
198+
data['expiration_date'] = input['expiration_date']
197199

198-
elif type == 'new':
200+
elif action == 'new':
199201
# if the ID belongs to a group other than "none" add line to message body
200202
if draft.group.type.slug == 'wg':
201203
wg_message = 'This draft is a work item of the %s Working Group of the IETF.' % draft.group.name
@@ -211,37 +213,43 @@ def get_email_initial(draft, type=None, input=None):
211213
data['subject'] = 'I-D ACTION:%s' % (curr_filename)
212214
data['body'] = render_to_string('drafts/message_new.txt', context)
213215

214-
elif type == 'replace':
216+
elif action == 'replace':
215217
'''
216218
input['replaced'] is a DocAlias
217219
input['replaced_by'] is a Document
218220
'''
219-
context = {'doc':input['replaced'].name,'replaced_by':input['replaced_by'].name}
220-
data['subject'] = 'Replacement of %s with %s' % (input['replaced'].name,input['replaced_by'].name)
221+
context = {'doc':input['replaced'],'replaced_by':input['replaced_by']}
222+
data['subject'] = 'Replacement of %s with %s' % (input['replaced'],input['replaced_by'])
221223
data['body'] = render_to_string('drafts/message_replace.txt', context)
222-
223-
elif type == 'resurrect':
224+
data['replaced'] = input['replaced']
225+
data['replaced_by'] = input['replaced_by']
226+
227+
elif action == 'resurrect':
224228
last_revision = get_last_revision(draft.name)
225229
last_filename = draft.name + '-' + last_revision + '.txt'
226230
context = {'doc':last_filename,'expire_date':expiration_date}
227231
data['subject'] = 'Resurrection of %s' % (last_filename)
228232
data['body'] = render_to_string('drafts/message_resurrect.txt', context)
233+
data['action'] = action
229234

230-
elif type == 'revision':
235+
elif action == 'revision':
231236
context = {'rev':new_revision,'doc':new_filename,'doc_base':new_filename[:-4]}
232237
data['to'] = get_revision_emails(draft)
233238
data['cc'] = ''
234239
data['subject'] = 'New Version Notification - %s' % (new_filename)
235240
data['body'] = render_to_string('drafts/message_revision.txt', context)
236241

237-
elif type == 'update':
242+
elif action == 'update':
238243
context = {'doc':input['filename'],'expire_date':expiration_date}
239244
data['subject'] = 'Posting of %s' % (input['filename'])
240245
data['body'] = render_to_string('drafts/message_update.txt', context)
241-
242-
elif type == 'withdraw':
243-
context = {'doc':curr_filename,'by':input['type']}
246+
data['action'] = action
247+
248+
elif action == 'withdraw':
249+
context = {'doc':curr_filename,'by':input['withdraw_type']}
244250
data['subject'] = 'Withdrawl of %s' % (curr_filename)
245251
data['body'] = render_to_string('drafts/message_withdraw.txt', context)
252+
data['action'] = action
253+
data['withdraw_type'] = input['withdraw_type']
246254

247255
return data

ietf/secr/drafts/forms.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,12 +213,30 @@ def clean(self):
213213

214214
class EmailForm(forms.Form):
215215
# max_lengths come from db limits, cc is not limited
216+
action = forms.CharField(max_length=255, widget=forms.HiddenInput(), required=False)
217+
expiration_date = forms.CharField(max_length=255, widget=forms.HiddenInput(), required=False)
218+
withdraw_type = forms.CharField(max_length=255, widget=forms.HiddenInput(), required=False)
219+
replaced = forms.CharField(max_length=255, widget=forms.HiddenInput(), required=False)
220+
replaced_by = forms.CharField(max_length=255, widget=forms.HiddenInput(), required=False)
221+
filename = forms.CharField(max_length=255, widget=forms.HiddenInput(), required=False)
216222
to = forms.CharField(max_length=255)
217223
cc = forms.CharField(required=False)
218224
subject = forms.CharField(max_length=255)
219225
body = forms.CharField(widget=forms.Textarea(), strip=False)
220226

227+
def __init__(self, *args, **kwargs):
228+
if 'hidden' in kwargs:
229+
self.hidden = kwargs.pop('hidden')
230+
else:
231+
self.hidden = False
232+
super(EmailForm, self).__init__(*args, **kwargs)
233+
234+
if self.hidden:
235+
for key in self.fields.keys():
236+
self.fields[key].widget = forms.HiddenInput()
237+
221238
class ExtendForm(forms.Form):
239+
action = forms.CharField(max_length=255, widget=forms.HiddenInput(),initial='extend')
222240
expiration_date = forms.DateField()
223241

224242
class ReplaceForm(forms.Form):
@@ -369,5 +387,5 @@ def clean(self):
369387
return self.cleaned_data
370388

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

0 commit comments

Comments
 (0)