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:
parent
232774a5cc
commit
22a2e29db8
|
@ -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)
|
||||
|
|
|
@ -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',),
|
||||
),
|
||||
]
|
|
@ -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),
|
||||
),
|
||||
]
|
|
@ -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)
|
||||
|
|
|
@ -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())
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
Loading…
Reference in a new issue