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:
parent
999cd502e2
commit
abb69338e2
|
@ -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):
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
Loading…
Reference in a new issue