Added a warning message for the user if ballot creation failed due to an already open ballot. This is a bad state, and should prevented by stricter checks before changing state, but is better than the current situation until we decide exactly which checks to implement.

- Legacy-Id: 14382
This commit is contained in:
Henrik Levkowetz 2017-11-30 16:10:38 +00:00
parent 999cd502e2
commit abb69338e2
5 changed files with 30 additions and 14 deletions

View file

@ -8,6 +8,7 @@ import json
from collections import defaultdict
from django.conf import settings
from django.contrib import messages
from django.forms import ValidationError
from django.utils.html import escape
from django.urls import reverse as urlreverse
@ -174,15 +175,21 @@ def needed_ballot_positions(doc, active_positions):
return " ".join(answer)
def create_ballot_if_not_open(doc, by, ballot_slug, time=None):
def create_ballot_if_not_open(request, doc, by, ballot_slug, time=None):
ballot_type = BallotType.objects.get(doc_type=doc.type, slug=ballot_slug)
if not doc.ballot_open(ballot_slug):
if time:
e = BallotDocEvent(type="created_ballot", by=by, doc=doc, rev=doc.rev, time=time)
else:
e = BallotDocEvent(type="created_ballot", by=by, doc=doc, rev=doc.rev)
e.ballot_type = BallotType.objects.get(doc_type=doc.type, slug=ballot_slug)
e.ballot_type = ballot_type
e.desc = u'Created "%s" ballot' % e.ballot_type.name
e.save()
return e
else:
if request:
messages.warning(request, "There already exists an open '%s' ballot for %s. No new ballot created." % (ballot_type, doc.name))
return None
def close_ballot(doc, by, ballot_slug):
if doc.ballot_open(ballot_slug):

View file

@ -23,12 +23,13 @@ from ietf.doc.mails import ( email_ballot_deferred, email_ballot_undeferred,
from ietf.doc.lastcall import request_last_call
from ietf.iesg.models import TelechatDate
from ietf.ietfauth.utils import has_role, role_required, is_authorized_in_doc_stream
from ietf.mailtrigger.utils import gather_address_lists
from ietf.mailtrigger.forms import CcSelectForm
from ietf.message.utils import infer_message
from ietf.name.models import BallotPositionName
from ietf.person.models import Person
from ietf.utils import log
from ietf.utils.mail import send_mail_text, send_mail_preformatted
from ietf.mailtrigger.utils import gather_address_lists
from ietf.mailtrigger.forms import CcSelectForm
BALLOT_CHOICES = (("yes", "Yes"),
("noobj", "No Objection"),
@ -233,7 +234,6 @@ def edit_position(request, name, ballot_id):
blocking_positions=json.dumps(blocking_positions),
))
@role_required('Area Director','Secretariat')
def send_ballot_comment(request, name, ballot_id):
"""Email document ballot position discuss/comment for Area Director."""
@ -329,7 +329,7 @@ def clear_ballot(request, name):
by = request.user.person
for t in BallotType.objects.filter(doc_type=doc.type_id):
close_ballot(doc, by, t.slug)
create_ballot_if_not_open(doc, by, t.slug)
create_ballot_if_not_open(request, doc, by, t.slug)
if doc.get_state('draft-iesg').slug == 'defer':
do_undefer_ballot(request,doc)
return redirect("ietf.doc.views_doc.document_main", name=doc.name)
@ -533,9 +533,9 @@ def ballot_writeupnotes(request, name):
existing.save()
if "issue_ballot" in request.POST:
create_ballot_if_not_open(doc, login, "approve")
e = create_ballot_if_not_open(request, doc, login, "approve") # pyflakes:ignore
ballot = doc.latest_event(BallotDocEvent, type="created_ballot")
log.assertion('ballot == e')
if has_role(request.user, "Area Director") and not doc.latest_event(BallotPositionDocEvent, ad=login, ballot=ballot):
# sending the ballot counts as a yes
pos = BallotPositionDocEvent(doc=doc, rev=doc.rev, by=login)

View file

