Added an send_email field to BallotPostitionDocEvent to reflect whether the 'Send email' button was used to save the ballot position. Reverted a different earlier schema change which had the same purpose. Added icons on documents' IESG evaluation record to reflect this.

- Legacy-Id: 15526
This commit is contained in:
Henrik Levkowetz 2018-10-07 15:08:17 +00:00
parent 232774a5cc
commit 22a2e29db8
8 changed files with 59 additions and 57 deletions

View file

@ -7,7 +7,6 @@ from models import (StateType, State, RelatedDocument, DocumentAuthor, Document,
DocHistoryAuthor, DocHistory, DocAlias, DocReminder, DocEvent, NewRevisionDocEvent,
StateDocEvent, ConsensusDocEvent, BallotType, BallotDocEvent, WriteupDocEvent, LastCallDocEvent,
TelechatDocEvent, BallotPositionDocEvent, ReviewRequestDocEvent, InitialReviewDocEvent,
BallotCommentDocEvent,
AddedMessageEvent, SubmissionDocEvent, DeletedEvent, EditedAuthorsDocEvent, DocumentURL)
@ -196,7 +195,6 @@ admin.site.register(NewRevisionDocEvent, DocEventAdmin)
admin.site.register(StateDocEvent, DocEventAdmin)
admin.site.register(ConsensusDocEvent, DocEventAdmin)
admin.site.register(BallotDocEvent, DocEventAdmin)
admin.site.register(BallotCommentDocEvent, DocEventAdmin)
admin.site.register(WriteupDocEvent, DocEventAdmin)
admin.site.register(LastCallDocEvent, DocEventAdmin)
admin.site.register(TelechatDocEvent, DocEventAdmin)

View file

@ -1,24 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.15 on 2018-09-30 09:04
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('doc', '0005_fix_replaced_iab_irtf_stream_docs'),
]
operations = [
migrations.CreateModel(
name='BallotCommentDocEvent',
fields=[
('docevent_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='doc.DocEvent')),
('send_email', models.BooleanField(default=False)),
],
bases=('doc.docevent',),
),
]

View file

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.15 on 2018-10-03 06:39
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('doc', '0005_fix_replaced_iab_irtf_stream_docs'),
]
operations = [
migrations.AddField(
model_name='ballotpositiondocevent',
name='send_email',
field=models.NullBooleanField(default=None),
),
]

View file

@ -1103,6 +1103,15 @@ class BallotDocEvent(DocEvent):
positions.sort(key=lambda p: (p.old_ad, p.ad.last_name()))
return positions
@memoize
def any_email_sent(self):
# When the send_email field is introduced, old positions will have it
# set to None. We sill essentially return True, False, or don't know:
sent_list = BallotPositionDocEvent.objects.filter(ballot=self, send_email=True).values_list('send_email', flat=True)
false = any( s==False for s in sent_list )
true = any( s==True for s in sent_list )
return True if true else False if false else None
class BallotPositionDocEvent(DocEvent):
ballot = ForeignKey(BallotDocEvent, null=True, default=None) # default=None is a temporary migration period fix, should be removed when charter branch is live
ad = ForeignKey(Person)
@ -1111,9 +1120,7 @@ class BallotPositionDocEvent(DocEvent):
discuss_time = models.DateTimeField(help_text="Time discuss text was written", blank=True, null=True)
comment = models.TextField(help_text="Optional comment", blank=True)
comment_time = models.DateTimeField(help_text="Time optional comment was written", blank=True, null=True)
class BallotCommentDocEvent(DocEvent):
send_email = models.BooleanField(default=False)
send_email = models.NullBooleanField(default=None)
class WriteupDocEvent(DocEvent):
text = models.TextField(blank=True)

View file

@ -12,7 +12,7 @@ from ietf.doc.models import (BallotType, DeletedEvent, StateType, State, Documen
TelechatDocEvent, DocReminder, LastCallDocEvent, NewRevisionDocEvent, WriteupDocEvent,
InitialReviewDocEvent, DocHistoryAuthor, BallotDocEvent, RelatedDocument,
RelatedDocHistory, BallotPositionDocEvent, AddedMessageEvent, SubmissionDocEvent,
ReviewRequestDocEvent, EditedAuthorsDocEvent, BallotCommentDocEvent, DocumentURL)
ReviewRequestDocEvent, EditedAuthorsDocEvent, DocumentURL)
from ietf.name.resources import BallotPositionNameResource, DocTypeNameResource
class BallotTypeResource(ModelResource):
@ -650,25 +650,3 @@ class DocumentURLResource(ModelResource):
api.doc.register(DocumentURLResource())
from ietf.person.resources import PersonResource
class BallotCommentDocEventResource(ModelResource):
by = ToOneField(PersonResource, 'by')
doc = ToOneField(DocumentResource, 'doc')
docevent_ptr = ToOneField(DocEventResource, 'docevent_ptr')
class Meta:
queryset = BallotCommentDocEvent.objects.all()
serializer = api.Serializer()
cache = SimpleCache()
#resource_name = 'ballotcommentdocevent'
filtering = {
"id": ALL,
"time": ALL,
"type": ALL,
"rev": ALL,
"desc": ALL,
"send_email": ALL,
"by": ALL_WITH_RELATIONS,
"doc": ALL_WITH_RELATIONS,
"docevent_ptr": ALL_WITH_RELATIONS,
}
api.doc.register(BallotCommentDocEventResource())

