Restrict the ability to change whether a group uses milestone dates to the ADs and the secretariat. Fixes #2869. Commit ready for merge.
- Legacy-Id: 17234
This commit is contained in:
parent
f0f522322a
commit
b4ac9f83f1
|
@ -6,6 +6,7 @@ import calendar
|
|||
|
||||
from django import forms
|
||||
from django.contrib import messages
|
||||
from django.core.exceptions import PermissionDenied
|
||||
from django.http import HttpResponseForbidden, HttpResponseBadRequest, HttpResponseRedirect, Http404
|
||||
from django.shortcuts import render, redirect
|
||||
from django.contrib.auth.decorators import login_required
|
||||
|
@ -107,8 +108,10 @@ def edit_milestones(request, acronym, group_type=None, milestone_set="current"):
|
|||
|
||||
needs_review = False
|
||||
if can_manage_group(request.user, group):
|
||||
can_change_uses_milestone_dates = True
|
||||
if not can_manage_group_type(request.user, group):
|
||||
# The user is chair or similar, not AD:
|
||||
can_change_uses_milestone_dates = False
|
||||
if milestone_set == "current":
|
||||
needs_review = True
|
||||
else:
|
||||
|
@ -299,17 +302,20 @@ def edit_milestones(request, acronym, group_type=None, milestone_set="current"):
|
|||
action = request.POST.get("action", "review")
|
||||
|
||||
if action == "switch":
|
||||
if group.uses_milestone_dates:
|
||||
group.uses_milestone_dates=False
|
||||
group.save()
|
||||
for order, milestone in enumerate(group.groupmilestone_set.filter(state_id='active').order_by('due','id')):
|
||||
milestone.order = order
|
||||
milestone.save()
|
||||
if can_change_uses_milestone_dates:
|
||||
if group.uses_milestone_dates:
|
||||
group.uses_milestone_dates=False
|
||||
group.save()
|
||||
for order, milestone in enumerate(group.groupmilestone_set.filter(state_id='active').order_by('due','id')):
|
||||
milestone.order = order
|
||||
milestone.save()
|
||||
else:
|
||||
group.uses_milestone_dates=True
|
||||
group.save()
|
||||
for m in milestones:
|
||||
forms.append(MilestoneForm(needs_review, reviewer, instance=m, uses_dates=group.uses_milestone_dates))
|
||||
else:
|
||||
group.uses_milestone_dates=True
|
||||
group.save()
|
||||
for m in milestones:
|
||||
forms.append(MilestoneForm(needs_review, reviewer, instance=m, uses_dates=group.uses_milestone_dates))
|
||||
raise PermissionDenied
|
||||
else:
|
||||
# parse out individual milestone forms
|
||||
for prefix in request.POST.getlist("prefix"):
|
||||
|
@ -383,7 +389,8 @@ def edit_milestones(request, acronym, group_type=None, milestone_set="current"):
|
|||
milestone_set=milestone_set,
|
||||
needs_review=needs_review,
|
||||
reviewer=reviewer,
|
||||
can_reset=can_reset))
|
||||
can_reset=can_reset,
|
||||
can_change_uses_milestone_dates=can_change_uses_milestone_dates))
|
||||
|
||||
@login_required
|
||||
def reset_charter_milestones(request, group_type, acronym):
|
||||
|
|
|
@ -1063,7 +1063,9 @@ class MilestoneTests(TestCase):
|
|||
|
||||
class DatelessMilestoneTests(TestCase):
|
||||
def test_switch_to_dateless(self):
|
||||
ms = DatedGroupMilestoneFactory()
|
||||
ad_role = RoleFactory(group__type_id='area',name_id='ad')
|
||||
ms = DatedGroupMilestoneFactory(group__parent=ad_role.group)
|
||||
ad = ad_role.person
|
||||
chair = RoleFactory(group=ms.group,name_id='chair').person
|
||||
|
||||
url = urlreverse('ietf.group.milestones.edit_milestones;current', kwargs=dict(acronym=ms.group.acronym))
|
||||
|
@ -1072,6 +1074,18 @@ class DatelessMilestoneTests(TestCase):
|
|||
r = self.client.get(url)
|
||||
self.assertEqual(r.status_code, 200)
|
||||
q = PyQuery(r.content)
|
||||
self.assertEqual(len(q('#switch-date-use-form')),0)
|
||||
|
||||
r = self.client.post(url, dict(action="switch"))
|
||||
self.assertEqual(r.status_code, 403)
|
||||
|
||||
self.client.logout()
|
||||
self.client.login(username=ad.user.username, password='%s+password' % ad.user.username)
|
||||
|
||||
r = self.client.get(url)
|
||||
self.assertEqual(r.status_code, 200)
|
||||
q = PyQuery(r.content)
|
||||
self.assertEqual(len(q('#switch-date-use-form')),1)
|
||||
self.assertEqual(len(q('#uses_milestone_dates')),1)
|
||||
|
||||
r = self.client.post(url, dict(action="switch"))
|
||||
|
@ -1085,11 +1099,12 @@ class DatelessMilestoneTests(TestCase):
|
|||
self.assertEqual(len(q('#uses_milestone_dates')),0)
|
||||
|
||||
def test_switch_to_dated(self):
|
||||
ms = DatelessGroupMilestoneFactory()
|
||||
chair = RoleFactory(group=ms.group,name_id='chair').person
|
||||
ad_role = RoleFactory(group__type_id='area',name_id='ad')
|
||||
ms = DatelessGroupMilestoneFactory(group__parent=ad_role.group)
|
||||
ad = ad_role.person
|
||||
|
||||
url = urlreverse('ietf.group.milestones.edit_milestones;current', kwargs=dict(acronym=ms.group.acronym))
|
||||
login_testing_unauthorized(self, chair.user.username, url)
|
||||
login_testing_unauthorized(self, ad.user.username, url)
|
||||
|
||||
r = self.client.get(url)
|
||||
self.assertEqual(r.status_code, 200)
|
||||
|
|
|
@ -3,6 +3,7 @@ $(document).ready(function () {
|
|||
var milestonesForm = $('#milestones-form');
|
||||
var group_uses_milestone_dates = ( $('#uses_milestone_dates').length > 0 );
|
||||
var milestone_order_has_changed = false;
|
||||
var switch_date_use_form = $("#switch-date-use-form")
|
||||
|
||||
// make sure we got the lowest number for idCounter
|
||||
milestonesForm.find('.edit-milestone input[name$="-id"]').each(function () {
|
||||
|
@ -14,7 +15,9 @@ $(document).ready(function () {
|
|||
function setChanged() {
|
||||
$(this).closest(".edit-milestone").addClass("changed");
|
||||
setSubmitButtonState();
|
||||
$("#switch-date-use-form").hide();
|
||||
if (switch_date_use_form) {
|
||||
switch_date_use_form.hide();
|
||||
}
|
||||
}
|
||||
|
||||
milestonesForm.on("change", '.edit-milestone select,.edit-milestone input,.edit-milestone textarea', setChanged);
|
||||
|
@ -166,7 +169,9 @@ $(document).ready(function () {
|
|||
milestone_order_has_changed = true;
|
||||
setSubmitButtonState();
|
||||
setOrderControlValue();
|
||||
$("#switch-date-use-form").hide();
|
||||
if (switch_date_use_form) {
|
||||
switch_date_use_form.hide();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -26,13 +26,15 @@
|
|||
</p>
|
||||
|
||||
<div class="container-fluid">
|
||||
<div class="col-sm-12">
|
||||
<form method="post" id="switch-date-use-form">{% csrf_token %}
|
||||
<button class="btn btn-default" type="submit" name="action" value="switch"{% if milestone_set == 'charter' %} style="display:none;"{% endif %}>
|
||||
{% if group.uses_milestone_dates %}Stop{% else %}Start{% endif %} using milestone dates
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
{% if can_change_uses_milestone_dates %}
|
||||
<div class="col-sm-12">
|
||||
<form method="post" id="switch-date-use-form">{% csrf_token %}
|
||||
<button class="btn btn-default" type="submit" name="action" value="switch"{% if milestone_set == 'charter' %} style="display:none;"{% endif %}>
|
||||
{% if group.uses_milestone_dates %}Stop{% else %}Start{% endif %} using milestone dates
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
|
||||
<div class="col-sm-12">
|
||||
|
|
Loading…
Reference in a new issue