Skip to content

Commit bd6a160

Browse files
russhousleyrjsparksjennifer-richards
authored
fix: add most recent ballot hint to History tab. (#9851)
* Add most recent ballot hint to History tab. Fixes#9696. * chore: style nit * fix: explicitly order queryset * fix: more precise description of the revision at the time of ballot * refactor: is None instead of == None --------- Co-authored-by: Robert Sparks <[email protected]> Co-authored-by: Jennifer Richards <[email protected]>
1 parent ce91feb commit bd6a160

File tree

4 files changed

+56
-2
lines changed

4 files changed

+56
-2
lines changed

ietf/doc/tests_utils.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,15 @@
1313
from ietf.group.factories import GroupFactory, RoleFactory
1414
from ietf.name.models import DocTagName
1515
from ietf.person.factories import PersonFactory
16+
from ietf.doc.factories import BallotPositionDocEventFactory
1617
from ietf.utils.test_utils import TestCase, name_of_file_containing, reload_db_objects
1718
from ietf.person.models import Person
1819
from ietf.doc.factories import DocumentFactory, WgRfcFactory, WgDraftFactory
1920
from ietf.doc.models import State, DocumentActionHolder, DocumentAuthor
2021
from ietf.doc.utils import (update_action_holders, add_state_change_event, update_documentauthors,
2122
fuzzy_find_documents, rebuild_reference_relations, build_file_urls,
22-
ensure_draft_bibxml_path_exists, update_or_create_draft_bibxml_file)
23+
ensure_draft_bibxml_path_exists, update_or_create_draft_bibxml_file,
24+
last_ballot_doc_revision)
2325
from ietf.utils.draft import Draft, PlaintextDraft
2426
from ietf.utils.xmldraft import XMLDraft
2527

@@ -533,3 +535,27 @@ def test_update_draft_bibxml_file(self, mock):
533535
self.assertEqual(mock.call_count, 1)
534536
self.assertEqual(mock.call_args, call(doc, "26"))
535537
self.assertEqual(ref_path.read_text(), "This\nis\nmy\nbibxml")
538+
539+
540+
class LastBallotDocRevisionTests(TestCase):
541+
def test_last_ballot_doc_revision(self):
542+
now = timezone.now()
543+
ad = Person.objects.get(user__username="ad")
544+
bpde_with_null_send_email = BallotPositionDocEventFactory(
545+
time=now - datetime.timedelta(minutes=30),
546+
send_email=None,
547+
)
548+
ballot = bpde_with_null_send_email.ballot
549+
BallotPositionDocEventFactory(
550+
ballot=ballot,
551+
balloter=ad,
552+
pos_id='noobj',
553+
comment='Commentary',
554+
comment_time=timezone.now(),
555+
send_email=None,
556+
)
557+
doc = bpde_with_null_send_email.doc
558+
rev = bpde_with_null_send_email.rev
559+
nobody = PersonFactory()
560+
self.assertIsNone(last_ballot_doc_revision(doc, nobody))
561+
self.assertEqual(rev, last_ballot_doc_revision(doc, ad))

ietf/doc/utils.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,12 @@
3636
from ietf.doc.models import Document, DocHistory, State, DocumentAuthor, DocHistoryAuthor
3737
from ietf.doc.models import RelatedDocument, RelatedDocHistory, BallotType, DocReminder
3838
from ietf.doc.models import DocEvent, ConsensusDocEvent, BallotDocEvent, IRSGBallotDocEvent, NewRevisionDocEvent, StateDocEvent
39-
from ietf.doc.models import TelechatDocEvent, DocumentActionHolder, EditedAuthorsDocEvent
39+
from ietf.doc.models import TelechatDocEvent, DocumentActionHolder, EditedAuthorsDocEvent, BallotPositionDocEvent
4040
from ietf.name.models import DocReminderTypeName, DocRelationshipName
4141
from ietf.group.models import Role, Group, GroupFeatures
4242
from ietf.ietfauth.utils import has_role, is_authorized_in_doc_stream, is_individual_draft_author, is_bofreq_editor
4343
from ietf.person.models import Email, Person
44+
from ietf.person.utils import get_active_balloters
4445
from ietf.review.models import ReviewWish
4546
from ietf.utils import draft, log
4647
from ietf.utils.mail import parseaddr, send_mail
@@ -687,6 +688,22 @@ def nice_consensus(consensus):
687688
}
688689
return mapping[consensus]
689690

691+
def last_ballot_doc_revision(doc, person):
692+
""" Return the document revision for the most recent ballot position
693+
by the provided user. """
694+
ballot = doc.active_ballot()
695+
if ballot is None or person is None:
696+
return None
697+
balloters = get_active_balloters(ballot.ballot_type)
698+
if person not in balloters:
699+
return None
700+
position_queryset = BallotPositionDocEvent.objects.filter(type="changed_ballot_position", balloter=person, ballot=ballot).order_by("-time")
701+
if not position_queryset.exists():
702+
return None
703+
ballot_time = position_queryset.first().time
704+
doc_rev = NewRevisionDocEvent.objects.filter(doc=doc, time__lte=ballot_time).order_by('-time').first().rev
705+
return doc_rev
706+
690707
def has_same_ballot(doc, date1, date2=None):
691708
""" Test if the most recent ballot created before the end of date1
692709
is the same as the most recent ballot created before the

ietf/doc/views_doc.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@
7979
from ietf.doc.views_ballot import parse_ballot_edit_return_point
8080
from ietf.doc.forms import InvestigateForm, TelechatForm, NotifyForm, ActionHoldersForm, DocAuthorForm, DocAuthorChangeBasisForm
8181
from ietf.doc.mails import email_comment, email_remind_action_holders
82+
from ietf.doc.utils import last_ballot_doc_revision
8283
from ietf.mailtrigger.utils import gather_relevant_expansions
8384
from ietf.meeting.models import Session, SessionPresentation
8485
from ietf.meeting.utils import group_sessions, get_upcoming_manageable_sessions, sort_sessions, add_event_info_to_session_qs
@@ -1225,6 +1226,10 @@ def document_history(request, name):
12251226
request.user, ("Area Director", "Secretariat", "IRTF Chair")
12261227
)
12271228

1229+
# if the current user has balloted on this document, give them a revision hint
1230+
ballot_doc_rev = None
1231+
if request.user.is_authenticated:
1232+
ballot_doc_rev = last_ballot_doc_revision(doc, request.user.person)
12281233

12291234
return render(
12301235
request,
@@ -1235,6 +1240,7 @@ def document_history(request, name):
12351240
"diff_revisions": diff_revisions,
12361241
"events": events,
12371242
"can_add_comment": can_add_comment,
1243+
"ballot_doc_rev": ballot_doc_rev,
12381244
},
12391245
)
12401246

ietf/templates/doc/document_history.html

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@
2020
<h2 class="my-3">Revision differences</h2>
2121
{% include "doc/document_history_form.html" with doc=doc diff_revisions=diff_revisions action=rfcdiff_base_url snapshot=snapshot only %}
2222
{% endif %}
23+
{% if ballot_doc_rev %}
24+
<p class="alert alert-info my-3">
25+
Your most recent ballot position was provided when the document was at version {{ ballot_doc_rev }}.
26+
</p>
27+
{% endif %}
2328
<h2 class="my-3">Document history</h2>
2429
{% if doc.came_from_draft %}
2530
<ul class="nav nav-tabs my-3">

0 commit comments

Comments
 (0)