Added a BallotCommentDocEvent, which extends DocEvent with a send_mail field, in order to better be able to show whether ballot discusses and comments were posted with with the 'send email' button or not.

- Legacy-Id: 15515
This commit is contained in:
Henrik Levkowetz 2018-10-01 13:31:17 +00:00
parent 194495da03
commit cfb214c48a
5 changed files with 63 additions and 10 deletions

View file

@ -7,6 +7,7 @@ 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)
@ -195,6 +196,7 @@ 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

@ -0,0 +1,24 @@
# -*- 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

@ -1112,6 +1112,9 @@ class BallotPositionDocEvent(DocEvent):
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)
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, DocumentURL)
ReviewRequestDocEvent, EditedAuthorsDocEvent, BallotCommentDocEvent, DocumentURL)
from ietf.name.resources import BallotPositionNameResource, DocTypeNameResource
class BallotTypeResource(ModelResource):
@ -648,3 +648,27 @@ class DocumentURLResource(ModelResource):
"tag": ALL_WITH_RELATIONS,
}
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,
LastCallDocEvent, WriteupDocEvent, IESG_SUBSTATE_TAGS )
BallotCommentDocEvent, 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,
@ -112,7 +112,7 @@ class EditPositionForm(forms.Form):
raise forms.ValidationError("You must enter a non-empty discuss")
return entered_discuss
def save_position(form, doc, ballot, ad, login=None):
def save_position(form, doc, ballot, ad, login=None, send_email=False):
# save the vote
if login is None:
login = ad
@ -141,10 +141,10 @@ def save_position(form, doc, ballot, ad, login=None):
changes.append("comment")
if pos.comment:
e = DocEvent(doc=doc, rev=doc.rev)
e.by = ad # otherwise we can't see who's saying it
e = BallotCommentDocEvent(doc=doc, rev=doc.rev, by=ad, send_email=send_email)
e.type = "added_comment"
e.desc = "[Ballot comment]\n" + pos.comment
added_events.append(e)
old_discuss = old_pos.discuss if old_pos else ""
@ -153,8 +153,7 @@ def save_position(form, doc, ballot, ad, login=None):
changes.append("discuss")
if pos.pos.blocking:
e = DocEvent(doc=doc, rev=doc.rev, by=login)
e.by = ad # otherwise we can't see who's saying it
e = BallotCommentDocEvent(doc=doc, rev=doc.rev, by=ad, send_email=send_email)
e.type = "added_comment"
e.desc = "[Ballot %s]\n" % pos.pos.name.lower()
e.desc += pos.discuss
@ -209,9 +208,10 @@ def edit_position(request, name, ballot_id):
form = EditPositionForm(request.POST, ballot_type=ballot.ballot_type)
if form.is_valid():
save_position(form, doc, ballot, ad, login)
send_mail = request.POST.get("send_mail") or False
save_position(form, doc, ballot, ad, login, send_mail)
if request.POST.get("send_mail"):
if send_mail:
qstr=""
if request.GET.get('ad'):
qstr += "?ad=%s" % request.GET.get('ad')
@ -274,7 +274,7 @@ def api_set_position(request):
return err(400, "No open ballot found")
form = EditPositionForm(request.POST, ballot_type=ballot.ballot_type)
if form.is_valid():
pos = save_position(form, doc, ballot, ad)
pos = save_position(form, doc, ballot, ad, send_email=True)
else:
errors = form.errors
summary = ','.join([ "%s: %s" % (f, striptags(errors[f])) for f in errors ])