Skip to content

Commit 7ecf7df

Browse files
committed
Merged in [13615] and [13627]from rcross@amsl.com:
Changed views that use GET requests to delete objects to use POST. Fixes ietf-tools#1796. - Legacy-Id: 13654 Note: SVN reference [13615] has been migrated to Git commit 3ccb550 Note: SVN reference [13627] has been migrated to Git commit b908caf
2 parents 34a2352 + b908caf commit 7ecf7df

11 files changed

Lines changed: 145 additions & 43 deletions

File tree

hold-for-merge

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# -*- conf-mode -*-
22

3+
/personal/rcross/6.54.2.dev0@13632 # resolved differently in [13653]
34
/personal/lars/6.48.2.dev0@13124 # fails drag-and-drop test
45
/branch/proceedings/6.29.1.dev0@11850 # Merged into /branch/proceedings/6.30.1.dev0, will be merged from there
56
/branch/proceedings/6.29.1.dev0@11856 # Merged into /branch/proceedings/6.30.1.dev0, will be merged from there

ietf/secr/drafts/tests_views.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,3 +154,16 @@ def test_view(self):
154154
response = self.client.get(url)
155155
self.assertEqual(response.status_code, 200)
156156

157+
def test_author_delete(self):
158+
draft = make_test_data()
159+
author = draft.documentauthor_set.first()
160+
id = author.id
161+
url = urlreverse('ietf.secr.drafts.views.author_delete', kwargs={'id':draft.name, 'oid':id})
162+
self.client.login(username="secretary", password="secretary+password")
163+
response = self.client.get(url)
164+
self.assertEqual(response.status_code, 200)
165+
redirect_url = urlreverse('ietf.secr.drafts.views.authors', kwargs={'id':draft.name})
166+
response = self.client.post(url, {'post':'yes'})
167+
self.assertRedirects(response, redirect_url)
168+
self.assertFalse(draft.documentauthor_set.filter(id=id))
169+

ietf/secr/drafts/views.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -542,9 +542,14 @@ def author_delete(request, id, oid):
542542
'''
543543
This view deletes the specified author from the draft
544544
'''
545-
DocumentAuthor.objects.get(id=oid).delete()
546-
messages.success(request, 'The author was deleted successfully')
547-
return redirect('ietf.secr.drafts.views.authors', id=id)
545+
author = DocumentAuthor.objects.get(id=oid)
546+
547+
if request.method == 'POST' and request.POST['post'] == 'yes':
548+
author.delete()
549+
messages.success(request, 'The author was deleted successfully')
550+
return redirect('ietf.secr.drafts.views.authors', id=id)
551+
552+
return render(request, 'confirm_delete.html', {'object': author})
548553

549554
@role_required('Secretariat')
550555
def authors(request, id):

ietf/secr/groups/tests.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,12 +140,15 @@ def test_people_delete(self):
140140
make_test_data()
141141
group = Group.objects.filter(acronym='mars')[0]
142142
role = group.role_set.all()[0]
143+
id = role.id
143144
url = reverse('ietf.secr.groups.views.delete_role', kwargs={'acronym':group.acronym,'id':role.id})
144145
target = reverse('ietf.secr.groups.views.people', kwargs={'acronym':group.acronym})
145146
self.client.login(username="secretary", password="secretary+password")
146-
response = self.client.get(url,follow=True)
147+
response = self.client.get(url)
148+
self.assertEqual(response.status_code, 200)
149+
response = self.client.post(url, {'post':'yes'})
147150
self.assertRedirects(response, target)
148-
self.assertTrue('deleted successfully' in response.content)
151+
self.assertFalse(group.role_set.filter(id=id))
149152

150153
def test_people_add(self):
151154
make_test_data()

