Skip to content

Commit b914f46

Browse files
committed
Merged in ^/branch/iola/review-tracker-r12128@12397, bringing in the review tool functionality described in RFC7735. This adds the ability to set up review management pages for review teams such as genart, secdir, opsdir, etc.; letting the review team secretaries manage requested and completed reviews; letting the reviewers keep track of and document their reviews, and more. See the RFC for full specification, and the branch commit log for a full commit history.
- Legacy-Id: 12419
2 parents b7b7eb0 + 7d8baf0 commit b914f46

110 files changed

Lines changed: 8840 additions & 538 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

ietf/api/__init__.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,6 @@ def to_simple_html(self, data, options):
9696
_root, _name = _app.split('.', 1)
9797
if _root == 'ietf':
9898
if not '.' in _name:
99-
10099
_api = Api(api_name=_name)
101100
_module_dict[_name] = _api
102101
_api_list.append((_name, _api))

ietf/bin/send-review-reminders

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
#!/usr/bin/env python
2+
3+
import os, sys
4+
import syslog
5+
6+
# boilerplate
7+
basedir = os.path.abspath(os.path.join(os.path.dirname(__file__), "../.."))
8+
sys.path = [ basedir ] + sys.path
9+
os.environ["DJANGO_SETTINGS_MODULE"] = "ietf.settings"
10+
11+
virtualenv_activation = os.path.join(basedir, "bin", "activate_this.py")
12+
if os.path.exists(virtualenv_activation):
13+
execfile(virtualenv_activation, dict(__file__=virtualenv_activation))
14+
15+
syslog.openlog(os.path.basename(__file__), syslog.LOG_PID, syslog.LOG_USER)
16+
17+
import django
18+
django.setup()
19+
20+
import datetime
21+
from ietf.review.utils import (
22+
review_requests_needing_reviewer_reminder, email_reviewer_reminder,
23+
review_requests_needing_secretary_reminder, email_secretary_reminder,
24+
)
25+
26+
today = datetime.date.today()
27+
28+
for review_req in review_requests_needing_reviewer_reminder(today):
29+
email_reviewer_reminder(review_req)
30+
print("Emailed reminder to {} for review of {} in {} (req. id {})".format(review_req.reviewer.address, review_req.doc_id, review_req.team.acronym, review_req.pk))
31+
32+
for review_req, secretary_role in review_requests_needing_secretary_reminder(today):
33+
email_secretary_reminder(review_req, secretary_role)
34+
print("Emailed reminder to {} for review of {} in {} (req. id {})".format(review_req.secretary_role.email.address, review_req.doc_id, review_req.team.acronym, review_req.pk))
35+

ietf/community/models.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,9 @@ def notify_events(sender, instance, **kwargs):
9898
if instance.doc.type_id != 'draft':
9999
return
100100

101+
if getattr(instance, "skip_community_list_notification", False):
102+
return
103+
101104
from ietf.community.utils import notify_event_to_subscribers
102105
notify_event_to_subscribers(instance)
103106

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# -*- coding: utf-8 -*-
2+
from __future__ import unicode_literals
3+
4+
from django.db import models, migrations
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('name', '0015_insert_review_name_data'),
11+
('review', '0001_initial'),
12+
('doc', '0015_auto_20161101_2313'),
13+
]
14+
15+
operations = [
16+
migrations.CreateModel(
17+
name='ReviewRequestDocEvent',
18+
fields=[
19+
('docevent_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='doc.DocEvent')),
20+
('review_request', models.ForeignKey(to='review.ReviewRequest')),
21+
('state', models.ForeignKey(blank=True, to='name.ReviewRequestStateName', null=True)),
22+
],
23+
options={
24+
},
25+
bases=('doc.docevent',),
26+
),
27+
migrations.AlterField(
28+
model_name='docevent',
29+
name='type',
30+
field=models.CharField(max_length=50, choices=[(b'new_revision', b'Added new revision'), (b'changed_document', b'Changed document metadata'), (b'added_comment', b'Added comment'), (b'added_message', b'Added message'), (b'deleted', b'Deleted document'), (b'changed_state', b'Changed state'), (b'changed_stream', b'Changed document stream'), (b'expired_document', b'Expired document'), (b'extended_expiry', b'Extended expiry of document'), (b'requested_resurrect', b'Requested resurrect'), (b'completed_resurrect', b'Completed resurrect'), (b'changed_consensus', b'Changed consensus'), (b'published_rfc', b'Published RFC'), (b'added_suggested_replaces', b'Added suggested replacement relationships'), (b'reviewed_suggested_replaces', b'Reviewed suggested replacement relationships'), (b'changed_group', b'Changed group'), (b'changed_protocol_writeup', b'Changed protocol writeup'), (b'changed_charter_milestone', b'Changed charter milestone'), (b'initial_review', b'Set initial review time'), (b'changed_review_announcement', b'Changed WG Review text'), (b'changed_action_announcement', b'Changed WG Action text'), (b'started_iesg_process', b'Started IESG process on document'), (b'created_ballot', b'Created ballot'), (b'closed_ballot', b'Closed ballot'), (b'sent_ballot_announcement', b'Sent ballot announcement'), (b'changed_ballot_position', b'Changed ballot position'), (b'changed_ballot_approval_text', b'Changed ballot approval text'), (b'changed_ballot_writeup_text', b'Changed ballot writeup text'), (b'changed_rfc_editor_note_text', b'Changed RFC Editor Note text'), (b'changed_last_call_text', b'Changed last call text'), (b'requested_last_call', b'Requested last call'), (b'sent_last_call', b'Sent last call'), (b'scheduled_for_telechat', b'Scheduled for telechat'), (b'iesg_approved', b'IESG approved document (no problem)'), (b'iesg_disapproved', b'IESG disapproved document (do not publish)'), (b'approved_in_minute', b'Approved in minute'), (b'iana_review', b'IANA review comment'), (b'rfc_in_iana_registry', b'RFC is in IANA registry'), (b'rfc_editor_received_announcement', b'Announcement was received by RFC Editor'), (b'requested_publication', b'Publication at RFC Editor requested'), (b'sync_from_rfc_editor', b'Received updated information from RFC Editor'), (b'requested_review', b'Requested review'), (b'assigned_review_request', b'Assigned review request'), (b'closed_review_request', b'Closed review request')]),
31+
preserve_default=True,
32+
),
33+
]

ietf/doc/models.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
from ietf.group.models import Group
1616
from ietf.name.models import ( DocTypeName, DocTagName, StreamName, IntendedStdLevelName, StdLevelName,
17-
DocRelationshipName, DocReminderTypeName, BallotPositionName )
17+
DocRelationshipName, DocReminderTypeName, BallotPositionName, ReviewRequestStateName )
1818
from ietf.person.models import Email, Person
1919
from ietf.utils.admin import admin_link
2020