@ -152,16 +152,16 @@ def change_state(request, name, option=None):
if charter_state.slug == "intrev" and group.type_id == "wg":
if request.POST.get("ballot_wo_extern"):
create_ballot_if_not_open(charter, by, "r-wo-ext")
create_ballot_if_not_open(request, charter, by, "r-wo-ext")
else:
create_ballot_if_not_open(charter, by, "r-extrev")
create_ballot_if_not_open(request, charter, by, "r-extrev")
(e1, e2) = default_review_text(group, charter, by)
e1.save()
e2.save()
e = default_action_text(group, charter, by)
e.save()
elif charter_state.slug in ["extrev","iesgrev"]:
create_ballot_if_not_open(charter, by, "approve")
create_ballot_if_not_open(request, charter, by, "approve")
elif charter_state.slug == "approved":
change_group_state_after_charter_approval(group, by)
fix_charter_revision_after_approval(charter, by)

View file

@ -7,6 +7,8 @@ from django.urls import reverse
from django.template.loader import render_to_string
from django.conf import settings
import debug # pyflakes:ignore
from ietf.doc.models import ( BallotDocEvent, BallotPositionDocEvent, DocAlias, DocEvent,
Document, NewRevisionDocEvent, State )
from ietf.doc.utils import ( add_state_change_event, close_open_ballots,
@ -17,6 +19,7 @@ from ietf.group.models import Role, Group
from ietf.iesg.models import TelechatDate
from ietf.ietfauth.utils import has_role, role_required, is_authorized_in_doc_stream
from ietf.person.models import Person
from ietf.utils import log
from ietf.utils.mail import send_mail_preformatted
from ietf.utils.textupload import get_cleaned_text_file_content
from ietf.mailtrigger.utils import gather_address_lists
@ -55,8 +58,9 @@ def change_state(request, name, option=None):
review.save_with_history(events)
if new_state.slug == "iesgeval":
create_ballot_if_not_open(review, login, "conflrev")
e = create_ballot_if_not_open(request, review, login, "conflrev") # pyflakes:ignore
ballot = review.latest_event(BallotDocEvent, type="created_ballot")
log.assertion('ballot == e')
if has_role(request.user, "Area Director") and not review.latest_event(BallotPositionDocEvent, ad=login, ballot=ballot, type="changed_ballot_position"):
# The AD putting a conflict review into iesgeval who doesn't already have a position is saying "yes"

View file

@ -7,6 +7,8 @@ from django.urls import reverse
from django.template.loader import render_to_string
from django.conf import settings
import debug # pyflakes:ignore
from ietf.doc.models import ( Document, DocAlias, State, DocEvent, BallotDocEvent,
BallotPositionDocEvent, NewRevisionDocEvent, WriteupDocEvent, STATUSCHANGE_RELATIONS )
from ietf.doc.forms import AdForm
@ -16,11 +18,13 @@ from ietf.doc.views_ballot import LastCallTextForm
from ietf.group.models import Group
from ietf.iesg.models import TelechatDate
from ietf.ietfauth.utils import has_role, role_required
from ietf.mailtrigger.utils import gather_address_lists
from ietf.name.models import DocRelationshipName, StdLevelName
from ietf.person.models import Person
from ietf.utils import log
from ietf.utils.mail import send_mail_preformatted
from ietf.utils.textupload import get_cleaned_text_file_content
from ietf.mailtrigger.utils import gather_address_lists
class ChangeStateForm(forms.Form):
new_state = forms.ModelChoiceField(State.objects.filter(type="statchg", used=True), label="Status Change Evaluation State", empty_label=None, required=True)
@ -55,8 +59,9 @@ def change_state(request, name, option=None):
status_change.save_with_history(events)
if new_state.slug == "iesgeval":
create_ballot_if_not_open(status_change, login, "statchg", status_change.time)
e = create_ballot_if_not_open(request, status_change, login, "statchg", status_change.time) # pyflakes:ignore
ballot = status_change.latest_event(BallotDocEvent, type="created_ballot")
log.assertion('ballot == e')
if has_role(request.user, "Area Director") and not status_change.latest_event(BallotPositionDocEvent, ad=login, ballot=ballot, type="changed_ballot_position"):
# The AD putting a status change into iesgeval who doesn't already have a position is saying "yes"