diff --git a/ietf/doc/admin.py b/ietf/doc/admin.py index 2b39ae761..415a9f6a7 100644 --- a/ietf/doc/admin.py +++ b/ietf/doc/admin.py @@ -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) diff --git a/ietf/doc/migrations/0006_ballotcommentdocevent.py b/ietf/doc/migrations/0006_ballotcommentdocevent.py new file mode 100644 index 000000000..4b2e15d91 --- /dev/null +++ b/ietf/doc/migrations/0006_ballotcommentdocevent.py @@ -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',), + ), + ] diff --git a/ietf/doc/models.py b/ietf/doc/models.py index 8b5c5770d..db50679ae 100644 --- a/ietf/doc/models.py +++ b/ietf/doc/models.py @@ -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) diff --git a/ietf/doc/resources.py b/ietf/doc/resources.py index c9cc24c60..88112c31f 100644 --- a/ietf/doc/resources.py +++ b/ietf/doc/resources.py @@ -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()) diff --git a/ietf/doc/views_ballot.py b/ietf/doc/views_ballot.py index c7a99f74d..82b520ddf 100644 --- a/ietf/doc/views_ballot.py +++ b/ietf/doc/views_ballot.py @@ -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 ])