@@ -724,6 +724,11 @@ class DocReminder(models.Model):
724724
("rfc_editor_received_announcement", "Announcement was received by RFC Editor"),
725725
("requested_publication", "Publication at RFC Editor requested"),
726726
("sync_from_rfc_editor", "Received updated information from RFC Editor"),
727+
728+
# review
729+
("requested_review", "Requested review"),
730+
("assigned_review_request", "Assigned review request"),
731+
("closed_review_request", "Closed review request"),
727732
]
728733

729734
class DocEvent(models.Model):
@@ -854,11 +859,14 @@ class TelechatDocEvent(DocEvent):
854859
telechat_date = models.DateField(blank=True, null=True)
855860
returning_item = models.BooleanField(default=False)
856861

862+
class ReviewRequestDocEvent(DocEvent):
863+
review_request = models.ForeignKey('review.ReviewRequest')
864+
state = models.ForeignKey(ReviewRequestStateName, blank=True, null=True)
865+
857866
# charter events
858867
class InitialReviewDocEvent(DocEvent):
859868
expires = models.DateTimeField(blank=True, null=True)
860869

861-
862870
class AddedMessageEvent(DocEvent):
863871
import ietf.message.models
864872
message = models.ForeignKey(ietf.message.models.Message, null=True, blank=True,related_name='doc_manualevents')

ietf/doc/resources.py

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
DocumentAuthor, DocEvent, StateDocEvent, DocHistory, ConsensusDocEvent, DocAlias,
1212
TelechatDocEvent, DocReminder, LastCallDocEvent, NewRevisionDocEvent, WriteupDocEvent,
1313
InitialReviewDocEvent, DocHistoryAuthor, BallotDocEvent, RelatedDocument,
14-
RelatedDocHistory, BallotPositionDocEvent, AddedMessageEvent, SubmissionDocEvent)
15-
14+
RelatedDocHistory, BallotPositionDocEvent, AddedMessageEvent, SubmissionDocEvent,
15+
ReviewRequestDocEvent)
1616

1717
from ietf.name.resources import BallotPositionNameResource, DocTypeNameResource
1818
class BallotTypeResource(ModelResource):
@@ -513,8 +513,6 @@ class Meta:
513513
}
514514
api.doc.register(BallotPositionDocEventResource())
515515

516-
517-
518516
from ietf.person.resources import PersonResource
519517
from ietf.message.resources import MessageResource
520518
class AddedMessageEventResource(ModelResource):
@@ -542,8 +540,6 @@ class Meta:
542540
}
543541
api.doc.register(AddedMessageEventResource())
544542

545-
546-
547543
from ietf.person.resources import PersonResource
548544
from ietf.submit.resources import SubmissionResource
549545
class SubmissionDocEventResource(ModelResource):
@@ -569,3 +565,29 @@ class Meta:
569565
}
570566
api.doc.register(SubmissionDocEventResource())
571567

568+
from ietf.person.resources import PersonResource
569+
from ietf.name.resources import ReviewRequestStateNameResource
570+
class ReviewRequestDocEventResource(ModelResource):
571+
by = ToOneField(PersonResource, 'by')
572+
doc = ToOneField(DocumentResource, 'doc')
573+
docevent_ptr = ToOneField(DocEventResource, 'docevent_ptr')
574+
review_request = ToOneField('ietf.review.resources.ReviewRequestResource', 'review_request')
575+
state = ToOneField(ReviewRequestStateNameResource, 'state', null=True)
576+
class Meta:
577+
queryset = ReviewRequestDocEvent.objects.all()
578+
serializer = api.Serializer()
579+
cache = SimpleCache()
580+
#resource_name = 'reviewrequestdocevent'
581+
filtering = {
582+
"id": ALL,
583+
"time": ALL,
584+
"type": ALL,
585+
"desc": ALL,
586+
"by": ALL_WITH_RELATIONS,
587+
"doc": ALL_WITH_RELATIONS,
588+
"docevent_ptr": ALL_WITH_RELATIONS,
589+
"review_request": ALL_WITH_RELATIONS,
590+
"state": ALL_WITH_RELATIONS,
591+
}
592+
api.doc.register(ReviewRequestDocEventResource())
593+

0 commit comments

Comments
 (0)