View file

@ -16,7 +16,7 @@ from django.views.decorators.csrf import csrf_exempt
import debug # pyflakes:ignore
from ietf.doc.models import ( Document, State, DocEvent, BallotDocEvent, BallotPositionDocEvent,
BallotCommentDocEvent, LastCallDocEvent, WriteupDocEvent, IESG_SUBSTATE_TAGS )
LastCallDocEvent, WriteupDocEvent, IESG_SUBSTATE_TAGS )
from ietf.doc.utils import ( add_state_change_event, close_ballot, close_open_ballots,
create_ballot_if_not_open, update_telechat )
from ietf.doc.mails import ( email_ballot_deferred, email_ballot_undeferred,
@ -127,6 +127,7 @@ def save_position(form, doc, ballot, ad, login=None, send_email=False):
pos.comment = clean["comment"].rstrip()
pos.comment_time = old_pos.comment_time if old_pos else None
pos.discuss = clean["discuss"].rstrip()
pos.send_email = send_email
if not pos.pos.blocking:
pos.discuss = ""
pos.discuss_time = old_pos.discuss_time if old_pos else None
@ -141,7 +142,7 @@ def save_position(form, doc, ballot, ad, login=None, send_email=False):
changes.append("comment")
if pos.comment:
e = BallotCommentDocEvent(doc=doc, rev=doc.rev, by=ad, send_email=send_email)
e = DocEvent(doc=doc, rev=doc.rev, by=ad)
e.type = "added_comment"
e.desc = "[Ballot comment]\n" + pos.comment
@ -153,7 +154,7 @@ def save_position(form, doc, ballot, ad, login=None, send_email=False):
changes.append("discuss")
if pos.pos.blocking:
e = BallotCommentDocEvent(doc=doc, rev=doc.rev, by=ad, send_email=send_email)
e = DocEvent(doc=doc, rev=doc.rev, by=ad)
e.type = "added_comment"
e.desc = "[Ballot %s]\n" % pos.pos.name.lower()
e.desc += pos.discuss

View file

@ -91,7 +91,18 @@
{% if p.pos.blocking and p.discuss %}
<div class="panel panel-danger">
<div class="panel-heading">
<h5 class="panel-title"><b>{{ p.pos.name }}</b> ({{ p.discuss_time|date:"Y-m-d" }}{% if not p.for_current_revision %} for -{{ p.get_dochistory.rev}}{% endif %})</h5>
<h5 class="panel-title">
<b>{{ p.pos.name }}</b> ({{ p.discuss_time|date:"Y-m-d" }}{% if not p.for_current_revision %} for -{{ p.get_dochistory.rev}}{% endif %})
{% if p.send_email %}
<span class="fa fa-envelope-o pull-right" title="Email requested to be sent for this discuss"></span>
{% elif p.ballot.any_email_sent == True %}
<span class="fa fa-envelope pull-right" title="Email requested to be sent for earlier discuss"></span>
{% elif p.ballot.any_email_sent == False %}
<span class="fa fa-exclamation-triangle pull-right" title="No email send requests for this discuss"></span>
{% else %}
<span class="pull-right small italic" style="margin-top: -0.3em;" title="No ballot position send log available">No email<br/>send info</span>
{% endif %}
</h5>
</div>
<div class="panel-body"><pre class="ballot pasted">{{ p.discuss|linkify }}</pre></div>
</div>
@ -100,7 +111,18 @@
{% if p.comment %}
<div class="panel panel-{{ p.pos|pos_to_label }}">
<div class="panel-heading">
<h5 class="panel-title"><b>Comment</b> ({{ p.comment_time|date:"Y-m-d" }}{% if not p.for_current_revision %} for -{{ p.get_dochistory.rev}}{% endif %})</h5>
<h5 class="panel-title">
<b>Comment</b> ({{ p.comment_time|date:"Y-m-d" }}{% if not p.for_current_revision %} for -{{ p.get_dochistory.rev}}{% endif %})
{% if p.send_email %}
<span class="fa fa-envelope-o pull-right" title="Email requested to be sent for this comment"></span>
{% elif p.ballot.any_email_sent == True %}
<span class="fa fa-envelope pull-right" title="Email requested to be sent for earlier comment"></span>
{% elif p.ballot.any_email_sent == False %}
<span class="fa fa-exclamation-triangle pull-right" title="No email send requests for this comment"></span>
{% else %}
<div class="pull-right small italic" style="margin-top: -0.3em;" title="No ballot position send log available">No email<br/>send info</div>
{% endif %}
</h5>
</div>
<div class="panel-body"><pre class="ballot pasted">{{ p.comment|linkify }}</pre></div>
</div>

Binary file not shown.