ietf/secr/groups/views.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -190,14 +190,17 @@ def delete_role(request, acronym, id):
190190
"""
191191
group = get_object_or_404(Group, acronym=acronym)
192192
role = get_object_or_404(Role, id=id)
193+
194+
if request.method == 'POST' and request.POST['post'] == 'yes':
195+
# save group
196+
save_group_in_history(group)
193197

194-
# save group
195-
save_group_in_history(group)
198+
role.delete()
199+
messages.success(request, 'The entry was deleted successfully')
200+
return redirect('ietf.secr.groups.views.people', acronym=acronym)
196201

197-
role.delete()
202+
return render(request, 'confirm_delete.html', {'object': role})
198203

199-
messages.success(request, 'The entry was deleted successfully')
200-
return redirect('ietf.secr.groups.views.people', acronym=acronym)
201204

202205
@role_required('Secretariat')
203206
def edit(request, acronym):

ietf/secr/meetings/tests.py

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -236,13 +236,19 @@ def test_meetings_times_delete(self):
236236
before = qs.count()
237237
expected_deletion_count = qs.filter(time=qs.first().time).count()
238238
url = reverse('ietf.secr.meetings.views.times_delete',kwargs={
239-
'meeting_id':42,
240-
'schedule_name':'test-agenda',
239+
'meeting_id':meeting.number,
240+
'schedule_name':meeting.agenda.name,
241241
'time':qs.first().time.strftime("%Y:%m:%d:%H:%M")
242242
})
243+
redirect_url = reverse('ietf.secr.meetings.views.times',kwargs={
244+
'meeting_id':meeting.number,
245+
'schedule_name':meeting.agenda.name
246+
})
243247
self.client.login(username="secretary", password="secretary+password")
244248
response = self.client.get(url)
245-
self.assertEqual(response.status_code, 302)
249+
self.assertEqual(response.status_code, 200)
250+
response = self.client.post(url, {'post':'yes'})
251+
self.assertRedirects(response, redirect_url)
246252
after = TimeSlot.objects.filter(meeting=meeting,type='session').count()
247253
self.assertEqual(after,before - expected_deletion_count)
248254

@@ -312,6 +318,18 @@ def test_meetings_nonsession_edit(self):
312318
timeslot = session.official_timeslotassignment().timeslot
313319
self.assertEqual(timeslot.time,new_time)
314320

321+
def test_meetings_non_session_delete(self):
322+
meeting = make_meeting_test_data()
323+
slot = meeting.agenda.assignments.filter(timeslot__type='reg').first().timeslot
324+
url = reverse('ietf.secr.meetings.views.non_session_delete', kwargs={'meeting_id':meeting.number,'schedule_name':meeting.agenda.name,'slot_id':slot.id})
325+
target = reverse('ietf.secr.meetings.views.non_session', kwargs={'meeting_id':meeting.number,'schedule_name':meeting.agenda.name})
326+
self.client.login(username="secretary", password="secretary+password")
327+
response = self.client.get(url)
328+
self.assertEqual(response.status_code, 200)
329+
response = self.client.post(url, {'post':'yes'})
330+
self.assertRedirects(response, target)
331+
self.assertFalse(meeting.agenda.assignments.filter(timeslot=slot))
332+
315333
def test_meetings_select_group(self):
316334
make_meeting_test_data()
317335
url = reverse('ietf.secr.meetings.views.select_group',kwargs={'meeting_id':42,'schedule_name':'test-agenda'})
@@ -321,6 +339,17 @@ def test_meetings_select_group(self):
321339
q = PyQuery(response.content)
322340
self.assertEqual(len(q("#id_scheduled_sessions")),1)
323341

342+
def test_meetings_schedule(self):
343+
meeting = make_meeting_test_data()
344+
url = reverse('ietf.secr.meetings.views.schedule',kwargs={
345+
'meeting_id':meeting.number,
346+
'schedule_name':meeting.agenda.name,
347+
'acronym':'mars'
348+
})
349+
self.client.login(username="secretary", password="secretary+password")
350+
response = self.client.get(url)
351+
self.assertEqual(response.status_code, 200)
352+
324353
# ----------------------
325354
# Unit Tests
326355
# -----------------------

ietf/secr/meetings/views.py

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from ietf.meeting.forms import duration_string
1919
from ietf.meeting.helpers import get_meeting, make_materials_directories
2020
from ietf.meeting.models import Meeting, Session, Room, TimeSlot, SchedTimeSessAssignment, Schedule
21+
from ietf.name.models import SessionStatusName
2122
from ietf.group.models import Group, GroupEvent
2223
from ietf.person.models import Person
2324
from ietf.secr.meetings.blue_sheets import create_blue_sheets
@@ -517,26 +518,30 @@ def non_session(request, meeting_id, schedule_name):
517518
@role_required('Secretariat')
518519
def non_session_delete(request, meeting_id, schedule_name, slot_id):
519520
'''
520-
This function deletes the non-session TimeSlot. For "other" and "plenary" timeslot
521-
types we need to delete the corresponding Session object as well. Check for uploaded
521+
This function deletes the non-session TimeSlot. Check for uploaded
522522
material first. SchedTimeSessAssignment objects get deleted as well.
523523
'''
524-
meeting = get_object_or_404(Meeting, number=meeting_id)
525-
# schedule = get_object_or_404(Schedule, meeting=meeting, name=schedule_name)
526524
slot = get_object_or_404(TimeSlot, id=slot_id)
527-
if slot.type_id in ('other','plenary','lead'):
528-
assignments = slot.sessionassignments.filter(schedule__meeting=meeting)
525+
assert slot.type_id in ('other','plenary','lead', 'reg')
526+
527+
if request.method == 'POST' and request.POST['post'] == 'yes':
528+
assignments = slot.sessionassignments.all()
529529
session_objects = [ x.session for x in assignments ]
530+
530531
for session in session_objects:
531532
if session.materials.exclude(states__slug='deleted'):
532533
messages.error(request, 'Materials have already been uploaded for "%s". You must delete those before deleting the timeslot.' % slot.name)
533534
return redirect('ietf.secr.meetings.views.non_session', meeting_id=meeting_id, schedule_name=schedule_name)
534-
else:
535-
Session.objects.filter(pk__in=[ x.pk for x in session_objects ]).delete()
536-
slot.delete()
535+
536+
# delete high order assignments, then sessions and slots
537+
assignments.delete()
538+
Session.objects.filter(pk__in=[ x.pk for x in session_objects ]).delete()
539+
slot.delete()
540+
541+
messages.success(request, 'The entry was deleted successfully')
542+
return redirect('ietf.secr.meetings.views.non_session', meeting_id=meeting_id, schedule_name=schedule_name)
537543

538-
messages.success(request, 'Non-Session timeslot deleted successfully')
539-
return redirect('ietf.secr.meetings.views.non_session', meeting_id=meeting_id, schedule_name=schedule_name)
544+
return render(request, 'confirm_delete.html', {'object': slot})
540545

541546
@role_required('Secretariat')
542547
def non_session_edit(request, meeting_id, schedule_name, slot_id):
@@ -1004,11 +1009,24 @@ def times_delete(request, meeting_id, schedule_name, time):
10041009

10051010
parts = [ int(x) for x in time.split(':') ]
10061011
dtime = datetime.datetime(*parts)
1007-
1008-
TimeSlot.objects.filter(meeting=meeting,time=dtime).delete()
1009-
1010-
messages.success(request, 'Timeslot deleted')
1011-
return redirect('ietf.secr.meetings.views.times', meeting_id=meeting_id,schedule_name=schedule_name)
1012+
status = SessionStatusName.objects.get(slug='schedw')
1013+
1014+
if request.method == 'POST' and request.POST['post'] == 'yes':
1015+
for slot in TimeSlot.objects.filter(meeting=meeting,time=dtime):
1016+
for assignment in slot.sessionassignments.all():
1017+
if assignment.session:
1018+
session = assignment.session
1019+
session.status = status
1020+
session.save()
1021+
assignment.delete()
1022+
slot.delete()
1023+
messages.success(request, 'The entry was deleted successfully')
1024+
return redirect('ietf.secr.meetings.views.times', meeting_id=meeting_id,schedule_name=schedule_name)
1025+
1026+
return render(request, 'confirm_delete.html', {
1027+
'object': '%s timeslots' % dtime.strftime("%A %H:%M"),
1028+
'extra': 'Any sessions assigned to this timeslot will be unscheduled'
1029+
})
10121030

10131031
@role_required('Secretariat')
10141032
def unschedule(request, meeting_id, schedule_name, session_id):

ietf/secr/roles/tests.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,16 @@ def test_roles_delete(self):
2828
augment_data()
2929
group = Group.objects.filter(acronym='mars')[0]
3030
role = group.role_set.all()[0]
31+
id = role.id
3132
url = reverse('ietf.secr.roles.views.delete_role', kwargs={'acronym':group.acronym,'id':role.id})
32-
target = reverse('ietf.secr.roles.views.main') + '?group=%s' % group.acronym
33+
target = reverse('ietf.secr.roles.views.main')
3334
self.client.login(username="secretary", password="secretary+password")
34-
response = self.client.get(url,follow=True)
35+
response = self.client.get(url)
36+
self.assertEqual(response.status_code, 200)
37+
response = self.client.post(url, {'post':'yes'})
3538
self.assertRedirects(response, target)
36-
self.assertTrue('deleted successfully' in response.content)
37-
39+
self.assertFalse(group.role_set.filter(id=id))
40+
3841
def test_roles_add(self):
3942
make_test_data()
4043
augment_data()

ietf/secr/roles/views.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from django.contrib import messages
22
from django.urls import reverse
33
from django.http import HttpResponseRedirect
4-
from django.shortcuts import render, get_object_or_404
4+
from django.shortcuts import render, get_object_or_404, redirect
55

66
from ietf.group.models import Group, Role
77
from ietf.group.utils import save_group_in_history
@@ -53,14 +53,15 @@ def delete_role(request, acronym, id):
5353
role = get_object_or_404(Role, id=id)
5454
group = get_object_or_404(Group, acronym=acronym)
5555

56-
# save group
57-
save_group_in_history(role.group)
58-
59-
role.delete()
60-
61-
messages.success(request, 'The entry was deleted successfully')
62-
url = reverse('ietf.secr.roles.views.main') + '?group=%s' % group.acronym
63-
return HttpResponseRedirect(url)
56+
if request.method == 'POST' and request.POST['post'] == 'yes':
57+
# save group
58+
save_group_in_history(group)
59+
60+
role.delete()
61+
messages.success(request, 'The entry was deleted successfully')
62+
return redirect('ietf.secr.roles.views.main')
63+
64+
return render(request, 'confirm_delete.html', {'object': role})
6465

6566
@role_required('Secretariat')
6667
def main(request):
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
{% extends "base_site.html" %}
2+
{% load staticfiles %}
3+
4+
{% block title %}Confirm Delete{% endblock %}
5+
6+
7+
{% block content %}
8+
9+
<div class="module draft-container">
10+
<h2>Confirm Delete</h2>
11+
<h3>Are you sure?</h3>
12+
<p>You are about to delete: {{ object }}</p>
13+
{% if extra %}<p>{{ extra }}</p>{% endif %}
14+
15+
<form action="" method="post">{% csrf_token %}
16+
<div>
17+
<p>
18+
<input type="hidden" name="post" value="yes">
19+
<input type="submit" value="Yes, I'm sure">
20+
<a href="#" onclick="history.go(-1);return false;" class="button cancel-link">Take me back</a>
21+
</p>
22+
</div>
23+
</form>
24+
</div> <!-- module -->
25+
26+
{% endblock %}

0 commit comments

Comments
 (0)