diff --git a/ietf/bin/send-review-reminders b/ietf/bin/send-review-reminders
index 36eb5a235..eb21325fa 100755
--- a/ietf/bin/send-review-reminders
+++ b/ietf/bin/send-review-reminders
@@ -19,17 +19,19 @@ django.setup()
import datetime
from ietf.review.utils import (
- review_requests_needing_reviewer_reminder, email_reviewer_reminder,
- review_requests_needing_secretary_reminder, email_secretary_reminder,
+ review_assignments_needing_reviewer_reminder, email_reviewer_reminder,
+ review_assignments_needing_secretary_reminder, email_secretary_reminder,
)
today = datetime.date.today()
-for review_req in review_requests_needing_reviewer_reminder(today):
- email_reviewer_reminder(review_req)
- 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))
+for assignment in review_assignments_needing_reviewer_reminder(today):
+ email_reviewer_reminder(assignment.review_request)
+ for review_assignment in assignments.review_req.reviewassignment_set.all():
+ print("Emailed reminder to {} for review of {} in {} (req. id {})".format(review_assignment.reviewer.address, assignment.review_req.doc_id, assignment.review_req.team.acronym, assignment.review_req.pk))
-for review_req, secretary_role in review_requests_needing_secretary_reminder(today):
- email_secretary_reminder(review_req, secretary_role)
- 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))
+for assignment, secretary_role in review_assignments_needing_secretary_reminder(today):
+ email_secretary_reminder(assignment.review_request, secretary_role)
+ review_req = assignment.review_request
+ print("Emailed reminder to {} for review of {} in {} (req. id {})".format(secretary_role.email.address, review_req.doc_id, review_req.team.acronym, review_req.pk))
diff --git a/ietf/dbtemplate/migrations/0003_adjust_review_templates.py b/ietf/dbtemplate/migrations/0003_adjust_review_templates.py
new file mode 100644
index 000000000..5a5ffc48b
--- /dev/null
+++ b/ietf/dbtemplate/migrations/0003_adjust_review_templates.py
@@ -0,0 +1,118 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.20 on 2019-03-05 11:39
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+def forward(apps, schema_editor):
+ DBTemplate = apps.get_model('dbtemplate', 'DBTemplate')
+ DBTemplate.objects.filter(id=186).update(content="""I am the assigned Gen-ART reviewer for this draft. The General Area
+Review Team (Gen-ART) reviews all IETF documents being processed
+by the IESG for the IETF Chair. Please treat these comments just
+like any other last call comments.
+
+For more information, please see the FAQ at
+
+.
+
+Document: {{ assignment.review_request.doc.name }}-??
+Reviewer: {{ assignment.reviewer.person.plain_name }}
+Review Date: {{ today }}
+IETF LC End Date: {% if assignment.review_request.doc.most_recent_ietflc %}{{ assignment.review_request.doc.most_recent_ietflc.expires|date:"Y-m-d" }}{% else %}None{% endif %}
+IESG Telechat date: {{ assignment.review_request.doc.telechat_date|default:'Not scheduled for a telechat' }}
+
+Summary:
+
+Major issues:
+
+Minor issues:
+
+Nits/editorial comments:
+""")
+
+ DBTemplate.objects.filter(id=187).update(content="""I am the assigned Gen-ART reviewer for this draft. The General Area
+Review Team (Gen-ART) reviews all IETF documents being processed
+by the IESG for the IETF Chair. Please wait for direction from your
+document shepherd or AD before posting a new version of the draft.
+
+For more information, please see the FAQ at
+
+.
+
+Document: {{ assignment.review_request.doc.name }}-??
+Reviewer: {{ assignment.reviewer.person.plain_name }}
+Review Date: {{ today }}
+IETF LC End Date: {% if assignment.review_req.doc.most_recent_ietflc %}{{ assignment.review_request.doc.most_recent_ietflc.expires|date:"Y-m-d" }}{% else %}None{% endif %}
+IESG Telechat date: {{ assignment.review_request.doc.telechat_date|default:'Not scheduled for a telechat' }}
+
+Summary:
+
+Major issues:
+
+Minor issues:
+
+Nits/editorial comments:
+
+""")
+
+def reverse(apps, schema_editor):
+ DBTemplate = apps.get_model('dbtemplate','DBTemplate')
+ DBTemplate.objects.filter(id=186).update(content="""I am the assigned Gen-ART reviewer for this draft. The General Area
+Review Team (Gen-ART) reviews all IETF documents being processed
+by the IESG for the IETF Chair. Please treat these comments just
+like any other last call comments.
+
+For more information, please see the FAQ at
+
+.
+
+Document: {{ review_req.doc.name }}-??
+Reviewer: {{ review_req.reviewer.person.plain_name }}
+Review Date: {{ today }}
+IETF LC End Date: {% if review_req.doc.most_recent_ietflc %}{{ review_req.doc.most_recent_ietflc.expires|date:"Y-m-d" }}{% else %}None{% endif %}
+IESG Telechat date: {{ review_req.doc.telechat_date|default:'Not scheduled for a telechat' }}
+
+Summary:
+
+Major issues:
+
+Minor issues:
+
+Nits/editorial comments:
+
+""")
+ DBTemplate.objects.filter(id=187).update(content="""I am the assigned Gen-ART reviewer for this draft. The General Area
+Review Team (Gen-ART) reviews all IETF documents being processed
+by the IESG for the IETF Chair. Please wait for direction from your
+document shepherd or AD before posting a new version of the draft.
+
+For more information, please see the FAQ at
+
+.
+
+Document: {{ review_req.doc.name }}-??
+Reviewer: {{ review_req.reviewer.person.plain_name }}
+Review Date: {{ today }}
+IETF LC End Date: {% if review_req.doc.most_recent_ietflc %}{{ review_req.doc.most_recent_ietflc.expires|date:"Y-m-d" }}{% else %}None{% endif %}
+IESG Telechat date: {{ review_req.doc.telechat_date|default:'Not scheduled for a telechat' }}
+
+Summary:
+
+Major issues:
+
+Minor issues:
+
+Nits/editorial comments:
+
+""")
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('dbtemplate', '0002_auto_20180220_1052'),
+ ('doc','0011_reviewassignmentdocevent'),
+ ]
+
+ operations = [
+ migrations.RunPython(forward, reverse)
+ ]
diff --git a/ietf/dbtemplate/migrations/0004_adjust_assignment_email_summary_templates.py b/ietf/dbtemplate/migrations/0004_adjust_assignment_email_summary_templates.py
new file mode 100644
index 000000000..0c4463a74
--- /dev/null
+++ b/ietf/dbtemplate/migrations/0004_adjust_assignment_email_summary_templates.py
@@ -0,0 +1,289 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.20 on 2019-03-13 13:41
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+def forward(apps, schema_editor):
+ DBTemplate = apps.get_model('dbtemplate','DBTemplate')
+
+ DBTemplate.objects.filter(pk=182).update(content="""{% autoescape off %}Subject: Open review assignments in {{group.acronym}}
+
+The following reviewers have assignments:{% for r in review_assignments %}{% ifchanged r.section %}
+
+{{r.section}}
+
+{% if r.section == 'Early review requests:' %}Reviewer Due Draft{% else %}Reviewer LC end Draft{% endif %}{% endifchanged %}
+{{ r.reviewer.person.plain_name|ljust:"22" }} {% if r.section == 'Early review requests:' %}{{ r.review_request.deadline|date:"Y-m-d" }}{% else %}{{ r.lastcall_ends|default:"None " }}{% endif %} {{ r.review_request.doc_id }}-{% if r.review_request..requested_rev %}{{ r.review_request.requested_rev }}{% else %}{{ r.review_request..doc.rev }}{% endif %} {{ r.earlier_review_mark }}{% endfor %}
+
+* Other revision previously reviewed
+** This revision already reviewed
+
+{% if rotation_list %}Next in the reviewer rotation:
+
+{% for p in rotation_list %} {{ p }}
+{% endfor %}{% endif %}{% endautoescape %}
+""")
+
+ DBTemplate.objects.filter(pk=183).update(content="""{% autoescape off %}Subject: Review Assignments
+
+Hi all,
+
+The following reviewers have assignments:{% for r in review_assignments %}{% ifchanged r.section %}
+
+{{r.section}}
+
+{% if r.section == 'Early review requests:' %}Reviewer Due Draft{% else %}Reviewer Type LC end Draft{% endif %}{% endifchanged %}
+{{ r.reviewer.person.plain_name|ljust:"22" }} {% if r.section == 'Early review requests:' %}{{ r.review_request.deadline|date:"Y-m-d" }}{% else %}{{r.review_request.type.name|ljust:"10"}}{{ r.lastcall_ends|default:"None " }}{% endif %} {{ r.review_request.doc_id }}-{% if r.review_request.requested_rev %}{{ r.review_request.requested_rev }}{% else %}{{ r.review_request.doc.rev }}{% endif %}{% if r.earlier_review_mark %} {{ r.earlier_review_mark }}{% endif %}{% endfor %}
+
+* Other revision previously reviewed
+** This revision already reviewed
+
+{% if rotation_list %}Next in the reviewer rotation:
+
+{% for p in rotation_list %} {{ p }}
+{% endfor %}{% endif %}
+The LC and Telechat review templates are included below:
+-------------------------------------------------------
+
+-- Begin LC Template --
+I am the assigned Gen-ART reviewer for this draft. The General Area
+Review Team (Gen-ART) reviews all IETF documents being processed
+by the IESG for the IETF Chair. Please treat these comments just
+like any other last call comments.
+
+For more information, please see the FAQ at
+
+.
+
+Document:
+Reviewer:
+Review Date:
+IETF LC End Date:
+IESG Telechat date: (if known)
+
+Summary:
+
+Major issues:
+
+Minor issues:
+
+Nits/editorial comments:
+
+-- End LC Template --
+
+-- Begin Telechat Template --
+I am the assigned Gen-ART reviewer for this draft. The General Area
+Review Team (Gen-ART) reviews all IETF documents being processed
+by the IESG for the IETF Chair. Please wait for direction from your
+document shepherd or AD before posting a new version of the draft.
+
+For more information, please see the FAQ at
+
+.
+
+Document:
+Reviewer:
+Review Date:
+IETF LC End Date:
+IESG Telechat date: (if known)
+
+Summary:
+
+Major issues:
+
+Minor issues:
+
+Nits/editorial comments:
+
+-- End Telechat Template --
+{% endautoescape %}
+
+""")
+
+ DBTemplate.objects.filter(pk=184).update(content="""{% autoescape off %}Subject: Assignments
+
+Review instructions and related resources are at:
+http://tools.ietf.org/area/sec/trac/wiki/SecDirReview{% for r in review_assignments %}{% ifchanged r.section %}
+
+{{r.section}}
+
+{% if r.section == 'Early review requests:' %}Reviewer Due Draft{% else %}Reviewer LC end Draft{% endif %}{% endifchanged %}
+{{ r.reviewer.person.plain_name|ljust:"22" }}{{ r.earlier_review|yesno:'R, , ' }}{% if r.section == 'Early review requests:' %}{{ r.review_request.deadline|date:"Y-m-d" }}{% else %}{{ r.lastcall_ends|default:"None " }}{% endif %} {{ r.review_request.doc_id }}-{% if r.review_request.requested_rev %}{{ r.review_request.requested_rev }}{% else %}{{ r.review_request.doc.rev }}{% endif %}{% endfor %}
+
+{% if rotation_list %}Next in the reviewer rotation:
+
+{% for p in rotation_list %} {{ p }}
+{% endfor %}{% endif %}{% endautoescape %}
+
+""")
+
+ DBTemplate.objects.filter(pk=185).update(content="""{% autoescape off %}Subject: Open review assignments in {{group.acronym}}
+
+Review instructions and related resources are at:
+
+
+The following reviewers have assignments:{% for r in review_assignments %}{% ifchanged r.section %}
+
+{{r.section}}
+
+{% if r.section == 'Early review requests:' %}Reviewer Due Draft{% else %}Reviewer LC end Draft{% endif %}{% endifchanged %}
+{{ r.reviewer.person.plain_name|ljust:"22" }} {% if r.section == 'Early review requests:' %}{{ r.review_request.deadline|date:"Y-m-d" }}{% else %}{{ r.lastcall_ends|default:"None " }}{% endif %} {{ r.review_request.doc_id }}-{% if r.review_request.requested_rev %}{{ r.review_request.requested_rev }}{% else %}{{ r.review_request.doc.rev }}{% endif %} {{ r.earlier_review_mark }}{% endfor %}
+
+* Other revision previously reviewed
+** This revision already reviewed
+
+{% if rotation_list %}Next in the reviewer rotation:
+
+{% for p in rotation_list %} {{ p }}
+{% endfor %}{% endif %}{% endautoescape %}
+
+""")
+
+
+def reverse(apps, schema_editor):
+ DBTemplate = apps.get_model('dbtemplate','DBTemplate')
+
+ DBTemplate.objects.filter(pk=182).update(content="""{% autoescape off %}Subject: Open review assignments in {{group.acronym}}
+
+The following reviewers have assignments:{% for r in review_requests %}{% ifchanged r.section %}
+
+{{r.section}}
+
+{% if r.section == 'Early review requests:' %}Reviewer Due Draft{% else %}Reviewer LC end Draft{% endif %}{% endifchanged %}
+{{ r.reviewer.person.plain_name|ljust:"22" }} {% if r.section == 'Early review requests:' %}{{ r.deadline|date:"Y-m-d" }}{% else %}{{ r.lastcall_ends|default:"None " }}{% endif %} {{ r.doc_id }}-{% if r.requested_rev %}{{ r.requested_rev }}{% else %}{{ r.doc.rev }}{% endif %} {{ r.earlier_review_mark }}{% endfor %}
+
+* Other revision previously reviewed
+** This revision already reviewed
+
+{% if rotation_list %}Next in the reviewer rotation:
+
+{% for p in rotation_list %} {{ p }}
+{% endfor %}{% endif %}{% endautoescape %}
+""")
+
+ DBTemplate.objects.filter(pk=183).update(content="""{% autoescape off %}Subject: Review Assignments
+
+Hi all,
+
+The following reviewers have assignments:{% for r in review_requests %}{% ifchanged r.section %}
+
+{{r.section}}
+
+{% if r.section == 'Early review requests:' %}Reviewer Due Draft{% else %}Reviewer Type LC end Draft{% endif %}{% endifchanged %}
+{{ r.reviewer.person.plain_name|ljust:"22" }} {% if r.section == 'Early review requests:' %}{{ r.deadline|date:"Y-m-d" }}{% else %}{{r.type.name|ljust:"10"}}{{ r.lastcall_ends|default:"None " }}{% endif %} {{ r.doc_id }}-{% if r.requested_rev %}{{ r.requested_rev }}{% else %}{{ r.doc.rev }}{% endif %}{% if r.earlier_review_mark %} {{ r.earlier_review_mark }}{% endif %}{% endfor %}
+
+* Other revision previously reviewed
+** This revision already reviewed
+
+{% if rotation_list %}Next in the reviewer rotation:
+
+{% for p in rotation_list %} {{ p }}
+{% endfor %}{% endif %}
+The LC and Telechat review templates are included below:
+-------------------------------------------------------
+
+-- Begin LC Template --
+I am the assigned Gen-ART reviewer for this draft. The General Area
+Review Team (Gen-ART) reviews all IETF documents being processed
+by the IESG for the IETF Chair. Please treat these comments just
+like any other last call comments.
+
+For more information, please see the FAQ at
+
+.
+
+Document:
+Reviewer:
+Review Date:
+IETF LC End Date:
+IESG Telechat date: (if known)
+
+Summary:
+
+Major issues:
+
+Minor issues:
+
+Nits/editorial comments:
+
+-- End LC Template --
+
+-- Begin Telechat Template --
+I am the assigned Gen-ART reviewer for this draft. The General Area
+Review Team (Gen-ART) reviews all IETF documents being processed
+by the IESG for the IETF Chair. Please wait for direction from your
+document shepherd or AD before posting a new version of the draft.
+
+For more information, please see the FAQ at
+
+.
+
+Document:
+Reviewer:
+Review Date:
+IETF LC End Date:
+IESG Telechat date: (if known)
+
+Summary:
+
+Major issues:
+
+Minor issues:
+
+Nits/editorial comments:
+
+-- End Telechat Template --
+{% endautoescape %}
+
+""")
+
+ DBTemplate.objects.filter(pk=184).update(content="""{% autoescape off %}Subject: Assignments
+
+Review instructions and related resources are at:
+http://tools.ietf.org/area/sec/trac/wiki/SecDirReview{% for r in review_requests %}{% ifchanged r.section %}
+
+{{r.section}}
+
+{% if r.section == 'Early review requests:' %}Reviewer Due Draft{% else %}Reviewer LC end Draft{% endif %}{% endifchanged %}
+{{ r.reviewer.person.plain_name|ljust:"22" }}{{ r.earlier_review|yesno:'R, , ' }}{% if r.section == 'Early review requests:' %}{{ r.deadline|date:"Y-m-d" }}{% else %}{{ r.lastcall_ends|default:"None " }}{% endif %} {{ r.doc_id }}-{% if r.requested_rev %}{{ r.requested_rev }}{% else %}{{ r.doc.rev }}{% endif %}{% endfor %}
+
+{% if rotation_list %}Next in the reviewer rotation:
+
+{% for p in rotation_list %} {{ p }}
+{% endfor %}{% endif %}{% endautoescape %}
+
+""")
+
+ DBTemplate.objects.filter(pk=185).update(content="""{% autoescape off %}Subject: Open review assignments in {{group.acronym}}
+
+Review instructions and related resources are at:
+
+
+The following reviewers have assignments:{% for r in review_requests %}{% ifchanged r.section %}
+
+{{r.section}}
+
+{% if r.section == 'Early review requests:' %}Reviewer Due Draft{% else %}Reviewer LC end Draft{% endif %}{% endifchanged %}
+{{ r.reviewer.person.plain_name|ljust:"22" }} {% if r.section == 'Early review requests:' %}{{ r.deadline|date:"Y-m-d" }}{% else %}{{ r.lastcall_ends|default:"None " }}{% endif %} {{ r.doc_id }}-{% if r.requested_rev %}{{ r.requested_rev }}{% else %}{{ r.doc.rev }}{% endif %} {{ r.earlier_review_mark }}{% endfor %}
+
+* Other revision previously reviewed
+** This revision already reviewed
+
+{% if rotation_list %}Next in the reviewer rotation:
+
+{% for p in rotation_list %} {{ p }}
+{% endfor %}{% endif %}{% endautoescape %}
+
+""")
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('dbtemplate', '0003_adjust_review_templates'),
+ ]
+
+ operations = [
+ migrations.RunPython(forward,reverse),
+ ]
diff --git a/ietf/doc/admin.py b/ietf/doc/admin.py
index 55285b49d..d61ccb191 100644
--- a/ietf/doc/admin.py
+++ b/ietf/doc/admin.py
@@ -5,7 +5,8 @@ from models import (StateType, State, RelatedDocument, DocumentAuthor, Document,
DocHistoryAuthor, DocHistory, DocAlias, DocReminder, DocEvent, NewRevisionDocEvent,
StateDocEvent, ConsensusDocEvent, BallotType, BallotDocEvent, WriteupDocEvent, LastCallDocEvent,
TelechatDocEvent, BallotPositionDocEvent, ReviewRequestDocEvent, InitialReviewDocEvent,
- AddedMessageEvent, SubmissionDocEvent, DeletedEvent, EditedAuthorsDocEvent, DocumentURL)
+ AddedMessageEvent, SubmissionDocEvent, DeletedEvent, EditedAuthorsDocEvent, DocumentURL,
+ ReviewAssignmentDocEvent )
class StateTypeAdmin(admin.ModelAdmin):
@@ -143,6 +144,7 @@ admin.site.register(WriteupDocEvent, DocEventAdmin)
admin.site.register(LastCallDocEvent, DocEventAdmin)
admin.site.register(TelechatDocEvent, DocEventAdmin)
admin.site.register(ReviewRequestDocEvent, DocEventAdmin)
+admin.site.register(ReviewAssignmentDocEvent, DocEventAdmin)
admin.site.register(InitialReviewDocEvent, DocEventAdmin)
admin.site.register(AddedMessageEvent, DocEventAdmin)
admin.site.register(SubmissionDocEvent, DocEventAdmin)
diff --git a/ietf/doc/factories.py b/ietf/doc/factories.py
index 10d866f7b..f5f669181 100644
--- a/ietf/doc/factories.py
+++ b/ietf/doc/factories.py
@@ -209,6 +209,12 @@ class ConflictReviewFactory(BaseDocumentFactory):
else:
obj.set_state(State.objects.get(type_id='conflrev',slug='iesgeval'))
+# This is very skeletal. It is enough for the tests that use it now, but when it's needed, it will need to be improved with, at least, a group generator that backs the object with a review team.
+class ReviewFactory(BaseDocumentFactory):
+ type_id = 'review'
+ name = factory.LazyAttribute(lambda o: 'review-doesnotexist-00-%s-%s'%(o.group.acronym,datetime.date.today().isoformat()))
+ group = factory.SubFactory('ietf.group.factories.GroupFactory',type_id='review')
+
class DocAliasFactory(factory.DjangoModelFactory):
class Meta:
model = DocAlias
diff --git a/ietf/doc/migrations/0011_reviewassignmentdocevent.py b/ietf/doc/migrations/0011_reviewassignmentdocevent.py
new file mode 100644
index 000000000..63df9a962
--- /dev/null
+++ b/ietf/doc/migrations/0011_reviewassignmentdocevent.py
@@ -0,0 +1,28 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.18 on 2019-01-11 11:22
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+import ietf.utils.models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('review', '0009_refactor_review_request'),
+ ('name', '0005_reviewassignmentstatename'),
+ ('doc', '0010_auto_20190225_1302'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='ReviewAssignmentDocEvent',
+ 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')),
+ ('review_assignment', ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='review.ReviewAssignment')),
+ ('state', ietf.utils.models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='name.ReviewAssignmentStateName')),
+ ],
+ bases=('doc.docevent',),
+ ),
+ ]
diff --git a/ietf/doc/models.py b/ietf/doc/models.py
index 47d0fa81f..484122922 100644
--- a/ietf/doc/models.py
+++ b/ietf/doc/models.py
@@ -20,7 +20,7 @@ import debug # pyflakes:ignore
from ietf.group.models import Group
from ietf.name.models import ( DocTypeName, DocTagName, StreamName, IntendedStdLevelName, StdLevelName,
- DocRelationshipName, DocReminderTypeName, BallotPositionName, ReviewRequestStateName, FormalLanguageName,
+ DocRelationshipName, DocReminderTypeName, BallotPositionName, ReviewRequestStateName, ReviewAssignmentStateName, FormalLanguageName,
DocUrlTagName)
from ietf.person.models import Email, Person
from ietf.person.utils import get_active_ads
@@ -1149,6 +1149,10 @@ class ReviewRequestDocEvent(DocEvent):
review_request = ForeignKey('review.ReviewRequest')
state = ForeignKey(ReviewRequestStateName, blank=True, null=True)
+class ReviewAssignmentDocEvent(DocEvent):
+ review_assignment = ForeignKey('review.ReviewAssignment')
+ state = ForeignKey(ReviewAssignmentStateName, blank=True, null=True)
+
# charter events
class InitialReviewDocEvent(DocEvent):
expires = models.DateTimeField(blank=True, null=True)
diff --git a/ietf/doc/resources.py b/ietf/doc/resources.py
index 62f928ced..64fd71a15 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, ReviewAssignmentDocEvent, EditedAuthorsDocEvent, DocumentURL)
from ietf.name.resources import BallotPositionNameResource, DocTypeNameResource
class BallotTypeResource(ModelResource):
@@ -652,3 +652,32 @@ class DocumentURLResource(ModelResource):
api.doc.register(DocumentURLResource())
+
+
+from ietf.person.resources import PersonResource
+from ietf.review.resources import ReviewAssignmentResource
+from ietf.name.resources import ReviewAssignmentStateNameResource
+class ReviewAssignmentDocEventResource(ModelResource):
+ by = ToOneField(PersonResource, 'by')
+ doc = ToOneField(DocumentResource, 'doc')
+ docevent_ptr = ToOneField(DocEventResource, 'docevent_ptr')
+ review_assignment = ToOneField(ReviewAssignmentResource, 'review_assignment')
+ state = ToOneField(ReviewAssignmentStateNameResource, 'state', null=True)
+ class Meta:
+ queryset = ReviewAssignmentDocEvent.objects.all()
+ serializer = api.Serializer()
+ cache = SimpleCache()
+ #resource_name = 'reviewassignmentdocevent'
+ filtering = {
+ "id": ALL,
+ "time": ALL,
+ "type": ALL,
+ "rev": ALL,
+ "desc": ALL,
+ "by": ALL_WITH_RELATIONS,
+ "doc": ALL_WITH_RELATIONS,
+ "docevent_ptr": ALL_WITH_RELATIONS,
+ "review_assignment": ALL_WITH_RELATIONS,
+ "state": ALL_WITH_RELATIONS,
+ }
+api.doc.register(ReviewAssignmentDocEventResource())
diff --git a/ietf/doc/tests_review.py b/ietf/doc/tests_review.py
index 24b229243..6b9855d0e 100644
--- a/ietf/doc/tests_review.py
+++ b/ietf/doc/tests_review.py
@@ -3,6 +3,7 @@
import datetime, os, shutil, json
import tarfile, tempfile, mailbox
import email.mime.multipart, email.mime.text, email.utils
+
from StringIO import StringIO
from mock import patch
from requests import Response
@@ -17,14 +18,14 @@ from pyquery import PyQuery
import debug # pyflakes:ignore
import ietf.review.mailarch
-from ietf.doc.factories import NewRevisionDocEventFactory, WgDraftFactory, WgRfcFactory
-from ietf.doc.models import DocumentAuthor, RelatedDocument, DocEvent, ReviewRequestDocEvent
+from ietf.doc.factories import NewRevisionDocEventFactory, WgDraftFactory, WgRfcFactory, ReviewFactory
+from ietf.doc.models import DocumentAuthor, RelatedDocument, DocEvent, ReviewAssignmentDocEvent
from ietf.group.factories import RoleFactory, ReviewTeamFactory
from ietf.group.models import Group
from ietf.message.models import Message
-from ietf.name.models import ReviewResultName, ReviewRequestStateName, ReviewTypeName
+from ietf.name.models import ReviewResultName, ReviewRequestStateName, ReviewAssignmentStateName
from ietf.person.models import Email, Person
-from ietf.review.factories import ReviewRequestFactory
+from ietf.review.factories import ReviewRequestFactory, ReviewAssignmentFactory
from ietf.review.models import (ReviewRequest, ReviewerSettings,
ReviewWish, UnavailablePeriod, NextReviewerInTeam)
from ietf.review.utils import reviewer_rotation_list, possibly_advance_next_reviewer_for_team
@@ -60,7 +61,8 @@ class ReviewTests(TestCase):
RoleFactory(group=review_team,person__user__username='reviewsecretary',person__user__email='reviewsecretary@example.com',name_id='secr')
RoleFactory(group=review_team3,person__user__username='reviewsecretary3',person__user__email='reviewsecretary3@example.com',name_id='secr')
- ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='accepted',requested_by=rev_role.person,reviewer=rev_role.person.email_set.first(),deadline=datetime.datetime.now()+datetime.timedelta(days=20))
+ req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='assigned',requested_by=rev_role.person,deadline=datetime.datetime.now()+datetime.timedelta(days=20))
+ ReviewAssignmentFactory(review_request = req, reviewer = rev_role.person.email_set.first(), state_id='accepted')
url = urlreverse('ietf.doc.views_review.request_review', kwargs={ "name": doc.name })
login_testing_unauthorized(self, "ad", url)
@@ -135,7 +137,8 @@ class ReviewTests(TestCase):
doc = WgDraftFactory(group__acronym='mars',rev='01')
review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="review", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut"))
rev_role = RoleFactory(group=review_team,person__user__username='reviewer',person__user__email='reviewer@example.com',name_id='reviewer')
- review_req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='accepted',requested_by=rev_role.person,reviewer=rev_role.person.email_set.first(),deadline=datetime.datetime.now()+datetime.timedelta(days=20))
+ review_req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='assigned',requested_by=rev_role.person,deadline=datetime.datetime.now()+datetime.timedelta(days=20))
+ ReviewAssignmentFactory(review_request=review_req, reviewer=rev_role.person.email_set.first(), state_id='accepted')
# move the review request to a doubly-replaced document to
# check we can fish it out
@@ -156,7 +159,8 @@ class ReviewTests(TestCase):
doc = WgDraftFactory(group__acronym='mars',rev='01')
review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="review", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut"))
rev_role = RoleFactory(group=review_team,person__user__username='reviewer',person__user__email='reviewer@example.com',name_id='reviewer')
- review_req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='accepted',requested_by=rev_role.person,reviewer=rev_role.person.email_set.first(),deadline=datetime.datetime.now()+datetime.timedelta(days=20))
+ review_req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='assigned',requested_by=rev_role.person,deadline=datetime.datetime.now()+datetime.timedelta(days=20))
+ ReviewAssignmentFactory(review_request = review_req, reviewer = rev_role.person.email_set.first(), state_id='accepted')
url = urlreverse('ietf.doc.views_review.review_request', kwargs={ "name": doc.name, "request_id": review_req.pk })
@@ -178,11 +182,11 @@ class ReviewTests(TestCase):
review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="review", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut"))
rev_role = RoleFactory(group=review_team,person__user__username='reviewer',person__user__email='reviewer@example.com',name_id='reviewer')
RoleFactory(group=review_team,person__user__username='reviewsecretary',person__user__email='reviewsecretary@example.com',name_id='secr')
- review_req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='accepted',requested_by=rev_role.person,reviewer=rev_role.person.email_set.first(),deadline=datetime.datetime.now()+datetime.timedelta(days=20))
+ review_req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='assigned',requested_by=rev_role.person,deadline=datetime.datetime.now()+datetime.timedelta(days=20))
+ ReviewAssignmentFactory(review_request=review_req, state_id='accepted', reviewer=rev_role.person.email_set.first())
close_url = urlreverse('ietf.doc.views_review.close_request', kwargs={ "name": doc.name, "request_id": review_req.pk })
-
# follow link
req_url = urlreverse('ietf.doc.views_review.review_request', kwargs={ "name": doc.name, "request_id": review_req.pk })
self.client.login(username="reviewsecretary", password="reviewsecretary+password")
@@ -287,7 +291,8 @@ class ReviewTests(TestCase):
settings, _ = ReviewerSettings.objects.get_or_create(team=team, person=reviewers[2])
settings.min_interval = 30
settings.save()
- ReviewRequest.objects.create(team=team, doc=doc, type_id="early", state_id="accepted", deadline=today, requested_by=reviewers[0], reviewer=reviewers[2].email_set.first())
+ req = ReviewRequest.objects.create(team=team, doc=doc, type_id="early", state_id="assigned", deadline=today, requested_by=reviewers[0])
+ ReviewAssignmentFactory(review_request=req, state_id="accepted", reviewer = reviewers[2].email_set.first(),assigned_on = req.time)
possibly_advance_next_reviewer_for_team(team, assigned_review_to_person_id=reviewers[3].pk)
self.assertEqual(NextReviewerInTeam.objects.get(team=team).next_reviewer, reviewers[4])
self.assertEqual(get_skip_next(reviewers[0]), 0)
@@ -314,17 +319,25 @@ class ReviewTests(TestCase):
doc.save_with_history([DocEvent.objects.create(doc=doc, rev=doc.rev, type="changed_document", by=Person.objects.get(user__username="secretary"), desc="Test")])
# previous review
- ReviewRequest.objects.create(
+ req = ReviewRequestFactory(
time=datetime.datetime.now() - datetime.timedelta(days=100),
requested_by=Person.objects.get(name="(System)"),
doc=doc,
- type=ReviewTypeName.objects.get(slug="early"),
+ type_id='early',
team=review_req.team,
- state=ReviewRequestStateName.objects.get(slug="completed"),
- result_id='serious-issues',
- reviewed_rev="01",
+ state_id='assigned',
+ requested_rev="01",
deadline=datetime.date.today() - datetime.timedelta(days=80),
+ )
+ ReviewAssignmentFactory(
+ review_request = req,
+ state_id='completed',
+ result_id='serious-issues',
reviewer=reviewer_email,
+ reviewed_rev="01",
+ review = ReviewFactory(),
+ assigned_on=req.time,
+ completed_on=req.time + datetime.timedelta(days=10),
)
reviewer_settings = ReviewerSettings.objects.get(person__email=reviewer_email, team=review_req.team)
@@ -387,37 +400,25 @@ class ReviewTests(TestCase):
self.assertEqual(r.status_code, 302)
review_req = reload_db_objects(review_req)
- self.assertEqual(review_req.state_id, "requested")
- self.assertEqual(review_req.reviewer, reviewer)
+ self.assertEqual(review_req.state_id, "assigned")
+ self.assertEqual(review_req.reviewassignment_set.count(),1)
+ assignment = review_req.reviewassignment_set.first()
+ self.assertEqual(assignment.reviewer, reviewer)
+ self.assertEqual(assignment.state_id, "assigned")
self.assertEqual(len(outbox), 1)
self.assertTrue("assigned" in outbox[0].get_payload(decode=True).decode("utf-8"))
self.assertEqual(NextReviewerInTeam.objects.get(team=review_req.team).next_reviewer, rotation_list[1])
- # re-assign
- empty_outbox()
- review_req.state = ReviewRequestStateName.objects.get(slug="accepted")
- review_req.save()
- reviewer = Email.objects.filter(role__name="reviewer", role__group=review_req.team, person=rotation_list[1]).first()
- r = self.client.post(assign_url, { "action": "assign", "reviewer": reviewer.pk, "add_skip": 1 })
- self.assertEqual(r.status_code, 302)
-
- review_req = reload_db_objects(review_req)
- self.assertEqual(review_req.state_id, "requested") # check that state is reset
- self.assertEqual(review_req.reviewer, reviewer)
- self.assertEqual(len(outbox), 2)
- self.assertTrue("cancelled your assignment" in outbox[0].get_payload(decode=True).decode("utf-8"))
- self.assertTrue("assigned" in outbox[1].get_payload(decode=True).decode("utf-8"))
- self.assertEqual(ReviewerSettings.objects.get(person=reviewer.person).skip_next, 1)
-
def test_accept_reviewer_assignment(self):
doc = WgDraftFactory(group__acronym='mars',rev='01')
review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="review", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut"))
rev_role = RoleFactory(group=review_team,person__user__username='reviewer',person__user__email='reviewer@example.com',name_id='reviewer')
- review_req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='requested',requested_by=rev_role.person,reviewer=rev_role.person.email_set.first(),deadline=datetime.datetime.now()+datetime.timedelta(days=20))
+ review_req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='assigned',requested_by=rev_role.person,deadline=datetime.datetime.now()+datetime.timedelta(days=20))
+ assignment = ReviewAssignmentFactory(review_request=review_req, state_id='assigned', reviewer=rev_role.person.email_set.first())
url = urlreverse('ietf.doc.views_review.review_request', kwargs={ "name": doc.name, "request_id": review_req.pk })
- username = review_req.reviewer.person.user.username
+ username = assignment.reviewer.person.user.username
self.client.login(username=username, password=username + "+password")
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
@@ -428,21 +429,22 @@ class ReviewTests(TestCase):
r = self.client.post(url, { "action": "accept" })
self.assertEqual(r.status_code, 302)
- review_req = reload_db_objects(review_req)
- self.assertEqual(review_req.state_id, "accepted")
+ assignment = reload_db_objects(assignment)
+ self.assertEqual(assignment.state_id, "accepted")
def test_reject_reviewer_assignment(self):
doc = WgDraftFactory(group__acronym='mars',rev='01')
review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="review", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut"))
rev_role = RoleFactory(group=review_team,person__user__username='reviewer',person__user__email='reviewer@example.com',name_id='reviewer')
RoleFactory(group=review_team,person__user__username='reviewsecretary',person__user__email='reviewsecretary@example.com',name_id='secr')
- review_req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='accepted',requested_by=rev_role.person,reviewer=rev_role.person.email_set.first(),deadline=datetime.datetime.now()+datetime.timedelta(days=20))
+ review_req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='assigned',requested_by=rev_role.person,deadline=datetime.datetime.now()+datetime.timedelta(days=20))
+ assignment = ReviewAssignmentFactory(review_request = review_req, reviewer=rev_role.person.email_set.first(), state_id='accepted')
- reject_url = urlreverse('ietf.doc.views_review.reject_reviewer_assignment', kwargs={ "name": doc.name, "request_id": review_req.pk })
+ reject_url = urlreverse('ietf.doc.views_review.reject_reviewer_assignment', kwargs={ "name": doc.name, "assignment_id": assignment.pk })
# follow link
- req_url = urlreverse('ietf.doc.views_review.review_request', kwargs={ "name": doc.name, "request_id": review_req.pk })
+ req_url = urlreverse('ietf.doc.views_review.review_request', kwargs={ "name": doc.name, "request_id": assignment.review_request.pk })
self.client.login(username="reviewsecretary", password="reviewsecretary+password")
r = self.client.get(req_url)
self.assertEqual(r.status_code, 200)
@@ -453,19 +455,18 @@ class ReviewTests(TestCase):
login_testing_unauthorized(self, "reviewsecretary", reject_url)
r = self.client.get(reject_url)
self.assertEqual(r.status_code, 200)
- self.assertTrue(unicode(review_req.reviewer.person) in unicontent(r))
+ self.assertTrue(unicode(assignment.reviewer.person) in unicontent(r))
# reject
empty_outbox()
r = self.client.post(reject_url, { "action": "reject", "message_to_secretary": "Test message" })
self.assertEqual(r.status_code, 302)
- review_req = reload_db_objects(review_req)
- self.assertEqual(review_req.state_id, "rejected")
+ assignment = reload_db_objects(assignment)
+ self.assertEqual(assignment.state_id, "rejected")
e = doc.latest_event()
self.assertEqual(e.type, "closed_review_request")
self.assertTrue("rejected" in e.desc)
- self.assertEqual(ReviewRequest.objects.filter(doc=review_req.doc, team=review_req.team, state="requested").count(), 1)
self.assertEqual(len(outbox), 1)
self.assertTrue("Test message" in outbox[0].get_payload(decode=True).decode("utf-8"))
@@ -509,7 +510,8 @@ class ReviewTests(TestCase):
review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="review", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut"))
rev_role = RoleFactory(group=review_team,person__user__username='reviewer',person__user__email='reviewer@example.com',name_id='reviewer')
RoleFactory(group=review_team,person__user__username='reviewsecretary',person__user__email='reviewsecretary@example.com',name_id='secr')
- review_req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='accepted',requested_by=rev_role.person,reviewer=rev_role.person.email_set.first(),deadline=datetime.datetime.now()+datetime.timedelta(days=20))
+ review_req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='assigned',requested_by=rev_role.person,deadline=datetime.datetime.now()+datetime.timedelta(days=20))
+ assignment = ReviewAssignmentFactory(review_request=review_req, reviewer=rev_role.person.email_set.first(), state_id='accepted')
# test URL construction
query_urls = ietf.review.mailarch.construct_query_urls(review_req)
@@ -525,7 +527,7 @@ class ReviewTests(TestCase):
real_fn = ietf.review.mailarch.construct_query_urls
ietf.review.mailarch.construct_query_urls = lambda review_req, query=None: { "query_data_url": "file://" + os.path.abspath(mbox_path) }
- url = urlreverse('ietf.doc.views_review.search_mail_archive', kwargs={ "name": doc.name, "request_id": review_req.pk })
+ url = urlreverse('ietf.doc.views_review.search_mail_archive', kwargs={ "name": doc.name, "assignment_id": assignment.pk })
login_testing_unauthorized(self, "reviewsecretary", url)
r = self.client.get(url)
@@ -555,7 +557,7 @@ class ReviewTests(TestCase):
f.write('Content-Type: text/html\n\n')
ietf.review.mailarch.construct_query_urls = lambda review_req, query=None: { "query_data_url": "file://" + os.path.abspath(no_result_path) }
- url = urlreverse('ietf.doc.views_review.search_mail_archive', kwargs={ "name": doc.name, "request_id": review_req.pk })
+ url = urlreverse('ietf.doc.views_review.search_mail_archive', kwargs={ "name": doc.name, "assignment_id": assignment.pk })
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
@@ -572,18 +574,19 @@ class ReviewTests(TestCase):
review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="review", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut"))
rev_role = RoleFactory(group=review_team,person__user__username='reviewer',person__user__email='reviewer@example.com',name_id='reviewer')
RoleFactory(group=review_team,person__user__username='reviewsecretary',person__user__email='reviewsecretary@example.com',name_id='secr')
- review_req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='accepted',requested_by=rev_role.person,reviewer=rev_role.person.email_set.first(),deadline=datetime.datetime.now()+datetime.timedelta(days=20))
+ review_req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='assigned',requested_by=rev_role.person,deadline=datetime.datetime.now()+datetime.timedelta(days=20))
+ assignment = ReviewAssignmentFactory(review_request=review_req, state_id='accepted', reviewer=rev_role.person.email_set.first())
for r in ReviewResultName.objects.filter(slug__in=("issues", "ready")):
review_req.team.reviewteamsettings.review_results.add(r)
- url = urlreverse('ietf.doc.views_review.complete_review', kwargs={ "name": doc.name, "request_id": review_req.pk })
+ url = urlreverse('ietf.doc.views_review.complete_review', kwargs={ "name": doc.name, "assignment_id": review_req.pk })
- return review_req, url
+ return assignment, url
def test_complete_review_upload_content(self):
- review_req, url = self.setup_complete_review_test()
+ assignment, url = self.setup_complete_review_test()
- login_testing_unauthorized(self, review_req.reviewer.person.user.username, url)
+ login_testing_unauthorized(self, assignment.reviewer.person.user.username, url)
# get
r = self.client.get(url)
@@ -611,9 +614,9 @@ class ReviewTests(TestCase):
test_file.name = "unnamed"
r = self.client.post(url, data={
- "result": ReviewResultName.objects.get(reviewteamsettings_review_results_set__group=review_req.team, slug="ready").pk,
- "state": ReviewRequestStateName.objects.get(slug="completed").pk,
- "reviewed_rev": review_req.doc.rev,
+ "result": ReviewResultName.objects.get(reviewteamsettings_review_results_set__group=assignment.review_request.team, slug="ready").pk,
+ "state": ReviewAssignmentStateName.objects.get(slug="completed").pk,
+ "reviewed_rev": assignment.review_request.doc.rev,
"review_submission": "upload",
"review_content": "",
"review_url": "",
@@ -621,25 +624,25 @@ class ReviewTests(TestCase):
})
self.assertEqual(r.status_code, 302)
- review_req = reload_db_objects(review_req)
- self.assertEqual(review_req.state_id, "completed")
- self.assertEqual(review_req.result_id, "ready")
- self.assertEqual(review_req.reviewed_rev, review_req.doc.rev)
- self.assertTrue(review_req.team.acronym.lower() in review_req.review.name)
- self.assertTrue(review_req.doc.rev in review_req.review.name)
+ assignment = reload_db_objects(assignment)
+ self.assertEqual(assignment.state_id, "completed")
+ self.assertEqual(assignment.result_id, "ready")
+ self.assertEqual(assignment.reviewed_rev, assignment.review_request.doc.rev)
+ self.assertTrue(assignment.review_request.team.acronym.lower() in assignment.review.name)
+ self.assertTrue(assignment.review_request.doc.rev in assignment.review.name)
- with open(os.path.join(self.review_subdir, review_req.review.name + ".txt")) as f:
+ with open(os.path.join(self.review_subdir, assignment.review.name + ".txt")) as f:
self.assertEqual(f.read(), "This is a review\nwith two lines")
self.assertEqual(len(outbox), 1)
- self.assertIn(review_req.team.list_email, outbox[0]["To"])
- self.assertIn(review_req.reviewer.person.plain_name(), parseaddr(outbox[0]["From"])[0])
+ self.assertIn(assignment.review_request.team.list_email, outbox[0]["To"])
+ self.assertIn(assignment.reviewer.role_set.filter(group=assignment.review_request.team,name='reviewer').first().person.plain_name(), parseaddr(outbox[0]["From"])[0] )
self.assertIn("This is a review", outbox[0].get_payload(decode=True).decode("utf-8"))
- self.assertTrue(settings.MAILING_LIST_ARCHIVE_URL in review_req.review.external_url)
+ self.assertIn(settings.MAILING_LIST_ARCHIVE_URL, assignment.review.external_url)
# Check that the review has the reviewer as author
- self.assertEqual(review_req.reviewer, review_req.review.documentauthor_set.first().email)
+ self.assertEqual(assignment.reviewer, assignment.review.documentauthor_set.first().email)
# Check that we have a copy of the outgoing message
msgid = outbox[0]["Message-ID"]
@@ -650,25 +653,25 @@ class ReviewTests(TestCase):
self.assertEqual(outbox[0].get_payload(decode=True).decode(str(outbox[0].get_charset())), message.body)
# check the review document page
- url = urlreverse('ietf.doc.views_doc.document_main', kwargs={ "name": review_req.review.name })
+ url = urlreverse('ietf.doc.views_doc.document_main', kwargs={ "name": assignment.review.name })
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
content = unicontent(r)
- self.assertTrue("{} Review".format(review_req.type.name) in content)
- self.assertTrue("This is a review" in content)
+ self.assertIn("{} Review".format(assignment.review_request.type.name), content)
+ self.assertIn("This is a review", content)
def test_complete_review_enter_content(self):
- review_req, url = self.setup_complete_review_test()
+ assignment, url = self.setup_complete_review_test()
- login_testing_unauthorized(self, review_req.reviewer.person.user.username, url)
+ login_testing_unauthorized(self, assignment.reviewer.person.user.username, url)
empty_outbox()
r = self.client.post(url, data={
- "result": ReviewResultName.objects.get(reviewteamsettings_review_results_set__group=review_req.team, slug="ready").pk,
- "state": ReviewRequestStateName.objects.get(slug="completed").pk,
- "reviewed_rev": review_req.doc.rev,
+ "result": ReviewResultName.objects.get(reviewteamsettings_review_results_set__group=assignment.review_request.team, slug="ready").pk,
+ "state": ReviewAssignmentStateName.objects.get(slug="completed").pk,
+ "reviewed_rev": assignment.review_request.doc.rev,
"review_submission": "enter",
"review_content": "This is a review\nwith two lines",
"review_url": "",
@@ -676,32 +679,33 @@ class ReviewTests(TestCase):
})
self.assertEqual(r.status_code, 302)
- review_req = reload_db_objects(review_req)
- self.assertEqual(review_req.state_id, "completed")
+ assignment = reload_db_objects(assignment)
+ self.assertEqual(assignment.state_id, "completed")
+ self.assertNotEqual(assignment.completed_on, None)
- with open(os.path.join(self.review_subdir, review_req.review.name + ".txt")) as f:
+ with open(os.path.join(self.review_subdir, assignment.review.name + ".txt")) as f:
self.assertEqual(f.read(), "This is a review\nwith two lines")
self.assertEqual(len(outbox), 1)
- self.assertTrue(review_req.team.list_email in outbox[0]["To"])
+ self.assertTrue(assignment.review_request.team.list_email in outbox[0]["To"])
self.assertTrue("This is a review" in outbox[0].get_payload(decode=True).decode("utf-8"))
- self.assertTrue(settings.MAILING_LIST_ARCHIVE_URL in review_req.review.external_url)
+ self.assertTrue(settings.MAILING_LIST_ARCHIVE_URL in assignment.review.external_url)
def test_complete_notify_ad_because_team_settings(self):
- review_req, url = self.setup_complete_review_test()
- review_req.team.reviewteamsettings.notify_ad_when.add(ReviewResultName.objects.get(slug='issues'))
+ assignment, url = self.setup_complete_review_test()
+ assignment.review_request.team.reviewteamsettings.notify_ad_when.add(ReviewResultName.objects.get(slug='issues'))
# TODO - it's a little surprising that the factories so far didn't give this doc an ad
- review_req.doc.ad = PersonFactory()
- review_req.doc.save_with_history([DocEvent.objects.create(doc=review_req.doc, rev=review_req.doc.rev, by=review_req.reviewer.person, type='changed_document',desc='added an AD')])
- login_testing_unauthorized(self, review_req.reviewer.person.user.username, url)
+ assignment.review_request.doc.ad = PersonFactory()
+ assignment.review_request.doc.save_with_history([DocEvent.objects.create(doc=assignment.review_request.doc, rev=assignment.review_request.doc.rev, by=assignment.reviewer.person, type='changed_document',desc='added an AD')])
+ login_testing_unauthorized(self, assignment.reviewer.person.user.username, url)
empty_outbox()
r = self.client.post(url, data={
- "result": ReviewResultName.objects.get(reviewteamsettings_review_results_set__group=review_req.team, slug="issues").pk,
+ "result": ReviewResultName.objects.get(reviewteamsettings_review_results_set__group=assignment.review_request.team, slug="issues").pk,
"state": ReviewRequestStateName.objects.get(slug="completed").pk,
- "reviewed_rev": review_req.doc.rev,
+ "reviewed_rev": assignment.review_request.doc.rev,
"review_submission": "enter",
"review_content": "This is a review\nwith two lines",
"review_url": "",
@@ -714,17 +718,17 @@ class ReviewTests(TestCase):
self.assertIn('settings indicated', outbox[-1].get_payload(decode=True).decode("utf-8"))
def test_complete_notify_ad_because_checkbox(self):
- review_req, url = self.setup_complete_review_test()
- review_req.doc.ad = PersonFactory()
- review_req.doc.save_with_history([DocEvent.objects.create(doc=review_req.doc, rev=review_req.doc.rev, by=review_req.reviewer.person, type='changed_document',desc='added an AD')])
- login_testing_unauthorized(self, review_req.reviewer.person.user.username, url)
+ assignment, url = self.setup_complete_review_test()
+ assignment.review_request.doc.ad = PersonFactory()
+ assignment.review_request.doc.save_with_history([DocEvent.objects.create(doc=assignment.review_request.doc, rev=assignment.review_request.doc.rev, by=assignment.reviewer.person, type='changed_document',desc='added an AD')])
+ login_testing_unauthorized(self, assignment.reviewer.person.user.username, url)
empty_outbox()
r = self.client.post(url, data={
- "result": ReviewResultName.objects.get(reviewteamsettings_review_results_set__group=review_req.team, slug="issues").pk,
- "state": ReviewRequestStateName.objects.get(slug="completed").pk,
- "reviewed_rev": review_req.doc.rev,
+ "result": ReviewResultName.objects.get(reviewteamsettings_review_results_set__group=assignment.review_request.team, slug="issues").pk,
+ "state": ReviewAssignmentStateName.objects.get(slug="completed").pk,
+ "reviewed_rev": assignment.review_request.doc.rev,
"review_submission": "enter",
"review_content": "This is a review\nwith two lines",
"review_url": "",
@@ -746,16 +750,16 @@ class ReviewTests(TestCase):
mock.return_value = response
# Run the test
- review_req, url = self.setup_complete_review_test()
+ assignment, url = self.setup_complete_review_test()
- login_testing_unauthorized(self, review_req.reviewer.person.user.username, url)
+ login_testing_unauthorized(self, assignment.reviewer.person.user.username, url)
empty_outbox()
r = self.client.post(url, data={
- "result": ReviewResultName.objects.get(reviewteamsettings_review_results_set__group=review_req.team, slug="ready").pk,
- "state": ReviewRequestStateName.objects.get(slug="completed").pk,
- "reviewed_rev": review_req.doc.rev,
+ "result": ReviewResultName.objects.get(reviewteamsettings_review_results_set__group=assignment.review_request.team, slug="ready").pk,
+ "state": ReviewAssignmentStateName.objects.get(slug="completed").pk,
+ "reviewed_rev": assignment.review_request.doc.rev,
"review_submission": "link",
"review_content": response.content,
"review_url": "http://example.com/testreview/",
@@ -763,27 +767,27 @@ class ReviewTests(TestCase):
})
self.assertEqual(r.status_code, 302)
- review_req = reload_db_objects(review_req)
- self.assertEqual(review_req.state_id, "completed")
+ assignment = reload_db_objects(assignment)
+ self.assertEqual(assignment.state_id, "completed")
- with open(os.path.join(self.review_subdir, review_req.review.name + ".txt")) as f:
+ with open(os.path.join(self.review_subdir, assignment.review.name + ".txt")) as f:
self.assertEqual(f.read(), "This is a review\nwith two lines")
self.assertEqual(len(outbox), 0)
- self.assertTrue("http://example.com" in review_req.review.external_url)
+ self.assertTrue("http://example.com" in assignment.review.external_url)
def test_partially_complete_review(self):
- review_req, url = self.setup_complete_review_test()
+ assignment, url = self.setup_complete_review_test()
- login_testing_unauthorized(self, review_req.reviewer.person.user.username, url)
+ login_testing_unauthorized(self, assignment.reviewer.person.user.username, url)
# partially complete
empty_outbox()
r = self.client.post(url, data={
- "result": ReviewResultName.objects.get(reviewteamsettings_review_results_set__group=review_req.team, slug="ready").pk,
- "state": ReviewRequestStateName.objects.get(slug="part-completed").pk,
- "reviewed_rev": review_req.doc.rev,
+ "result": ReviewResultName.objects.get(reviewteamsettings_review_results_set__group=assignment.review_request.team, slug="ready").pk,
+ "state": ReviewAssignmentStateName.objects.get(slug="part-completed").pk,
+ "reviewed_rev": assignment.review_request.doc.rev,
"review_submission": "enter",
"review_content": "This is a review with a somewhat long line spanning over 80 characters to test word wrapping\nand another line",
})
@@ -791,16 +795,15 @@ class ReviewTests(TestCase):
- review_req = reload_db_objects(review_req)
- self.assertEqual(review_req.state_id, "part-completed")
- self.assertTrue(review_req.doc.rev in review_req.review.name)
+ assignment = reload_db_objects(assignment)
+ self.assertEqual(assignment.state_id, "part-completed")
+ self.assertTrue(assignment.review_request.doc.rev in assignment.review.name)
self.assertEqual(len(outbox), 2)
self.assertTrue("reviewsecretary@example.com" in outbox[0]["To"])
self.assertTrue("partially" in outbox[0]["Subject"].lower())
- self.assertTrue("new review request" in outbox[0].get_payload(decode=True).decode("utf-8"))
- self.assertTrue(review_req.team.list_email in outbox[1]["To"])
+ self.assertTrue(assignment.review_request.team.list_email in outbox[1]["To"])
self.assertTrue("partial review" in outbox[1]["Subject"].lower())
body = outbox[1].get_payload(decode=True).decode("utf-8")
self.assertTrue("This is a review" in body)
@@ -810,30 +813,26 @@ class ReviewTests(TestCase):
self.assertTrue(not any( len(line) > 100 for line in body.splitlines() ))
self.assertTrue(any( len(line) > 80 for line in body.splitlines() ))
- first_review = review_req.review
- first_reviewer = review_req.reviewer
+ first_review = assignment.review
# complete
- review_req = ReviewRequest.objects.get(state="requested", doc=review_req.doc, team=review_req.team)
- self.assertEqual(review_req.reviewer, None)
- review_req.reviewer = first_reviewer # same reviewer, so we can test uniquification
- review_req.save()
+ assignment = assignment.review_request.reviewassignment_set.create(state_id="assigned", reviewer=assignment.reviewer)
- url = urlreverse('ietf.doc.views_review.complete_review', kwargs={ "name": review_req.doc.name, "request_id": review_req.pk })
+ url = urlreverse('ietf.doc.views_review.complete_review', kwargs={ "name": assignment.review_request.doc.name, "assignment_id": assignment.pk })
r = self.client.post(url, data={
- "result": ReviewResultName.objects.get(reviewteamsettings_review_results_set__group=review_req.team, slug="ready").pk,
- "state": ReviewRequestStateName.objects.get(slug="completed").pk,
- "reviewed_rev": review_req.doc.rev,
+ "result": ReviewResultName.objects.get(reviewteamsettings_review_results_set__group=assignment.review_request.team, slug="ready").pk,
+ "state": ReviewAssignmentStateName.objects.get(slug="completed").pk,
+ "reviewed_rev": assignment.review_request.doc.rev,
"review_submission": "enter",
"review_content": "This is another review with a really, really, really, really, really, really, really, really, really, really long line.",
})
self.assertEqual(r.status_code, 302)
- review_req = reload_db_objects(review_req)
- self.assertEqual(review_req.state_id, "completed")
- self.assertTrue(review_req.doc.rev in review_req.review.name)
- second_review = review_req.review
+ assignment = reload_db_objects(assignment)
+ self.assertEqual(assignment.state_id, "completed")
+ self.assertTrue(assignment.review_request.doc.rev in assignment.review.name)
+ second_review = assignment.review
self.assertTrue(first_review.name != second_review.name)
self.assertTrue(second_review.name.endswith("-2")) # uniquified
@@ -845,18 +844,18 @@ class ReviewTests(TestCase):
def test_revise_review_enter_content(self):
- review_req, url = self.setup_complete_review_test()
- review_req.state = ReviewRequestStateName.objects.get(slug="no-response")
- review_req.save()
+ assignment, url = self.setup_complete_review_test()
+ assignment.state = ReviewAssignmentStateName.objects.get(slug="no-response")
+ assignment.save()
- login_testing_unauthorized(self, review_req.reviewer.person.user.username, url)
+ login_testing_unauthorized(self, assignment.reviewer.person.user.username, url)
empty_outbox()
r = self.client.post(url, data={
- "result": ReviewResultName.objects.get(reviewteamsettings_review_results_set__group=review_req.team, slug="ready").pk,
- "state": ReviewRequestStateName.objects.get(slug="completed").pk,
- "reviewed_rev": review_req.doc.rev,
+ "result": ReviewResultName.objects.get(reviewteamsettings_review_results_set__group=assignment.review_request.team, slug="ready").pk,
+ "state": ReviewAssignmentStateName.objects.get(slug="completed").pk,
+ "reviewed_rev": assignment.review_request.doc.rev,
"review_submission": "enter",
"review_content": "This is a review\nwith two lines",
"review_url": "",
@@ -866,12 +865,12 @@ class ReviewTests(TestCase):
})
self.assertEqual(r.status_code, 302)
- review_req = reload_db_objects(review_req)
- self.assertEqual(review_req.state_id, "completed")
- event = ReviewRequestDocEvent.objects.get(type="closed_review_request", review_request=review_req)
+ assignment = reload_db_objects(assignment)
+ self.assertEqual(assignment.state_id, "completed")
+ event = ReviewAssignmentDocEvent.objects.get(type="closed_review_request", review_assignment=assignment)
self.assertEqual(event.time, datetime.datetime(2012, 12, 24, 12, 13, 14))
- with open(os.path.join(self.review_subdir, review_req.review.name + ".txt")) as f:
+ with open(os.path.join(self.review_subdir, assignment.review.name + ".txt")) as f:
self.assertEqual(f.read(), "This is a review\nwith two lines")
self.assertEqual(len(outbox), 0)
@@ -879,9 +878,9 @@ class ReviewTests(TestCase):
# revise again
empty_outbox()
r = self.client.post(url, data={
- "result": ReviewResultName.objects.get(reviewteamsettings_review_results_set__group=review_req.team, slug="ready").pk,
- "state": ReviewRequestStateName.objects.get(slug="part-completed").pk,
- "reviewed_rev": review_req.doc.rev,
+ "result": ReviewResultName.objects.get(reviewteamsettings_review_results_set__group=assignment.review_request.team, slug="ready").pk,
+ "state": ReviewAssignmentStateName.objects.get(slug="part-completed").pk,
+ "reviewed_rev": assignment.review_request.doc.rev,
"review_submission": "enter",
"review_content": "This is a revised review",
"review_url": "",
@@ -891,9 +890,9 @@ class ReviewTests(TestCase):
})
self.assertEqual(r.status_code, 302)
- review_req = reload_db_objects(review_req)
- self.assertEqual(review_req.review.rev, "01")
- event = ReviewRequestDocEvent.objects.get(type="closed_review_request", review_request=review_req)
+ assignment = reload_db_objects(assignment)
+ self.assertEqual(assignment.review.rev, "01")
+ event = ReviewAssignmentDocEvent.objects.get(type="closed_review_request", review_assignment=assignment)
self.assertEqual(event.time, datetime.datetime(2013, 12, 24, 11, 11, 11))
self.assertEqual(len(outbox), 0)
@@ -903,7 +902,8 @@ class ReviewTests(TestCase):
review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="review", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut"))
rev_role = RoleFactory(group=review_team,person__user__username='reviewer',person__user__email='reviewer@example.com',name_id='reviewer')
RoleFactory(group=review_team,person__user__username='reviewsecretary',person__user__email='reviewsecretary@example.com',name_id='secr')
- review_req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='accepted',requested_by=rev_role.person,reviewer=rev_role.person.email_set.first(),deadline=datetime.datetime.now()+datetime.timedelta(days=20))
+ review_req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='assigned',requested_by=rev_role.person,deadline=datetime.datetime.now()+datetime.timedelta(days=20))
+ ReviewAssignmentFactory(review_request = review_req, reviewer = rev_role.person.email_set.first(), state_id='accepted')
url = urlreverse('ietf.doc.views_review.edit_comment', kwargs={ "name": doc.name, "request_id": review_req.pk })
@@ -924,7 +924,8 @@ class ReviewTests(TestCase):
review_team = ReviewTeamFactory(acronym="reviewteam", name="Review Team", type_id="review", list_email="reviewteam@ietf.org", parent=Group.objects.get(acronym="farfut"))
rev_role = RoleFactory(group=review_team,person__user__username='reviewer',person__user__email='reviewer@example.com',name_id='reviewer')
RoleFactory(group=review_team,person__user__username='reviewsecretary',person__user__email='reviewsecretary@example.com',name_id='secr')
- review_req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='accepted',requested_by=rev_role.person,reviewer=rev_role.person.email_set.first(),deadline=datetime.datetime.now()+datetime.timedelta(days=20))
+ review_req = ReviewRequestFactory(doc=doc,team=review_team,type_id='early',state_id='accepted',requested_by=rev_role.person,deadline=datetime.datetime.now()+datetime.timedelta(days=20))
+ ReviewAssignmentFactory(review_request = review_req, reviewer = rev_role.person.email_set.first(), state_id='accepted')
url = urlreverse('ietf.doc.views_review.edit_deadline', kwargs={ "name": doc.name, "request_id": review_req.pk })
@@ -942,3 +943,34 @@ class ReviewTests(TestCase):
review_req = reload_db_objects(review_req)
self.assertEqual(review_req.deadline,new_deadline)
self.assertTrue('Deadline changed' in outbox[-1]['Subject'])
+
+ def test_mark_no_response(self):
+ assignment = ReviewAssignmentFactory()
+ secr = RoleFactory(group=assignment.review_request.team,person__user__username='reviewsecretary',person__user__email='reviewsecretary@example.com',name_id='secr').person
+ url = urlreverse('ietf.doc.views_review.mark_reviewer_assignment_no_response', kwargs={"name": assignment.review_request.doc.name, "assignment_id": assignment.pk})
+
+ login_testing_unauthorized(self, secr.user.username, url)
+ r = self.client.get(url)
+ self.assertEqual(r.status_code, 200)
+
+ r=self.client.post(url, data={"action":"noresponse"})
+ self.assertEqual(r.status_code, 302)
+
+ assignment = reload_db_objects(assignment)
+ self.assertEqual(assignment.state_id, 'no-response')
+
+ def test_withdraw_assignment(self):
+ assignment = ReviewAssignmentFactory()
+ secr = RoleFactory(group=assignment.review_request.team,person__user__username='reviewsecretary',person__user__email='reviewsecretary@example.com',name_id='secr').person
+ url = urlreverse('ietf.doc.views_review.withdraw_reviewer_assignment', kwargs={"name": assignment.review_request.doc.name, "assignment_id": assignment.pk})
+
+ login_testing_unauthorized(self, secr.user.username, url)
+ r = self.client.get(url)
+ self.assertEqual(r.status_code, 200)
+
+ r=self.client.post(url, data={"action":"withdraw"})
+ self.assertEqual(r.status_code, 302)
+
+ assignment = reload_db_objects(assignment)
+ self.assertEqual(assignment.state_id, 'withdrawn')
+
diff --git a/ietf/doc/urls_review.py b/ietf/doc/urls_review.py
index d3cba6ffa..23b217c50 100644
--- a/ietf/doc/urls_review.py
+++ b/ietf/doc/urls_review.py
@@ -7,9 +7,11 @@ urlpatterns = [
url(r'^(?P[0-9]+)/login/$', views_review.review_request_forced_login),
url(r'^(?P[0-9]+)/close/$', views_review.close_request),
url(r'^(?P[0-9]+)/assignreviewer/$', views_review.assign_reviewer),
- url(r'^(?P[0-9]+)/rejectreviewerassignment/$', views_review.reject_reviewer_assignment),
- url(r'^(?P[0-9]+)/complete/$', views_review.complete_review),
- url(r'^(?P[0-9]+)/searchmailarchive/$', views_review.search_mail_archive),
+ url(r'^(?P[0-9]+)/rejectreviewerassignment/$', views_review.reject_reviewer_assignment),
+ url(r'^(?P[0-9]+)/complete/$', views_review.complete_review),
+ url(r'^(?P[0-9]+)/withdraw/$', views_review.withdraw_reviewer_assignment),
+ url(r'^(?P[0-9]+)/noresponse/$', views_review.mark_reviewer_assignment_no_response),
+ url(r'^(?P[0-9]+)/searchmailarchive/$', views_review.search_mail_archive),
url(r'^(?P[0-9]+)/editcomment/$', views_review.edit_comment),
url(r'^(?P[0-9]+)/editdeadline/$', views_review.edit_deadline),
]
diff --git a/ietf/doc/utils_search.py b/ietf/doc/utils_search.py
index 6b61d73db..31b365e27 100644
--- a/ietf/doc/utils_search.py
+++ b/ietf/doc/utils_search.py
@@ -103,7 +103,7 @@ def fill_in_document_table_attributes(docs, have_telechat_date=False):
if d.get_state_slug() != "rfc":
d.milestones = [ m for (t, m) in sorted(((m.time, m) for m in d.groupmilestone_set.all() if m.state_id == "active")) ]
- d.reviewed_by_teams = sorted(set(r.team.acronym for r in d.reviewrequest_set.filter(state__in=["requested","accepted","part-completed","completed"]).distinct().select_related('team')))
+ d.reviewed_by_teams = sorted(set(r.team.acronym for r in d.reviewrequest_set.filter(state__in=["assigned","accepted","part-completed","completed"]).distinct().select_related('team')))
e = d.latest_event_cache.get('started_iesg_process', None)
d.balloting_started = e.time if e else datetime.datetime.min
diff --git a/ietf/doc/views_doc.py b/ietf/doc/views_doc.py
index e4166edd5..e9597a506 100644
--- a/ietf/doc/views_doc.py
+++ b/ietf/doc/views_doc.py
@@ -64,8 +64,8 @@ from ietf.doc.mails import email_comment
from ietf.mailtrigger.utils import gather_relevant_expansions
from ietf.meeting.models import Session
from ietf.meeting.utils import group_sessions, get_upcoming_manageable_sessions, sort_sessions
-from ietf.review.models import ReviewRequest
-from ietf.review.utils import can_request_review_of_doc, review_requests_to_list_for_docs
+from ietf.review.models import ReviewAssignment
+from ietf.review.utils import can_request_review_of_doc, review_assignments_to_list_for_docs
from ietf.review.utils import no_review_from_teams_on_doc
from ietf.utils import markup_txt, log
from ietf.utils.text import maybe_split
@@ -382,7 +382,7 @@ def document_main(request, name, rev=None):
published = doc.latest_event(type="published_rfc")
started_iesg_process = doc.latest_event(type="started_iesg_process")
- review_requests = review_requests_to_list_for_docs([doc]).get(doc.pk, [])
+ review_assignments = review_assignments_to_list_for_docs([doc]).get(doc.pk, [])
no_review_from_teams = no_review_from_teams_on_doc(doc, rev or doc.rev)
return render(request, "doc/document_draft.html",
@@ -446,7 +446,7 @@ def document_main(request, name, rev=None):
search_archive=search_archive,
actions=actions,
presentations=presentations,
- review_requests=review_requests,
+ review_assignments=review_assignments,
no_review_from_teams=no_review_from_teams,
))
@@ -598,11 +598,11 @@ def document_main(request, name, rev=None):
# If we want to go back to using markup_txt.markup_unicode, call it explicitly here like this:
# content = markup_txt.markup_unicode(content, split=False, width=80)
- review_req = ReviewRequest.objects.filter(review=doc.name).first()
+ review_assignment = ReviewAssignment.objects.filter(review=doc.name).first()
other_reviews = []
- if review_req:
- other_reviews = [r for r in review_requests_to_list_for_docs([review_req.doc]).get(doc.pk, []) if r != review_req]
+ if review_assignment:
+ other_reviews = [r for r in review_assignments_to_list_for_docs([review_assignment.review_request.doc]).get(doc.pk, []) if r != review_assignment]
return render(request, "doc/document_review.html",
dict(doc=doc,
@@ -611,7 +611,7 @@ def document_main(request, name, rev=None):
revisions=revisions,
latest_rev=latest_rev,
snapshot=snapshot,
- review_req=review_req,
+ review_req=review_assignment.review_request,
other_reviews=other_reviews,
))
diff --git a/ietf/doc/views_review.py b/ietf/doc/views_review.py
index 9103a65c1..fb5a55039 100644
--- a/ietf/doc/views_review.py
+++ b/ietf/doc/views_review.py
@@ -20,9 +20,9 @@ from django.template.loader import render_to_string, TemplateDoesNotExist
from django.urls import reverse as urlreverse
from ietf.doc.models import (Document, NewRevisionDocEvent, State, DocAlias,
- LastCallDocEvent, ReviewRequestDocEvent, DocumentAuthor)
-from ietf.name.models import ReviewRequestStateName, ReviewResultName, DocTypeName
-from ietf.review.models import ReviewRequest
+ LastCallDocEvent, ReviewRequestDocEvent, ReviewAssignmentDocEvent, DocumentAuthor)
+from ietf.name.models import ReviewRequestStateName, ReviewAssignmentStateName, ReviewResultName, DocTypeName
+from ietf.review.models import ReviewRequest, ReviewAssignment
from ietf.group.models import Group
from ietf.ietfauth.utils import is_authorized_in_doc_stream, user_is_person, has_role
from ietf.message.models import Message
@@ -30,9 +30,9 @@ from ietf.message.utils import infer_message
from ietf.person.fields import PersonEmailChoiceField, SearchablePersonField
from ietf.review.utils import (active_review_teams, assign_review_request_to_reviewer,
can_request_review_of_doc, can_manage_review_requests_for_team,
- email_review_request_change, make_new_review_request_from_existing,
- close_review_request_states, close_review_request,
- setup_reviewer_field)
+ email_review_assignment_change, email_review_request_change,
+ close_review_request_states,
+ close_review_request, setup_reviewer_field)
from ietf.review import mailarch
from ietf.utils.fields import DatepickerDateField
from ietf.utils.text import strip_prefix, xslugify
@@ -184,47 +184,50 @@ def review_request(request, name, request_id):
doc = get_object_or_404(Document, name=name)
review_req = get_object_or_404(ReviewRequest, pk=request_id)
- is_reviewer = review_req.reviewer and user_is_person(request.user, review_req.reviewer.person)
can_manage_request = can_manage_review_requests_for_team(request.user, review_req.team)
- can_close_request = (review_req.state_id in ["requested", "accepted"]
+ can_close_request = (review_req.state_id in ["requested", "assigned"]
and (is_authorized_in_doc_stream(request.user, doc)
or can_manage_request))
- can_assign_reviewer = (review_req.state_id in ["requested", "accepted"]
+ can_assign_reviewer = (review_req.state_id in ["requested", "assigned"]
and can_manage_request)
- can_accept_reviewer_assignment = (review_req.state_id == "requested"
- and review_req.reviewer
- and (is_reviewer or can_manage_request))
-
- can_reject_reviewer_assignment = (review_req.state_id in ["requested", "accepted"]
- and review_req.reviewer
- and (is_reviewer or can_manage_request))
-
- can_complete_review = (review_req.state_id in ["requested", "accepted", "overtaken", "no-response", "part-completed", "completed"]
- and review_req.reviewer
- and (is_reviewer or can_manage_request))
-
can_edit_comment = can_request_review_of_doc(request.user, doc)
+
can_edit_deadline = can_edit_comment
- if request.method == "POST" and request.POST.get("action") == "accept" and can_accept_reviewer_assignment:
- review_req.state = ReviewRequestStateName.objects.get(slug="accepted")
- review_req.save()
+ assignments = review_req.reviewassignment_set.all()
+ for assignment in assignments:
+ assignment.is_reviewer = user_is_person(request.user, assignment.reviewer.person)
+ assignment.can_accept_reviewer_assignment = (assignment.state_id == "assigned"
+ and (assignment.is_reviewer or can_manage_request))
+
+ assignment.can_reject_reviewer_assignment = (assignment.state_id in ["assigned", "accepted"]
+ and (assignment.is_reviewer or can_manage_request))
+
+ assignment.can_complete_review = (assignment.state_id in ["assigned", "accepted", "overtaken", "no-response", "part-completed", "completed"]
+ and (assignment.is_reviewer or can_manage_request))
+
+ # This implementation means if a reviewer accepts one assignment for a review_request, he accepts all assigned to him (for that request)
+ # This problematic - it's a bug (probably) for the same person to have more than one assignment for the same request.
+ # It is, however unintuitive, and acceptance should be refactored to be something that works on assignments, not requests
+ if request.method == "POST" and request.POST.get("action") == "accept":
+ for assignment in assignments:
+ if assignment.can_accept_reviewer_assignment:
+ assignment.state = ReviewAssignmentStateName.objects.get(slug="accepted")
+ assignment.save()
return redirect(review_request, name=review_req.doc.name, request_id=review_req.pk)
return render(request, 'doc/review/review_request.html', {
'doc': doc,
'review_req': review_req,
'can_close_request': can_close_request,
- 'can_reject_reviewer_assignment': can_reject_reviewer_assignment,
'can_assign_reviewer': can_assign_reviewer,
- 'can_accept_reviewer_assignment': can_accept_reviewer_assignment,
- 'can_complete_review': can_complete_review,
'can_edit_comment': can_edit_comment,
'can_edit_deadline': can_edit_deadline,
+ 'assignments': assignments,
})
@@ -245,7 +248,7 @@ class CloseReviewRequestForm(forms.Form):
@login_required
def close_request(request, name, request_id):
doc = get_object_or_404(Document, name=name)
- review_req = get_object_or_404(ReviewRequest, pk=request_id, state__in=["requested", "accepted"])
+ review_req = get_object_or_404(ReviewRequest, pk=request_id, state__in=["requested", "assigned"])
can_request = is_authorized_in_doc_stream(request.user, doc)
can_manage_request = can_manage_review_requests_for_team(request.user, review_req.team)
@@ -265,12 +268,13 @@ def close_request(request, name, request_id):
return render(request, 'doc/review/close_request.html', {
'doc': doc,
'review_req': review_req,
+ 'assignments': review_req.reviewassignment_set.all(),
'form': form,
})
class AssignReviewerForm(forms.Form):
- reviewer = PersonEmailChoiceField(empty_label="(None)", required=False)
+ reviewer = PersonEmailChoiceField(label="Assign Additional Reviewer", empty_label="(None)", required=False)
add_skip = forms.BooleanField(label='Skip next time', required=False)
def __init__(self, review_req, *args, **kwargs):
@@ -281,7 +285,7 @@ class AssignReviewerForm(forms.Form):
@login_required
def assign_reviewer(request, name, request_id):
doc = get_object_or_404(Document, name=name)
- review_req = get_object_or_404(ReviewRequest, pk=request_id, state__in=["requested", "accepted"])
+ review_req = get_object_or_404(ReviewRequest, pk=request_id, state__in=["requested", "assigned"])
if not can_manage_review_requests_for_team(request.user, review_req.team):
return HttpResponseForbidden("You do not have permission to perform this action")
@@ -300,6 +304,7 @@ def assign_reviewer(request, name, request_id):
return render(request, 'doc/review/assign_reviewer.html', {
'doc': doc,
'review_req': review_req,
+ 'assignments': review_req.reviewassignment_set.all(),
'form': form,
})
@@ -307,15 +312,15 @@ class RejectReviewerAssignmentForm(forms.Form):
message_to_secretary = forms.CharField(widget=forms.Textarea, required=False, help_text="Optional explanation of rejection, will be emailed to team secretary if filled in", strip=False)
@login_required
-def reject_reviewer_assignment(request, name, request_id):
+def reject_reviewer_assignment(request, name, assignment_id):
doc = get_object_or_404(Document, name=name)
- review_req = get_object_or_404(ReviewRequest, pk=request_id, state__in=["requested", "accepted"])
+ review_assignment = get_object_or_404(ReviewAssignment, pk=assignment_id, state__in=["assigned", "accepted"])
- if not review_req.reviewer:
- return redirect(review_request, name=review_req.doc.name, request_id=review_req.pk)
+ if not review_assignment.reviewer:
+ return redirect(review_request, name=review_assignment.review_request.doc.name, request_id=review_assignment.review_request.pk)
- is_reviewer = user_is_person(request.user, review_req.reviewer.person)
- can_manage_request = can_manage_review_requests_for_team(request.user, review_req.team)
+ is_reviewer = user_is_person(request.user, review_assignment.reviewer.person)
+ can_manage_request = can_manage_review_requests_for_team(request.user, review_assignment.review_request.team)
if not (is_reviewer or can_manage_request):
return HttpResponseForbidden("You do not have permission to perform this action")
@@ -323,47 +328,119 @@ def reject_reviewer_assignment(request, name, request_id):
if request.method == "POST" and request.POST.get("action") == "reject":
form = RejectReviewerAssignmentForm(request.POST)
if form.is_valid():
- # reject the request
- review_req.state = ReviewRequestStateName.objects.get(slug="rejected")
- review_req.save()
+ # reject the assignment
+ review_assignment.state = ReviewAssignmentStateName.objects.get(slug="rejected")
+ review_assignment.save()
- ReviewRequestDocEvent.objects.create(
+ ReviewAssignmentDocEvent.objects.create(
type="closed_review_request",
- doc=review_req.doc,
- rev=review_req.doc.rev,
+ doc=review_assignment.review_request.doc,
+ rev=review_assignment.review_request.doc.rev,
by=request.user.person,
desc="Assignment of request for {} review by {} to {} was rejected".format(
- review_req.type.name,
- review_req.team.acronym.upper(),
- review_req.reviewer.person,
+ review_assignment.review_request.type.name,
+ review_assignment.review_request.team.acronym.upper(),
+ review_assignment.reviewer.person,
),
- review_request=review_req,
- state=review_req.state,
+ review_assignment=review_assignment,
+ state=review_assignment.state,
)
- # make a new unassigned review request
- new_review_req = make_new_review_request_from_existing(review_req)
- new_review_req.save()
-
msg = render_to_string("review/reviewer_assignment_rejected.txt", {
"by": request.user.person,
"message_to_secretary": form.cleaned_data.get("message_to_secretary")
})
- email_review_request_change(request, review_req, "Reviewer assignment rejected", msg, by=request.user.person, notify_secretary=True, notify_reviewer=True, notify_requested_by=False)
+ email_review_assignment_change(request, review_assignment, "Reviewer assignment rejected", msg, by=request.user.person, notify_secretary=True, notify_reviewer=True, notify_requested_by=False)
- return redirect(review_request, name=new_review_req.doc.name, request_id=new_review_req.pk)
+ return redirect(review_request, name=review_assignment.review_request.doc.name, request_id=review_assignment.review_request.pk)
else:
form = RejectReviewerAssignmentForm()
return render(request, 'doc/review/reject_reviewer_assignment.html', {
'doc': doc,
- 'review_req': review_req,
+ 'review_req': review_assignment.review_request,
+ 'assignments': review_assignment.review_request.reviewassignment_set.all(),
'form': form,
})
+@login_required
+def withdraw_reviewer_assignment(request, name, assignment_id):
+ get_object_or_404(Document, name=name)
+ review_assignment = get_object_or_404(ReviewAssignment, pk=assignment_id, state__in=["assigned", "accepted"])
+
+ can_manage_request = can_manage_review_requests_for_team(request.user, review_assignment.review_request.team)
+ if not can_manage_request:
+ return HttpResponseForbidden("You do not have permission to perform this action")
+
+ if request.method == "POST" and request.POST.get("action") == "withdraw":
+ review_assignment.state_id = 'withdrawn'
+ review_assignment.save()
+
+ ReviewAssignmentDocEvent.objects.create(
+ type="closed_review_request",
+ doc=review_assignment.review_request.doc,
+ rev=review_assignment.review_request.doc.rev,
+ by=request.user.person,
+ desc="Assignment of request for {} review by {} to {} was withdrawn".format(
+ review_assignment.review_request.type.name,
+ review_assignment.review_request.team.acronym.upper(),
+ review_assignment.reviewer.person,
+ ),
+ review_assignment=review_assignment,
+ state=review_assignment.state,
+ )
+
+ msg = "Review assignment withdrawn by %s"%request.user.person
+
+ email_review_assignment_change(request, review_assignment, "Reviewer assignment withdrawn", msg, by=request.user.person, notify_secretary=True, notify_reviewer=True, notify_requested_by=False)
+
+ return redirect(review_request, name=review_assignment.review_request.doc.name, request_id=review_assignment.review_request.pk)
+
+ return render(request, 'doc/review/withdraw_reviewer_assignment.html', {
+ 'assignment': review_assignment,
+ })
+
+@login_required
+def mark_reviewer_assignment_no_response(request, name, assignment_id):
+ get_object_or_404(Document, name=name)
+ review_assignment = get_object_or_404(ReviewAssignment, pk=assignment_id, state__in=["assigned", "accepted"])
+
+ can_manage_request = can_manage_review_requests_for_team(request.user, review_assignment.review_request.team)
+ if not can_manage_request:
+ return HttpResponseForbidden("You do not have permission to perform this action")
+
+ if request.method == "POST" and request.POST.get("action") == "noresponse":
+ review_assignment.state_id = 'no-response'
+ review_assignment.save()
+
+ ReviewAssignmentDocEvent.objects.create(
+ type="closed_review_request",
+ doc=review_assignment.review_request.doc,
+ rev=review_assignment.review_request.doc.rev,
+ by=request.user.person,
+ desc="Assignment of request for {} review by {} to {} was marked no-response".format(
+ review_assignment.review_request.type.name,
+ review_assignment.review_request.team.acronym.upper(),
+ review_assignment.reviewer.person,
+ ),
+ review_assignment=review_assignment,
+ state=review_assignment.state,
+ )
+
+ msg = "Review assignment marked 'No Response' by %s"%request.user.person
+
+ email_review_assignment_change(request, review_assignment, "Reviewer assignment marked no-response", msg, by=request.user.person, notify_secretary=True, notify_reviewer=True, notify_requested_by=False)
+
+ return redirect(review_request, name=review_assignment.review_request.doc.name, request_id=review_assignment.review_request.pk)
+
+ return render(request, 'doc/review/mark_reviewer_assignment_no_response.html', {
+ 'assignment': review_assignment,
+ })
+
+
class CompleteReviewForm(forms.Form):
- state = forms.ModelChoiceField(queryset=ReviewRequestStateName.objects.filter(slug__in=("completed", "part-completed")).order_by("-order"), widget=forms.RadioSelect, initial="completed")
+ state = forms.ModelChoiceField(queryset=ReviewAssignmentStateName.objects.filter(slug__in=("completed", "part-completed")).order_by("-order"), widget=forms.RadioSelect, initial="completed")
reviewed_rev = forms.CharField(label="Reviewed revision", max_length=4)
result = forms.ModelChoiceField(queryset=ReviewResultName.objects.filter(used=True), widget=forms.RadioSelect, empty_label=None)
ACTIONS = [
@@ -381,16 +458,16 @@ class CompleteReviewForm(forms.Form):
cc = MultiEmailField(required=False, help_text="Email addresses to send to in addition to the review team list")
email_ad = forms.BooleanField(label="Send extra email to the responsible AD suggesting early attention", required=False)
- def __init__(self, review_req, is_reviewer, *args, **kwargs):
- self.review_req = review_req
+ def __init__(self, assignment, is_reviewer, *args, **kwargs):
+ self.assignment = assignment
super(CompleteReviewForm, self).__init__(*args, **kwargs)
- doc = self.review_req.doc
+ doc = self.assignment.review_request.doc
known_revisions = NewRevisionDocEvent.objects.filter(doc=doc).order_by("time", "id").values_list("rev", "time", flat=False)
- revising_review = review_req.state_id not in ["requested", "accepted"]
+ revising_review = assignment.state_id not in ["assigned", "accepted"]
if not revising_review:
self.fields["state"].choices = [
@@ -402,7 +479,7 @@ class CompleteReviewForm(forms.Form):
reviewed_rev_class = []
for r in known_revisions:
last_version = r[0]
- if r[1] < review_req.time:
+ if r[1] < assignment.review_request.time:
kwargs["initial"]["reviewed_rev"] = r[0]
reviewed_rev_class.append('reviewer-doc-past')
else:
@@ -426,13 +503,13 @@ class CompleteReviewForm(forms.Form):
" ".join("{1} ".format('', *r)
for i, r in enumerate(known_revisions)))
- self.fields["result"].queryset = self.fields["result"].queryset.filter(reviewteamsettings_review_results_set__group=review_req.team)
+ self.fields["result"].queryset = self.fields["result"].queryset.filter(reviewteamsettings_review_results_set__group=assignment.review_request.team)
def format_submission_choice(label):
if revising_review:
label = label.replace(" (automatically posts to {mailing_list})", "")
- return label.format(mailing_list=review_req.team.list_email or "[error: team has no mailing list set]")
+ return label.format(mailing_list=assignment.review_request.team.list_email or "[error: team has no mailing list set]")
self.fields["review_submission"].choices = [ (k, format_submission_choice(label)) for k, label in self.fields["review_submission"].choices]
@@ -443,7 +520,7 @@ class CompleteReviewForm(forms.Form):
del self.fields["completion_time"]
def clean_reviewed_rev(self):
- return clean_doc_revision(self.review_req.doc, self.cleaned_data.get("reviewed_rev"))
+ return clean_doc_revision(self.assignment.review_request.doc, self.cleaned_data.get("reviewed_rev"))
def clean_review_content(self):
return self.cleaned_data["review_content"].replace("\r", "")
@@ -461,7 +538,7 @@ class CompleteReviewForm(forms.Form):
return url
def clean(self):
- if "@" in self.review_req.reviewer.person.ascii:
+ if "@" in self.assignment.reviewer.person.ascii:
raise forms.ValidationError("Reviewer name must be filled in (the ASCII version is currently \"{}\" - since it contains an @ sign the name is probably still the original email address).".format(self.review_req.reviewer.person.ascii))
def require_field(f):
@@ -477,40 +554,37 @@ class CompleteReviewForm(forms.Form):
require_field("review_url")
@login_required
-def complete_review(request, name, request_id):
+def complete_review(request, name, assignment_id):
doc = get_object_or_404(Document, name=name)
- review_req = get_object_or_404(ReviewRequest, pk=request_id)
+ assignment = get_object_or_404(ReviewAssignment, pk=assignment_id)
- revising_review = review_req.state_id not in ["requested", "accepted"]
+ revising_review = assignment.state_id not in ["assigned", "accepted"]
- if not review_req.reviewer:
- return redirect(review_request, name=review_req.doc.name, request_id=review_req.pk)
-
- is_reviewer = user_is_person(request.user, review_req.reviewer.person)
- can_manage_request = can_manage_review_requests_for_team(request.user, review_req.team)
+ is_reviewer = user_is_person(request.user, assignment.reviewer.person)
+ can_manage_request = can_manage_review_requests_for_team(request.user, assignment.review_request.team)
if not (is_reviewer or can_manage_request):
return HttpResponseForbidden("You do not have permission to perform this action")
- (to, cc) = gather_address_lists('review_completed',review_req = review_req)
+ (to, cc) = gather_address_lists('review_completed', review_req = assignment.review_request)
if request.method == "POST":
- form = CompleteReviewForm(review_req, is_reviewer,
+ form = CompleteReviewForm(assignment, is_reviewer,
request.POST, request.FILES)
if form.is_valid():
review_submission = form.cleaned_data['review_submission']
- review = review_req.review
+ review = assignment.review
if not review:
# create review doc
for i in range(1, 100):
name_components = [
"review",
- strip_prefix(review_req.doc.name, "draft-"),
+ strip_prefix(assignment.review_request.doc.name, "draft-"),
form.cleaned_data["reviewed_rev"],
- review_req.team.acronym,
- review_req.type.slug,
- xslugify(review_req.reviewer.person.ascii_parts()[3]),
+ assignment.review_request.team.acronym,
+ assignment.review_request.type.slug,
+ xslugify(assignment.reviewer.person.ascii_parts()[3]),
datetime.date.today().isoformat(),
]
if i > 1:
@@ -523,10 +597,10 @@ def complete_review(request, name, request_id):
break
review.type = DocTypeName.objects.get(slug="review")
- review.group = review_req.team
+ review.group = assignment.review_request.team
review.rev = "00" if not review.rev else "{:02}".format(int(review.rev) + 1)
- review.title = "{} Review of {}-{}".format(review_req.type.name, review_req.doc.name, form.cleaned_data["reviewed_rev"])
+ review.title = "{} Review of {}-{}".format(assignment.review_request.type.name, assignment.review_request.doc.name, form.cleaned_data["reviewed_rev"])
review.time = datetime.datetime.now()
if review_submission == "link":
review.external_url = form.cleaned_data['review_url']
@@ -554,63 +628,55 @@ def complete_review(request, name, request_id):
with open(filename, 'wb') as destination:
destination.write(encoded_content)
- # close review request
- review_req.state = form.cleaned_data["state"]
- review_req.reviewed_rev = form.cleaned_data["reviewed_rev"]
- review_req.result = form.cleaned_data["result"]
- review_req.review = review
- review_req.save()
-
- need_to_email_review = review_submission != "link" and review_req.team.list_email and not revising_review
-
- desc = "Request for {} review by {} {}: {}. Reviewer: {}.".format(
- review_req.type.name,
- review_req.team.acronym.upper(),
- review_req.state.name,
- review_req.result.name,
- review_req.reviewer.person,
- )
- if need_to_email_review:
- desc += " " + "Sent review to list."
-
completion_datetime = datetime.datetime.now()
if "completion_date" in form.cleaned_data:
completion_datetime = datetime.datetime.combine(form.cleaned_data["completion_date"], form.cleaned_data.get("completion_time") or datetime.time.min)
- close_event = ReviewRequestDocEvent.objects.filter(type="closed_review_request", review_request=review_req).first()
- if not close_event:
- close_event = ReviewRequestDocEvent(type="closed_review_request", review_request=review_req)
+ # complete assignment
+ assignment.state = form.cleaned_data["state"]
+ assignment.reviewed_rev = form.cleaned_data["reviewed_rev"]
+ assignment.result = form.cleaned_data["result"]
+ assignment.review = review
+ assignment.completed_on = completion_datetime
+ assignment.save()
- close_event.doc = review_req.doc
- close_event.rev = review_req.doc.rev
+ need_to_email_review = review_submission != "link" and assignment.review_request.team.list_email and not revising_review
+
+ desc = "Request for {} review by {} {}: {}. Reviewer: {}.".format(
+ assignment.review_request.type.name,
+ assignment.review_request.team.acronym.upper(),
+ assignment.state.name,
+ assignment.result.name,
+ assignment.reviewer.person,
+ )
+ if need_to_email_review:
+ desc += " " + "Sent review to list."
+
+ close_event = ReviewAssignmentDocEvent.objects.filter(type="closed_review_request", review_assignment=assignment).first()
+ if not close_event:
+ close_event = ReviewAssignmentDocEvent(type="closed_review_request", review_assignment=assignment)
+
+ close_event.doc = assignment.review_request.doc
+ close_event.rev = assignment.review_request.doc.rev
close_event.by = request.user.person
close_event.desc = desc
- close_event.state = review_req.state
+ close_event.state = assignment.state
close_event.time = completion_datetime
close_event.save()
- if review_req.state_id == "part-completed" and not revising_review:
- existing_open_reqs = ReviewRequest.objects.filter(doc=review_req.doc, team=review_req.team, state__in=("requested", "accepted"))
+ if assignment.state_id == "part-completed" and not revising_review:
+ existing_assignments = ReviewAssignment.objects.filter(review_request__doc=assignment.review_request.doc, review_request__team=assignment.review_request.team, state__in=("assigned", "accepted", "completed"))
- new_review_req_url = new_review_req = None
- if not existing_open_reqs:
- new_review_req = make_new_review_request_from_existing(review_req)
- new_review_req.save()
-
- new_review_req_url = urlreverse("ietf.doc.views_review.review_request", kwargs={ "name": new_review_req.doc.name, "request_id": new_review_req.pk })
- new_review_req_url = request.build_absolute_uri(new_review_req_url)
-
- subject = "Review of {}-{} completed partially".format(review_req.doc.name, review_req.reviewed_rev)
+ subject = "Review of {}-{} completed partially".format(assignment.review_request.doc.name, assignment.reviewed_rev)
msg = render_to_string("review/partially_completed_review.txt", {
- "new_review_req_url": new_review_req_url,
- "existing_open_reqs": existing_open_reqs,
+ "existing_assignments": existing_assignments,
"by": request.user.person,
})
- email_review_request_change(request, review_req, subject, msg, request.user.person, notify_secretary=True, notify_reviewer=False, notify_requested_by=False)
+ email_review_assignment_change(request, assignment, subject, msg, request.user.person, notify_secretary=True, notify_reviewer=False, notify_requested_by=False)
- role = request.user.person.role_set.filter(group=review_req.team,name='reviewer').first()
+ role = request.user.person.role_set.filter(group=assignment.review_request.team,name='reviewer').first()
if role and role.email.active:
author_email = role.email
frm = role.formatted_email()
@@ -621,10 +687,10 @@ def complete_review(request, name, request_id):
if need_to_email_review:
# email the review
- subject = "{} {} {} of {}-{}".format(review_req.team.acronym.capitalize(),review_req.type.name.lower(),"partial review" if review_req.state_id == "part-completed" else "review", review_req.doc.name, review_req.reviewed_rev)
- related_groups = [ review_req.team, ]
- if review_req.doc.group:
- related_groups.append(review_req.doc.group)
+ subject = "{} {} {} of {}-{}".format(assignment.review_request.team.acronym.capitalize(),assignment.review_request.type.name.lower(),"partial review" if assignment.state_id == "part-completed" else "review", assignment.review_request.doc.name, assignment.reviewed_rev)
+ related_groups = [ assignment.review_request.team, ]
+ if assignment.review_request.doc.group:
+ related_groups.append(assignment.review_request.doc.group)
msg = Message.objects.create(
by=request.user.person,
subject=subject,
@@ -632,26 +698,26 @@ def complete_review(request, name, request_id):
to=", ".join(to),
cc=form.cleaned_data["cc"],
body = render_to_string("review/completed_review.txt", {
- "review_req": review_req,
+ "assignment": assignment,
"content": encoded_content.decode("utf-8"),
}),
)
msg.related_groups.add(*related_groups)
- msg.related_docs.add(review_req.doc)
+ msg.related_docs.add(assignment.review_request.doc)
msg = send_mail_message(request, msg)
- list_name = mailarch.list_name_from_email(review_req.team.list_email)
+ list_name = mailarch.list_name_from_email(assignment.review_request.team.list_email)
if list_name:
review.external_url = mailarch.construct_message_url(list_name, email.utils.unquote(msg["Message-ID"]))
review.save_with_history([close_event])
- if form.cleaned_data['email_ad'] or review_req.result in review_req.team.reviewteamsettings.notify_ad_when.all():
- (to, cc) = gather_address_lists('review_notify_ad',review_req = review_req).as_strings()
+ if form.cleaned_data['email_ad'] or assignment.result in assignment.review_request.team.reviewteamsettings.notify_ad_when.all():
+ (to, cc) = gather_address_lists('review_notify_ad',review_req = assignment.review_request).as_strings()
msg_txt = render_to_string("review/notify_ad.txt", {
"to": to,
"cc": cc,
- "review_req": review_req,
+ "assignment": assignment,
"settings": settings,
"explicit_request": form.cleaned_data['email_ad'],
})
@@ -660,42 +726,41 @@ def complete_review(request, name, request_id):
msg.save()
send_mail_message(request, msg)
- return redirect("ietf.doc.views_doc.document_main", name=review_req.review.name)
+ return redirect("ietf.doc.views_doc.document_main", name=assignment.review.name)
else:
initial={
- "reviewed_rev": review_req.reviewed_rev,
- "result": review_req.result_id,
+ "reviewed_rev": assignment.reviewed_rev,
+ "result": assignment.result_id,
"cc": ", ".join(cc),
}
try:
- initial['review_content'] = render_to_string('/group/%s/review/content_templates/%s.txt' % (review_req.team.acronym, review_req.type.slug), {'review_req':review_req,'today':datetime.date.today()})
+ initial['review_content'] = render_to_string('/group/%s/review/content_templates/%s.txt' % (assignment.review_request.team.acronym, assignment.review_request.type.slug), {'assignment':assignment,'today':datetime.date.today()})
except TemplateDoesNotExist:
pass
- form = CompleteReviewForm(review_req, is_reviewer, initial=initial)
+ form = CompleteReviewForm(assignment, is_reviewer, initial=initial)
- mail_archive_query_urls = mailarch.construct_query_urls(review_req)
+ mail_archive_query_urls = mailarch.construct_query_urls(assignment.review_request)
return render(request, 'doc/review/complete_review.html', {
'doc': doc,
- 'review_req': review_req,
+ 'assignment': assignment,
'form': form,
'mail_archive_query_urls': mail_archive_query_urls,
'revising_review': revising_review,
})
-def search_mail_archive(request, name, request_id):
- #doc = get_object_or_404(Document, name=name)
- review_req = get_object_or_404(ReviewRequest, pk=request_id)
+def search_mail_archive(request, name, assignment_id):
+ assignment = get_object_or_404(ReviewAssignment, pk=assignment_id)
- is_reviewer = user_is_person(request.user, review_req.reviewer.person)
- can_manage_request = can_manage_review_requests_for_team(request.user, review_req.team)
+ is_reviewer = user_is_person(request.user, assignment.reviewer.person)
+ can_manage_request = can_manage_review_requests_for_team(request.user, assignment.review_request.team)
if not (is_reviewer or can_manage_request):
return HttpResponseForbidden("You do not have permission to perform this action")
- res = mailarch.construct_query_urls(review_req, query=request.GET.get("query"))
+ res = mailarch.construct_query_urls(assignment.review_request, query=request.GET.get("query"))
if not res:
return JsonResponse({ "error": "Couldn't do lookup in mail archive - don't know where to look"})
@@ -760,7 +825,7 @@ def edit_deadline(request, name, request_id):
if form.is_valid():
if form.cleaned_data['deadline'] != old_deadline:
form.save()
- subject = "Deadline changed: {} {} review of {}-{}".format(review_req.team.acronym.capitalize(),review_req.type.name.lower(), review_req.doc.name, review_req.reviewed_rev)
+ subject = "Deadline changed: {} {} review of {}-{}".format(review_req.team.acronym.capitalize(),review_req.type.name.lower(), review_req.doc.name, review_req.requested_rev)
msg = render_to_string("review/deadline_changed.txt", {
"review_req": review_req,
"old_deadline": old_deadline,
diff --git a/ietf/group/forms.py b/ietf/group/forms.py
index 1cbc56ee8..635312263 100644
--- a/ietf/group/forms.py
+++ b/ietf/group/forms.py
@@ -239,8 +239,6 @@ class ManageReviewRequestForm(forms.Form):
close_initial = None
if review_req.pk is None:
close_initial = "no-review-version"
- elif review_req.reviewer:
- close_initial = "no-response"
else:
close_initial = "overtaken"
diff --git a/ietf/group/tests_review.py b/ietf/group/tests_review.py
index 92bed8aab..021172a98 100644
--- a/ietf/group/tests_review.py
+++ b/ietf/group/tests_review.py
@@ -9,26 +9,27 @@ from ietf.utils.test_utils import login_testing_unauthorized, TestCase, uniconte
from ietf.doc.models import TelechatDocEvent
from ietf.group.models import Role
from ietf.iesg.models import TelechatDate
-from ietf.person.models import Email, Person
-from ietf.review.models import ReviewRequest, ReviewerSettings, UnavailablePeriod, ReviewSecretarySettings
+from ietf.person.models import Person
+from ietf.review.models import ReviewerSettings, UnavailablePeriod, ReviewSecretarySettings
from ietf.review.utils import (
suggested_review_requests_for_team,
- review_requests_needing_reviewer_reminder, email_reviewer_reminder,
- review_requests_needing_secretary_reminder, email_secretary_reminder,
+ review_assignments_needing_reviewer_reminder, email_reviewer_reminder,
+ review_assignments_needing_secretary_reminder, email_secretary_reminder,
reviewer_rotation_list,
)
-from ietf.name.models import ReviewTypeName, ReviewResultName, ReviewRequestStateName
+from ietf.name.models import ReviewResultName, ReviewRequestStateName, ReviewAssignmentStateName
import ietf.group.views
from ietf.utils.mail import outbox, empty_outbox
from ietf.dbtemplate.factories import DBTemplateFactory
from ietf.person.factories import PersonFactory, EmailFactory
from ietf.doc.factories import DocumentFactory
from ietf.group.factories import RoleFactory, ReviewTeamFactory
-from ietf.review.factories import ReviewRequestFactory, ReviewerSettingsFactory
+from ietf.review.factories import ReviewRequestFactory, ReviewerSettingsFactory, ReviewAssignmentFactory
class ReviewTests(TestCase):
def test_review_requests(self):
- review_req = ReviewRequestFactory(reviewer=EmailFactory())
+ review_req = ReviewRequestFactory(state_id='assigned')
+ assignment = ReviewAssignmentFactory(review_request=review_req, state_id='assigned', reviewer=EmailFactory(), assigned_on = review_req.time)
group = review_req.team
for url in [urlreverse(ietf.group.views.review_requests, kwargs={ 'acronym': group.acronym }),
@@ -36,7 +37,7 @@ class ReviewTests(TestCase):
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
self.assertIn(review_req.doc.name, unicontent(r))
- self.assertIn(unicode(review_req.reviewer.person), unicontent(r))
+ self.assertIn(assignment.reviewer.person.__unicode__(), unicontent(r))
url = urlreverse(ietf.group.views.review_requests, kwargs={ 'acronym': group.acronym })
@@ -50,7 +51,8 @@ class ReviewTests(TestCase):
self.assertTrue(review_req.doc.name in unicontent(r))
def test_suggested_review_requests(self):
- review_req = ReviewRequestFactory()
+ review_req = ReviewRequestFactory(state_id='assigned')
+ assignment = ReviewAssignmentFactory(review_request=review_req, state_id='assigned')
doc = review_req.doc
team = review_req.team
@@ -89,22 +91,23 @@ class ReviewTests(TestCase):
self.assertEqual(list(suggested_review_requests_for_team(team)), [])
# blocked by versioned refusal
- review_req.reviewed_rev = doc.rev
- review_req.state = ReviewRequestStateName.objects.get(slug="no-review-document")
+ review_req.state = ReviewRequestStateName.objects.get(slug="no-review-version")
review_req.save()
self.assertEqual(list(suggested_review_requests_for_team(team)), [])
# blocked by completion
- review_req.state = ReviewRequestStateName.objects.get(slug="completed")
+ review_req.state = ReviewRequestStateName.objects.get(slug="assigned")
review_req.save()
+ assignment.state = ReviewAssignmentStateName.objects.get(slug="completed")
+ assignment.reviewed_rev = review_req.doc.rev
+ assignment.save()
self.assertEqual(list(suggested_review_requests_for_team(team)), [])
# ... but not to previous version
- review_req.reviewed_rev = prev_rev
- review_req.state = ReviewRequestStateName.objects.get(slug="completed")
- review_req.save()
+ assignment.reviewed_rev = prev_rev
+ assignment.save()
self.assertEqual(len(suggested_review_requests_for_team(team)), 1)
@@ -112,17 +115,19 @@ class ReviewTests(TestCase):
team = ReviewTeamFactory()
reviewer = RoleFactory(name_id='reviewer',group=team,person__user__username='reviewer').person
ReviewerSettingsFactory(person=reviewer,team=team)
- review_req1 = ReviewRequestFactory(state_id='completed',team=team,reviewer=reviewer.email())
+ review_req1 = ReviewRequestFactory(state_id='completed',team=team)
+ ReviewAssignmentFactory(review_request = review_req1, reviewer=reviewer.email())
PersonFactory(user__username='plain')
- ReviewRequest.objects.create(
- doc=review_req1.doc,
- team=review_req1.team,
- type_id="early",
- deadline=datetime.date.today() + datetime.timedelta(days=30),
- state_id="accepted",
- reviewer=review_req1.reviewer,
- requested_by=Person.objects.get(user__username="reviewer"),
+ ReviewAssignmentFactory(
+ review_request__doc=review_req1.doc,
+ review_request__team=review_req1.team,
+ review_request__type_id="early",
+ review_request__deadline=datetime.date.today() + datetime.timedelta(days=30),
+ review_request__state_id="assigned",
+ review_request__requested_by=Person.objects.get(user__username="reviewer"),
+ state_id = "accepted",
+ reviewer=reviewer.email_set.first(),
)
UnavailablePeriod.objects.create(
@@ -169,169 +174,70 @@ class ReviewTests(TestCase):
def test_manage_review_requests(self):
group = ReviewTeamFactory()
- reviewer = RoleFactory(name_id='reviewer',group=group,person__user__username='reviewer').person
+ RoleFactory(name_id='reviewer',group=group,person__user__username='reviewer').person
marsperson = RoleFactory(name_id='reviewer',group=group,person=PersonFactory(name=u"Mars Anders Chairman",user__username='marschairman')).person
- review_req1 = ReviewRequestFactory(doc__pages=2,doc__shepherd=marsperson.email(),reviewer=reviewer.email(),team=group)
+ review_req1 = ReviewRequestFactory(doc__pages=2,doc__shepherd=marsperson.email(),team=group)
+ review_req2 = ReviewRequestFactory(team=group)
+ review_req3 = ReviewRequestFactory(team=group)
RoleFactory(name_id='chair',group=review_req1.doc.group,person=marsperson)
- doc = review_req1.doc
- url = urlreverse(ietf.group.views.manage_review_requests, kwargs={ 'acronym': group.acronym, "assignment_status": "assigned" })
-
- login_testing_unauthorized(self, "secretary", url)
-
- assigned_url = urlreverse(ietf.group.views.manage_review_requests, kwargs={ 'acronym': group.acronym, 'group_type': group.type_id, "assignment_status": "assigned" })
unassigned_url = urlreverse(ietf.group.views.manage_review_requests, kwargs={ 'acronym': group.acronym, 'group_type': group.type_id, "assignment_status": "unassigned" })
-
- review_req2 = ReviewRequest.objects.create(
- doc=review_req1.doc,
- team=review_req1.team,
- type_id="early",
- deadline=datetime.date.today() + datetime.timedelta(days=30),
- state_id="accepted",
- reviewer=review_req1.reviewer,
- requested_by=Person.objects.get(user__username="reviewer"),
- )
-
- review_req3 = ReviewRequest.objects.create(
- doc=review_req1.doc,
- team=review_req1.team,
- type_id="early",
- deadline=datetime.date.today() + datetime.timedelta(days=30),
- state_id="requested",
- requested_by=Person.objects.get(user__username="reviewer"),
- )
-
- # previous reviews
- ReviewRequest.objects.create(
- time=datetime.datetime.now() - datetime.timedelta(days=100),
- requested_by=Person.objects.get(name="(System)"),
- doc=doc,
- type=ReviewTypeName.objects.get(slug="early"),
- team=review_req1.team,
- state=ReviewRequestStateName.objects.get(slug="completed"),
- result=ReviewResultName.objects.get(slug="ready-nits"),
- reviewed_rev="01",
- deadline=datetime.date.today() - datetime.timedelta(days=80),
- reviewer=review_req1.reviewer,
- )
-
- ReviewRequest.objects.create(
- time=datetime.datetime.now() - datetime.timedelta(days=100),
- requested_by=Person.objects.get(name="(System)"),
- doc=doc,
- type=ReviewTypeName.objects.get(slug="early"),
- team=review_req1.team,
- state=ReviewRequestStateName.objects.get(slug="completed"),
- result=ReviewResultName.objects.get(slug="ready"),
- reviewed_rev="01",
- deadline=datetime.date.today() - datetime.timedelta(days=80),
- reviewer=review_req1.reviewer,
- )
+ login_testing_unauthorized(self, "secretary", unassigned_url)
# Need one more person in review team one so we can test incrementing skip_count without immediately decrementing it
another_reviewer = PersonFactory.create(name = u"Extra TestReviewer") # needs to be lexically greater than the exsting one
another_reviewer.role_set.create(name_id='reviewer', email=another_reviewer.email(), group=review_req1.team)
-
+ ReviewerSettingsFactory(team=review_req3.team, person = another_reviewer)
+ yet_another_reviewer = PersonFactory.create(name = u"YetAnotherExtra TestReviewer") # needs to be lexically greater than the exsting one
+ yet_another_reviewer.role_set.create(name_id='reviewer', email=yet_another_reviewer.email(), group=review_req1.team)
+ ReviewerSettingsFactory(team=review_req3.team, person = yet_another_reviewer)
+
# get
- r = self.client.get(assigned_url)
+ r = self.client.get(unassigned_url)
self.assertEqual(r.status_code, 200)
self.assertTrue(review_req1.doc.name in unicontent(r))
- # can't save assigned: conflict
- new_reviewer = Email.objects.get(role__name="reviewer", role__group=group, person__user__username="marschairman")
- # provoke conflict by posting bogus data
- r = self.client.post(assigned_url, {
- "reviewrequest": [str(review_req1.pk), str(review_req2.pk), str(123456)],
-
- # close
- "r{}-existing_reviewer".format(review_req1.pk): "123456",
- "r{}-action".format(review_req1.pk): "close",
- "r{}-close".format(review_req1.pk): "no-response",
-
- # assign
- "r{}-existing_reviewer".format(review_req2.pk): "123456",
- "r{}-action".format(review_req2.pk): "assign",
- "r{}-reviewer".format(review_req2.pk): new_reviewer.pk,
-
- "action": "save-continue",
- })
- self.assertEqual(r.status_code, 200)
- content = unicontent(r).lower()
- self.assertTrue("1 request closed" in content)
- self.assertTrue("2 requests changed assignment" in content)
-
- # can't save unassigned: conflict
- r = self.client.post(unassigned_url, {
- "reviewrequest": [str(123456)],
- "action": "save-continue",
- })
- self.assertEqual(r.status_code, 200)
- content = unicontent(r).lower()
- self.assertTrue("1 request opened" in content)
-
- # close and reassign assigned
- new_reviewer = Email.objects.get(role__name="reviewer", role__group=group, person__user__username="marschairman")
- r = self.client.post(assigned_url, {
- "reviewrequest": [str(review_req1.pk), str(review_req2.pk)],
-
- # close
- "r{}-existing_reviewer".format(review_req1.pk): review_req1.reviewer_id or "",
- "r{}-action".format(review_req1.pk): "close",
- "r{}-close".format(review_req1.pk): "no-response",
-
- # assign
- "r{}-existing_reviewer".format(review_req2.pk): review_req2.reviewer_id or "",
- "r{}-action".format(review_req2.pk): "assign",
- "r{}-reviewer".format(review_req2.pk): new_reviewer.pk,
- "r{}-add_skip".format(review_req2.pk) : 1,
-
- "action": "save",
- })
- self.assertEqual(r.status_code, 302)
-
- # no change on unassigned
+ # Test that conflicts are detected
r = self.client.post(unassigned_url, {
"reviewrequest": [str(review_req3.pk)],
- # no change
- "r{}-existing_reviewer".format(review_req3.pk): review_req3.reviewer_id or "",
- "r{}-action".format(review_req3.pk): "",
- "r{}-close".format(review_req3.pk): "no-response",
- "r{}-reviewer".format(review_req3.pk): "",
+ "r{}-existing_reviewer".format(review_req3.pk): "",
+ "r{}-action".format(review_req3.pk): "assign",
+ "r{}-reviewer".format(review_req3.pk): another_reviewer.email_set.first().pk,
+ "r{}-add_skip".format(review_req3.pk): 1,
+
+ "action": "save",
+ })
+ self.assertEqual(r.status_code, 200)
+ content = unicontent(r).lower()
+ self.assertTrue("2 requests opened" in content)
+
+ r = self.client.post(unassigned_url, {
+ "reviewrequest": [str(review_req1.pk),str(review_req2.pk),str(review_req3.pk)],
+
+ "r{}-existing_reviewer".format(review_req3.pk): "",
+ "r{}-action".format(review_req3.pk): "assign",
+ "r{}-reviewer".format(review_req3.pk): another_reviewer.email_set.first().pk,
+ "r{}-add_skip".format(review_req3.pk): 1,
"action": "save",
})
self.assertEqual(r.status_code, 302)
- review_req1, review_req2, review_req3 = reload_db_objects(review_req1, review_req2, review_req3)
- self.assertEqual(review_req1.state_id, "no-response")
- self.assertEqual(review_req2.state_id, "requested")
- self.assertEqual(review_req2.reviewer, new_reviewer)
- settings = ReviewerSettings.objects.filter(team=review_req2.team, person=new_reviewer.person).first()
+ review_req3 = reload_db_objects(review_req3)
+ settings = ReviewerSettings.objects.filter(team=review_req3.team, person=another_reviewer).first()
self.assertEqual(settings.skip_next,1)
- self.assertEqual(review_req3.state_id, "requested")
-
- r = self.client.post(assigned_url, {
- "reviewrequest": [str(review_req2.pk)],
- "r{}-existing_reviewer".format(review_req2.pk): review_req2.reviewer_id or "",
- "r{}-action".format(review_req2.pk): "assign",
- "r{}-reviewer".format(review_req2.pk): "",
- "r{}-add_skip".format(review_req2.pk) : 0,
- "action": "save",
- })
- self.assertEqual(r.status_code, 302)
- review_req2 = reload_db_objects(review_req2)
- self.assertEqual(review_req2.state_id, "requested")
- self.assertEqual(review_req2.reviewer, None)
+ self.assertEqual(review_req3.state_id, "assigned")
def test_email_open_review_assignments(self):
- review_req1 = ReviewRequestFactory(reviewer=EmailFactory(person__user__username='marschairman'))
+ review_req1 = ReviewRequestFactory()
+ ReviewAssignmentFactory(review_request=review_req1,reviewer=EmailFactory(person__user__username='marschairman'))
DBTemplateFactory.create(path='/group/defaults/email/open_assignments.txt',
type_id='django',
content = """
{% autoescape off %}
Reviewer Deadline Draft
- {% for r in review_requests %}{{ r.reviewer.person.plain_name|ljust:"22" }} {{ r.deadline|date:"Y-m-d" }} {{ r.doc_id }}-{% if r.requested_rev %}{{ r.requested_rev }}{% else %}{{ r.doc.rev }}{% endif %}
+ {% for r in review_assignments %}{{ r.reviewer.person.plain_name|ljust:"22" }} {{ r.review_request.deadline|date:"Y-m-d" }} {{ r.review_request.doc_id }}-{% if r.review_request.requested_rev %}{{ r.review_request.requested_rev }}{% else %}{{ r.review_request.doc.rev }}{% endif %}
{% endfor %}
{% if rotation_list %}Next in the reviewer rotation:
@@ -376,15 +282,14 @@ class ReviewTests(TestCase):
def test_change_reviewer_settings(self):
reviewer = ReviewerSettingsFactory(person__user__username='reviewer',expertise='Some expertise').person
- review_req = ReviewRequestFactory(reviewer=reviewer.email())
- RoleFactory(name_id='reviewer',group=review_req.team,person=review_req.reviewer.person)
+ review_req = ReviewRequestFactory()
+ assignment = ReviewAssignmentFactory(review_request=review_req,reviewer=reviewer.email())
+ RoleFactory(name_id='reviewer',group=review_req.team,person=assignment.reviewer.person)
RoleFactory(name_id='secr',group=review_req.team)
- reviewer = review_req.reviewer.person
-
url = urlreverse(ietf.group.views.change_reviewer_settings, kwargs={
"acronym": review_req.team.acronym,
- "reviewer_email": review_req.reviewer_id,
+ "reviewer_email": assignment.reviewer_id,
})
login_testing_unauthorized(self, reviewer.user.username, url)
@@ -392,7 +297,7 @@ class ReviewTests(TestCase):
url = urlreverse(ietf.group.views.change_reviewer_settings, kwargs={
"group_type": review_req.team.type_id,
"acronym": review_req.team.acronym,
- "reviewer_email": review_req.reviewer_id,
+ "reviewer_email": assignment.reviewer_id,
})
# get
@@ -451,7 +356,7 @@ class ReviewTests(TestCase):
msg_content = outbox[0].get_payload(decode=True).decode("utf-8").lower()
self.assertTrue(start_date.isoformat(), msg_content)
self.assertTrue("indefinite", msg_content)
- self.assertEqual(period.reason, "Whimsy")
+ self.assertEqual(period.reason, "Whimsy")
# end unavailable period
empty_outbox()
@@ -526,8 +431,9 @@ class ReviewTests(TestCase):
self.assertEqual(settings.remind_days_before_deadline, 6)
def test_review_reminders(self):
- review_req = ReviewRequestFactory()
+ review_req = ReviewRequestFactory(state_id='assigned')
reviewer = RoleFactory(name_id='reviewer',group=review_req.team,person__user__username='reviewer').person
+ assignment = ReviewAssignmentFactory(review_request=review_req, state_id='assigned', assigned_on = review_req.time, reviewer=reviewer.email_set.first())
RoleFactory(name_id='secr',group=review_req.team,person__user__username='reviewsecretary')
ReviewerSettingsFactory(team = review_req.team, person = reviewer)
@@ -551,23 +457,23 @@ class ReviewTests(TestCase):
review_req.save()
# reviewer
- needing_reminders = review_requests_needing_reviewer_reminder(today - datetime.timedelta(days=1))
+ needing_reminders = review_assignments_needing_reviewer_reminder(today - datetime.timedelta(days=1))
self.assertEqual(list(needing_reminders), [])
- needing_reminders = review_requests_needing_reviewer_reminder(today)
- self.assertEqual(list(needing_reminders), [review_req])
+ needing_reminders = review_assignments_needing_reviewer_reminder(today)
+ self.assertEqual(list(needing_reminders), [assignment])
- needing_reminders = review_requests_needing_reviewer_reminder(today + datetime.timedelta(days=1))
+ needing_reminders = review_assignments_needing_reviewer_reminder(today + datetime.timedelta(days=1))
self.assertEqual(list(needing_reminders), [])
# secretary
- needing_reminders = review_requests_needing_secretary_reminder(today - datetime.timedelta(days=1))
+ needing_reminders = review_assignments_needing_secretary_reminder(today - datetime.timedelta(days=1))
self.assertEqual(list(needing_reminders), [])
- needing_reminders = review_requests_needing_secretary_reminder(today)
- self.assertEqual(list(needing_reminders), [(review_req, secretary_role)])
+ needing_reminders = review_assignments_needing_secretary_reminder(today)
+ self.assertEqual(list(needing_reminders), [(assignment, secretary_role)])
- needing_reminders = review_requests_needing_secretary_reminder(today + datetime.timedelta(days=1))
+ needing_reminders = review_assignments_needing_secretary_reminder(today + datetime.timedelta(days=1))
self.assertEqual(list(needing_reminders), [])
# email reviewer
diff --git a/ietf/group/urls.py b/ietf/group/urls.py
index 6f02b8b27..3a9a70235 100644
--- a/ietf/group/urls.py
+++ b/ietf/group/urls.py
@@ -41,7 +41,7 @@ info_detail_urls = [
url(r'^archives/$', views.derived_archives),
url(r'^photos/$', views.group_photos),
url(r'^reviews/$', views.review_requests),
- url(r'^reviews/manage/(?Passigned|unassigned)/$', views.manage_review_requests),
+ url(r'^reviews/manage/(?Punassigned)/$', views.manage_review_requests),
url(r'^reviews/email-assignments/$', views.email_open_review_assignments),
url(r'^reviewers/$', views.reviewer_overview),
url(r'^reviewers/(?P[\w%+-.@]+)/settings/$', views.change_reviewer_settings),
diff --git a/ietf/group/utils.py b/ietf/group/utils.py
index 01f366987..ca0f27f0d 100644
--- a/ietf/group/utils.py
+++ b/ietf/group/utils.py
@@ -224,7 +224,7 @@ def construct_group_menu_context(request, group, selected, group_type, others):
if group.features.has_reviews and can_manage_review_requests_for_team(request.user, group):
import ietf.group.views
actions.append((u"Manage unassigned reviews", urlreverse(ietf.group.views.manage_review_requests, kwargs=dict(assignment_status="unassigned", **kwargs))))
- actions.append((u"Manage assigned reviews", urlreverse(ietf.group.views.manage_review_requests, kwargs=dict(assignment_status="assigned", **kwargs))))
+ #actions.append((u"Manage assigned reviews", urlreverse(ietf.group.views.manage_review_requests, kwargs=dict(assignment_status="assigned", **kwargs))))
if Role.objects.filter(name="secr", group=group, person__user=request.user).exists():
actions.append((u"Secretary settings", urlreverse(ietf.group.views.change_review_secretary_settings, kwargs=kwargs)))
diff --git a/ietf/group/views.py b/ietf/group/views.py
index f02585138..7163fa724 100644
--- a/ietf/group/views.py
+++ b/ietf/group/views.py
@@ -86,7 +86,7 @@ from ietf.meeting.helpers import get_meeting
from ietf.meeting.utils import group_sessions
from ietf.name.models import GroupTypeName, StreamName
from ietf.person.models import Email
-from ietf.review.models import ReviewRequest, ReviewerSettings, ReviewSecretarySettings
+from ietf.review.models import ReviewRequest, ReviewAssignment, ReviewerSettings, ReviewSecretarySettings
from ietf.review.utils import (can_manage_review_requests_for_team,
can_access_review_stats_for_team,
@@ -99,7 +99,7 @@ from ietf.review.utils import (can_manage_review_requests_for_team,
current_unavailable_periods_for_reviewers,
email_reviewer_availability_change,
reviewer_rotation_list,
- latest_review_requests_for_reviewers,
+ latest_review_assignments_for_reviewers,
augment_review_requests_with_events,
get_default_filter_re,
days_needed_to_fulfill_min_interval_for_reviewers,
@@ -108,7 +108,7 @@ from ietf.doc.models import LastCallDocEvent
-from ietf.name.models import ReviewRequestStateName
+from ietf.name.models import ReviewAssignmentStateName
from ietf.utils.mail import send_mail_text, parse_preformatted
from ietf.ietfauth.utils import user_is_person
@@ -1263,27 +1263,26 @@ def group_menu_data(request):
# --- Review views -----------------------------------------------------
def get_open_review_requests_for_team(team, assignment_status=None):
- open_review_requests = ReviewRequest.objects.filter(
- team=team,
- state__in=("requested", "accepted")
+ open_review_requests = ReviewRequest.objects.filter(team=team).filter(
+ Q(state_id='requested') | Q(state_id='assigned',reviewassignment__state__in=('assigned','accepted'))
).prefetch_related(
- "reviewer__person", "type", "state", "doc", "doc__states",
+ "type", "state", "doc", "doc__states",
).order_by("-time", "-id")
if assignment_status == "unassigned":
- open_review_requests = suggested_review_requests_for_team(team) + list(open_review_requests.filter(reviewer=None))
+ open_review_requests = suggested_review_requests_for_team(team) + list(open_review_requests.filter(state_id='requested'))
elif assignment_status == "assigned":
- open_review_requests = list(open_review_requests.exclude(reviewer=None))
+ open_review_requests = list(open_review_requests.filter(state_id='assigned'))
else:
open_review_requests = suggested_review_requests_for_team(team) + list(open_review_requests)
- today = datetime.date.today()
- unavailable_periods = current_unavailable_periods_for_reviewers(team)
- for r in open_review_requests:
- if r.reviewer:
- r.reviewer_unavailable = any(p.availability == "unavailable"
- for p in unavailable_periods.get(r.reviewer.person_id, []))
- r.due = max(0, (today - r.deadline).days)
+ #today = datetime.date.today()
+ #unavailable_periods = current_unavailable_periods_for_reviewers(team)
+ #for r in open_review_requests:
+ #if r.reviewer:
+ # r.reviewer_unavailable = any(p.availability == "unavailable"
+ # for p in unavailable_periods.get(r.reviewer.person_id, []))
+ #r.due = max(0, (today - r.deadline).days)
return open_review_requests
@@ -1292,25 +1291,19 @@ def review_requests(request, acronym, group_type=None):
if not group.features.has_reviews:
raise Http404
- assigned_review_requests = []
- unassigned_review_requests = []
+ unassigned_review_requests = [r for r in get_open_review_requests_for_team(group) if not r.state_id=='assigned']
- for r in get_open_review_requests_for_team(group):
- if r.reviewer:
- assigned_review_requests.append(r)
- else:
- unassigned_review_requests.append(r)
+ open_review_assignments = list(ReviewAssignment.objects.filter(review_request__team=group, state_id__in=('assigned','accepted')).order_by('-assigned_on'))
+ today = datetime.date.today()
+ unavailable_periods = current_unavailable_periods_for_reviewers(group)
+ for a in open_review_assignments:
+ a.reviewer_unavailable = any(p.availability == "unavailable"
+ for p in unavailable_periods.get(a.reviewer.person_id, []))
+ a.due = max(0, (today - a.review_request.deadline).days)
- open_review_requests = [
- ("Unassigned", unassigned_review_requests),
- ("Assigned", assigned_review_requests),
- ]
+ closed_review_assignments = ReviewAssignment.objects.filter(review_request__team=group).exclude(state_id__in=('assigned','accepted')).prefetch_related("state","result").order_by('-assigned_on')
- closed_review_requests = ReviewRequest.objects.filter(
- team=group,
- ).exclude(
- state__in=("requested", "accepted")
- ).prefetch_related("reviewer__person", "type", "state", "doc", "result").order_by("-time", "-id")
+ closed_review_requests = ReviewRequest.objects.filter(team=group).exclude(state__in=("requested", "assigned")).prefetch_related("type", "state", "doc").order_by("-time", "-id")
since_choices = [
(None, "1 month"),
@@ -1338,10 +1331,14 @@ def review_requests(request, acronym, group_type=None):
| Q(reviewrequestdocevent__isnull=True, time__gte=datetime.date.today() - date_limit)
).distinct()
+ closed_review_assignments = closed_review_assignments.filter(completed_on__gte = datetime.date.today() - date_limit)
+
return render(request, 'group/review_requests.html',
construct_group_menu_context(request, group, "review requests", group_type, {
- "open_review_requests": open_review_requests,
+ "unassigned_review_requests": unassigned_review_requests,
+ "open_review_assignments": open_review_assignments,
"closed_review_requests": closed_review_requests,
+ "closed_review_assignments": closed_review_assignments,
"since_choices": since_choices,
"since": since,
"can_manage_review_requests": can_manage_review_requests_for_team(request.user, group),
@@ -1365,8 +1362,8 @@ def reviewer_overview(request, acronym, group_type=None):
today = datetime.date.today()
- req_data_for_reviewers = latest_review_requests_for_reviewers(group)
- review_state_by_slug = { n.slug: n for n in ReviewRequestStateName.objects.all() }
+ req_data_for_reviewers = latest_review_assignments_for_reviewers(group)
+ assignment_state_by_slug = { n.slug: n for n in ReviewAssignmentStateName.objects.all() }
days_needed = days_needed_to_fulfill_min_interval_for_reviewers(group)
@@ -1387,15 +1384,16 @@ def reviewer_overview(request, acronym, group_type=None):
person.busy = person.id in days_needed
+ # TODO - What is this MAX_CLOSED_REQS trying to accomplish?
MAX_CLOSED_REQS = 10
days_since = 9999
req_data = req_data_for_reviewers.get(person.pk, [])
- open_reqs = sum(1 for d in req_data if d.state in ["requested", "accepted"])
+ open_reqs = sum(1 for d in req_data if d.state in ["assigned", "accepted"])
latest_reqs = []
for d in req_data:
- if d.state in ["requested", "accepted"] or len(latest_reqs) < MAX_CLOSED_REQS + open_reqs:
- latest_reqs.append((d.req_pk, d.doc, d.reviewed_rev, d.assigned_time, d.deadline,
- review_state_by_slug.get(d.state),
+ if d.state in ["assigned", "accepted"] or len(latest_reqs) < MAX_CLOSED_REQS + open_reqs:
+ latest_reqs.append((d.assignment_pk, d.doc, d.reviewed_rev, d.assigned_time, d.deadline,
+ assignment_state_by_slug.get(d.state),
int(math.ceil(d.assignment_to_closure_days)) if d.assignment_to_closure_days is not None else None))
if d.state in ["completed", "completed_in_time", "completed_late"]:
if d.assigned_time is not None:
@@ -1474,23 +1472,6 @@ def manage_review_requests(request, acronym, group_type=None, assignment_status=
for r in opened_reqs:
review_requests_dict[r].form.add_error(None, "New request.")
- for req in review_requests:
- existing_reviewer = request.POST.get(req.form.prefix + "-existing_reviewer")
- if existing_reviewer is None:
- continue
-
- if existing_reviewer != unicode(req.reviewer_id or ""):
- msg = "Assignment was changed."
- a = req.form["action"].value()
- if a == "assign":
- msg += " Didn't assign reviewer."
- elif a == "close":
- msg += " Didn't close request."
- req.form.add_error(None, msg)
- req.form.data[req.form.prefix + "-action"] = "" # cancel the action
-
- newly_assigned += 1
-
form_results = []
for req in review_requests:
form_results.append(req.form.is_valid())
@@ -1565,37 +1546,35 @@ def email_open_review_assignments(request, acronym, group_type=None):
if not can_manage_review_requests_for_team(request.user, group):
return HttpResponseForbidden("You do not have permission to perform this action")
- review_requests = list(ReviewRequest.objects.filter(
- team=group,
- state__in=("requested", "accepted"),
- ).exclude(
- reviewer=None,
- ).prefetch_related("reviewer", "type", "state", "doc").distinct().order_by("reviewer","-deadline"))
+ review_assignments = list(ReviewAssignment.objects.filter(
+ review_request__team=group,
+ state__in=("assigned", "accepted"),
+ ).prefetch_related("reviewer", "review_request__type", "state", "review_request__doc").distinct().order_by("reviewer","-review_request__deadline"))
- review_requests.sort(key=lambda r:r.reviewer.person.last_name()+r.reviewer.person.first_name())
+ review_assignments.sort(key=lambda r:r.reviewer.person.last_name()+r.reviewer.person.first_name())
- for r in review_requests:
- if r.doc.telechat_date():
- r.section = 'For telechat %s' % r.doc.telechat_date().isoformat()
+ for r in review_assignments:
+ if r.review_request.doc.telechat_date():
+ r.section = 'For telechat %s' % r.review_request.doc.telechat_date().isoformat()
r.section_order='0'+r.section
- elif r.type_id == 'early':
+ elif r.review_request.type_id == 'early':
r.section = 'Early review requests:'
r.section_order='2'
else:
r.section = 'Last calls:'
r.section_order='1'
- e = r.doc.latest_event(LastCallDocEvent, type="sent_last_call")
+ e = r.review_request.doc.latest_event(LastCallDocEvent, type="sent_last_call")
r.lastcall_ends = e and e.expires.date().isoformat()
- r.earlier_review = ReviewRequest.objects.filter(doc=r.doc,reviewer__in=r.reviewer.person.email_set.all(),state="completed")
+ r.earlier_review = ReviewAssignment.objects.filter(review_request__doc=r.review_request.doc,reviewer__in=r.reviewer.person.email_set.all(),state="completed")
if r.earlier_review:
- req_rev = r.requested_rev or r.doc.rev
+ req_rev = r.review_request.requested_rev or r.review_request.doc.rev
earlier_review_rev = r.earlier_review.aggregate(Max('reviewed_rev'))['reviewed_rev__max']
if req_rev == earlier_review_rev:
r.earlier_review_mark = '**'
else:
r.earlier_review_mark = '*'
- review_requests.sort(key=lambda r: r.section_order)
+ review_assignments.sort(key=lambda r: r.section_order)
back_url = request.GET.get("next")
if not back_url:
@@ -1630,7 +1609,7 @@ def email_open_review_assignments(request, acronym, group_type=None):
template = DBTemplate.objects.get(path="/group/defaults/email/open_assignments.txt")
partial_msg = render_to_string(template.path, {
- "review_requests": review_requests,
+ "review_assignments": review_assignments,
"rotation_list": reviewer_rotation_list(group)[:10],
"group" : group,
})
@@ -1651,7 +1630,7 @@ def email_open_review_assignments(request, acronym, group_type=None):
return render(request, 'group/email_open_review_assignments.html', {
'group': group,
- 'review_requests': review_requests,
+ 'review_assignments': review_assignments,
'form': form,
'back_url': back_url,
})
@@ -1737,14 +1716,14 @@ def change_reviewer_settings(request, acronym, reviewer_email, group_type=None):
# the secretary might need to reassign
# assignments, so mention the current ones
- review_reqs = ReviewRequest.objects.filter(state__in=["requested", "accepted"], reviewer=reviewer_role.email, team=group)
+ review_assignments = ReviewAssignment.objects.filter(state__in=["assigned", "accepted"], reviewer=reviewer_role.email, review_request__team=group)
msg += "\n\n"
- if review_reqs:
+ if review_assignments:
msg += "{} is currently assigned to review:".format(reviewer_role.person)
- for r in review_reqs:
+ for r in review_assignments:
msg += "\n\n"
- msg += "{} (deadline: {})".format(r.doc_id, r.deadline.isoformat())
+ msg += "{} (deadline: {})".format(r.review_request.doc_id, r.review_request.deadline.isoformat())
else:
msg += "{} does not have any assignments currently.".format(reviewer_role.person)
diff --git a/ietf/iesg/agenda.py b/ietf/iesg/agenda.py
index a221c1d59..46a22adf3 100644
--- a/ietf/iesg/agenda.py
+++ b/ietf/iesg/agenda.py
@@ -12,7 +12,7 @@ import debug # pyflakes:ignore
from ietf.doc.models import Document, LastCallDocEvent, ConsensusDocEvent
from ietf.doc.utils_search import fill_in_telechat_date
from ietf.iesg.models import TelechatDate, TelechatAgendaItem
-from ietf.review.utils import review_requests_to_list_for_docs
+from ietf.review.utils import review_assignments_to_list_for_docs
def get_agenda_date(date=None):
if not date:
@@ -156,7 +156,7 @@ def fill_in_agenda_docs(date, sections, docs=None):
docs = docs.select_related("stream", "group").distinct()
fill_in_telechat_date(docs)
- review_requests_for_docs = review_requests_to_list_for_docs(docs)
+ review_assignments_for_docs = review_assignments_to_list_for_docs(docs)
for doc in docs:
if doc.telechat_date() != date:
@@ -182,7 +182,7 @@ def fill_in_agenda_docs(date, sections, docs=None):
if e and (e.consensus != None):
doc.consensus = "Yes" if e.consensus else "No"
- doc.review_requests = review_requests_for_docs.get(doc.pk, [])
+ doc.review_assignments = review_assignments_for_docs.get(doc.pk, [])
elif doc.type_id == "conflrev":
doc.conflictdoc = doc.relateddocument_set.get(relationship__slug='conflrev').target.document
elif doc.type_id == "charter":
diff --git a/ietf/ietfauth/tests.py b/ietf/ietfauth/tests.py
index fbc5831ee..e1ff2ed50 100644
--- a/ietf/ietfauth/tests.py
+++ b/ietf/ietfauth/tests.py
@@ -22,7 +22,7 @@ from ietf.ietfauth.htpasswd import update_htpasswd_file
from ietf.mailinglists.models import Subscribed
from ietf.person.models import Person, Email, PersonalApiKey, PERSON_API_KEY_ENDPOINTS
from ietf.person.factories import PersonFactory, EmailFactory
-from ietf.review.factories import ReviewRequestFactory
+from ietf.review.factories import ReviewRequestFactory, ReviewAssignmentFactory
from ietf.review.models import ReviewWish, UnavailablePeriod
from ietf.utils.decorators import skip_coverage
@@ -358,11 +358,12 @@ class IetfAuthTests(TestCase):
self.assertTrue(self.username_in_htpasswd_file(user.username))
def test_review_overview(self):
- review_req = ReviewRequestFactory(reviewer=EmailFactory(person__user__username='reviewer'))
- RoleFactory(name_id='reviewer',group=review_req.team,person=review_req.reviewer.person)
+ review_req = ReviewRequestFactory()
+ assignment = ReviewAssignmentFactory(review_request=review_req,reviewer=EmailFactory(person__user__username='reviewer'))
+ RoleFactory(name_id='reviewer',group=review_req.team,person=assignment.reviewer.person)
doc = review_req.doc
- reviewer = review_req.reviewer.person
+ reviewer = assignment.reviewer.person
UnavailablePeriod.objects.create(
team=review_req.team,
diff --git a/ietf/ietfauth/views.py b/ietf/ietfauth/views.py
index dd1dbda97..4fe2e1349 100644
--- a/ietf/ietfauth/views.py
+++ b/ietf/ietfauth/views.py
@@ -65,7 +65,7 @@ from ietf.ietfauth.htpasswd import update_htpasswd_file
from ietf.ietfauth.utils import role_required
from ietf.mailinglists.models import Subscribed, Whitelisted
from ietf.person.models import Person, Email, Alias, PersonalApiKey
-from ietf.review.models import ReviewRequest, ReviewerSettings, ReviewWish
+from ietf.review.models import ReviewerSettings, ReviewWish, ReviewAssignment
from ietf.review.utils import unavailable_periods_to_list, get_default_filter_re
from ietf.doc.fields import SearchableDocumentField
from ietf.utils.decorators import person_required
@@ -433,18 +433,18 @@ class AddReviewWishForm(forms.Form):
@login_required
def review_overview(request):
- open_review_requests = ReviewRequest.objects.filter(
+ open_review_assignments = ReviewAssignment.objects.filter(
reviewer__person__user=request.user,
- state__in=["requested", "accepted"],
+ state__in=["assigned", "accepted"],
)
today = Date.today()
- for r in open_review_requests:
- r.due = max(0, (today - r.deadline).days)
+ for r in open_review_assignments:
+ r.due = max(0, (today - r.review_request.deadline).days)
- closed_review_requests = ReviewRequest.objects.filter(
+ closed_review_assignments = ReviewAssignment.objects.filter(
reviewer__person__user=request.user,
state__in=["no-response", "part-completed", "completed"],
- ).order_by("-time")[:20]
+ ).order_by("-review_request__time")[:20]
teams = Group.objects.filter(role__name="reviewer", role__person__user=request.user, state="active")
@@ -483,8 +483,8 @@ def review_overview(request):
review_wishes = ReviewWish.objects.filter(person__user=request.user).prefetch_related("team")
return render(request, 'ietfauth/review_overview.html', {
- 'open_review_requests': open_review_requests,
- 'closed_review_requests': closed_review_requests,
+ 'open_review_assignments': open_review_assignments,
+ 'closed_review_assignments': closed_review_assignments,
'teams': teams,
'review_wishes': review_wishes,
'review_wish_form': review_wish_form,
diff --git a/ietf/name/admin.py b/ietf/name/admin.py
index 9eb0f5cc5..3924b7910 100644
--- a/ietf/name/admin.py
+++ b/ietf/name/admin.py
@@ -9,7 +9,7 @@ from ietf.name.models import (
LiaisonStatementState, LiaisonStatementTagName, MeetingTypeName, NomineePositionStateName,
ReviewRequestStateName, ReviewResultName, ReviewTypeName, RoleName, RoomResourceName,
SessionStatusName, StdLevelName, StreamName, TimeSlotTypeName, TopicAudienceName,
- DocUrlTagName)
+ DocUrlTagName, ReviewAssignmentStateName)
from ietf.stats.models import CountryAlias
@@ -68,6 +68,7 @@ admin.site.register(LiaisonStatementTagName, NameAdmin)
admin.site.register(MeetingTypeName, NameAdmin)
admin.site.register(NomineePositionStateName, NameAdmin)
admin.site.register(ReviewRequestStateName, NameAdmin)
+admin.site.register(ReviewAssignmentStateName, NameAdmin)
admin.site.register(ReviewResultName, NameAdmin)
admin.site.register(ReviewTypeName, NameAdmin)
admin.site.register(RoleName, NameAdmin)
diff --git a/ietf/name/fixtures/names.json b/ietf/name/fixtures/names.json
index 24e6e8d3b..8af101227 100644
--- a/ietf/name/fixtures/names.json
+++ b/ietf/name/fixtures/names.json
@@ -1,10881 +1,10981 @@
[
-{
- "model": "name.agendatypename",
- "pk": "ad",
- "fields": {
- "name": "AD Office Hours",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.agendatypename",
- "pk": "ietf",
- "fields": {
- "name": "IETF Agenda",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.agendatypename",
- "pk": "side",
- "fields": {
- "name": "Side Meetings",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.agendatypename",
- "pk": "workshop",
- "fields": {
- "name": "Workshops",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.ballotpositionname",
- "pk": "yes",
- "fields": {
- "name": "Yes",
- "desc": "",
- "used": true,
- "order": 1,
- "blocking": false
- }
-},
-{
- "model": "name.ballotpositionname",
- "pk": "noobj",
- "fields": {
- "name": "No Objection",
- "desc": "",
- "used": true,
- "order": 2,
- "blocking": false
- }
-},
-{
- "model": "name.ballotpositionname",
- "pk": "block",
- "fields": {
- "name": "Block",
- "desc": "",
- "used": true,
- "order": 3,
- "blocking": true
- }
-},
-{
- "model": "name.ballotpositionname",
- "pk": "discuss",
- "fields": {
- "name": "Discuss",
- "desc": "",
- "used": true,
- "order": 3,
- "blocking": true
- }
-},
-{
- "model": "name.ballotpositionname",
- "pk": "abstain",
- "fields": {
- "name": "Abstain",
- "desc": "",
- "used": true,
- "order": 4,
- "blocking": false
- }
-},
-{
- "model": "name.ballotpositionname",
- "pk": "recuse",
- "fields": {
- "name": "Recuse",
- "desc": "",
- "used": true,
- "order": 5,
- "blocking": false
- }
-},
-{
- "model": "name.ballotpositionname",
- "pk": "norecord",
- "fields": {
- "name": "No Record",
- "desc": "",
- "used": true,
- "order": 6,
- "blocking": false
- }
-},
-{
- "model": "name.constraintname",
- "pk": "conflict",
- "fields": {
- "name": "Conflicts with",
- "desc": "",
- "used": true,
- "order": 0,
- "penalty": 100000
- }
-},
-{
- "model": "name.constraintname",
- "pk": "conflic2",
- "fields": {
- "name": "Conflicts with (secondary)",
- "desc": "",
- "used": true,
- "order": 0,
- "penalty": 10000
- }
-},
-{
- "model": "name.constraintname",
- "pk": "conflic3",
- "fields": {
- "name": "Conflicts with (tertiary)",
- "desc": "",
- "used": true,
- "order": 0,
- "penalty": 1000
- }
-},
-{
- "model": "name.constraintname",
- "pk": "bethere",
- "fields": {
- "name": "Person must be present",
- "desc": "",
- "used": true,
- "order": 0,
- "penalty": 200000
- }
-},
-{
- "model": "name.continentname",
- "pk": "africa",
- "fields": {
- "name": "Africa",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.continentname",
- "pk": "antarctica",
- "fields": {
- "name": "Antarctica",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.continentname",
- "pk": "asia",
- "fields": {
- "name": "Asia",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.continentname",
- "pk": "europe",
- "fields": {
- "name": "Europe",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.continentname",
- "pk": "north-america",
- "fields": {
- "name": "North America",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.continentname",
- "pk": "oceania",
- "fields": {
- "name": "Oceania",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.continentname",
- "pk": "south-america",
- "fields": {
- "name": "South America",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.countryname",
- "pk": "AF",
- "fields": {
- "name": "Afghanistan",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "AX",
- "fields": {
- "name": "\u00c5land Islands",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "AL",
- "fields": {
- "name": "Albania",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "DZ",
- "fields": {
- "name": "Algeria",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "AS",
- "fields": {
- "name": "American Samoa",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "oceania",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "AD",
- "fields": {
- "name": "Andorra",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "AO",
- "fields": {
- "name": "Angola",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "AI",
- "fields": {
- "name": "Anguilla",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "north-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "AQ",
- "fields": {
- "name": "Antarctica",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "antarctica",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "AG",
- "fields": {
- "name": "Antigua and Barbuda",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "north-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "AR",
- "fields": {
- "name": "Argentina",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "south-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "AM",
- "fields": {
- "name": "Armenia",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "AW",
- "fields": {
- "name": "Aruba",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "north-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "AU",
- "fields": {
- "name": "Australia",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "oceania",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "AT",
- "fields": {
- "name": "Austria",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": true
- }
-},
-{
- "model": "name.countryname",
- "pk": "AZ",
- "fields": {
- "name": "Azerbaijan",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "BS",
- "fields": {
- "name": "Bahamas",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "north-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "BH",
- "fields": {
- "name": "Bahrain",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "BD",
- "fields": {
- "name": "Bangladesh",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "BB",
- "fields": {
- "name": "Barbados",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "north-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "BY",
- "fields": {
- "name": "Belarus",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "BE",
- "fields": {
- "name": "Belgium",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": true
- }
-},
-{
- "model": "name.countryname",
- "pk": "BZ",
- "fields": {
- "name": "Belize",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "north-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "BJ",
- "fields": {
- "name": "Benin",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "BM",
- "fields": {
- "name": "Bermuda",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "north-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "BT",
- "fields": {
- "name": "Bhutan",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "BO",
- "fields": {
- "name": "Bolivia",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "south-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "BQ",
- "fields": {
- "name": "Bonaire, Sint Eustatius and Saba",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "north-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "BA",
- "fields": {
- "name": "Bosnia and Herzegovina",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "BW",
- "fields": {
- "name": "Botswana",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "BV",
- "fields": {
- "name": "Bouvet Island",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "antarctica",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "BR",
- "fields": {
- "name": "Brazil",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "south-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "IO",
- "fields": {
- "name": "British Indian Ocean Territory",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "BN",
- "fields": {
- "name": "Brunei",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "BG",
- "fields": {
- "name": "Bulgaria",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": true
- }
-},
-{
- "model": "name.countryname",
- "pk": "BF",
- "fields": {
- "name": "Burkina Faso",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "BI",
- "fields": {
- "name": "Burundi",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "CV",
- "fields": {
- "name": "Cabo Verde",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "KH",
- "fields": {
- "name": "Cambodia",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "CM",
- "fields": {
- "name": "Cameroon",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "CA",
- "fields": {
- "name": "Canada",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "north-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "KY",
- "fields": {
- "name": "Cayman Islands",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "north-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "CF",
- "fields": {
- "name": "Central African Republic",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "TD",
- "fields": {
- "name": "Chad",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "CL",
- "fields": {
- "name": "Chile",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "south-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "CN",
- "fields": {
- "name": "China",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "CX",
- "fields": {
- "name": "Christmas Island",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "CC",
- "fields": {
- "name": "Cocos (Keeling) Islands",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "CO",
- "fields": {
- "name": "Colombia",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "south-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "KM",
- "fields": {
- "name": "Comoros",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "CG",
- "fields": {
- "name": "Congo",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "CD",
- "fields": {
- "name": "Congo (the Democratic Republic of the)",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "CK",
- "fields": {
- "name": "Cook Islands",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "oceania",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "CR",
- "fields": {
- "name": "Costa Rica",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "north-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "CI",
- "fields": {
- "name": "C\u00f4te d'Ivoire",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "HR",
- "fields": {
- "name": "Croatia",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": true
- }
-},
-{
- "model": "name.countryname",
- "pk": "CU",
- "fields": {
- "name": "Cuba",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "north-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "CW",
- "fields": {
- "name": "Cura\u00e7ao",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "north-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "CY",
- "fields": {
- "name": "Cyprus",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": true
- }
-},
-{
- "model": "name.countryname",
- "pk": "CZ",
- "fields": {
- "name": "Czech Republic",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": true
- }
-},
-{
- "model": "name.countryname",
- "pk": "DK",
- "fields": {
- "name": "Denmark",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": true
- }
-},
-{
- "model": "name.countryname",
- "pk": "DJ",
- "fields": {
- "name": "Djibouti",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "DM",
- "fields": {
- "name": "Dominica",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "north-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "DO",
- "fields": {
- "name": "Dominican Republic",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "north-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "EC",
- "fields": {
- "name": "Ecuador",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "south-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "EG",
- "fields": {
- "name": "Egypt",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "SV",
- "fields": {
- "name": "El Salvador",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "north-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "GQ",
- "fields": {
- "name": "Equatorial Guinea",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "ER",
- "fields": {
- "name": "Eritrea",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "EE",
- "fields": {
- "name": "Estonia",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": true
- }
-},
-{
- "model": "name.countryname",
- "pk": "ET",
- "fields": {
- "name": "Ethiopia",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "FK",
- "fields": {
- "name": "Falkland Islands [Malvinas]",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "south-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "FO",
- "fields": {
- "name": "Faroe Islands",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "FJ",
- "fields": {
- "name": "Fiji",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "oceania",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "FI",
- "fields": {
- "name": "Finland",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": true
- }
-},
-{
- "model": "name.countryname",
- "pk": "FR",
- "fields": {
- "name": "France",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": true
- }
-},
-{
- "model": "name.countryname",
- "pk": "GF",
- "fields": {
- "name": "French Guiana",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "south-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "PF",
- "fields": {
- "name": "French Polynesia",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "oceania",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "TF",
- "fields": {
- "name": "French Southern Territories",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "antarctica",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "GA",
- "fields": {
- "name": "Gabon",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "GM",
- "fields": {
- "name": "Gambia",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "GE",
- "fields": {
- "name": "Georgia",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "DE",
- "fields": {
- "name": "Germany",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": true
- }
-},
-{
- "model": "name.countryname",
- "pk": "GH",
- "fields": {
- "name": "Ghana",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "GI",
- "fields": {
- "name": "Gibraltar",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "GR",
- "fields": {
- "name": "Greece",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": true
- }
-},
-{
- "model": "name.countryname",
- "pk": "GL",
- "fields": {
- "name": "Greenland",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "north-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "GD",
- "fields": {
- "name": "Grenada",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "north-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "GP",
- "fields": {
- "name": "Guadeloupe",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "north-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "GU",
- "fields": {
- "name": "Guam",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "oceania",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "GT",
- "fields": {
- "name": "Guatemala",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "north-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "GG",
- "fields": {
- "name": "Guernsey",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "GN",
- "fields": {
- "name": "Guinea",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "GW",
- "fields": {
- "name": "Guinea-Bissau",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "GY",
- "fields": {
- "name": "Guyana",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "south-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "HT",
- "fields": {
- "name": "Haiti",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "north-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "HM",
- "fields": {
- "name": "Heard Island and McDonald Islands",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "antarctica",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "VA",
- "fields": {
- "name": "Holy See",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "HN",
- "fields": {
- "name": "Honduras",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "north-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "HK",
- "fields": {
- "name": "Hong Kong",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "HU",
- "fields": {
- "name": "Hungary",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": true
- }
-},
-{
- "model": "name.countryname",
- "pk": "IS",
- "fields": {
- "name": "Iceland",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "IN",
- "fields": {
- "name": "India",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "ID",
- "fields": {
- "name": "Indonesia",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "IR",
- "fields": {
- "name": "Iran",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "IQ",
- "fields": {
- "name": "Iraq",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "IE",
- "fields": {
- "name": "Ireland",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": true
- }
-},
-{
- "model": "name.countryname",
- "pk": "IM",
- "fields": {
- "name": "Isle of Man",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "IL",
- "fields": {
- "name": "Israel",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "IT",
- "fields": {
- "name": "Italy",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": true
- }
-},
-{
- "model": "name.countryname",
- "pk": "JM",
- "fields": {
- "name": "Jamaica",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "north-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "JP",
- "fields": {
- "name": "Japan",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "JE",
- "fields": {
- "name": "Jersey",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "JO",
- "fields": {
- "name": "Jordan",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "KZ",
- "fields": {
- "name": "Kazakhstan",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "KE",
- "fields": {
- "name": "Kenya",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "KI",
- "fields": {
- "name": "Kiribati",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "oceania",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "KW",
- "fields": {
- "name": "Kuwait",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "KG",
- "fields": {
- "name": "Kyrgyzstan",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "LA",
- "fields": {
- "name": "Laos",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "LV",
- "fields": {
- "name": "Latvia",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": true
- }
-},
-{
- "model": "name.countryname",
- "pk": "LB",
- "fields": {
- "name": "Lebanon",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "LS",
- "fields": {
- "name": "Lesotho",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "LR",
- "fields": {
- "name": "Liberia",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "LY",
- "fields": {
- "name": "Libya",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "LI",
- "fields": {
- "name": "Liechtenstein",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "LT",
- "fields": {
- "name": "Lithuania",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": true
- }
-},
-{
- "model": "name.countryname",
- "pk": "LU",
- "fields": {
- "name": "Luxembourg",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": true
- }
-},
-{
- "model": "name.countryname",
- "pk": "MO",
- "fields": {
- "name": "Macao",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "MK",
- "fields": {
- "name": "Macedonia",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "MG",
- "fields": {
- "name": "Madagascar",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "MW",
- "fields": {
- "name": "Malawi",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "MY",
- "fields": {
- "name": "Malaysia",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "MV",
- "fields": {
- "name": "Maldives",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "ML",
- "fields": {
- "name": "Mali",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "MT",
- "fields": {
- "name": "Malta",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": true
- }
-},
-{
- "model": "name.countryname",
- "pk": "MH",
- "fields": {
- "name": "Marshall Islands",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "oceania",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "MQ",
- "fields": {
- "name": "Martinique",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "north-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "MR",
- "fields": {
- "name": "Mauritania",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "MU",
- "fields": {
- "name": "Mauritius",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "YT",
- "fields": {
- "name": "Mayotte",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "MX",
- "fields": {
- "name": "Mexico",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "north-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "FM",
- "fields": {
- "name": "Micronesia (Federated States of)",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "oceania",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "MD",
- "fields": {
- "name": "Moldova",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "MC",
- "fields": {
- "name": "Monaco",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "MN",
- "fields": {
- "name": "Mongolia",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "ME",
- "fields": {
- "name": "Montenegro",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "MS",
- "fields": {
- "name": "Montserrat",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "north-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "MA",
- "fields": {
- "name": "Morocco",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "MZ",
- "fields": {
- "name": "Mozambique",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "MM",
- "fields": {
- "name": "Myanmar",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "NA",
- "fields": {
- "name": "Namibia",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "NR",
- "fields": {
- "name": "Nauru",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "oceania",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "NP",
- "fields": {
- "name": "Nepal",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "NL",
- "fields": {
- "name": "Netherlands",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": true
- }
-},
-{
- "model": "name.countryname",
- "pk": "NC",
- "fields": {
- "name": "New Caledonia",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "oceania",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "NZ",
- "fields": {
- "name": "New Zealand",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "oceania",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "NI",
- "fields": {
- "name": "Nicaragua",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "north-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "NE",
- "fields": {
- "name": "Niger",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "NG",
- "fields": {
- "name": "Nigeria",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "NU",
- "fields": {
- "name": "Niue",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "oceania",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "NF",
- "fields": {
- "name": "Norfolk Island",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "oceania",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "KP",
- "fields": {
- "name": "North Korea",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "MP",
- "fields": {
- "name": "Northern Mariana Islands",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "oceania",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "NO",
- "fields": {
- "name": "Norway",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "OM",
- "fields": {
- "name": "Oman",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "PK",
- "fields": {
- "name": "Pakistan",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "PW",
- "fields": {
- "name": "Palau",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "oceania",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "PS",
- "fields": {
- "name": "Palestine, State of",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "PA",
- "fields": {
- "name": "Panama",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "north-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "PG",
- "fields": {
- "name": "Papua New Guinea",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "oceania",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "PY",
- "fields": {
- "name": "Paraguay",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "south-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "PE",
- "fields": {
- "name": "Peru",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "south-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "PH",
- "fields": {
- "name": "Philippines",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "PN",
- "fields": {
- "name": "Pitcairn",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "oceania",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "PL",
- "fields": {
- "name": "Poland",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": true
- }
-},
-{
- "model": "name.countryname",
- "pk": "PT",
- "fields": {
- "name": "Portugal",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": true
- }
-},
-{
- "model": "name.countryname",
- "pk": "PR",
- "fields": {
- "name": "Puerto Rico",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "north-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "QA",
- "fields": {
- "name": "Qatar",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "RE",
- "fields": {
- "name": "R\u00e9union",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "RO",
- "fields": {
- "name": "Romania",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": true
- }
-},
-{
- "model": "name.countryname",
- "pk": "RU",
- "fields": {
- "name": "Russia",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "RW",
- "fields": {
- "name": "Rwanda",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "BL",
- "fields": {
- "name": "Saint Barth\u00e9lemy",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "north-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "SH",
- "fields": {
- "name": "Saint Helena, Ascension and Tristan da Cunha",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "KN",
- "fields": {
- "name": "Saint Kitts and Nevis",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "north-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "LC",
- "fields": {
- "name": "Saint Lucia",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "north-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "MF",
- "fields": {
- "name": "Saint Martin (French part)",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "north-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "PM",
- "fields": {
- "name": "Saint Pierre and Miquelon",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "north-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "VC",
- "fields": {
- "name": "Saint Vincent and the Grenadines",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "north-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "WS",
- "fields": {
- "name": "Samoa",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "oceania",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "SM",
- "fields": {
- "name": "San Marino",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "ST",
- "fields": {
- "name": "Sao Tome and Principe",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "SA",
- "fields": {
- "name": "Saudi Arabia",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "SN",
- "fields": {
- "name": "Senegal",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "RS",
- "fields": {
- "name": "Serbia",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "SC",
- "fields": {
- "name": "Seychelles",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "SL",
- "fields": {
- "name": "Sierra Leone",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "SG",
- "fields": {
- "name": "Singapore",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "SX",
- "fields": {
- "name": "Sint Maarten (Dutch part)",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "north-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "SK",
- "fields": {
- "name": "Slovakia",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": true
- }
-},
-{
- "model": "name.countryname",
- "pk": "SI",
- "fields": {
- "name": "Slovenia",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": true
- }
-},
-{
- "model": "name.countryname",
- "pk": "SB",
- "fields": {
- "name": "Solomon Islands",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "oceania",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "SO",
- "fields": {
- "name": "Somalia",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "ZA",
- "fields": {
- "name": "South Africa",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "GS",
- "fields": {
- "name": "South Georgia and the South Sandwich Islands",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "antarctica",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "KR",
- "fields": {
- "name": "South Korea",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "SS",
- "fields": {
- "name": "South Sudan",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "ES",
- "fields": {
- "name": "Spain",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": true
- }
-},
-{
- "model": "name.countryname",
- "pk": "LK",
- "fields": {
- "name": "Sri Lanka",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "SD",
- "fields": {
- "name": "Sudan",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "SR",
- "fields": {
- "name": "Suriname",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "south-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "SJ",
- "fields": {
- "name": "Svalbard and Jan Mayen",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "SZ",
- "fields": {
- "name": "Swaziland",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "SE",
- "fields": {
- "name": "Sweden",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": true
- }
-},
-{
- "model": "name.countryname",
- "pk": "CH",
- "fields": {
- "name": "Switzerland",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "SY",
- "fields": {
- "name": "Syria",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "TW",
- "fields": {
- "name": "Taiwan",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "TJ",
- "fields": {
- "name": "Tajikistan",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "TZ",
- "fields": {
- "name": "Tanzania",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "TH",
- "fields": {
- "name": "Thailand",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "TL",
- "fields": {
- "name": "Timor-Leste",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "TG",
- "fields": {
- "name": "Togo",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "TK",
- "fields": {
- "name": "Tokelau",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "oceania",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "TO",
- "fields": {
- "name": "Tonga",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "oceania",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "TT",
- "fields": {
- "name": "Trinidad and Tobago",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "north-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "TN",
- "fields": {
- "name": "Tunisia",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "TR",
- "fields": {
- "name": "Turkey",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "TM",
- "fields": {
- "name": "Turkmenistan",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "TC",
- "fields": {
- "name": "Turks and Caicos Islands",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "north-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "TV",
- "fields": {
- "name": "Tuvalu",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "oceania",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "UG",
- "fields": {
- "name": "Uganda",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "UA",
- "fields": {
- "name": "Ukraine",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "AE",
- "fields": {
- "name": "United Arab Emirates",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "GB",
- "fields": {
- "name": "United Kingdom",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "europe",
- "in_eu": true
- }
-},
-{
- "model": "name.countryname",
- "pk": "UM",
- "fields": {
- "name": "United States Minor Outlying Islands",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "oceania",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "US",
- "fields": {
- "name": "United States of America",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "north-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "UY",
- "fields": {
- "name": "Uruguay",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "south-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "UZ",
- "fields": {
- "name": "Uzbekistan",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "VU",
- "fields": {
- "name": "Vanuatu",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "oceania",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "VE",
- "fields": {
- "name": "Venezuela",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "south-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "VN",
- "fields": {
- "name": "Vietnam",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "VG",
- "fields": {
- "name": "Virgin Islands (British)",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "north-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "VI",
- "fields": {
- "name": "Virgin Islands (U.S.)",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "north-america",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "WF",
- "fields": {
- "name": "Wallis and Futuna",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "oceania",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "EH",
- "fields": {
- "name": "Western Sahara",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "YE",
- "fields": {
- "name": "Yemen",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "asia",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "ZM",
- "fields": {
- "name": "Zambia",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.countryname",
- "pk": "ZW",
- "fields": {
- "name": "Zimbabwe",
- "desc": "",
- "used": true,
- "order": 0,
- "continent": "africa",
- "in_eu": false
- }
-},
-{
- "model": "name.dbtemplatetypename",
- "pk": "django",
- "fields": {
- "name": "Django",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.dbtemplatetypename",
- "pk": "plain",
- "fields": {
- "name": "Plain",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.dbtemplatetypename",
- "pk": "rst",
- "fields": {
- "name": "reStructuredText",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.docrelationshipname",
- "pk": "downref-approval",
- "fields": {
- "name": "approves downref to",
- "desc": "Approval for downref",
- "used": true,
- "order": 0,
- "revname": "was approved for downref by"
- }
-},
-{
- "model": "name.docrelationshipname",
- "pk": "conflrev",
- "fields": {
- "name": "conflict reviews",
- "desc": "",
- "used": true,
- "order": 0,
- "revname": "Conflict reviewed by"
- }
-},
-{
- "model": "name.docrelationshipname",
- "pk": "refinfo",
- "fields": {
- "name": "informatively references",
- "desc": "Informative Reference",
- "used": true,
- "order": 0,
- "revname": "is informatively referenced by"
- }
-},
-{
- "model": "name.docrelationshipname",
- "pk": "tobcp",
- "fields": {
- "name": "Moves to BCP",
- "desc": "",
- "used": true,
- "order": 0,
- "revname": "Moved to BCP by"
- }
-},
-{
- "model": "name.docrelationshipname",
- "pk": "toexp",
- "fields": {
- "name": "Moves to Experimental",
- "desc": "",
- "used": true,
- "order": 0,
- "revname": "Moved to Experimental by"
- }
-},
-{
- "model": "name.docrelationshipname",
- "pk": "tohist",
- "fields": {
- "name": "Moves to Historic",
- "desc": "",
- "used": true,
- "order": 0,
- "revname": "Moved to Historic by"
- }
-},
-{
- "model": "name.docrelationshipname",
- "pk": "toinf",
- "fields": {
- "name": "Moves to Informational",
- "desc": "",
- "used": true,
- "order": 0,
- "revname": "Moved to Informational by"
- }
-},
-{
- "model": "name.docrelationshipname",
- "pk": "tois",
- "fields": {
- "name": "Moves to Internet Standard",
- "desc": "",
- "used": true,
- "order": 0,
- "revname": "Moved to Internet Standard by"
- }
-},
-{
- "model": "name.docrelationshipname",
- "pk": "tops",
- "fields": {
- "name": "Moves to Proposed Standard",
- "desc": "",
- "used": true,
- "order": 0,
- "revname": "Moved to Proposed Standard by"
- }
-},
-{
- "model": "name.docrelationshipname",
- "pk": "refnorm",
- "fields": {
- "name": "normatively references",
- "desc": "Normative Reference",
- "used": true,
- "order": 0,
- "revname": "is normatively referenced by"
- }
-},
-{
- "model": "name.docrelationshipname",
- "pk": "obs",
- "fields": {
- "name": "Obsoletes",
- "desc": "",
- "used": true,
- "order": 0,
- "revname": "Obsoleted by"
- }
-},
-{
- "model": "name.docrelationshipname",
- "pk": "possibly-replaces",
- "fields": {
- "name": "Possibly Replaces",
- "desc": "",
- "used": true,
- "order": 0,
- "revname": "Possibly Replaced By"
- }
-},
-{
- "model": "name.docrelationshipname",
- "pk": "refold",
- "fields": {
- "name": "Reference",
- "desc": "A reference found in a document which does not have split normative/informative reference sections.",
- "used": true,
- "order": 0,
- "revname": "Referenced by"
- }
-},
-{
- "model": "name.docrelationshipname",
- "pk": "replaces",
- "fields": {
- "name": "Replaces",
- "desc": "",
- "used": true,
- "order": 0,
- "revname": "Replaced by"
- }
-},
-{
- "model": "name.docrelationshipname",
- "pk": "updates",
- "fields": {
- "name": "Updates",
- "desc": "",
- "used": true,
- "order": 0,
- "revname": "Updated by"
- }
-},
-{
- "model": "name.docrelationshipname",
- "pk": "refunk",
- "fields": {
- "name": "Possible Reference",
- "desc": "Reference of unknown type, likely found in the text of the document.",
- "used": true,
- "order": 3,
- "revname": "Possibly Referenced By"
- }
-},
-{
- "model": "name.docremindertypename",
- "pk": "stream-s",
- "fields": {
- "name": "Stream state should change",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.doctagname",
- "pk": "app-min",
- "fields": {
- "name": "Approved in minutes",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.doctagname",
- "pk": "errata",
- "fields": {
- "name": "Has errata",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.doctagname",
- "pk": "ref",
- "fields": {
- "name": "Holding for references",
- "desc": "Holding for normative reference",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.doctagname",
- "pk": "iana",
- "fields": {
- "name": "IANA",
- "desc": "The document has IANA actions that are not yet completed.",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.doctagname",
- "pk": "iana-crd",
- "fields": {
- "name": "IANA coordination",
- "desc": "RFC-Editor/IANA Registration Coordination",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.doctagname",
- "pk": "iesg-com",
- "fields": {
- "name": "IESG Review Completed",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.doctagname",
- "pk": "missref",
- "fields": {
- "name": "Missing references",
- "desc": "Awaiting missing normative reference",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.doctagname",
- "pk": "no-adopt",
- "fields": {
- "name": "Polled for WG adoption but not adopted",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.doctagname",
- "pk": "rfc-rev",
- "fields": {
- "name": "Review by RFC Editor",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.doctagname",
- "pk": "rev-wg",
- "fields": {
- "name": "Revised I-D Needed - Issue raised by WG",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.doctagname",
- "pk": "need-sh",
- "fields": {
- "name": "Shepherd Needed",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.doctagname",
- "pk": "via-rfc",
- "fields": {
- "name": "Via RFC Editor",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.doctagname",
- "pk": "w-dep",
- "fields": {
- "name": "Waiting for Dependency on Other Document",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.doctagname",
- "pk": "w-expert",
- "fields": {
- "name": "Awaiting Expert Review/Resolution of Issues Raised",
- "desc": "",
- "used": true,
- "order": 1
- }
-},
-{
- "model": "name.doctagname",
- "pk": "need-ed",
- "fields": {
- "name": "Editor Needed",
- "desc": "",
- "used": true,
- "order": 1
- }
-},
-{
- "model": "name.doctagname",
- "pk": "point",
- "fields": {
- "name": "Point Raised - writeup needed",
- "desc": "IESG discussions on the document have raised some issues that need to be brought to the attention of the authors/WG, but those issues have not been written down yet. (It is common for discussions during a telechat to result in such situations. An AD may raise a possible issue during a telechat and only decide as a result of that discussion whether the issue is worth formally writing up and bringing to the attention of the authors/WG). A document stays in the \"Point Raised - Writeup Needed\" state until *ALL* IESG comments that have been raised have been documented.",
- "used": true,
- "order": 1
- }
-},
-{
- "model": "name.doctagname",
- "pk": "ad-f-up",
- "fields": {
- "name": "AD Followup",
- "desc": "A generic substate indicating that the shepherding AD has the action item to determine appropriate next steps. In particular, the appropriate steps (and the corresponding next state or substate) depend entirely on the nature of the issues that were raised and can only be decided with active involvement of the shepherding AD. Examples include:\n\n- if another AD raises an issue, the shepherding AD may first iterate with the other AD to get a better understanding of the exact issue. Or, the shepherding AD may attempt to argue that the issue is not serious enough to bring to the attention of the authors/WG.\n\n- if a documented issue is forwarded to a WG, some further iteration may be needed before it can be determined whether a new revision is needed or whether the WG response to an issue clarifies the issue sufficiently.\n\n- when a new revision appears, the shepherding AD will first look at the changes to determine whether they believe all outstanding issues have been raised satisfactorily, prior to asking the ADs who raised the original issues to verify the changes.",
- "used": true,
- "order": 2
- }
-},
-{
- "model": "name.doctagname",
- "pk": "w-extern",
- "fields": {
- "name": "Awaiting External Review/Resolution of Issues Raised",
- "desc": "",
- "used": true,
- "order": 2
- }
-},
-{
- "model": "name.doctagname",
- "pk": "w-part",
- "fields": {
- "name": "Waiting for Partner Feedback",
- "desc": "",
- "used": true,
- "order": 2
- }
-},
-{
- "model": "name.doctagname",
- "pk": "w-merge",
- "fields": {
- "name": "Awaiting Merge with Other Document",
- "desc": "",
- "used": true,
- "order": 3
- }
-},
-{
- "model": "name.doctagname",
- "pk": "w-review",
- "fields": {
- "name": "Awaiting Reviews",
- "desc": "",
- "used": true,
- "order": 3
- }
-},
-{
- "model": "name.doctagname",
- "pk": "extpty",
- "fields": {
- "name": "External Party",
- "desc": "The document is awaiting review or input from an external party (i.e, someone other than the shepherding AD, the authors, or the WG). See the \"note\" field for more details on who has the action.",
- "used": true,
- "order": 3
- }
-},
-{
- "model": "name.doctagname",
- "pk": "need-aut",
- "fields": {
- "name": "Author or Editor Needed",
- "desc": "",
- "used": true,
- "order": 4
- }
-},
-{
- "model": "name.doctagname",
- "pk": "sh-f-up",
- "fields": {
- "name": "Document Shepherd Followup",
- "desc": "",
- "used": true,
- "order": 4
- }
-},
-{
- "model": "name.doctagname",
- "pk": "need-rev",
- "fields": {
- "name": "Revised I-D Needed",
- "desc": "An updated I-D is needed to address the issues that have been raised.",
- "used": true,
- "order": 5
- }
-},
-{
- "model": "name.doctagname",
- "pk": "w-refdoc",
- "fields": {
- "name": "Waiting for Referenced Document",
- "desc": "",
- "used": true,
- "order": 5
- }
-},
-{
- "model": "name.doctagname",
- "pk": "w-refing",
- "fields": {
- "name": "Waiting for Referencing Document",
- "desc": "",
- "used": true,
- "order": 6
- }
-},
-{
- "model": "name.doctagname",
- "pk": "rev-wglc",
- "fields": {
- "name": "Revised I-D Needed - Issue raised by WGLC",
- "desc": "",
- "used": true,
- "order": 7
- }
-},
-{
- "model": "name.doctagname",
- "pk": "rev-ad",
- "fields": {
- "name": "Revised I-D Needed - Issue raised by AD",
- "desc": "",
- "used": true,
- "order": 8
- }
-},
-{
- "model": "name.doctagname",
- "pk": "rev-iesg",
- "fields": {
- "name": "Revised I-D Needed - Issue raised by IESG",
- "desc": "",
- "used": true,
- "order": 9
- }
-},
-{
- "model": "name.doctagname",
- "pk": "sheph-u",
- "fields": {
- "name": "Doc Shepherd Follow-up Underway",
- "desc": "",
- "used": true,
- "order": 10
- }
-},
-{
- "model": "name.doctagname",
- "pk": "other",
- "fields": {
- "name": "Other - see Comment Log",
- "desc": "",
- "used": true,
- "order": 11
- }
-},
-{
- "model": "name.doctypename",
- "pk": "agenda",
- "fields": {
- "name": "Agenda",
- "desc": "",
- "used": true,
- "order": 0,
- "prefix": "agenda"
- }
-},
-{
- "model": "name.doctypename",
- "pk": "bluesheets",
- "fields": {
- "name": "Bluesheets",
- "desc": "",
- "used": true,
- "order": 0,
- "prefix": "bluesheets"
- }
-},
-{
- "model": "name.doctypename",
- "pk": "charter",
- "fields": {
- "name": "Charter",
- "desc": "",
- "used": true,
- "order": 0,
- "prefix": "charter"
- }
-},
-{
- "model": "name.doctypename",
- "pk": "conflrev",
- "fields": {
- "name": "Conflict Review",
- "desc": "",
- "used": true,
- "order": 0,
- "prefix": "conflict-review"
- }
-},
-{
- "model": "name.doctypename",
- "pk": "draft",
- "fields": {
- "name": "Draft",
- "desc": "",
- "used": true,
- "order": 0,
- "prefix": "draft"
- }
-},
-{
- "model": "name.doctypename",
- "pk": "liaison",
- "fields": {
- "name": "Liaison",
- "desc": "",
- "used": false,
- "order": 0,
- "prefix": "liaison"
- }
-},
-{
- "model": "name.doctypename",
- "pk": "liai-att",
- "fields": {
- "name": "Liaison Attachment",
- "desc": "",
- "used": true,
- "order": 0,
- "prefix": "liai-att"
- }
-},
-{
- "model": "name.doctypename",
- "pk": "minutes",
- "fields": {
- "name": "Minutes",
- "desc": "",
- "used": true,
- "order": 0,
- "prefix": "minutes"
- }
-},
-{
- "model": "name.doctypename",
- "pk": "recording",
- "fields": {
- "name": "Recording",
- "desc": "",
- "used": true,
- "order": 0,
- "prefix": "recording"
- }
-},
-{
- "model": "name.doctypename",
- "pk": "review",
- "fields": {
- "name": "Review",
- "desc": "",
- "used": true,
- "order": 0,
- "prefix": "review"
- }
-},
-{
- "model": "name.doctypename",
- "pk": "shepwrit",
- "fields": {
- "name": "Shepherd's writeup",
- "desc": "",
- "used": false,
- "order": 0,
- "prefix": "shepherd"
- }
-},
-{
- "model": "name.doctypename",
- "pk": "slides",
- "fields": {
- "name": "Slides",
- "desc": "",
- "used": true,
- "order": 0,
- "prefix": "slides"
- }
-},
-{
- "model": "name.doctypename",
- "pk": "statchg",
- "fields": {
- "name": "Status Change",
- "desc": "",
- "used": true,
- "order": 0,
- "prefix": "status-change"
- }
-},
-{
- "model": "name.docurltagname",
- "pk": "issues",
- "fields": {
- "name": "Document issue tracker",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.docurltagname",
- "pk": "repository",
- "fields": {
- "name": "Document source repository",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.docurltagname",
- "pk": "wiki",
- "fields": {
- "name": "Document wiki",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.docurltagname",
- "pk": "yang-module",
- "fields": {
- "name": "Extracted yang module",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.docurltagname",
- "pk": "yang-impact-analysis",
- "fields": {
- "name": "Yang impact analysis",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.docurltagname",
- "pk": "yang-module-metadata",
- "fields": {
- "name": "Yang module metadata",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.draftsubmissionstatename",
- "pk": "confirmed",
- "fields": {
- "name": "Confirmed",
- "desc": "",
- "used": true,
- "order": 0,
- "next_states": [
- "cancel",
- "posted"
- ]
- }
-},
-{
- "model": "name.draftsubmissionstatename",
- "pk": "uploaded",
- "fields": {
- "name": "Uploaded",
- "desc": "",
- "used": true,
- "order": 1,
- "next_states": [
- "auth",
- "aut-appr",
- "grp-appr",
- "manual",
- "cancel"
- ]
- }
-},
-{
- "model": "name.draftsubmissionstatename",
- "pk": "auth",
- "fields": {
- "name": "Awaiting Submitter Authentication",
- "desc": "",
- "used": true,
- "order": 2,
- "next_states": [
- "confirmed",
- "cancel",
- "posted"
- ]
- }
-},
-{
- "model": "name.draftsubmissionstatename",
- "pk": "aut-appr",
- "fields": {
- "name": "Awaiting Approval from Previous Version Authors",
- "desc": "",
- "used": true,
- "order": 3,
- "next_states": [
- "confirmed",
- "cancel",
- "posted"
- ]
- }
-},
-{
- "model": "name.draftsubmissionstatename",
- "pk": "grp-appr",
- "fields": {
- "name": "Awaiting Initial Version Approval",
- "desc": "",
- "used": true,
- "order": 4,
- "next_states": [
- "cancel",
- "posted"
- ]
- }
-},
-{
- "model": "name.draftsubmissionstatename",
- "pk": "manual",
- "fields": {
- "name": "Awaiting Manual Post",
- "desc": "",
- "used": true,
- "order": 5,
- "next_states": [
- "cancel",
- "posted"
- ]
- }
-},
-{
- "model": "name.draftsubmissionstatename",
- "pk": "cancel",
- "fields": {
- "name": "Cancelled",
- "desc": "",
- "used": true,
- "order": 6,
- "next_states": []
- }
-},
-{
- "model": "name.draftsubmissionstatename",
- "pk": "posted",
- "fields": {
- "name": "Posted",
- "desc": "",
- "used": true,
- "order": 7,
- "next_states": []
- }
-},
-{
- "model": "name.draftsubmissionstatename",
- "pk": "waiting-for-draft",
- "fields": {
- "name": "Manual Post Waiting for Draft",
- "desc": "",
- "used": true,
- "order": 8,
- "next_states": [
- "cancel",
- "posted"
- ]
- }
-},
-{
- "model": "name.feedbacktypename",
- "pk": "comment",
- "fields": {
- "name": "Comment",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.feedbacktypename",
- "pk": "junk",
- "fields": {
- "name": "Junk",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.feedbacktypename",
- "pk": "nomina",
- "fields": {
- "name": "Nomination",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.feedbacktypename",
- "pk": "questio",
- "fields": {
- "name": "Questionnaire response",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.feedbacktypename",
- "pk": "read",
- "fields": {
- "name": "Read",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.formallanguagename",
- "pk": "abnf",
- "fields": {
- "name": "ABNF",
- "desc": "Augmented Backus-Naur Form",
- "used": true,
- "order": 1
- }
-},
-{
- "model": "name.formallanguagename",
- "pk": "asn1",
- "fields": {
- "name": "ASN.1",
- "desc": "Abstract Syntax Notation One",
- "used": true,
- "order": 2
- }
-},
-{
- "model": "name.formallanguagename",
- "pk": "cbor",
- "fields": {
- "name": "CBOR",
- "desc": "Concise Binary Object Representation",
- "used": true,
- "order": 3
- }
-},
-{
- "model": "name.formallanguagename",
- "pk": "ccode",
- "fields": {
- "name": "C Code",
- "desc": "Code in the C Programming Language",
- "used": true,
- "order": 4
- }
-},
-{
- "model": "name.formallanguagename",
- "pk": "json",
- "fields": {
- "name": "JSON",
- "desc": "Javascript Object Notation",
- "used": true,
- "order": 5
- }
-},
-{
- "model": "name.formallanguagename",
- "pk": "xml",
- "fields": {
- "name": "XML",
- "desc": "Extensible Markup Language",
- "used": true,
- "order": 6
- }
-},
-{
- "model": "name.groupmilestonestatename",
- "pk": "active",
- "fields": {
- "name": "Active",
- "desc": "",
- "used": true,
- "order": 1
- }
-},
-{
- "model": "name.groupmilestonestatename",
- "pk": "deleted",
- "fields": {
- "name": "Deleted",
- "desc": "",
- "used": true,
- "order": 2
- }
-},
-{
- "model": "name.groupmilestonestatename",
- "pk": "review",
- "fields": {
- "name": "For review",
- "desc": "",
- "used": true,
- "order": 3
- }
-},
-{
- "model": "name.groupmilestonestatename",
- "pk": "charter",
- "fields": {
- "name": "Chartering/rechartering",
- "desc": "",
- "used": true,
- "order": 4
- }
-},
-{
- "model": "name.groupstatename",
- "pk": "abandon",
- "fields": {
- "name": "Abandonded",
- "desc": "Formation of the group (most likely a BoF or Proposed WG) was abandoned",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.groupstatename",
- "pk": "active",
- "fields": {
- "name": "Active",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.groupstatename",
- "pk": "bof",
- "fields": {
- "name": "BOF",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.groupstatename",
- "pk": "bof-conc",
- "fields": {
- "name": "BOF Concluded",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.groupstatename",
- "pk": "conclude",
- "fields": {
- "name": "Concluded",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.groupstatename",
- "pk": "dormant",
- "fields": {
- "name": "Dormant",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.groupstatename",
- "pk": "proposed",
- "fields": {
- "name": "Proposed",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.groupstatename",
- "pk": "replaced",
- "fields": {
- "name": "Replaced",
- "desc": "Replaced by dnssd",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.groupstatename",
- "pk": "unknown",
- "fields": {
- "name": "Unknown",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.grouptypename",
- "pk": "adhoc",
- "fields": {
- "name": "Ad Hoc",
- "desc": "Ad Hoc schedulable Group Type, for instance HotRfc",
- "used": true,
- "order": 0,
- "verbose_name": "Ad Hoc Group Type"
- }
-},
-{
- "model": "name.grouptypename",
- "pk": "ag",
- "fields": {
- "name": "AG",
- "desc": "Area group",
- "used": true,
- "order": 0,
- "verbose_name": "Area Group"
- }
-},
-{
- "model": "name.grouptypename",
- "pk": "area",
- "fields": {
- "name": "Area",
- "desc": "",
- "used": true,
- "order": 0,
- "verbose_name": "Area"
- }
-},
-{
- "model": "name.grouptypename",
- "pk": "dir",
- "fields": {
- "name": "Directorate",
- "desc": "In many areas, the Area Directors have formed an advisory group or directorate. These comprise experienced members of the IETF and the technical community represented by the area. The specific name and the details of the role for each group differ from area to area, but the primary intent is that these groups assist the Area Director(s), e.g., with the review of specifications produced in the area.",
- "used": true,
- "order": 0,
- "verbose_name": "Area Directorate"
- }
-},
-{
- "model": "name.grouptypename",
- "pk": "review",
- "fields": {
- "name": "Directorate (with reviews)",
- "desc": "",
- "used": true,
- "order": 0,
- "verbose_name": ""
- }
-},
-{
- "model": "name.grouptypename",
- "pk": "iab",
- "fields": {
- "name": "IAB",
- "desc": "",
- "used": true,
- "order": 0,
- "verbose_name": "Internet Architecture Board"
- }
-},
-{
- "model": "name.grouptypename",
- "pk": "iesg",
- "fields": {
- "name": "IESG",
- "desc": "",
- "used": true,
- "order": 0,
- "verbose_name": "Internet Engineering Steering Group"
- }
-},
-{
- "model": "name.grouptypename",
- "pk": "ietf",
- "fields": {
- "name": "IETF",
- "desc": "",
- "used": true,
- "order": 0,
- "verbose_name": "Internet Engineering Task Force"
- }
-},
-{
- "model": "name.grouptypename",
- "pk": "individ",
- "fields": {
- "name": "Individual",
- "desc": "",
- "used": true,
- "order": 0,
- "verbose_name": "An Individual"
- }
-},
-{
- "model": "name.grouptypename",
- "pk": "irtf",
- "fields": {
- "name": "IRTF",
- "desc": "",
- "used": true,
- "order": 0,
- "verbose_name": "Internet Research Task Force"
- }
-},
-{
- "model": "name.grouptypename",
- "pk": "ise",
- "fields": {
- "name": "ISE",
- "desc": "",
- "used": true,
- "order": 0,
- "verbose_name": "Independent Stream Editor"
- }
-},
-{
- "model": "name.grouptypename",
- "pk": "isoc",
- "fields": {
- "name": "ISOC",
- "desc": "",
- "used": true,
- "order": 0,
- "verbose_name": "The Internet Society"
- }
-},
-{
- "model": "name.grouptypename",
- "pk": "nomcom",
- "fields": {
- "name": "Nomcom",
- "desc": "An IETF/IAB Nominating Committee. Use 'SDO' for external nominating committees.",
- "used": true,
- "order": 0,
- "verbose_name": "IETF/IAB Nominating Committee"
- }
-},
-{
- "model": "name.grouptypename",
- "pk": "program",
- "fields": {
- "name": "Program",
- "desc": "Program",
- "used": true,
- "order": 0,
- "verbose_name": ""
- }
-},
-{
- "model": "name.grouptypename",
- "pk": "rfcedtyp",
- "fields": {
- "name": "RFC Editor",
- "desc": "",
- "used": true,
- "order": 0,
- "verbose_name": "The RFC Editor"
- }
-},
-{
- "model": "name.grouptypename",
- "pk": "rg",
- "fields": {
- "name": "RG",
- "desc": "Research group",
- "used": true,
- "order": 0,
- "verbose_name": "Research Group"
- }
-},
-{
- "model": "name.grouptypename",
- "pk": "sdo",
- "fields": {
- "name": "SDO",
- "desc": "Standards organization",
- "used": true,
- "order": 0,
- "verbose_name": "Standards Organization"
- }
-},
-{
- "model": "name.grouptypename",
- "pk": "team",
- "fields": {
- "name": "Team",
- "desc": "",
- "used": true,
- "order": 0,
- "verbose_name": "Team"
- }
-},
-{
- "model": "name.grouptypename",
- "pk": "wg",
- "fields": {
- "name": "WG",
- "desc": "Working group",
- "used": true,
- "order": 0,
- "verbose_name": "Working Group"
- }
-},
-{
- "model": "name.importantdatename",
- "pk": "00cutoff",
- "fields": {
- "name": "00 ID Cutoff",
- "desc": "Internet Draft submission cut-off for -00 drafts by UTC 23:59",
- "used": false,
- "order": 0,
- "default_offset_days": -19
- }
-},
-{
- "model": "name.importantdatename",
- "pk": "01cutoff",
- "fields": {
- "name": "01 ID Cutoff",
- "desc": "Internet Draft submission cut-off for revised (-01 and above) drafts by UTC 23:59",
- "used": false,
- "order": 0,
- "default_offset_days": -12
- }
-},
-{
- "model": "name.importantdatename",
- "pk": "cutoffbofapprove",
- "fields": {
- "name": "Cut-off BOF approval",
- "desc": "Cut-off date for Area Directors to approve BOFs at UTC 23:59",
- "used": true,
- "order": 0,
- "default_offset_days": -36
- }
-},
-{
- "model": "name.importantdatename",
- "pk": "cutoffbofreq",
- "fields": {
- "name": "Cut-off BOF scheduling Requests",
- "desc": "Cut-off date for BOF proposal requests to Area Directors at UTC 23:59",
- "used": true,
- "order": 0,
- "default_offset_days": -43
- }
-},
-{
- "model": "name.importantdatename",
- "pk": "cutoffresched",
- "fields": {
- "name": "Cut-off Reschedule Requests",
- "desc": "Cut-off date for requests to reschedule Working Group or BOF meetings UTC 23:59",
- "used": true,
- "order": 0,
- "default_offset_days": -24
- }
-},
-{
- "model": "name.importantdatename",
- "pk": "cutoffwgreq",
- "fields": {
- "name": "Cut-off WG scheduling Requests",
- "desc": "Cut-off date for requests to schedule Working Group Meetings at UTC 23:59",
- "used": true,
- "order": 0,
- "default_offset_days": -43
- }
-},
-{
- "model": "name.importantdatename",
- "pk": "draftwgagenda",
- "fields": {
- "name": "Draft Working Group Agendas",
- "desc": "Draft Working Group agendas due by UTC 23:59",
- "used": true,
- "order": 0,
- "default_offset_days": -10
- }
-},
-{
- "model": "name.importantdatename",
- "pk": "earlybird",
- "fields": {
- "name": "Earlybird cutoff",
- "desc": "Early Bird registration and payment cut-off at UTC 23:59",
- "used": true,
- "order": 0,
- "default_offset_days": -47
- }
-},
-{
- "model": "name.importantdatename",
- "pk": "finalagenda",
- "fields": {
- "name": "Final Agenda",
- "desc": "Final agenda to be published",
- "used": true,
- "order": 0,
- "default_offset_days": -22
- }
-},
-{
- "model": "name.importantdatename",
- "pk": "idcutoff",
- "fields": {
- "name": "ID Cutoff",
- "desc": "Internet Draft submission cut-off (for all drafts, including -00) by UTC 23:59",
- "used": true,
- "order": 0,
- "default_offset_days": -12
- }
-},
-{
- "model": "name.importantdatename",
- "pk": "cutoffpre",
- "fields": {
- "name": "Pre-Registration Cutoff",
- "desc": "Final Pre-Registration and Pre-Payment cut-off at 17:00 local meeting time",
- "used": false,
- "order": 0,
- "default_offset_days": -1
- }
-},
-{
- "model": "name.importantdatename",
- "pk": "prelimagenda",
- "fields": {
- "name": "Preliminary Agenda",
- "desc": "Preliminary Agenda published for comment",
- "used": true,
- "order": 0,
- "default_offset_days": -29
- }
-},
-{
- "model": "name.importantdatename",
- "pk": "procsub",
- "fields": {
- "name": "Proceedings Submission Cut-off",
- "desc": "Proceedings submission cutoff date by UTC 23:59",
- "used": true,
- "order": 0,
- "default_offset_days": 27
- }
-},
-{
- "model": "name.importantdatename",
- "pk": "revsub",
- "fields": {
- "name": "Proceedings Submission Revision Cut-off",
- "desc": "Proceedings submission corrections cutoff date by UTC 23:59",
- "used": true,
- "order": 0,
- "default_offset_days": 51
- }
-},
-{
- "model": "name.importantdatename",
- "pk": "cutoffcancel",
- "fields": {
- "name": "Registration Cancellation Cut-off",
- "desc": "Registration cancellation cut-off at UTC 23:59",
- "used": true,
- "order": 0,
- "default_offset_days": -5
- }
-},
-{
- "model": "name.importantdatename",
- "pk": "openreg",
- "fields": {
- "name": "Registration Opens",
- "desc": "IETF Online Registration Opens",
- "used": true,
- "order": 0,
- "default_offset_days": -82
- }
-},
-{
- "model": "name.importantdatename",
- "pk": "revwgagenda",
- "fields": {
- "name": "Revised Working Group Agendas",
- "desc": "Revised Working Group agendas due by UTC 23:59",
- "used": true,
- "order": 0,
- "default_offset_days": -5
- }
-},
-{
- "model": "name.importantdatename",
- "pk": "opensched",
- "fields": {
- "name": "Scheduling Opens",
- "desc": "Working Group and BOF scheduling begins",
- "used": true,
- "order": 0,
- "default_offset_days": -89
- }
-},
-{
- "model": "name.importantdatename",
- "pk": "stdratecutoff",
- "fields": {
- "name": "Standard rate registration ends",
- "desc": "Standard rate registration and payment cut-off at UTC 23:59.",
- "used": true,
- "order": 18,
- "default_offset_days": -12
- }
-},
-{
- "model": "name.intendedstdlevelname",
- "pk": "ps",
- "fields": {
- "name": "Proposed Standard",
- "desc": "",
- "used": true,
- "order": 1
- }
-},
-{
- "model": "name.intendedstdlevelname",
- "pk": "ds",
- "fields": {
- "name": "Draft Standard",
- "desc": "",
- "used": false,
- "order": 2
- }
-},
-{
- "model": "name.intendedstdlevelname",
- "pk": "std",
- "fields": {
- "name": "Internet Standard",
- "desc": "",
- "used": true,
- "order": 3
- }
-},
-{
- "model": "name.intendedstdlevelname",
- "pk": "bcp",
- "fields": {
- "name": "Best Current Practice",
- "desc": "",
- "used": true,
- "order": 4
- }
-},
-{
- "model": "name.intendedstdlevelname",
- "pk": "inf",
- "fields": {
- "name": "Informational",
- "desc": "",
- "used": true,
- "order": 5
- }
-},
-{
- "model": "name.intendedstdlevelname",
- "pk": "exp",
- "fields": {
- "name": "Experimental",
- "desc": "",
- "used": true,
- "order": 6
- }
-},
-{
- "model": "name.intendedstdlevelname",
- "pk": "hist",
- "fields": {
- "name": "Historic",
- "desc": "",
- "used": true,
- "order": 7
- }
-},
-{
- "model": "name.iprdisclosurestatename",
- "pk": "pending",
- "fields": {
- "name": "Pending",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.iprdisclosurestatename",
- "pk": "parked",
- "fields": {
- "name": "Parked",
- "desc": "",
- "used": true,
- "order": 1
- }
-},
-{
- "model": "name.iprdisclosurestatename",
- "pk": "posted",
- "fields": {
- "name": "Posted",
- "desc": "",
- "used": true,
- "order": 2
- }
-},
-{
- "model": "name.iprdisclosurestatename",
- "pk": "rejected",
- "fields": {
- "name": "Rejected",
- "desc": "",
- "used": true,
- "order": 3
- }
-},
-{
- "model": "name.iprdisclosurestatename",
- "pk": "removed",
- "fields": {
- "name": "Removed",
- "desc": "",
- "used": true,
- "order": 4
- }
-},
-{
- "model": "name.ipreventtypename",
- "pk": "changed_disclosure",
- "fields": {
- "name": "Changed disclosure metadata",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.ipreventtypename",
- "pk": "comment",
- "fields": {
- "name": "Comment",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.ipreventtypename",
- "pk": "legacy",
- "fields": {
- "name": "Legacy",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.ipreventtypename",
- "pk": "msgin",
- "fields": {
- "name": "MsgIn",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.ipreventtypename",
- "pk": "msgout",
- "fields": {
- "name": "MsgOut",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.ipreventtypename",
- "pk": "parked",
- "fields": {
- "name": "Parked",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.ipreventtypename",
- "pk": "pending",
- "fields": {
- "name": "Pending",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.ipreventtypename",
- "pk": "posted",
- "fields": {
- "name": "Posted",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.ipreventtypename",
- "pk": "private_comment",
- "fields": {
- "name": "Private Comment",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.ipreventtypename",
- "pk": "rejected",
- "fields": {
- "name": "Rejected",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.ipreventtypename",
- "pk": "removed",
- "fields": {
- "name": "Removed",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.ipreventtypename",
- "pk": "submitted",
- "fields": {
- "name": "Submitted",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.ipreventtypename",
- "pk": "update_notify",
- "fields": {
- "name": "Update Notify",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.iprlicensetypename",
- "pk": "none-selected",
- "fields": {
- "name": "None Selected",
- "desc": "[None selected]",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.iprlicensetypename",
- "pk": "no-license",
- "fields": {
- "name": "No License",
- "desc": "a) No License Required for Implementers",
- "used": true,
- "order": 1
- }
-},
-{
- "model": "name.iprlicensetypename",
- "pk": "royalty-free",
- "fields": {
- "name": "Royalty Free",
- "desc": "b) Royalty-Free, Reasonable and Non-Discriminatory License to All Implementers",
- "used": true,
- "order": 2
- }
-},
-{
- "model": "name.iprlicensetypename",
- "pk": "reasonable",
- "fields": {
- "name": "Reasonable",
- "desc": "c) Reasonable and Non-Discriminatory License to All Implementers with Possible Royalty/Fee",
- "used": true,
- "order": 3
- }
-},
-{
- "model": "name.iprlicensetypename",
- "pk": "provided-later",
- "fields": {
- "name": "Provided Later",
- "desc": "d) Licensing Declaration to be Provided Later (implies a willingness to commit to the provisions of a), b), or c) above to all implementers; otherwise, the next option 'Unwilling to Commit to the Provisions of a), b), or c) Above'. - must be selected)",
- "used": true,
- "order": 4
- }
-},
-{
- "model": "name.iprlicensetypename",
- "pk": "unwilling-to-commit",
- "fields": {
- "name": "Unwilling to Commit",
- "desc": "e) Unwilling to Commit to the Provisions of a), b), or c) Above",
- "used": true,
- "order": 5
- }
-},
-{
- "model": "name.iprlicensetypename",
- "pk": "see-below",
- "fields": {
- "name": "See Below",
- "desc": "f) See Text Below for Licensing Declaration",
- "used": true,
- "order": 6
- }
-},
-{
- "model": "name.liaisonstatementeventtypename",
- "pk": "submitted",
- "fields": {
- "name": "Submitted",
- "desc": "",
- "used": true,
- "order": 1
- }
-},
-{
- "model": "name.liaisonstatementeventtypename",
- "pk": "modified",
- "fields": {
- "name": "Modified",
- "desc": "",
- "used": true,
- "order": 2
- }
-},
-{
- "model": "name.liaisonstatementeventtypename",
- "pk": "approved",
- "fields": {
- "name": "Approved",
- "desc": "",
- "used": true,
- "order": 3
- }
-},
-{
- "model": "name.liaisonstatementeventtypename",
- "pk": "posted",
- "fields": {
- "name": "Posted",
- "desc": "",
- "used": true,
- "order": 4
- }
-},
-{
- "model": "name.liaisonstatementeventtypename",
- "pk": "killed",
- "fields": {
- "name": "Killed",
- "desc": "",
- "used": true,
- "order": 5
- }
-},
-{
- "model": "name.liaisonstatementeventtypename",
- "pk": "resurrected",
- "fields": {
- "name": "Resurrected",
- "desc": "",
- "used": true,
- "order": 6
- }
-},
-{
- "model": "name.liaisonstatementeventtypename",
- "pk": "msgin",
- "fields": {
- "name": "MsgIn",
- "desc": "",
- "used": true,
- "order": 7
- }
-},
-{
- "model": "name.liaisonstatementeventtypename",
- "pk": "msgout",
- "fields": {
- "name": "MsgOut",
- "desc": "",
- "used": true,
- "order": 8
- }
-},
-{
- "model": "name.liaisonstatementeventtypename",
- "pk": "comment",
- "fields": {
- "name": "Comment",
- "desc": "",
- "used": true,
- "order": 9
- }
-},
-{
- "model": "name.liaisonstatementeventtypename",
- "pk": "private_comment",
- "fields": {
- "name": "Private Comment",
- "desc": "",
- "used": true,
- "order": 10
- }
-},
-{
- "model": "name.liaisonstatementeventtypename",
- "pk": "resent",
- "fields": {
- "name": "Re-sent",
- "desc": "",
- "used": true,
- "order": 11
- }
-},
-{
- "model": "name.liaisonstatementpurposename",
- "pk": "action",
- "fields": {
- "name": "For action",
- "desc": "",
- "used": true,
- "order": 1
- }
-},
-{
- "model": "name.liaisonstatementpurposename",
- "pk": "comment",
- "fields": {
- "name": "For comment",
- "desc": "",
- "used": true,
- "order": 2
- }
-},
-{
- "model": "name.liaisonstatementpurposename",
- "pk": "info",
- "fields": {
- "name": "For information",
- "desc": "",
- "used": true,
- "order": 3
- }
-},
-{
- "model": "name.liaisonstatementpurposename",
- "pk": "response",
- "fields": {
- "name": "In response",
- "desc": "",
- "used": true,
- "order": 4
- }
-},
-{
- "model": "name.liaisonstatementstate",
- "pk": "pending",
- "fields": {
- "name": "Pending",
- "desc": "",
- "used": true,
- "order": 1
- }
-},
-{
- "model": "name.liaisonstatementstate",
- "pk": "approved",
- "fields": {
- "name": "Approved",
- "desc": "",
- "used": true,
- "order": 2
- }
-},
-{
- "model": "name.liaisonstatementstate",
- "pk": "posted",
- "fields": {
- "name": "Posted",
- "desc": "",
- "used": true,
- "order": 3
- }
-},
-{
- "model": "name.liaisonstatementstate",
- "pk": "dead",
- "fields": {
- "name": "Dead",
- "desc": "",
- "used": true,
- "order": 4
- }
-},
-{
- "model": "name.liaisonstatementtagname",
- "pk": "required",
- "fields": {
- "name": "Action Required",
- "desc": "",
- "used": true,
- "order": 1
- }
-},
-{
- "model": "name.liaisonstatementtagname",
- "pk": "taken",
- "fields": {
- "name": "Action Taken",
- "desc": "",
- "used": true,
- "order": 2
- }
-},
-{
- "model": "name.meetingtypename",
- "pk": "ietf",
- "fields": {
- "name": "IETF",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.meetingtypename",
- "pk": "interim",
- "fields": {
- "name": "Interim",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.nomineepositionstatename",
- "pk": "accepted",
- "fields": {
- "name": "Accepted",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.nomineepositionstatename",
- "pk": "declined",
- "fields": {
- "name": "Declined",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.nomineepositionstatename",
- "pk": "pending",
- "fields": {
- "name": "Nominated, pending response",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.reviewrequeststatename",
- "pk": "requested",
- "fields": {
- "name": "Requested",
- "desc": "",
- "used": true,
- "order": 1
- }
-},
-{
- "model": "name.reviewrequeststatename",
- "pk": "accepted",
- "fields": {
- "name": "Accepted",
- "desc": "",
- "used": true,
- "order": 2
- }
-},
-{
- "model": "name.reviewrequeststatename",
- "pk": "rejected",
- "fields": {
- "name": "Rejected",
- "desc": "",
- "used": true,
- "order": 3
- }
-},
-{
- "model": "name.reviewrequeststatename",
- "pk": "withdrawn",
- "fields": {
- "name": "Withdrawn",
- "desc": "",
- "used": true,
- "order": 4
- }
-},
-{
- "model": "name.reviewrequeststatename",
- "pk": "overtaken",
- "fields": {
- "name": "Overtaken by Events",
- "desc": "",
- "used": true,
- "order": 5
- }
-},
-{
- "model": "name.reviewrequeststatename",
- "pk": "no-response",
- "fields": {
- "name": "No Response",
- "desc": "",
- "used": true,
- "order": 6
- }
-},
-{
- "model": "name.reviewrequeststatename",
- "pk": "no-review-version",
- "fields": {
- "name": "Team Will not Review Version",
- "desc": "",
- "used": true,
- "order": 7
- }
-},
-{
- "model": "name.reviewrequeststatename",
- "pk": "no-review-document",
- "fields": {
- "name": "Team Will not Review Document",
- "desc": "",
- "used": true,
- "order": 8
- }
-},
-{
- "model": "name.reviewrequeststatename",
- "pk": "part-completed",
- "fields": {
- "name": "Partially Completed",
- "desc": "",
- "used": true,
- "order": 9
- }
-},
-{
- "model": "name.reviewrequeststatename",
- "pk": "completed",
- "fields": {
- "name": "Completed",
- "desc": "",
- "used": true,
- "order": 10
- }
-},
-{
- "model": "name.reviewrequeststatename",
- "pk": "unknown",
- "fields": {
- "name": "Unknown",
- "desc": "",
- "used": false,
- "order": 20
- }
-},
-{
- "model": "name.reviewresultname",
- "pk": "serious-issues",
- "fields": {
- "name": "Serious Issues",
- "desc": "",
- "used": true,
- "order": 1
- }
-},
-{
- "model": "name.reviewresultname",
- "pk": "issues",
- "fields": {
- "name": "Has Issues",
- "desc": "",
- "used": true,
- "order": 2
- }
-},
-{
- "model": "name.reviewresultname",
- "pk": "nits",
- "fields": {
- "name": "Has Nits",
- "desc": "",
- "used": true,
- "order": 3
- }
-},
-{
- "model": "name.reviewresultname",
- "pk": "not-ready",
- "fields": {
- "name": "Not Ready",
- "desc": "",
- "used": true,
- "order": 4
- }
-},
-{
- "model": "name.reviewresultname",
- "pk": "right-track",
- "fields": {
- "name": "On the Right Track",
- "desc": "",
- "used": true,
- "order": 5
- }
-},
-{
- "model": "name.reviewresultname",
- "pk": "almost-ready",
- "fields": {
- "name": "Almost Ready",
- "desc": "",
- "used": true,
- "order": 6
- }
-},
-{
- "model": "name.reviewresultname",
- "pk": "ready-issues",
- "fields": {
- "name": "Ready with Issues",
- "desc": "",
- "used": true,
- "order": 7
- }
-},
-{
- "model": "name.reviewresultname",
- "pk": "ready-nits",
- "fields": {
- "name": "Ready with Nits",
- "desc": "",
- "used": true,
- "order": 8
- }
-},
-{
- "model": "name.reviewresultname",
- "pk": "ready",
- "fields": {
- "name": "Ready",
- "desc": "",
- "used": true,
- "order": 9
- }
-},
-{
- "model": "name.reviewtypename",
- "pk": "early",
- "fields": {
- "name": "Early",
- "desc": "",
- "used": true,
- "order": 1
- }
-},
-{
- "model": "name.reviewtypename",
- "pk": "lc",
- "fields": {
- "name": "Last Call",
- "desc": "",
- "used": true,
- "order": 2
- }
-},
-{
- "model": "name.reviewtypename",
- "pk": "telechat",
- "fields": {
- "name": "Telechat",
- "desc": "",
- "used": true,
- "order": 3
- }
-},
-{
- "model": "name.rolename",
- "pk": "ceo",
- "fields": {
- "name": "CEO",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.rolename",
- "pk": "coord",
- "fields": {
- "name": "Co-ordinator",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.rolename",
- "pk": "lead",
- "fields": {
- "name": "Lead",
- "desc": "Lead member (such as the Lead of an IAB program)",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.rolename",
- "pk": "trac-admin",
- "fields": {
- "name": "Trac Admin",
- "desc": "Assigned permission TRAC_ADMIN in datatracker-managed Trac Wiki instances",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.rolename",
- "pk": "trac-editor",
- "fields": {
- "name": "Trac Editor",
- "desc": "Provides log-in permission to restricted Trac instances",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.rolename",
- "pk": "chair",
- "fields": {
- "name": "Chair",
- "desc": "",
- "used": true,
- "order": 1
- }
-},
-{
- "model": "name.rolename",
- "pk": "ad",
- "fields": {
- "name": "Area Director",
- "desc": "",
- "used": true,
- "order": 2
- }
-},
-{
- "model": "name.rolename",
- "pk": "execdir",
- "fields": {
- "name": "Executive Director",
- "desc": "",
- "used": true,
- "order": 2
- }
-},
-{
- "model": "name.rolename",
- "pk": "admdir",
- "fields": {
- "name": "Administrative Director",
- "desc": "",
- "used": true,
- "order": 3
- }
-},
-{
- "model": "name.rolename",
- "pk": "pre-ad",
- "fields": {
- "name": "Incoming Area Director",
- "desc": "",
- "used": true,
- "order": 3
- }
-},
-{
- "model": "name.rolename",
- "pk": "advisor",
- "fields": {
- "name": "Advisor",
- "desc": "Advisor in a group that has explicit membership, such as the NomCom",
- "used": true,
- "order": 4
- }
-},
-{
- "model": "name.rolename",
- "pk": "liaiman",
- "fields": {
- "name": "Liaison Manager",
- "desc": "",
- "used": true,
- "order": 4
- }
-},
-{
- "model": "name.rolename",
- "pk": "techadv",
- "fields": {
- "name": "Tech Advisor",
- "desc": "",
- "used": true,
- "order": 4
- }
-},
-{
- "model": "name.rolename",
- "pk": "auth",
- "fields": {
- "name": "Authorized Individual",
- "desc": "",
- "used": true,
- "order": 5
- }
-},
-{
- "model": "name.rolename",
- "pk": "editor",
- "fields": {
- "name": "Editor",
- "desc": "",
- "used": true,
- "order": 5
- }
-},
-{
- "model": "name.rolename",
- "pk": "delegate",
- "fields": {
- "name": "Delegate",
- "desc": "",
- "used": true,
- "order": 6
- }
-},
-{
- "model": "name.rolename",
- "pk": "secr",
- "fields": {
- "name": "Secretary",
- "desc": "",
- "used": true,
- "order": 6
- }
-},
-{
- "model": "name.rolename",
- "pk": "member",
- "fields": {
- "name": "Member",
- "desc": "Regular group member in a group that has explicit membership, such as the NomCom",
- "used": true,
- "order": 7
- }
-},
-{
- "model": "name.rolename",
- "pk": "atlarge",
- "fields": {
- "name": "At Large Member",
- "desc": "",
- "used": true,
- "order": 10
- }
-},
-{
- "model": "name.rolename",
- "pk": "liaison",
- "fields": {
- "name": "Liaison Member",
- "desc": "Liaison group member in a group that has explicit membership, such as the NomCom",
- "used": true,
- "order": 11
- }
-},
-{
- "model": "name.rolename",
- "pk": "announce",
- "fields": {
- "name": "List Announcer",
- "desc": "Authorised to send announcements to the ietf-announce and other lists",
- "used": true,
- "order": 12
- }
-},
-{
- "model": "name.rolename",
- "pk": "matman",
- "fields": {
- "name": "Materials Manager",
- "desc": "",
- "used": true,
- "order": 13
- }
-},
-{
- "model": "name.rolename",
- "pk": "recman",
- "fields": {
- "name": "Recording Manager",
- "desc": "",
- "used": true,
- "order": 13
- }
-},
-{
- "model": "name.rolename",
- "pk": "reviewer",
- "fields": {
- "name": "Reviewer",
- "desc": "",
- "used": true,
- "order": 14
- }
-},
-{
- "model": "name.roomresourcename",
- "pk": "audiostream",
- "fields": {
- "name": "Audio Stream",
- "desc": "Audio streaming support",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.roomresourcename",
- "pk": "boardroom",
- "fields": {
- "name": "Boardroom Layout",
- "desc": "Experimental room setup (boardroom and classroom) subject to availability",
- "used": false,
- "order": 0
- }
-},
-{
- "model": "name.roomresourcename",
- "pk": "u-shape",
- "fields": {
- "name": "Experimental Room Setup (U-Shape and classroom)",
- "desc": "Experimental Room Setup (U-Shape and classroom, subject to availability)",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.roomresourcename",
- "pk": "flipcharts",
- "fields": {
- "name": "Flipcharts",
- "desc": "Flipchars",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.roomresourcename",
- "pk": "project",
- "fields": {
- "name": "LCD projector",
- "desc": "The room will have a computer projector",
- "used": false,
- "order": 0
- }
-},
-{
- "model": "name.roomresourcename",
- "pk": "meetecho",
- "fields": {
- "name": "Meetecho Support",
- "desc": "The room will have a meetecho wrangler",
- "used": false,
- "order": 0
- }
-},
-{
- "model": "name.roomresourcename",
- "pk": "proj2",
- "fields": {
- "name": "second LCD projector",
- "desc": "The room will have a second computer projector",
- "used": false,
- "order": 0
- }
-},
-{
- "model": "name.sessionstatusname",
- "pk": "appr",
- "fields": {
- "name": "Approved",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.sessionstatusname",
- "pk": "canceled",
- "fields": {
- "name": "Cancelled",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.sessionstatusname",
- "pk": "canceledpa",
- "fields": {
- "name": "Cancelled - Pre Announcement",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.sessionstatusname",
- "pk": "deleted",
- "fields": {
- "name": "Deleted",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.sessionstatusname",
- "pk": "disappr",
- "fields": {
- "name": "Disapproved",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.sessionstatusname",
- "pk": "notmeet",
- "fields": {
- "name": "Not meeting",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.sessionstatusname",
- "pk": "sched",
- "fields": {
- "name": "Scheduled",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.sessionstatusname",
- "pk": "scheda",
- "fields": {
- "name": "Scheduled - Announcement to be sent",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.sessionstatusname",
- "pk": "apprw",
- "fields": {
- "name": "Waiting for Approval",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.sessionstatusname",
- "pk": "schedw",
- "fields": {
- "name": "Waiting for Scheduling",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.stdlevelname",
- "pk": "bcp",
- "fields": {
- "name": "Best Current Practice",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.stdlevelname",
- "pk": "ds",
- "fields": {
- "name": "Draft Standard",
- "desc": "",
- "used": false,
- "order": 0
- }
-},
-{
- "model": "name.stdlevelname",
- "pk": "exp",
- "fields": {
- "name": "Experimental",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.stdlevelname",
- "pk": "hist",
- "fields": {
- "name": "Historic",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.stdlevelname",
- "pk": "inf",
- "fields": {
- "name": "Informational",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.stdlevelname",
- "pk": "std",
- "fields": {
- "name": "Internet Standard",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.stdlevelname",
- "pk": "ps",
- "fields": {
- "name": "Proposed Standard",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.stdlevelname",
- "pk": "unkn",
- "fields": {
- "name": "Unknown",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.streamname",
- "pk": "ietf",
- "fields": {
- "name": "IETF",
- "desc": "IETF stream",
- "used": true,
- "order": 1
- }
-},
-{
- "model": "name.streamname",
- "pk": "ise",
- "fields": {
- "name": "ISE",
- "desc": "Independent Submission Editor stream",
- "used": true,
- "order": 2
- }
-},
-{
- "model": "name.streamname",
- "pk": "irtf",
- "fields": {
- "name": "IRTF",
- "desc": "IRTF Stream",
- "used": true,
- "order": 3
- }
-},
-{
- "model": "name.streamname",
- "pk": "iab",
- "fields": {
- "name": "IAB",
- "desc": "IAB stream",
- "used": true,
- "order": 4
- }
-},
-{
- "model": "name.streamname",
- "pk": "legacy",
- "fields": {
- "name": "Legacy",
- "desc": "Legacy stream",
- "used": true,
- "order": 5
- }
-},
-{
- "model": "name.timeslottypename",
- "pk": "break",
- "fields": {
- "name": "Break",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.timeslottypename",
- "pk": "lead",
- "fields": {
- "name": "Leadership",
- "desc": "Leadership Meetings",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.timeslottypename",
- "pk": "offagenda",
- "fields": {
- "name": "Off Agenda",
- "desc": "Other Meetings Not Published on Agenda",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.timeslottypename",
- "pk": "other",
- "fields": {
- "name": "Other",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.timeslottypename",
- "pk": "plenary",
- "fields": {
- "name": "Plenary",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.timeslottypename",
- "pk": "reg",
- "fields": {
- "name": "Registration",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.timeslottypename",
- "pk": "reserved",
- "fields": {
- "name": "Room Reserved",
- "desc": "A room has been reserved for use by another body the timeslot indicated",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.timeslottypename",
- "pk": "unavail",
- "fields": {
- "name": "Room Unavailable",
- "desc": "A room was not booked for the timeslot indicated",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.timeslottypename",
- "pk": "session",
- "fields": {
- "name": "Session",
- "desc": "",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.topicaudiencename",
- "pk": "general",
- "fields": {
- "name": "General",
- "desc": "Anyone who can log in",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.topicaudiencename",
- "pk": "nomcom",
- "fields": {
- "name": "Nomcom Members",
- "desc": "Members of this nomcom",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "name.topicaudiencename",
- "pk": "nominees",
- "fields": {
- "name": "Nominees",
- "desc": "Anyone who has accepted a Nomination for an open position",
- "used": true,
- "order": 0
- }
-},
-{
- "model": "doc.statetype",
- "pk": "draft",
- "fields": {
- "label": "State"
- }
-},
-{
- "model": "doc.statetype",
- "pk": "draft-iesg",
- "fields": {
- "label": "IESG state"
- }
-},
-{
- "model": "doc.statetype",
- "pk": "draft-iana",
- "fields": {
- "label": "IANA state"
- }
-},
-{
- "model": "doc.statetype",
- "pk": "draft-rfceditor",
- "fields": {
- "label": "RFC Editor state"
- }
-},
-{
- "model": "doc.statetype",
- "pk": "draft-stream-ietf",
- "fields": {
- "label": "IETF WG state"
- }
-},
-{
- "model": "doc.statetype",
- "pk": "draft-stream-irtf",
- "fields": {
- "label": "IRTF state"
- }
-},
-{
- "model": "doc.statetype",
- "pk": "draft-stream-ise",
- "fields": {
- "label": "ISE state"
- }
-},
-{
- "model": "doc.statetype",
- "pk": "draft-stream-iab",
- "fields": {
- "label": "IAB state"
- }
-},
-{
- "model": "doc.statetype",
- "pk": "slides",
- "fields": {
- "label": "State"
- }
-},
-{
- "model": "doc.statetype",
- "pk": "minutes",
- "fields": {
- "label": "State"
- }
-},
-{
- "model": "doc.statetype",
- "pk": "agenda",
- "fields": {
- "label": "State"
- }
-},
-{
- "model": "doc.statetype",
- "pk": "liai-att",
- "fields": {
- "label": "State"
- }
-},
-{
- "model": "doc.statetype",
- "pk": "charter",
- "fields": {
- "label": "State"
- }
-},
-{
- "model": "doc.statetype",
- "pk": "conflrev",
- "fields": {
- "label": "Conflict Review State"
- }
-},
-{
- "model": "doc.statetype",
- "pk": "draft-iana-action",
- "fields": {
- "label": "IANA Action state"
- }
-},
-{
- "model": "doc.statetype",
- "pk": "draft-iana-review",
- "fields": {
- "label": "IANA Review state"
- }
-},
-{
- "model": "doc.statetype",
- "pk": "statchg",
- "fields": {
- "label": "RFC Status Change state"
- }
-},
-{
- "model": "doc.statetype",
- "pk": "recording",
- "fields": {
- "label": "State"
- }
-},
-{
- "model": "doc.statetype",
- "pk": "bluesheets",
- "fields": {
- "label": "State"
- }
-},
-{
- "model": "doc.statetype",
- "pk": "reuse_policy",
- "fields": {
- "label": "Policy"
- }
-},
-{
- "model": "doc.statetype",
- "pk": "review",
- "fields": {
- "label": "Review"
- }
-},
-{
- "model": "doc.statetype",
- "pk": "liaison",
- "fields": {
- "label": "Liason Statement State"
- }
-},
-{
- "model": "doc.statetype",
- "pk": "shepwrit",
- "fields": {
- "label": "Shepherd's Writeup State"
- }
-},
-{
- "model": "doc.state",
- "pk": 81,
- "fields": {
- "type": "agenda",
- "slug": "active",
- "name": "Active",
- "used": true,
- "desc": "",
- "order": 1,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 82,
- "fields": {
- "type": "agenda",
- "slug": "deleted",
- "name": "Deleted",
- "used": true,
- "desc": "",
- "order": 2,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 139,
- "fields": {
- "type": "bluesheets",
- "slug": "active",
- "name": "Active",
- "used": true,
- "desc": "",
- "order": 0,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 140,
- "fields": {
- "type": "bluesheets",
- "slug": "deleted",
- "name": "Deleted",
- "used": true,
- "desc": "",
- "order": 0,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 83,
- "fields": {
- "type": "charter",
- "slug": "notrev",
- "name": "Not currently under review",
- "used": true,
- "desc": "The proposed charter is not being considered at this time. A proposed charter will remain in this state until an AD moves it to Informal IESG review.",
- "order": 0,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 84,
- "fields": {
- "type": "charter",
- "slug": "infrev",
- "name": "Draft Charter",
- "used": true,
- "desc": "The proposed charter is not being considered at this time. A proposed charter will remain in this state until an AD moves it to Start Chartering/Rechartering (Internal IESG/IAB Review). This state is useful for drafting the charter, discussing with chairs, etc.",
- "order": 0,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 85,
- "fields": {
- "type": "charter",
- "slug": "intrev",
- "name": "Start Chartering/Rechartering (Internal IESG/IAB Review)",
- "used": true,
- "desc": "This is the state when you'd like to propose the charter / new charter. This state also allows you to ask whether external review can be skipped in ballot. After you select this state, the Secretariat takes over and drives the rest of the process.",
- "order": 0,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 86,
- "fields": {
- "type": "charter",
- "slug": "extrev",
- "name": "External Review (Message to Community, Selected by Secretariat)",
- "used": true,
- "desc": "This state is selected by the Secretariat (AD's, keep yer grubby mits off this!) when it has been decided that the charter needs external review.",
- "order": 0,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 87,
- "fields": {
- "type": "charter",
- "slug": "iesgrev",
- "name": "IESG Review (Charter for Approval, Selected by Secretariat)",
- "used": true,
- "desc": "This state is selected by the Secretariat (AD's, keep yer grubby mits off this!) when the IESG is reviewing the discussion from the external review of the proposed charter (this is similar to the IESG Evaluation state for a draft).",
- "order": 0,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 88,
- "fields": {
- "type": "charter",
- "slug": "approved",
- "name": "Approved",
- "used": true,
- "desc": "The charter is approved by the IESG.",
- "order": 0,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 90,
- "fields": {
- "type": "conflrev",
- "slug": "needshep",
- "name": "Needs Shepherd",
- "used": true,
- "desc": "A conflict review has been requested, but a shepherding AD has not yet been assigned",
- "order": 1,
- "next_states": [
- 91,
- 98,
- 99
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 91,
- "fields": {
- "type": "conflrev",
- "slug": "adrev",
- "name": "AD Review",
- "used": true,
- "desc": "The sponsoring AD is reviewing the document and preparing a proposed response",
- "order": 2,
- "next_states": [
- 92,
- 98,
- 99
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 92,
- "fields": {
- "type": "conflrev",
- "slug": "iesgeval",
- "name": "IESG Evaluation",
- "used": true,
- "desc": "The IESG is considering the proposed conflict review response",
- "order": 3,
- "next_states": [
- 93,
- 94,
- 95,
- 98,
- 99
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 93,
- "fields": {
- "type": "conflrev",
- "slug": "defer",
- "name": "IESG Evaluation - Defer",
- "used": true,
- "desc": "The evaluation of the proposed conflict review response has been deferred to the next telechat",
- "order": 4,
- "next_states": [
- 92,
- 94,
- 95,
- 98,
- 99
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 100,
- "fields": {
- "type": "conflrev",
- "slug": "appr-reqnopub-pr",
- "name": "Approved Request to Not Publish - point raised",
- "used": true,
- "desc": "The IESG has approved the conflict review response (a request to not publish), but a point has been raised that should be cleared before moving to announcement to be sent",
- "order": 5,
- "next_states": [
- 94
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 101,
- "fields": {
- "type": "conflrev",
- "slug": "appr-noprob-pr",
- "name": "Approved No Problem - point raised",
- "used": true,
- "desc": "The IESG has approved the conflict review response, but a point has been raised that should be cleared before proceeding to announcement to be sent",
- "order": 6,
- "next_states": [
- 95
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 94,
- "fields": {
- "type": "conflrev",
- "slug": "appr-reqnopub-pend",
- "name": "Approved Request to Not Publish - announcement to be sent",
- "used": true,
- "desc": "The IESG has approved the conflict review response (a request to not publish), but the secretariat has not yet sent the response",
- "order": 7,
- "next_states": [
- 96,
- 98
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 95,
- "fields": {
- "type": "conflrev",
- "slug": "appr-noprob-pend",
- "name": "Approved No Problem - announcement to be sent",
- "used": true,
- "desc": "The IESG has approved the conflict review response, but the secretariat has not yet sent the response",
- "order": 8,
- "next_states": [
- 97,
- 98
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 96,
- "fields": {
- "type": "conflrev",
- "slug": "appr-reqnopub-sent",
- "name": "Approved Request to Not Publish - announcement sent",
- "used": true,
- "desc": "The secretariat has delivered the IESG's approved conflict review response (a request to not publish) to the requester",
- "order": 9,
- "next_states": [
- 96
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 97,
- "fields": {
- "type": "conflrev",
- "slug": "appr-noprob-sent",
- "name": "Approved No Problem - announcement sent",
- "used": true,
- "desc": "The secretariat has delivered the IESG's approved conflict review response to the requester",
- "order": 10,
- "next_states": [
- 97
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 98,
- "fields": {
- "type": "conflrev",
- "slug": "withdraw",
- "name": "Withdrawn",
- "used": true,
- "desc": "The request for conflict review was withdrawn",
- "order": 11,
- "next_states": [
- 90
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 99,
- "fields": {
- "type": "conflrev",
- "slug": "dead",
- "name": "Dead",
- "used": true,
- "desc": "The conflict review has been abandoned",
- "order": 12,
- "next_states": [
- 90
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 1,
- "fields": {
- "type": "draft",
- "slug": "active",
- "name": "Active",
- "used": true,
- "desc": "",
- "order": 1,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 2,
- "fields": {
- "type": "draft",
- "slug": "expired",
- "name": "Expired",
- "used": true,
- "desc": "",
- "order": 2,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 3,
- "fields": {
- "type": "draft",
- "slug": "rfc",
- "name": "RFC",
- "used": true,
- "desc": "",
- "order": 3,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 4,
- "fields": {
- "type": "draft",
- "slug": "repl",
- "name": "Replaced",
- "used": true,
- "desc": "",
- "order": 4,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 5,
- "fields": {
- "type": "draft",
- "slug": "auth-rm",
- "name": "Withdrawn by Submitter",
- "used": true,
- "desc": "",
- "order": 5,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 6,
- "fields": {
- "type": "draft",
- "slug": "ietf-rm",
- "name": "Withdrawn by IETF",
- "used": true,
- "desc": "",
- "order": 6,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 102,
- "fields": {
- "type": "draft-iana-action",
- "slug": "newdoc",
- "name": "New Document",
- "used": true,
- "desc": "A new document has been received by IANA, but no actions have been taken",
- "order": 1,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 103,
- "fields": {
- "type": "draft-iana-action",
- "slug": "inprog",
- "name": "In Progress",
- "used": true,
- "desc": "IANA is currently processing the actions for this document",
- "order": 2,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 104,
- "fields": {
- "type": "draft-iana-action",
- "slug": "waitauth",
- "name": "Waiting on Authors",
- "used": true,
- "desc": "IANA is waiting on the document's authors to respond",
- "order": 3,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 105,
- "fields": {
- "type": "draft-iana-action",
- "slug": "waitad",
- "name": "Waiting on ADs",
- "used": true,
- "desc": "IANA is waiting on the IETF Area Directors to respond",
- "order": 4,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 106,
- "fields": {
- "type": "draft-iana-action",
- "slug": "waitwgc",
- "name": "Waiting on WGC",
- "used": true,
- "desc": "IANA is waiting on the IETF Working Group Chairs to respond",
- "order": 5,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 107,
- "fields": {
- "type": "draft-iana-action",
- "slug": "waitrfc",
- "name": "Waiting on RFC Editor",
- "used": true,
- "desc": "IANA has notified the RFC Editor that the actions have been completed",
- "order": 6,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 108,
- "fields": {
- "type": "draft-iana-action",
- "slug": "rfcedack",
- "name": "RFC-Ed-Ack",
- "used": true,
- "desc": "Request completed. The RFC Editor has acknowledged receipt of IANA's message that the actions have been completed",
- "order": 7,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 109,
- "fields": {
- "type": "draft-iana-action",
- "slug": "onhold",
- "name": "On Hold",
- "used": true,
- "desc": "IANA has suspended work on the document",
- "order": 8,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 110,
- "fields": {
- "type": "draft-iana-action",
- "slug": "noic",
- "name": "No IANA Actions",
- "used": true,
- "desc": "Request completed. There were no IANA actions for this document",
- "order": 9,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 111,
- "fields": {
- "type": "draft-iana-review",
- "slug": "need-rev",
- "name": "IANA - Review Needed",
- "used": true,
- "desc": "Document has not yet been reviewed by IANA.",
- "order": 1,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 112,
- "fields": {
- "type": "draft-iana-review",
- "slug": "ok-act",
- "name": "IANA OK - Actions Needed",
- "used": true,
- "desc": "Document requires IANA actions, and the IANA Considerations section indicates the details of the actions correctly.",
- "order": 2,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 113,
- "fields": {
- "type": "draft-iana-review",
- "slug": "ok-noact",
- "name": "IANA OK - No Actions Needed",
- "used": true,
- "desc": "Document requires no IANA action, and the IANA Considerations section indicates this correctly.",
- "order": 3,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 114,
- "fields": {
- "type": "draft-iana-review",
- "slug": "not-ok",
- "name": "IANA - Not OK",
- "used": true,
- "desc": "IANA has issues with the text of the IANA Considerations section of the document.",
- "order": 4,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 115,
- "fields": {
- "type": "draft-iana-review",
- "slug": "changed",
- "name": "Version Changed - Review Needed",
- "used": true,
- "desc": "Document revision has changed after review by IANA.",
- "order": 5,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 150,
- "fields": {
- "type": "draft-iesg",
- "slug": "idexists",
- "name": "I-D Exists",
- "used": true,
- "desc": "The IESG has not started processing this draft, or has stopped processing it without publicastion.",
- "order": 0,
- "next_states": [
- 16,
- 11
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 16,
- "fields": {
- "type": "draft-iesg",
- "slug": "pub-req",
- "name": "Publication Requested",
- "used": true,
- "desc": "A formal request has been made to advance/publish the document, following the procedures in Section 7.5 of RFC 2418. The request could be from a WG chair, from an individual through the RFC Editor, etc. (The Secretariat (iesg-secretary@ietf.org) is copied on these requests to ensure that the request makes it into the ID tracker.) A document in this state has not (yet) been reviewed by an AD nor has any official action been taken on it yet (other than to note that its publication has been requested.",
- "order": 10,
- "next_states": [
- 13,
- 11,
- 8
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 13,
- "fields": {
- "type": "draft-iesg",
- "slug": "ad-eval",
- "name": "AD Evaluation",
- "used": true,
- "desc": "A specific AD (e.g., the Area Advisor for the WG) has begun reviewing the document to verify that it is ready for advancement. The shepherding AD is responsible for doing any necessary review before starting an IETF Last Call or sending the document directly to the IESG as a whole.",
- "order": 11,
- "next_states": [
- 21,
- 14,
- 12,
- 11
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 21,
- "fields": {
- "type": "draft-iesg",
- "slug": "review-e",
- "name": "Expert Review",
- "used": true,
- "desc": "An AD sometimes asks for an external review by an outside party as part of evaluating whether a document is ready for advancement. MIBs, for example, are reviewed by the \"MIB doctors\". Other types of reviews may also be requested (e.g., security, operations impact, etc.). Documents stay in this state until the review is complete and possibly until the issues raised in the review are addressed. See the \"note\" field for specific details on the nature of the review.",
- "order": 12,
- "next_states": [
- 13
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 14,
- "fields": {
- "type": "draft-iesg",
- "slug": "lc-req",
- "name": "Last Call Requested",
- "used": true,
- "desc": "The AD has requested that the Secretariat start an IETF Last Call, but the the actual Last Call message has not been sent yet.",
- "order": 15,
- "next_states": [
- 15
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 15,
- "fields": {
- "type": "draft-iesg",
- "slug": "lc",
- "name": "In Last Call",
- "used": true,
- "desc": "The document is currently waiting for IETF Last Call to complete. Last Calls for WG documents typically last 2 weeks, those for individual submissions last 4 weeks.",
- "order": 16,
- "next_states": [
- 19,
- 20
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 19,
- "fields": {
- "type": "draft-iesg",
- "slug": "writeupw",
- "name": "Waiting for Writeup",
- "used": true,
- "desc": "Before a standards-track or BCP document is formally considered by the entire IESG, the AD must write up a protocol action. The protocol action is included in the approval message that the Secretariat sends out when the document is approved for publication as an RFC.",
- "order": 18,
- "next_states": [
- 20
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 20,
- "fields": {
- "type": "draft-iesg",
- "slug": "goaheadw",
- "name": "Waiting for AD Go-Ahead",
- "used": true,
- "desc": "As a result of the IETF Last Call, comments may need to be responded to and a revision of the ID may be needed as well. The AD is responsible for verifying that all Last Call comments have been adequately addressed and that the (possibly revised) document is in the ID directory and ready for consideration by the IESG as a whole.",
- "order": 19,
- "next_states": [
- 12
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 12,
- "fields": {
- "type": "draft-iesg",
- "slug": "iesg-eva",
- "name": "IESG Evaluation",
- "used": true,
- "desc": "The document is now (finally!) being formally reviewed by the entire IESG. Documents are discussed in email or during a bi-weekly IESG telechat. In this phase, each AD reviews the document and airs any issues they may have. Unresolvable issues are documented as \"discuss\" comments that can be forwarded to the authors/WG. See the description of substates for additional details about the current state of the IESG discussion.",
- "order": 20,
- "next_states": [
- 18,
- 9,
- 22
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 18,
- "fields": {
- "type": "draft-iesg",
- "slug": "defer",
- "name": "IESG Evaluation - Defer",
- "used": true,
- "desc": "During a telechat, one or more ADs requested an additional 2 weeks to review the document. A defer is designed to be an exception mechanism, and can only be invoked once, the first time the document comes up for discussion during a telechat.",
- "order": 21,
- "next_states": [
- 12
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 9,
- "fields": {
- "type": "draft-iesg",
- "slug": "approved",
- "name": "Approved-announcement to be sent",
- "used": true,
- "desc": "The IESG has approved the document for publication, but the Secretariat has not yet sent out on official approval message.",
- "order": 27,
- "next_states": [
- 10
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 10,
- "fields": {
- "type": "draft-iesg",
- "slug": "ann",
- "name": "Approved-announcement sent",
- "used": true,
- "desc": "The IESG has approved the document for publication, and the Secretariat has sent out the official approval message to the RFC editor.",
- "order": 30,
- "next_states": [
- 17
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 17,
- "fields": {
- "type": "draft-iesg",
- "slug": "rfcqueue",
- "name": "RFC Ed Queue",
- "used": true,
- "desc": "The document is in the RFC editor Queue (as confirmed by http://www.rfc-editor.org/queue.html).",
- "order": 31,
- "next_states": [
- 7
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 7,
- "fields": {
- "type": "draft-iesg",
- "slug": "pub",
- "name": "RFC Published",
- "used": true,
- "desc": "The ID has been published as an RFC.",
- "order": 32,
- "next_states": [
- 8
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 22,
- "fields": {
- "type": "draft-iesg",
- "slug": "nopubadw",
- "name": "DNP-waiting for AD note",
- "used": true,
- "desc": "Do Not Publish: The IESG recommends against publishing the document, but the writeup explaining its reasoning has not yet been produced. DNPs apply primarily to individual submissions received through the RFC editor. See the \"note\" field for more details on who has the action item.",
- "order": 33,
- "next_states": [
- 23
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 23,
- "fields": {
- "type": "draft-iesg",
- "slug": "nopubanw",
- "name": "DNP-announcement to be sent",
- "used": true,
- "desc": "The IESG recommends against publishing the document, the writeup explaining its reasoning has been produced, but the Secretariat has not yet sent out the official \"do not publish\" recommendation message.",
- "order": 34,
- "next_states": [
- 8
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 11,
- "fields": {
- "type": "draft-iesg",
- "slug": "watching",
- "name": "AD is watching",
- "used": true,
- "desc": "An AD is aware of the document and has chosen to place the document in a separate state in order to keep a closer eye on it (for whatever reason). Documents in this state are still not being actively tracked in the sense that no formal request has been made to publish or advance the document. The sole difference between this state and \"I-D Exists\" is that an AD has chosen to put it in a separate state, to make it easier to keep track of (for the AD's own reasons).",
- "order": 42,
- "next_states": [
- 16
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 8,
- "fields": {
- "type": "draft-iesg",
- "slug": "dead",
- "name": "Dead",
- "used": true,
- "desc": "Document is \"dead\" and is no longer being tracked. (E.g., it has been replaced by another document with a different name, it has been withdrawn, etc.)",
- "order": 99,
- "next_states": [
- 16
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 24,
- "fields": {
- "type": "draft-rfceditor",
- "slug": "auth",
- "name": "AUTH",
- "used": true,
- "desc": "Awaiting author action",
- "order": 0,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 25,
- "fields": {
- "type": "draft-rfceditor",
- "slug": "auth48",
- "name": "AUTH48",
- "used": true,
- "desc": "Awaiting final author approval",
- "order": 0,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 26,
- "fields": {
- "type": "draft-rfceditor",
- "slug": "edit",
- "name": "EDIT",
- "used": false,
- "desc": "Approved by the stream manager (e.g., IESG, IAB, IRSG, ISE), awaiting processing and publishing",
- "order": 0,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 27,
- "fields": {
- "type": "draft-rfceditor",
- "slug": "iana",
- "name": "IANA",
- "used": true,
- "desc": "Document has been edited, but is holding for completion of IANA actions",
- "order": 0,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 28,
- "fields": {
- "type": "draft-rfceditor",
- "slug": "iesg",
- "name": "IESG",
- "used": false,
- "desc": "Awaiting IESG action",
- "order": 0,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 29,
- "fields": {
- "type": "draft-rfceditor",
- "slug": "isr",
- "name": "ISR",
- "used": true,
- "desc": "Independent Submission Review by the ISE ",
- "order": 0,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 30,
- "fields": {
- "type": "draft-rfceditor",
- "slug": "isr-auth",
- "name": "ISR-AUTH",
- "used": false,
- "desc": "Independent submission awaiting author action, or in discussion between author and ISE",
- "order": 0,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 31,
- "fields": {
- "type": "draft-rfceditor",
- "slug": "ref",
- "name": "REF",
- "used": true,
- "desc": "Holding for normative reference",
- "order": 0,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 32,
- "fields": {
- "type": "draft-rfceditor",
- "slug": "rfc-edit",
- "name": "RFC-EDITOR",
- "used": true,
- "desc": "Awaiting final RFC Editor review before AUTH48",
- "order": 0,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 33,
- "fields": {
- "type": "draft-rfceditor",
- "slug": "timeout",
- "name": "TO",
- "used": true,
- "desc": "Time-out period during which the IESG reviews document for conflict/concurrence with other IETF working group work",
- "order": 0,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 34,
- "fields": {
- "type": "draft-rfceditor",
- "slug": "missref",
- "name": "MISSREF",
- "used": true,
- "desc": "Awaiting missing normative reference",
- "order": 0,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 89,
- "fields": {
- "type": "draft-rfceditor",
- "slug": "auth48done",
- "name": "AUTH48-DONE",
- "used": false,
- "desc": "Final approvals are complete",
- "order": 0,
- "next_states": [
- 74
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 116,
- "fields": {
- "type": "draft-rfceditor",
- "slug": "auth48-done",
- "name": "AUTH48-DONE",
- "used": true,
- "desc": "Final approvals are complete",
- "order": 0,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 117,
- "fields": {
- "type": "draft-rfceditor",
- "slug": "edit",
- "name": "EDIT",
- "used": true,
- "desc": "Approved by the stream manager (e.g., IESG, IAB, IRSG, ISE), awaiting processing and publishing",
- "order": 0,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 118,
- "fields": {
- "type": "draft-rfceditor",
- "slug": "iana-crd",
- "name": "IANA",
- "used": true,
- "desc": "RFC-Editor/IANA Registration Coordination",
- "order": 0,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 119,
- "fields": {
- "type": "draft-rfceditor",
- "slug": "iesg",
- "name": "IESG",
- "used": true,
- "desc": "Holding for IESG action",
- "order": 0,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 120,
- "fields": {
- "type": "draft-rfceditor",
- "slug": "isr-auth",
- "name": "ISR-AUTH",
- "used": true,
- "desc": "Independent Submission awaiting author update, or in discussion between author and ISE",
- "order": 0,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 133,
- "fields": {
- "type": "draft-rfceditor",
- "slug": "pending",
- "name": "Pending",
- "used": true,
- "desc": "",
- "order": 0,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 147,
- "fields": {
- "type": "draft-stream-iab",
- "slug": "repl",
- "name": "Replaced",
- "used": true,
- "desc": "Replaced",
- "order": 0,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 45,
- "fields": {
- "type": "draft-stream-iab",
- "slug": "candidat",
- "name": "Candidate IAB Document",
- "used": true,
- "desc": "A document being considered for the IAB stream.",
- "order": 1,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 46,
- "fields": {
- "type": "draft-stream-iab",
- "slug": "active",
- "name": "Active IAB Document",
- "used": true,
- "desc": "This document has been adopted by the IAB and is being actively developed.",
- "order": 2,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 47,
- "fields": {
- "type": "draft-stream-iab",
- "slug": "parked",
- "name": "Parked IAB Document",
- "used": true,
- "desc": "This document has lost its author or editor, is waiting for another document to be written, or cannot currently be worked on by the IAB for some other reason. Annotations probably explain why this document is parked.",
- "order": 3,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 48,
- "fields": {
- "type": "draft-stream-iab",
- "slug": "review-i",
- "name": "IAB Review",
- "used": true,
- "desc": "This document is awaiting the IAB itself to come to internal consensus.",
- "order": 4,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 49,
- "fields": {
- "type": "draft-stream-iab",
- "slug": "review-c",
- "name": "Community Review",
- "used": true,
- "desc": "This document has completed internal consensus within the IAB and is now under community review.",
- "order": 5,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 50,
- "fields": {
- "type": "draft-stream-iab",
- "slug": "approved",
- "name": "Approved by IAB, To Be Sent to RFC Editor",
- "used": true,
- "desc": "The consideration of this document is complete, but it has not yet been sent to the RFC Editor for publication (although that is going to happen soon).",
- "order": 6,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 51,
- "fields": {
- "type": "draft-stream-iab",
- "slug": "diff-org",
- "name": "Sent to a Different Organization for Publication",
- "used": true,
- "desc": "The IAB does not expect to publish the document itself, but has passed it on to a different organization that might continue work on the document. The expectation is that the other organization will eventually publish the document.",
- "order": 7,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 52,
- "fields": {
- "type": "draft-stream-iab",
- "slug": "rfc-edit",
- "name": "Sent to the RFC Editor",
- "used": true,
- "desc": "The IAB processing of this document is complete and it has been sent to the RFC Editor for publication. The document may be in the RFC Editor's queue, or it may have been published as an RFC; this state doesn't distinguish between different states occurring after the document has left the IAB.",
- "order": 8,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 53,
- "fields": {
- "type": "draft-stream-iab",
- "slug": "pub",
- "name": "Published RFC",
- "used": true,
- "desc": "The document has been published as an RFC.",
- "order": 9,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 54,
- "fields": {
- "type": "draft-stream-iab",
- "slug": "dead",
- "name": "Dead IAB Document",
- "used": true,
- "desc": "This document was an active IAB document, but for some reason it is no longer being pursued for the IAB stream. It is possible that the document might be revived later, possibly in another stream.",
- "order": 10,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 134,
- "fields": {
- "type": "draft-stream-ietf",
- "slug": "wg-cand",
- "name": "Candidate for WG Adoption",
- "used": true,
- "desc": "The document has been marked as a candidate for WG adoption by the WG Chair. This state can be used before a call for adoption is issued (and the document is put in the \"Call For Adoption By WG Issued\" state), to indicate that the document is in the queue for a call for adoption, even if none has been issued yet.",
- "order": 0,
- "next_states": [
- 35
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 35,
- "fields": {
- "type": "draft-stream-ietf",
- "slug": "c-adopt",
- "name": "Call For Adoption By WG Issued",
- "used": true,
- "desc": "4.2.1. Call for Adoption by WG Issued \n\n The \"Call for Adoption by WG Issued\" state should be used to indicate when an I-D is being considered for adoption by an IETF WG. An I-D that is in this state is actively being considered for adoption and has not yet achieved consensus, preference, or selection in the WG.\n\n This state may be used to describe an I-D that someone has asked a WG to consider for adoption, if the WG Chair has agreed with the request. This state may also be used to identify an I-D that a WG Chair asked an author to write specifically for consideration as a candidate WG item [WGDTSPEC], and/or an I-D that is listed as a 'candidate draft' in the WG's charter.\n\n Under normal conditions, it should not be possible for an I-D to be in the \"Call for Adoption by WG Issued\" state in more than one working group at the same time. This said, it is not uncommon for authors to \"shop\" their I-Ds to more than one WG at a time, with the hope of getting their documents adopted somewhere.\n\n After this state is implemented in the Datatracker, an I-D that is in the \"Call for Adoption by WG Issued\" state will not be able to be \"shopped\" to any other WG without the consent of the WG Chairs and the responsible ADs impacted by the shopping.\n\n Note that Figure 1 includes an arc leading from this state to outside of the WG state machine. This illustrates that some I-Ds that are considered do not get adopted as WG drafts. An I-D that is not adopted as a WG draft will transition out of the WG state machine and revert back to having no stream-specific state; however, the status change history log of the I-D will record that the I-D was previously in the \"Call for Adoption by WG Issued\" state.",
- "order": 1,
- "next_states": [
- 36,
- 37
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 36,
- "fields": {
- "type": "draft-stream-ietf",
- "slug": "adopt-wg",
- "name": "Adopted by a WG",
- "used": true,
- "desc": "4.2.2. Adopted by a WG \n\n The \"Adopted by a WG\" state describes an individual submission I-D that an IETF WG has agreed to adopt as one of its WG drafts.\n\n WG Chairs who use this state will be able to clearly indicate when their WGs adopt individual submission I-Ds. This will facilitate the Datatracker's ability to correctly capture \"Replaces\" information for WG drafts and correct \"Replaced by\" information for individual submission I-Ds that have been replaced by WG drafts.\n\n This state is needed because the Datatracker uses the filename of an I-D as a key to search its database for status information about the I-D, and because the filename of a WG I-D is supposed to be different from the filename of an individual submission I-D. The filename of an individual submission I-D will typically be formatted as 'draft-author-wgname-topic-nn'.\n\n The filename of a WG document is supposed to be formatted as 'draft- ietf-wgname-topic-nn'.\n\n An individual I-D that is adopted by a WG may take weeks or months to be resubmitted by the author as a new (version-00) WG draft. If the \"Adopted by a WG\" state is not used, the Datatracker has no way to determine that an I-D has been adopted until a new version of the I-D is submitted to the WG by the author and until the I-D is approved for posting by a WG Chair.",
- "order": 2,
- "next_states": [
- 38
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 37,
- "fields": {
- "type": "draft-stream-ietf",
- "slug": "info",
- "name": "Adopted for WG Info Only",
- "used": true,
- "desc": "4.2.3. Adopted for WG Info Only \n\n The \"Adopted for WG Info Only\" state describes a document that contains useful information for the WG that adopted it, but the document is not intended to be published as an RFC. The WG will not actively develop the contents of the I-D or progress it for publication as an RFC. The only purpose of the I-D is to provide information for internal use by the WG.",
- "order": 3,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 38,
- "fields": {
- "type": "draft-stream-ietf",
- "slug": "wg-doc",
- "name": "WG Document",
- "used": true,
- "desc": "4.2.4. WG Document \n\n The \"WG Document\" state describes an I-D that has been adopted by an IETF WG and is being actively developed.\n\n A WG Chair may transition an I-D into the \"WG Document\" state at any time as long as the I-D is not being considered or developed in any other WG.\n\n Alternatively, WG Chairs may rely upon new functionality to be added to the Datatracker to automatically move version-00 drafts into the \"WG Document\" state as described in Section 4.1.\n\n Under normal conditions, it should not be possible for an I-D to be in the \"WG Document\" state in more than one WG at a time. This said, I-Ds may be transferred from one WG to another with the consent of the WG Chairs and the responsible ADs.",
- "order": 4,
- "next_states": [
- 39,
- 40,
- 41,
- 43
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 39,
- "fields": {
- "type": "draft-stream-ietf",
- "slug": "parked",
- "name": "Parked WG Document",
- "used": true,
- "desc": "4.2.5. Parked WG Document \n\n A \"Parked WG Document\" is an I-D that has lost its author or editor, is waiting for another document to be written or for a review to be completed, or cannot be progressed by the working group for some other reason.\n\n Some of the annotation tags described in Section 4.3 may be used in conjunction with this state to indicate why an I-D has been parked, and/or what may need to happen for the I-D to be un-parked.\n\n Parking a WG draft will not prevent it from expiring; however, this state can be used to indicate why the I-D has stopped progressing in the WG.\n\n A \"Parked WG Document\" that is not expired may be transferred from one WG to another with the consent of the WG Chairs and the responsible ADs.",
- "order": 5,
- "next_states": [
- 38
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 40,
- "fields": {
- "type": "draft-stream-ietf",
- "slug": "dead",
- "name": "Dead WG Document",
- "used": true,
- "desc": "4.2.6. Dead WG Document \n\n A \"Dead WG Document\" is an I-D that has been abandoned. Note that 'Dead' is not always a final state for a WG I-D. If consensus is subsequently achieved, a \"Dead WG Document\" may be resurrected. A \"Dead WG Document\" that is not resurrected will eventually expire.\n\n Note that an I-D that is declared to be \"Dead\" in one WG and that is not expired may be transferred to a non-dead state in another WG with the consent of the WG Chairs and the responsible ADs.",
- "order": 6,
- "next_states": [
- 38
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 41,
- "fields": {
- "type": "draft-stream-ietf",
- "slug": "wg-lc",
- "name": "In WG Last Call",
- "used": true,
- "desc": "4.2.7. In WG Last Call \n\n A document \"In WG Last Call\" is an I-D for which a WG Last Call (WGLC) has been issued and is in progress.\n\n Note that conducting a WGLC is an optional part of the IETF WG process, per Section 7.4 of RFC 2418 [RFC2418].\n\n If a WG Chair decides to conduct a WGLC on an I-D, the \"In WG Last Call\" state can be used to track the progress of the WGLC. The Chair may configure the Datatracker to send a WGLC message to one or more mailing lists when the Chair moves the I-D into this state. The WG Chair may also be able to select a different set of mailing lists for a different document undergoing a WGLC; some documents may deserve coordination with other WGs.\n\n A WG I-D in this state should remain \"In WG Last Call\" until the WG Chair moves it to another state. The WG Chair may configure the Datatracker to send an e-mail after a specified period of time to remind or 'nudge' the Chair to conclude the WGLC and to determine the next state for the document.\n\n It is possible for one WGLC to lead into another WGLC for the same document. For example, an I-D that completed a WGLC as an \"Informational\" document may need another WGLC if a decision is taken to convert the I-D into a Standards Track document.",
- "order": 7,
- "next_states": [
- 38,
- 42,
- 43
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 145,
- "fields": {
- "type": "draft-stream-ietf",
- "slug": "waiting-for-implementation",
- "name": "Waiting for Implementation",
- "used": true,
- "desc": "In some areas, it can be desirable to wait for multiple interoperable implementations before progressing a draft to be an RFC, and in some WGs this is required. This state should be entered after WG Last Call has completed.",
- "order": 8,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 146,
- "fields": {
- "type": "draft-stream-ietf",
- "slug": "held-by-wg",
- "name": "Held by WG",
- "used": true,
- "desc": "Held by WG, see document history for details.",
- "order": 9,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 42,
- "fields": {
- "type": "draft-stream-ietf",
- "slug": "chair-w",
- "name": "Waiting for WG Chair Go-Ahead",
- "used": true,
- "desc": "4.2.8. Waiting for WG Chair Go-Ahead \n\n A WG Chair may wish to place an I-D that receives a lot of comments during a WGLC into the \"Waiting for WG Chair Go-Ahead\" state. This state describes an I-D that has undergone a WGLC; however, the Chair is not yet ready to call consensus on the document.\n\n If comments from the WGLC need to be responded to, or a revision to the I-D is needed, the Chair may place an I-D into this state until all of the WGLC comments are adequately addressed and the (possibly revised) document is in the I-D repository.",
- "order": 10,
- "next_states": [
- 41,
- 43
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 43,
- "fields": {
- "type": "draft-stream-ietf",
- "slug": "writeupw",
- "name": "WG Consensus: Waiting for Write-Up",
- "used": true,
- "desc": "4.2.9. WG Consensus: Waiting for Writeup \n\n A document in the \"WG Consensus: Waiting for Writeup\" state has essentially completed its development within the working group, and is nearly ready to be sent to the IESG for publication. The last thing to be done is the preparation of a protocol writeup by a Document Shepherd. The IESG requires that a document shepherd writeup be completed before publication of the I-D is requested. The IETF document shepherding process and the role of a WG Document Shepherd is described in RFC 4858 [RFC4858]\n\n A WG Chair may call consensus on an I-D without a formal WGLC and transition an I-D that was in the \"WG Document\" state directly into this state.\n\n The name of this state includes the words \"Waiting for Writeup\" because a good document shepherd writeup takes time to prepare.",
- "order": 11,
- "next_states": [
- 44
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 44,
- "fields": {
- "type": "draft-stream-ietf",
- "slug": "sub-pub",
- "name": "Submitted to IESG for Publication",
- "used": true,
- "desc": "4.2.10. Submitted to IESG for Publication \n\n This state describes a WG document that has been submitted to the IESG for publication and that has not been sent back to the working group for revision.\n\n An I-D in this state may be under review by the IESG, it may have been approved and be in the RFC Editor's queue, or it may have been published as an RFC. Other possibilities exist too. The document may be \"Dead\" (in the IESG state machine) or in a \"Do Not Publish\" state.",
- "order": 12,
- "next_states": [
- 38
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 149,
- "fields": {
- "type": "draft-stream-irtf",
- "slug": "repl",
- "name": "Replaced",
- "used": true,
- "desc": "Replaced",
- "order": 0,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 55,
- "fields": {
- "type": "draft-stream-irtf",
- "slug": "candidat",
- "name": "Candidate RG Document",
- "used": true,
- "desc": "This document is under consideration in an RG for becoming an IRTF document. A document in this state does not imply any RG consensus and does not imply any precedence or selection. It's simply a way to indicate that somebody has asked for a document to be considered for adoption by an RG.",
- "order": 1,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 56,
- "fields": {
- "type": "draft-stream-irtf",
- "slug": "active",
- "name": "Active RG Document",
- "used": true,
- "desc": "This document has been adopted by the RG and is being actively developed.",
- "order": 2,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 57,
- "fields": {
- "type": "draft-stream-irtf",
- "slug": "parked",
- "name": "Parked RG Document",
- "used": true,
- "desc": "This document has lost its author or editor, is waiting for another document to be written, or cannot currently be worked on by the RG for some other reason.",
- "order": 3,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 58,
- "fields": {
- "type": "draft-stream-irtf",
- "slug": "rg-lc",
- "name": "In RG Last Call",
- "used": true,
- "desc": "The document is in its final review in the RG.",
- "order": 4,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 59,
- "fields": {
- "type": "draft-stream-irtf",
- "slug": "sheph-w",
- "name": "Waiting for Document Shepherd",
- "used": true,
- "desc": "IRTF documents have document shepherds who help RG documents through the process after the RG has finished with the document.",
- "order": 5,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 60,
- "fields": {
- "type": "draft-stream-irtf",
- "slug": "chair-w",
- "name": "Waiting for IRTF Chair",
- "used": true,
- "desc": "The IRTF Chair is meant to be performing some task such as sending a request for IESG Review.",
- "order": 6,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 61,
- "fields": {
- "type": "draft-stream-irtf",
- "slug": "irsg-w",
- "name": "Awaiting IRSG Reviews",
- "used": true,
- "desc": "The document shepherd has taken the document to the IRSG and solicited reviews from one or more IRSG members.",
- "order": 7,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 62,
- "fields": {
- "type": "draft-stream-irtf",
- "slug": "irsgpoll",
- "name": "In IRSG Poll",
- "used": true,
- "desc": "The IRSG is taking a poll on whether or not the document is ready to be published.",
- "order": 8,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 63,
- "fields": {
- "type": "draft-stream-irtf",
- "slug": "iesg-rev",
- "name": "In IESG Review",
- "used": true,
- "desc": "The IRSG has asked the IESG to do a review of the document, as described in RFC5742.",
- "order": 9,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 64,
- "fields": {
- "type": "draft-stream-irtf",
- "slug": "rfc-edit",
- "name": "Sent to the RFC Editor",
- "used": true,
- "desc": "The RG processing of this document is complete and it has been sent to the RFC Editor for publication. The document may be in the RFC Editor's queue, or it may have been published as an RFC; this state doesn't distinguish between different states occurring after the document has left the RG.",
- "order": 10,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 65,
- "fields": {
- "type": "draft-stream-irtf",
- "slug": "pub",
- "name": "Published RFC",
- "used": true,
- "desc": "The document has been published as an RFC.",
- "order": 11,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 66,
- "fields": {
- "type": "draft-stream-irtf",
- "slug": "iesghold",
- "name": "Document on Hold Based On IESG Request",
- "used": true,
- "desc": "The IESG has requested that the document be held pending further review, as specified in RFC 5742, and the IRTF has agreed to such a hold.",
- "order": 12,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 67,
- "fields": {
- "type": "draft-stream-irtf",
- "slug": "dead",
- "name": "Dead IRTF Document",
- "used": true,
- "desc": "This document was an active IRTF document, but for some reason it is no longer being pursued for the IRTF stream. It is possible that the document might be revived later, possibly in another stream.",
- "order": 13,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 148,
- "fields": {
- "type": "draft-stream-ise",
- "slug": "repl",
- "name": "Replaced",
- "used": true,
- "desc": "Replaced",
- "order": 0,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 68,
- "fields": {
- "type": "draft-stream-ise",
- "slug": "receive",
- "name": "Submission Received",
- "used": true,
- "desc": "The draft has been sent to the ISE with a request for publication.",
- "order": 1,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 69,
- "fields": {
- "type": "draft-stream-ise",
- "slug": "find-rev",
- "name": "Finding Reviewers",
- "used": true,
- "desc": " The ISE is finding initial reviewers for the document.",
- "order": 2,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 70,
- "fields": {
- "type": "draft-stream-ise",
- "slug": "ise-rev",
- "name": "In ISE Review",
- "used": true,
- "desc": "The ISE is actively working on the document.",
- "order": 3,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 71,
- "fields": {
- "type": "draft-stream-ise",
- "slug": "need-res",
- "name": "Response to Review Needed",
- "used": true,
- "desc": " One or more reviews have been sent to the author, and the ISE is awaiting response.",
- "order": 4,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 72,
- "fields": {
- "type": "draft-stream-ise",
- "slug": "iesg-rev",
- "name": "In IESG Review",
- "used": true,
- "desc": "The ISE has asked the IESG to do a review of the document, as described in RFC5742.",
- "order": 5,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 73,
- "fields": {
- "type": "draft-stream-ise",
- "slug": "rfc-edit",
- "name": "Sent to the RFC Editor",
- "used": true,
- "desc": "The ISE processing of this document is complete and it has been sent to the RFC Editor for publication. The document may be in the RFC Editor's queue, or it may have been published as an RFC; this state doesn't distinguish between different states occurring after the document has left the ISE.",
- "order": 6,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 74,
- "fields": {
- "type": "draft-stream-ise",
- "slug": "pub",
- "name": "Published RFC",
- "used": true,
- "desc": "The document has been published as an RFC.",
- "order": 7,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 75,
- "fields": {
- "type": "draft-stream-ise",
- "slug": "dead",
- "name": "No Longer In Independent Submission Stream",
- "used": true,
- "desc": "This document was actively considered in the Independent Submission stream, but the ISE chose not to publish it. It is possible that the document might be revived later. A document in this state may have a comment explaining the reasoning of the ISE (such as if the document was going to move to a different stream).",
- "order": 8,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 76,
- "fields": {
- "type": "draft-stream-ise",
- "slug": "iesghold",
- "name": "Document on Hold Based On IESG Request",
- "used": true,
- "desc": "The IESG has requested that the document be held pending further review, as specified in RFC 5742, and the ISE has agreed to such a hold.",
- "order": 9,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 79,
- "fields": {
- "type": "minutes",
- "slug": "active",
- "name": "Active",
- "used": true,
- "desc": "",
- "order": 1,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 80,
- "fields": {
- "type": "minutes",
- "slug": "deleted",
- "name": "Deleted",
- "used": true,
- "desc": "",
- "order": 2,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 135,
- "fields": {
- "type": "recording",
- "slug": "active",
- "name": "Active",
- "used": true,
- "desc": "",
- "order": 0,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 136,
- "fields": {
- "type": "recording",
- "slug": "deleted",
- "name": "Deleted",
- "used": true,
- "desc": "",
- "order": 0,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 141,
- "fields": {
- "type": "reuse_policy",
- "slug": "single",
- "name": "Single Meeting",
- "used": true,
- "desc": "",
- "order": 0,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 142,
- "fields": {
- "type": "reuse_policy",
- "slug": "multiple",
- "name": "Multiple Meetings",
- "used": true,
- "desc": "",
- "order": 0,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 143,
- "fields": {
- "type": "review",
- "slug": "active",
- "name": "Active",
- "used": true,
- "desc": "",
- "order": 1,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 144,
- "fields": {
- "type": "review",
- "slug": "deleted",
- "name": "Deleted",
- "used": true,
- "desc": "",
- "order": 2,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 77,
- "fields": {
- "type": "slides",
- "slug": "active",
- "name": "Active",
- "used": true,
- "desc": "",
- "order": 1,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 138,
- "fields": {
- "type": "slides",
- "slug": "archived",
- "name": "Archived",
- "used": true,
- "desc": "This document is not active, but is available in the archives",
- "order": 3,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 78,
- "fields": {
- "type": "slides",
- "slug": "deleted",
- "name": "Deleted",
- "used": true,
- "desc": "",
- "order": 4,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 121,
- "fields": {
- "type": "statchg",
- "slug": "needshep",
- "name": "Needs Shepherd",
- "used": true,
- "desc": "An RFC status change has been requested, but a shepherding AD has not yet been assigned",
- "order": 1,
- "next_states": [
- 122,
- 129
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 122,
- "fields": {
- "type": "statchg",
- "slug": "adrev",
- "name": "AD Review",
- "used": true,
- "desc": "The sponsoring AD is preparing an RFC status change document",
- "order": 2,
- "next_states": [
- 130,
- 123,
- 129
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 130,
- "fields": {
- "type": "statchg",
- "slug": "lc-req",
- "name": "Last Call Requested",
- "used": true,
- "desc": "Last Call has been requested for this proposed status change",
- "order": 3,
- "next_states": [
- 131
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 131,
- "fields": {
- "type": "statchg",
- "slug": "in-lc",
- "name": "In Last Call",
- "used": true,
- "desc": "This proposed status change is in IETF Last Call",
- "order": 4,
- "next_states": [
- 132
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 132,
- "fields": {
- "type": "statchg",
- "slug": "goahead",
- "name": "Waiting for AD Go-Ahead",
- "used": true,
- "desc": "The AD is following up on IETF LC comments",
- "order": 5,
- "next_states": [
- 123,
- 129
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 123,
- "fields": {
- "type": "statchg",
- "slug": "iesgeval",
- "name": "IESG Evaluation",
- "used": true,
- "desc": "The IESG is considering the proposed RFC status changes",
- "order": 6,
- "next_states": [
- 124,
- 125,
- 126,
- 129
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 124,
- "fields": {
- "type": "statchg",
- "slug": "defer",
- "name": "IESG Evaluation - Defer",
- "used": true,
- "desc": "The evaluation of the proposed RFC status changes have been deferred to the next telechat",
- "order": 7,
- "next_states": [
- 123,
- 125,
- 126,
- 129
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 125,
- "fields": {
- "type": "statchg",
- "slug": "appr-pr",
- "name": "Approved - point raised",
- "used": true,
- "desc": "The IESG has approved the RFC status changes, but a point has been raised that should be cleared before proceeding to announcement to be sent",
- "order": 8,
- "next_states": [
- 126,
- 127
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 126,
- "fields": {
- "type": "statchg",
- "slug": "appr-pend",
- "name": "Approved - announcement to be sent",
- "used": true,
- "desc": "The IESG has approved the RFC status changes, but the secretariat has not yet sent the announcement",
- "order": 9,
- "next_states": [
- 127
- ]
- }
-},
-{
- "model": "doc.state",
- "pk": 127,
- "fields": {
- "type": "statchg",
- "slug": "appr-sent",
- "name": "Approved - announcement sent",
- "used": true,
- "desc": "The secretariat has announced the IESG's approved RFC status changes",
- "order": 10,
- "next_states": []
- }
-},
-{
- "model": "doc.state",
- "pk": 129,
- "fields": {
- "type": "statchg",
- "slug": "dead",
- "name": "Dead",
- "used": true,
- "desc": "The RFC status changes have been abandoned",
- "order": 11,
- "next_states": [
- 121
- ]
- }
-},
-{
- "model": "doc.ballottype",
- "pk": 5,
- "fields": {
- "doc_type": "conflrev",
- "slug": "conflrev",
- "name": "Approve",
- "question": "Is this the correct conflict review response?",
- "used": true,
- "order": 0,
- "positions": [
- "yes",
- "noobj",
- "discuss",
- "abstain",
- "recuse",
- "norecord"
- ]
- }
-},
-{
- "model": "doc.ballottype",
- "pk": 6,
- "fields": {
- "doc_type": "statchg",
- "slug": "statchg",
- "name": "Approve",
- "question": "Do we approve these RFC status changes?",
- "used": true,
- "order": 0,
- "positions": [
- "yes",
- "noobj",
- "discuss",
- "abstain",
- "recuse",
- "norecord"
- ]
- }
-},
-{
- "model": "doc.ballottype",
- "pk": 1,
- "fields": {
- "doc_type": "charter",
- "slug": "r-extrev",
- "name": "Ready for external review",
- "question": "Is this charter ready for external review?",
- "used": true,
- "order": 1,
- "positions": [
- "yes",
- "noobj",
- "block",
- "abstain",
- "norecord"
- ]
- }
-},
-{
- "model": "doc.ballottype",
- "pk": 4,
- "fields": {
- "doc_type": "draft",
- "slug": "approve",
- "name": "Approve",
- "question": "",
- "used": true,
- "order": 1,
- "positions": [
- "yes",
- "noobj",
- "discuss",
- "abstain",
- "recuse",
- "norecord"
- ]
- }
-},
-{
- "model": "doc.ballottype",
- "pk": 2,
- "fields": {
- "doc_type": "charter",
- "slug": "r-wo-ext",
- "name": "Ready w/o external review",
- "question": "Is this charter ready for external review? Is this charter ready for approval without external review?",
- "used": true,
- "order": 2,
- "positions": [
- "yes",
- "noobj",
- "block",
- "abstain",
- "norecord"
- ]
- }
-},
-{
- "model": "doc.ballottype",
- "pk": 3,
- "fields": {
- "doc_type": "charter",
- "slug": "approve",
- "name": "Approve",
- "question": "Do we approve of this charter?",
- "used": true,
- "order": 3,
- "positions": [
- "yes",
- "noobj",
- "block",
- "abstain",
- "norecord"
- ]
- }
-},
-{
- "model": "group.groupfeatures",
- "pk": "wg",
- "fields": {
- "has_milestones": true,
- "has_chartering_process": true,
- "has_documents": true,
- "has_session_materials": true,
- "has_nonsession_materials": false,
- "has_meetings": true,
- "has_reviews": false,
- "has_default_jabber": true,
- "acts_like_wg": true,
- "create_wiki": true,
- "custom_group_roles": false,
- "customize_workflow": true,
- "is_schedulable": true,
- "show_on_agenda": true,
- "req_subm_approval": true,
- "agenda_type": "ietf",
- "about_page": "ietf.group.views.group_about",
- "default_tab": "ietf.group.views.group_documents",
- "material_types": "[\"slides\"]",
- "admin_roles": "[\"chair\"]",
- "docman_roles": "[\"chair\",\"delegate\",\"secr\"]",
- "groupman_roles": "[\"ad\",\"chair\",\"delegate\",\"secr\"]",
- "matman_roles": "[\"ad\",\"chair\",\"delegate\",\"secr\"]",
- "role_order": "[\"chair\",\"secr\",\"delegate\"]"
- }
-},
-{
- "model": "group.groupfeatures",
- "pk": "isoc",
- "fields": {
- "has_milestones": false,
- "has_chartering_process": false,
- "has_documents": false,
- "has_session_materials": false,
- "has_nonsession_materials": false,
- "has_meetings": false,
- "has_reviews": false,
- "has_default_jabber": false,
- "acts_like_wg": false,
- "create_wiki": false,
- "custom_group_roles": true,
- "customize_workflow": false,
- "is_schedulable": false,
- "show_on_agenda": false,
- "req_subm_approval": true,
- "agenda_type": null,
- "about_page": "ietf.group.views.group_about",
- "default_tab": "ietf.group.views.group_about",
- "material_types": "[\"slides\"]",
- "admin_roles": "[\"chair\"]",
- "docman_roles": "[]",
- "groupman_roles": "[\"chair\"]",
- "matman_roles": "[\"chair\",\"secr\"]",
- "role_order": "[\"chair\",\"secr\"]"
- }
-},
-{
- "model": "group.groupfeatures",
- "pk": "sdo",
- "fields": {
- "has_milestones": false,
- "has_chartering_process": false,
- "has_documents": false,
- "has_session_materials": false,
- "has_nonsession_materials": false,
- "has_meetings": false,
- "has_reviews": false,
- "has_default_jabber": false,
- "acts_like_wg": false,
- "create_wiki": false,
- "custom_group_roles": true,
- "customize_workflow": false,
- "is_schedulable": false,
- "show_on_agenda": false,
- "req_subm_approval": true,
- "agenda_type": null,
- "about_page": "ietf.group.views.group_about",
- "default_tab": "ietf.group.views.group_about",
- "material_types": "[\"slides\"]",
- "admin_roles": "[\"chair\"]",
- "docman_roles": "[\"liaiman\",\"matman\"]",
- "groupman_roles": "[]",
- "matman_roles": "[]",
- "role_order": "[\"liaiman\"]"
- }
-},
-{
- "model": "group.groupfeatures",
- "pk": "ag",
- "fields": {
- "has_milestones": false,
- "has_chartering_process": false,
- "has_documents": true,
- "has_session_materials": true,
- "has_nonsession_materials": false,
- "has_meetings": true,
- "has_reviews": false,
- "has_default_jabber": false,
- "acts_like_wg": true,
- "create_wiki": true,
- "custom_group_roles": true,
- "customize_workflow": false,
- "is_schedulable": true,
- "show_on_agenda": true,
- "req_subm_approval": true,
- "agenda_type": "ietf",
- "about_page": "ietf.group.views.group_about",
- "default_tab": "ietf.group.views.group_about",
- "material_types": "[\"slides\"]",
- "admin_roles": "[\"chair\"]",
- "docman_roles": "[\"chair\",\"delegate\",\"secr\"]",
- "groupman_roles": "[\"ad\",\"chair\",\"delegate\"]",
- "matman_roles": "[\"ad\",\"chair\",\"delegate\",\"secr\"]",
- "role_order": "[\"chair\",\"secr\"]"
- }
-},
-{
- "model": "group.groupfeatures",
- "pk": "area",
- "fields": {
- "has_milestones": false,
- "has_chartering_process": false,
- "has_documents": false,
- "has_session_materials": false,
- "has_nonsession_materials": false,
- "has_meetings": false,
- "has_reviews": false,
- "has_default_jabber": false,
- "acts_like_wg": false,
- "create_wiki": true,
- "custom_group_roles": true,
- "customize_workflow": false,
- "is_schedulable": false,
- "show_on_agenda": false,
- "req_subm_approval": true,
- "agenda_type": "ietf",
- "about_page": "ietf.group.views.group_about",
- "default_tab": "ietf.group.views.group_about",
- "material_types": "[\"slides\"]",
- "admin_roles": "[\"ad\"]",
- "docman_roles": "[\"ad\",\"delegate\",\"secr\"]",
- "groupman_roles": "[\"ad\"]",
- "matman_roles": "[\"ad\",\"chair\",\"delegate\",\"secr\"]",
- "role_order": "[\"chair\",\"secr\"]"
- }
-},
-{
- "model": "group.groupfeatures",
- "pk": "ietf",
- "fields": {
- "has_milestones": false,
- "has_chartering_process": false,
- "has_documents": false,
- "has_session_materials": true,
- "has_nonsession_materials": false,
- "has_meetings": true,
- "has_reviews": false,
- "has_default_jabber": false,
- "acts_like_wg": false,
- "create_wiki": false,
- "custom_group_roles": true,
- "customize_workflow": false,
- "is_schedulable": false,
- "show_on_agenda": false,
- "req_subm_approval": true,
- "agenda_type": "ietf",
- "about_page": "ietf.group.views.group_about",
- "default_tab": "ietf.group.views.group_about",
- "material_types": "[\"slides\"]",
- "admin_roles": "[\"chair\",\"lead\"]",
- "docman_roles": "[\"chair\"]",
- "groupman_roles": "[\"chair\",\"delegate\"]",
- "matman_roles": "[\"chair\",\"delegate\"]",
- "role_order": "[\"chair\",\"secr\"]"
- }
-},
-{
- "model": "group.groupfeatures",
- "pk": "review",
- "fields": {
- "has_milestones": false,
- "has_chartering_process": false,
- "has_documents": false,
- "has_session_materials": false,
- "has_nonsession_materials": false,
- "has_meetings": false,
- "has_reviews": true,
- "has_default_jabber": false,
- "acts_like_wg": false,
- "create_wiki": true,
- "custom_group_roles": true,
- "customize_workflow": false,
- "is_schedulable": false,
- "show_on_agenda": false,
- "req_subm_approval": true,
- "agenda_type": null,
- "about_page": "ietf.group.views.group_about",
- "default_tab": "ietf.group.views.review_requests",
- "material_types": "[\"slides\"]",
- "admin_roles": "[\"chair\",\"secr\"]",
- "docman_roles": "[\"secr\"]",
- "groupman_roles": "[\"ad\",\"secr\"]",
- "matman_roles": "[\"ad\",\"secr\"]",
- "role_order": "[\"chair\",\"secr\"]"
- }
-},
-{
- "model": "group.groupfeatures",
- "pk": "nomcom",
- "fields": {
- "has_milestones": false,
- "has_chartering_process": false,
- "has_documents": false,
- "has_session_materials": false,
- "has_nonsession_materials": false,
- "has_meetings": false,
- "has_reviews": false,
- "has_default_jabber": false,
- "acts_like_wg": false,
- "create_wiki": true,
- "custom_group_roles": true,
- "customize_workflow": false,
- "is_schedulable": false,
- "show_on_agenda": false,
- "req_subm_approval": true,
- "agenda_type": "side",
- "about_page": "ietf.group.views.group_about",
- "default_tab": "ietf.group.views.group_about",
- "material_types": "[\"slides\"]",
- "admin_roles": "[\"chair\"]",
- "docman_roles": "[]",
- "groupman_roles": "[\"chair\",\"advisor\"]",
- "matman_roles": "[\"chair\"]",
- "role_order": "[\"chair\",\"member\",\"advisor\"]"
- }
-},
-{
- "model": "group.groupfeatures",
- "pk": "ise",
- "fields": {
- "has_milestones": false,
- "has_chartering_process": false,
- "has_documents": false,
- "has_session_materials": false,
- "has_nonsession_materials": false,
- "has_meetings": false,
- "has_reviews": false,
- "has_default_jabber": false,
- "acts_like_wg": false,
- "create_wiki": false,
- "custom_group_roles": true,
- "customize_workflow": false,
- "is_schedulable": false,
- "show_on_agenda": false,
- "req_subm_approval": true,
- "agenda_type": "ad",
- "about_page": "ietf.group.views.group_about",
- "default_tab": "ietf.group.views.group_about",
- "material_types": "[\"slides\"]",
- "admin_roles": "[\"chair\",\"lead\"]",
- "docman_roles": "[\"chair\"]",
- "groupman_roles": "[\"chair\",\"delegate\"]",
- "matman_roles": "[\"chair\",\"delegate\"]",
- "role_order": "[\"chair\",\"delegate\"]"
- }
-},
-{
- "model": "group.groupfeatures",
- "pk": "iab",
- "fields": {
- "has_milestones": false,
- "has_chartering_process": false,
- "has_documents": false,
- "has_session_materials": false,
- "has_nonsession_materials": false,
- "has_meetings": true,
- "has_reviews": false,
- "has_default_jabber": false,
- "acts_like_wg": false,
- "create_wiki": false,
- "custom_group_roles": true,
- "customize_workflow": false,
- "is_schedulable": false,
- "show_on_agenda": true,
- "req_subm_approval": true,
- "agenda_type": "ietf",
- "about_page": "ietf.group.views.group_about",
- "default_tab": "ietf.group.views.group_about",
- "material_types": "[\"slides\"]",
- "admin_roles": "[\"chair\"]",
- "docman_roles": "[\"chair\"]",
- "groupman_roles": "[]",
- "matman_roles": "[\"chair\",\"delegate\"]",
- "role_order": "[\"chair\",\"secr\"]"
- }
-},
-{
- "model": "group.groupfeatures",
- "pk": "program",
- "fields": {
- "has_milestones": true,
- "has_chartering_process": false,
- "has_documents": true,
- "has_session_materials": false,
- "has_nonsession_materials": false,
- "has_meetings": false,
- "has_reviews": false,
- "has_default_jabber": false,
- "acts_like_wg": false,
- "create_wiki": false,
- "custom_group_roles": true,
- "customize_workflow": false,
- "is_schedulable": false,
- "show_on_agenda": false,
- "req_subm_approval": false,
- "agenda_type": null,
- "about_page": "ietf.group.views.group_about",
- "default_tab": "ietf.group.views.group_about",
- "material_types": "[\"slides\"]",
- "admin_roles": "[\"lead\"]",
- "docman_roles": "[\"lead\",\"secr\"]",
- "groupman_roles": "[\"lead\",\"secr\"]",
- "matman_roles": "[\"lead\",\"secr\"]",
- "role_order": "[\"lead\",\"secr\"]"
- }
-},
-{
- "model": "group.groupfeatures",
- "pk": "rg",
- "fields": {
- "has_milestones": true,
- "has_chartering_process": true,
- "has_documents": true,
- "has_session_materials": true,
- "has_nonsession_materials": false,
- "has_meetings": true,
- "has_reviews": false,
- "has_default_jabber": true,
- "acts_like_wg": true,
- "create_wiki": true,
- "custom_group_roles": false,
- "customize_workflow": true,
- "is_schedulable": true,
- "show_on_agenda": true,
- "req_subm_approval": true,
- "agenda_type": "ietf",
- "about_page": "ietf.group.views.group_about",
- "default_tab": "ietf.group.views.group_documents",
- "material_types": "[\"slides\"]",
- "admin_roles": "[\"chair\"]",
- "docman_roles": "[\"chair\",\"delegate\",\"secr\"]",
- "groupman_roles": "[\"chair\",\"secr\"]",
- "matman_roles": "[\"chair\",\"secr\"]",
- "role_order": "[\"chair\",\"secr\"]"
- }
-},
-{
- "model": "group.groupfeatures",
- "pk": "team",
- "fields": {
- "has_milestones": false,
- "has_chartering_process": false,
- "has_documents": false,
- "has_session_materials": false,
- "has_nonsession_materials": true,
- "has_meetings": true,
- "has_reviews": false,
- "has_default_jabber": false,
- "acts_like_wg": false,
- "create_wiki": true,
- "custom_group_roles": true,
- "customize_workflow": false,
- "is_schedulable": false,
- "show_on_agenda": false,
- "req_subm_approval": false,
- "agenda_type": "ietf",
- "about_page": "ietf.group.views.group_about",
- "default_tab": "ietf.group.views.group_about",
- "material_types": "[\"slides\"]",
- "admin_roles": "[\"chair\"]",
- "docman_roles": "[\"chair\"]",
- "groupman_roles": "[\"chair\"]",
- "matman_roles": "[\"chair\",\"matman\"]",
- "role_order": "[\"chair\",\"member\",\"matman\"]"
- }
-},
-{
- "model": "group.groupfeatures",
- "pk": "rfcedtyp",
- "fields": {
- "has_milestones": false,
- "has_chartering_process": false,
- "has_documents": false,
- "has_session_materials": false,
- "has_nonsession_materials": false,
- "has_meetings": false,
- "has_reviews": false,
- "has_default_jabber": false,
- "acts_like_wg": false,
- "create_wiki": false,
- "custom_group_roles": true,
- "customize_workflow": false,
- "is_schedulable": false,
- "show_on_agenda": false,
- "req_subm_approval": true,
- "agenda_type": "side",
- "about_page": "ietf.group.views.group_about",
- "default_tab": "ietf.group.views.group_about",
- "material_types": "[\"slides\"]",
- "admin_roles": "[\"chair\"]",
- "docman_roles": "[]",
- "groupman_roles": "[]",
- "matman_roles": "[]",
- "role_order": "[\"chair\",\"secr\"]"
- }
-},
-{
- "model": "group.groupfeatures",
- "pk": "individ",
- "fields": {
- "has_milestones": false,
- "has_chartering_process": false,
- "has_documents": false,
- "has_session_materials": false,
- "has_nonsession_materials": false,
- "has_meetings": false,
- "has_reviews": false,
- "has_default_jabber": false,
- "acts_like_wg": false,
- "create_wiki": false,
- "custom_group_roles": true,
- "customize_workflow": false,
- "is_schedulable": false,
- "show_on_agenda": false,
- "req_subm_approval": false,
- "agenda_type": null,
- "about_page": "ietf.group.views.group_about",
- "default_tab": "ietf.group.views.group_about",
- "material_types": "[\"slides\"]",
- "admin_roles": "[\"chair\"]",
- "docman_roles": "[\"auth\"]",
- "groupman_roles": "[]",
- "matman_roles": "[]",
- "role_order": "[\"chair\",\"secr\"]"
- }
-},
-{
- "model": "group.groupfeatures",
- "pk": "irtf",
- "fields": {
- "has_milestones": false,
- "has_chartering_process": false,
- "has_documents": false,
- "has_session_materials": false,
- "has_nonsession_materials": false,
- "has_meetings": false,
- "has_reviews": false,
- "has_default_jabber": false,
- "acts_like_wg": false,
- "create_wiki": false,
- "custom_group_roles": true,
- "customize_workflow": false,
- "is_schedulable": false,
- "show_on_agenda": false,
- "req_subm_approval": true,
- "agenda_type": "ietf",
- "about_page": "ietf.group.views.group_about",
- "default_tab": "ietf.group.views.group_about",
- "material_types": "[\"slides\"]",
- "admin_roles": "[\"chair\"]",
- "docman_roles": "[]",
- "groupman_roles": "[\"chair\",\"delegate\"]",
- "matman_roles": "[\"chair\",\"delegate\",\"secr\"]",
- "role_order": "[\"chair\",\"secr\"]"
- }
-},
-{
- "model": "group.groupfeatures",
- "pk": "dir",
- "fields": {
- "has_milestones": false,
- "has_chartering_process": false,
- "has_documents": false,
- "has_session_materials": false,
- "has_nonsession_materials": false,
- "has_meetings": false,
- "has_reviews": false,
- "has_default_jabber": false,
- "acts_like_wg": false,
- "create_wiki": true,
- "custom_group_roles": true,
- "customize_workflow": false,
- "is_schedulable": false,
- "show_on_agenda": false,
- "req_subm_approval": true,
- "agenda_type": null,
- "about_page": "ietf.group.views.group_about",
- "default_tab": "ietf.group.views.group_about",
- "material_types": "[\"slides\"]",
- "admin_roles": "[\"chair\",\"secr\"]",
- "docman_roles": "[]",
- "groupman_roles": "[\"ad\",\"secr\"]",
- "matman_roles": "[\"ad\",\"chair\",\"delegate\",\"secr\"]",
- "role_order": "[\"chair\",\"secr\"]"
- }
-},
-{
- "model": "group.groupfeatures",
- "pk": "iesg",
- "fields": {
- "has_milestones": false,
- "has_chartering_process": false,
- "has_documents": false,
- "has_session_materials": false,
- "has_nonsession_materials": false,
- "has_meetings": false,
- "has_reviews": false,
- "has_default_jabber": false,
- "acts_like_wg": false,
- "create_wiki": false,
- "custom_group_roles": true,
- "customize_workflow": false,
- "is_schedulable": false,
- "show_on_agenda": false,
- "req_subm_approval": true,
- "agenda_type": "ad",
- "about_page": "ietf.group.views.group_about",
- "default_tab": "ietf.group.views.group_about",
- "material_types": "\"[]\"",
- "admin_roles": "[\"chair\"]",
- "docman_roles": "[\"chair\"]",
- "groupman_roles": "[\"chair\",\"delegate\"]",
- "matman_roles": "[\"chair\",\"delegate\",\"member\"]",
- "role_order": "[\"chair\",\"delegate\",\"member\"]"
- }
-},
-{
- "model": "group.groupfeatures",
- "pk": "adhoc",
- "fields": {
- "has_milestones": false,
- "has_chartering_process": false,
- "has_documents": false,
- "has_session_materials": true,
- "has_nonsession_materials": false,
- "has_meetings": true,
- "has_reviews": false,
- "has_default_jabber": true,
- "acts_like_wg": false,
- "create_wiki": true,
- "custom_group_roles": false,
- "customize_workflow": false,
- "is_schedulable": true,
- "show_on_agenda": true,
- "req_subm_approval": true,
- "agenda_type": "ietf",
- "about_page": "ietf.group.views.group_about",
- "default_tab": "ietf.group.views.group_about",
- "material_types": "[\"slides\"]",
- "admin_roles": "[\"chair\"]",
- "docman_roles": "[\"chair\"]",
- "groupman_roles": "[\"chair\",\"lead\",\"delegate\"]",
- "matman_roles": "[\"chair\",\"lead\",\"delegate\",\"matman\"]",
- "role_order": "[\"chair\",\"lead\",\"delegate\",\"matman\"]"
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "commenter",
- "fields": {
- "desc": "The person providing a comment to nomcom",
- "template": "{{commenter}}"
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "conflict_review_steering_group",
- "fields": {
- "desc": "The steering group (e.g. IRSG) of a document being reviewed for IETF stream conflicts",
- "template": null
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "conflict_review_stream_manager",
- "fields": {
- "desc": "The stream manager of a document being reviewed for IETF stream conflicts",
- "template": null
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "doc_ad",
- "fields": {
- "desc": "The document's responsible Area Director",
- "template": "{% if doc.ad %}<{{doc.ad.email_address}}>{% endif %}"
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "doc_affecteddoc_authors",
- "fields": {
- "desc": "The authors of the subject documents of a conflict-review or status-change",
- "template": null
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "doc_affecteddoc_group_chairs",
- "fields": {
- "desc": "The chairs of groups of the subject documents of a conflict-review or status-change",
- "template": null
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "doc_affecteddoc_notify",
- "fields": {
- "desc": "The notify field of the subject documents of a conflict-review or status-change",
- "template": null
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "doc_authors",
- "fields": {
- "desc": "The document's authors",
- "template": "{% if doc.type_id == \"draft\" %}<{{doc.name}}@ietf.org>{% endif %}"
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "doc_authors_expanded",
- "fields": {
- "desc": "The authors of the document, without using the draft aliases",
- "template": "{{doc.author_list}}"
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "doc_discussing_ads",
- "fields": {
- "desc": "Any ADs holding an active DISCUSS position on a given document",
- "template": null
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "doc_group_chairs",
- "fields": {
- "desc": "The document's group chairs (if the document is assigned to a working or research group)",
- "template": null
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "doc_group_delegates",
- "fields": {
- "desc": "The document's group delegates (if the document is assigned to a working or research group)",
- "template": null
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "doc_group_mail_list",
- "fields": {
- "desc": "The list address of the document's group",
- "template": null
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "doc_group_responsible_directors",
- "fields": {
- "desc": "The document's group's responsible AD(s) or IRTF chair",
- "template": null
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "doc_ipr_group_or_ad",
- "fields": {
- "desc": "Leadership for a document that has a new IPR disclosure",
- "template": null
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "doc_non_ietf_stream_manager",
- "fields": {
- "desc": "The document's stream manager if the document is not in the IETF stream",
- "template": null
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "doc_notify",
- "fields": {
- "desc": "The addresses in the document's notify field",
- "template": "{{doc.notify}}"
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "doc_shepherd",
- "fields": {
- "desc": "The document's shepherd",
- "template": "{% if doc.shepherd %}<{{doc.shepherd.address}}>{% endif %}"
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "doc_stream_manager",
- "fields": {
- "desc": "The manager of the document's stream",
- "template": null
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "group_chairs",
- "fields": {
- "desc": "The group's chairs",
- "template": "{% if group and group.acronym %}<{{group.acronym}}-chairs@ietf.org>{% endif %}"
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "group_changed_personnel",
- "fields": {
- "desc": "Any personnel who were added or deleted when a group's personnel changes",
- "template": "{% if changed_personnel %} {{ changed_personnel | join:\", \" }} {% endif %}"
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "group_mail_list",
- "fields": {
- "desc": "The group's mailing list",
- "template": "{% if group.list_email %}<{{ group.list_email }}>{% endif %}"
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "group_responsible_directors",
- "fields": {
- "desc": "The group's responsible AD(s) or IRTF chair",
- "template": null
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "group_secretaries",
- "fields": {
- "desc": "The group's secretaries",
- "template": null
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "group_steering_group",
- "fields": {
- "desc": "The group's steering group (IESG or IRSG)",
- "template": null
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "group_stream_announce",
- "fields": {
- "desc": "The group's stream's announce list",
- "template": "{% if group.type_id == 'wg' %}IETF-Announce {% elif group.type_id == 'rg' %}IRTF-Announce {% endif %}"
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "iab",
- "fields": {
- "desc": "The IAB",
- "template": "The IAB "
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "iana",
- "fields": {
- "desc": "IANA",
- "template": ""
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "iana_approve",
- "fields": {
- "desc": "IANA's draft approval address",
- "template": "IANA "
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "iana_eval",
- "fields": {
- "desc": "IANA's draft evaluation address",
- "template": "IANA "
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "iana_last_call",
- "fields": {
- "desc": "IANA's draft last call address",
- "template": "IANA "
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "id_announce",
- "fields": {
- "desc": "The I-D-Announce Email List",
- "template": ""
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "iesg",
- "fields": {
- "desc": "The IESG",
- "template": "The IESG "
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "iesg_secretary",
- "fields": {
- "desc": "The Secretariat",
- "template": ""
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "ietf_announce",
- "fields": {
- "desc": "The IETF Announce list",
- "template": "IETF-Announce "
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "ietf_general",
- "fields": {
- "desc": "The IETF general discussion list",
- "template": "ietf@ietf.org"
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "ietf_secretariat",
- "fields": {
- "desc": "The Secretariat",
- "template": ""
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "internet_draft_requests",
- "fields": {
- "desc": "The internet drafts ticketing system",
- "template": ""
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "ipr_announce",
- "fields": {
- "desc": "The IETF IPR announce list",
- "template": "ipr-announce@ietf.org"
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "ipr_requests",
- "fields": {
- "desc": "The ipr disclosure handling system",
- "template": ""
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "ipr_submitter",
- "fields": {
- "desc": "The submitter of an IPR disclosure",
- "template": "{% if ipr.submitter_email %}{{ ipr.submitter_email }}{% endif %}"
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "ipr_updatedipr_contacts",
- "fields": {
- "desc": "The submitter (or ietf participant if the submitter is not available) of all IPR disclosures updated directly by this disclosure, without recursing to what the updated disclosures might have updated.",
- "template": null
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "ipr_updatedipr_holders",
- "fields": {
- "desc": "The holders of all IPR disclosures updated by disclosure and disclosures updated by those and so on.",
- "template": null
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "liaison_admin",
- "fields": {
- "desc": "Alias for secretariat liaison administration",
- "template": ""
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "liaison_approvers",
- "fields": {
- "desc": "The set of people who can approve this liasion statemetns",
- "template": "{{liaison.approver_emails|join:\", \"}}"
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "liaison_cc",
- "fields": {
- "desc": "The addresses captured in the Cc field of the liaison statement form",
- "template": "{{liaison.cc_contacts}}"
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "liaison_manager",
- "fields": {
- "desc": "The assigned liaison manager for an external group ",
- "template": null
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "liaison_response_contacts",
- "fields": {
- "desc": "The addresses captured in the response contact field of the liaison statement form",
- "template": "{{liaison.response_contacts}}"
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "liaison_technical_contacts",
- "fields": {
- "desc": "The addresses captured in the technical contact field of the liaison statement form",
- "template": "{{liaison.technical_contacts}}"
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "liaison_to_contacts",
- "fields": {
- "desc": "The addresses captured in the To field of the liaison statement form",
- "template": "{{liaison.to_contacts}}"
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "logged_in_person",
- "fields": {
- "desc": "The person currently logged into the datatracker who initiated a given action",
- "template": "{% if person and person.email_address %}<{{ person.email_address }}>{% endif %}"
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "new_work",
- "fields": {
- "desc": "The IETF New Work list",
- "template": ""
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "nomcom_chair",
- "fields": {
- "desc": "The chair of a given nomcom",
- "template": "{{nomcom.group.get_chair.email.address}}"
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "nominator",
- "fields": {
- "desc": "The person that submitted a nomination to nomcom",
- "template": "{{nominator}}"
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "nominee",
- "fields": {
- "desc": "The person nominated for a position",
- "template": "{{nominee}}"
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "review_doc_ad",
- "fields": {
- "desc": "The reviewed document's responsible area director",
- "template": "{% if review_req.doc.ad %}{{review_req.doc.ad.email_address}}{% endif %}"
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "review_doc_all_parties",
- "fields": {
- "desc": "The .all alias for the document being reviewed",
- "template": "{% if review_req.doc.type_id == 'draft' %}<{{review_req.doc.name}}.all@ietf.org>{% endif %}"
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "review_doc_group_mail_list",
- "fields": {
- "desc": "The working group list for the document being reviewed",
- "template": "{{review_req.doc.group.list_email}}"
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "review_team_ads",
- "fields": {
- "desc": "The ADs of the team reviewing the document",
- "template": null
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "review_team_mail_list",
- "fields": {
- "desc": "The review team's email list",
- "template": "{{review_req.team.list_email}}"
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "rfc_editor",
- "fields": {
- "desc": "The RFC Editor",
- "template": ""
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "rfc_editor_if_doc_in_queue",
- "fields": {
- "desc": "The RFC Editor if a document is in the RFC Editor queue",
- "template": null
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "session_requester",
- "fields": {
- "desc": "The person that requested a meeting slot for a given group",
- "template": null
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "session_requests",
- "fields": {
- "desc": "The session request ticketing system",
- "template": ""
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "stream_managers",
- "fields": {
- "desc": "The managers of any related streams",
- "template": null
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "submission_authors",
- "fields": {
- "desc": "The authors of a submitted draft",
- "template": null
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "submission_confirmers",
- "fields": {
- "desc": "The people who can confirm a draft submission",
- "template": null
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "submission_group_chairs",
- "fields": {
- "desc": "The chairs of a submitted draft belonging to a group",
- "template": null
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "submission_group_mail_list",
- "fields": {
- "desc": "The mailing list of the group associated with a submitted document",
- "template": ""
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "submission_manualpost_handling",
- "fields": {
- "desc": "IETF manual post handling",
- "template": ""
- }
-},
-{
- "model": "mailtrigger.recipient",
- "pk": "submission_submitter",
- "fields": {
- "desc": "The person that submitted a draft",
- "template": "{{submission.submitter}}"
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "ballot_approved_charter",
- "fields": {
- "desc": "Recipients when a charter is approved",
- "to": [
- "ietf_announce"
- ],
- "cc": [
- "doc_notify",
- "group_chairs",
- "group_mail_list",
- "group_steering_group"
- ]
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "ballot_approved_conflrev",
- "fields": {
- "desc": "Recipients when a conflict review ballot is approved",
- "to": [
- "conflict_review_steering_group",
- "conflict_review_stream_manager",
- "doc_affecteddoc_authors",
- "doc_affecteddoc_group_chairs",
- "doc_affecteddoc_notify",
- "doc_notify"
- ],
- "cc": [
- "iana",
- "iesg",
- "ietf_announce"
- ]
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "ballot_approved_ietf_stream",
- "fields": {
- "desc": "Recipients when an IETF stream document ballot is approved",
- "to": [
- "ietf_announce"
- ],
- "cc": [
- "doc_ad",
- "doc_authors",
- "doc_group_chairs",
- "doc_group_mail_list",
- "doc_notify",
- "doc_shepherd",
- "iesg",
- "rfc_editor"
- ]
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "ballot_approved_ietf_stream_iana",
- "fields": {
- "desc": "Recipients for IANA message when an IETF stream document ballot is approved",
- "to": [
- "iana_approve"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "ballot_approved_status_change",
- "fields": {
- "desc": "Recipients when a status change is approved",
- "to": [
- "ietf_announce"
- ],
- "cc": [
- "doc_affecteddoc_authors",
- "doc_affecteddoc_group_chairs",
- "doc_affecteddoc_notify",
- "doc_notify",
- "iana",
- "iesg",
- "rfc_editor"
- ]
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "ballot_deferred",
- "fields": {
- "desc": "Recipients when a ballot is deferred to or undeferred from a future telechat",
- "to": [
- "conflict_review_stream_manager",
- "doc_affecteddoc_authors",
- "doc_affecteddoc_group_chairs",
- "doc_affecteddoc_notify",
- "doc_authors",
- "doc_group_chairs",
- "doc_notify",
- "doc_shepherd",
- "iesg",
- "iesg_secretary"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "ballot_ednote_changed_late",
- "fields": {
- "desc": "Recipients when the RFC Editor note for a document is changed after the document has been approved",
- "to": [
- "iesg",
- "rfc_editor"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "ballot_issued",
- "fields": {
- "desc": "Recipients when a ballot is issued",
- "to": [
- "iesg",
- "iesg_secretary"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "ballot_issued_iana",
- "fields": {
- "desc": "Recipients for IANA message when a ballot is issued",
- "to": [
- "iana_eval"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "ballot_saved",
- "fields": {
- "desc": "Recipients when a new ballot position (with discusses, other blocking positions, or comments) is saved",
- "to": [
- "iesg"
- ],
- "cc": [
- "conflict_review_stream_manager",
- "doc_affecteddoc_authors",
- "doc_affecteddoc_group_chairs",
- "doc_affecteddoc_notify",
- "doc_authors",
- "doc_group_chairs",
- "doc_group_mail_list",
- "doc_notify",
- "doc_shepherd"
- ]
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "charter_external_review",
- "fields": {
- "desc": "Recipients for a charter external review",
- "to": [
- "ietf_announce"
- ],
- "cc": [
- "group_mail_list"
- ]
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "charter_external_review_new_work",
- "fields": {
- "desc": "Recipients for a message to new-work about a charter review",
- "to": [
- "new_work"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "charter_internal_review",
- "fields": {
- "desc": "Recipients for message noting that internal review has started on a charter",
- "to": [
- "iab",
- "iesg"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "charter_state_edit_admin_needed",
- "fields": {
- "desc": "Recipients for message to adminstrators when a charter state edit needs followon administrative action",
- "to": [
- "iesg_secretary"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "conflrev_ad_changed",
- "fields": {
- "desc": "Recipients when the responsible AD for a conflict review is changed",
- "to": [],
- "cc": [
- "conflict_review_steering_group",
- "conflict_review_stream_manager",
- "doc_affecteddoc_authors",
- "doc_affecteddoc_group_chairs",
- "doc_affecteddoc_notify",
- "doc_notify",
- "iesg"
- ]
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "conflrev_requested",
- "fields": {
- "desc": "Recipients for a stream manager's request for an IETF conflict review",
- "to": [
- "iesg_secretary"
- ],
- "cc": [
- "conflict_review_steering_group",
- "conflict_review_stream_manager",
- "doc_affecteddoc_authors",
- "doc_affecteddoc_group_chairs",
- "doc_affecteddoc_notify",
- "doc_notify",
- "iesg"
- ]
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "conflrev_requested_iana",
- "fields": {
- "desc": "Recipients for IANA message when a stream manager requests an IETF conflict review",
- "to": [
- "iana_eval"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "doc_added_comment",
- "fields": {
- "desc": "Recipients for a message when a new comment is manually entered into the document's history",
- "to": [
- "doc_authors",
- "doc_group_chairs",
- "doc_group_responsible_directors",
- "doc_non_ietf_stream_manager",
- "doc_shepherd"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "doc_adopted_by_group",
- "fields": {
- "desc": "Recipients for notification that a document has been adopted by a group",
- "to": [
- "doc_authors",
- "doc_group_chairs",
- "doc_group_mail_list"
- ],
- "cc": [
- "doc_ad",
- "doc_notify",
- "doc_shepherd"
- ]
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "doc_expired",
- "fields": {
- "desc": "Recipients for notification of a document's expiration",
- "to": [
- "doc_authors"
- ],
- "cc": [
- "doc_group_chairs",
- "doc_group_responsible_directors",
- "doc_notify",
- "doc_shepherd"
- ]
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "doc_expires_soon",
- "fields": {
- "desc": "Recipients for notification of impending expiration of a document",
- "to": [
- "doc_authors"
- ],
- "cc": [
- "doc_group_chairs",
- "doc_group_responsible_directors",
- "doc_notify",
- "doc_shepherd"
- ]
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "doc_iana_state_changed",
- "fields": {
- "desc": "Recipients when IANA state information for a document changes ",
- "to": [
- "doc_ad",
- "doc_affecteddoc_authors",
- "doc_affecteddoc_group_chairs",
- "doc_affecteddoc_notify",
- "doc_authors",
- "doc_group_chairs",
- "doc_notify",
- "doc_shepherd"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "doc_iesg_processing_started",
- "fields": {
- "desc": "Recipients for a message when the IESG begins processing a document ",
- "to": [
- "doc_ad",
- "doc_authors",
- "doc_group_chairs",
- "doc_shepherd"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "doc_intended_status_changed",
- "fields": {
- "desc": "Recipients for a message when a document's intended publication status changes",
- "to": [
- "doc_authors",
- "doc_group_chairs",
- "doc_group_responsible_directors",
- "doc_non_ietf_stream_manager",
- "doc_shepherd"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "doc_pulled_from_rfc_queue",
- "fields": {
- "desc": "Recipients when a document is taken out of the RFC's editor queue before publication",
- "to": [
- "iana",
- "rfc_editor"
- ],
- "cc": [
- "doc_authors",
- "doc_group_chairs",
- "doc_notify",
- "doc_shepherd",
- "iesg",
- "iesg_secretary"
- ]
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "doc_replacement_changed",
- "fields": {
- "desc": "Recipients when what a document replaces or is replaced by changes",
- "to": [
- "doc_authors_expanded"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "doc_replacement_suggested",
- "fields": {
- "desc": "Recipients for suggestions that this doc replaces or is replace by some other document",
- "to": [
- "doc_group_chairs",
- "doc_group_responsible_directors",
- "doc_non_ietf_stream_manager",
- "iesg_secretary"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "doc_state_edited",
- "fields": {
- "desc": "Recipients when a document's state is manually edited",
- "to": [
- "doc_ad",
- "doc_affecteddoc_authors",
- "doc_affecteddoc_group_chairs",
- "doc_affecteddoc_notify",
- "doc_authors",
- "doc_group_chairs",
- "doc_group_responsible_directors",
- "doc_notify",
- "doc_shepherd"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "doc_stream_changed",
- "fields": {
- "desc": "Recipients for notification when a document's stream changes",
- "to": [
- "doc_authors",
- "doc_notify",
- "stream_managers"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "doc_stream_state_edited",
- "fields": {
- "desc": "Recipients when the stream state of a document is manually edited",
- "to": [
- "doc_authors",
- "doc_group_chairs",
- "doc_group_delegates",
- "doc_shepherd"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "doc_telechat_details_changed",
- "fields": {
- "desc": "Recipients when a document's telechat date or other telechat specific details are changed",
- "to": [
- "conflict_review_steering_group",
- "conflict_review_stream_manager",
- "doc_affecteddoc_authors",
- "doc_affecteddoc_group_chairs",
- "doc_affecteddoc_notify",
- "doc_authors",
- "doc_group_chairs",
- "doc_notify",
- "doc_shepherd",
- "iesg",
- "iesg_secretary"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "group_added_comment",
- "fields": {
- "desc": "Recipients when a comment is added to a group's history",
- "to": [
- "group_chairs",
- "group_responsible_directors",
- "group_secretaries"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "group_approved_milestones_edited",
- "fields": {
- "desc": "Recipients when the set of approved milestones for a group are edited",
- "to": [
- "group_mail_list"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "group_closure_requested",
- "fields": {
- "desc": "Recipients for message requesting closure of a group",
- "to": [
- "iesg_secretary"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "group_milestones_edited",
- "fields": {
- "desc": "Recipients when any of a group's milestones are edited",
- "to": [
- "group_chairs",
- "group_responsible_directors"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "group_personnel_change",
- "fields": {
- "desc": "Recipients for a message noting changes in a group's personnel",
- "to": [
- "group_chairs",
- "group_changed_personnel",
- "group_responsible_directors",
- "group_secretaries",
- "iesg_secretary"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "interim_announced",
- "fields": {
- "desc": "Recipients when an interim meeting is announced",
- "to": [
- "group_stream_announce",
- "ietf_announce"
- ],
- "cc": [
- "group_mail_list"
- ]
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "interim_approved",
- "fields": {
- "desc": "Recipients when an interim meeting is approved and an announcement needs to be sent",
- "to": [
- "iesg_secretary"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "interim_cancelled",
- "fields": {
- "desc": "Recipients when an interim meeting is cancelled",
- "to": [
- "group_stream_announce",
- "ietf_announce"
- ],
- "cc": [
- "group_chairs",
- "group_mail_list",
- "logged_in_person"
- ]
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "ipr_disclosure_followup",
- "fields": {
- "desc": "Recipients when the secretary follows up on an IPR disclosure submission",
- "to": [
- "ipr_submitter"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "ipr_disclosure_submitted",
- "fields": {
- "desc": "Recipients when an IPR disclosure is submitted",
- "to": [
- "ipr_requests"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "ipr_posted_on_doc",
- "fields": {
- "desc": "Recipients when an IPR disclosure calls out a given document",
- "to": [
- "doc_authors"
- ],
- "cc": [
- "doc_ipr_group_or_ad",
- "ipr_announce"
- ]
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "ipr_posting_confirmation",
- "fields": {
- "desc": "Recipients for a message confirming that a disclosure has been posted",
- "to": [
- "ipr_submitter"
- ],
- "cc": [
- "ipr_updatedipr_contacts",
- "ipr_updatedipr_holders"
- ]
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "last_call_expired",
- "fields": {
- "desc": "Recipients when a last call has expired",
- "to": [
- "doc_ad",
- "doc_authors",
- "doc_notify",
- "doc_shepherd"
- ],
- "cc": [
- "iesg_secretary"
- ]
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "last_call_issued",
- "fields": {
- "desc": "Recipients when a last call is issued",
- "to": [
- "ietf_announce"
- ],
- "cc": [
- "doc_ad",
- "doc_affecteddoc_authors",
- "doc_affecteddoc_group_chairs",
- "doc_affecteddoc_notify",
- "doc_authors",
- "doc_group_chairs",
- "doc_group_mail_list",
- "doc_notify",
- "doc_shepherd"
- ]
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "last_call_issued_iana",
- "fields": {
- "desc": "Recipients for IANA message when a last call is issued",
- "to": [
- "iana_last_call"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "last_call_requested",
- "fields": {
- "desc": "Recipients when AD requests a last call",
- "to": [
- "iesg_secretary"
- ],
- "cc": [
- "doc_ad",
- "doc_notify",
- "doc_shepherd"
- ]
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "liaison_approval_requested",
- "fields": {
- "desc": "Recipients for a message that a pending liaison statement needs approval",
- "to": [
- "liaison_approvers"
- ],
- "cc": [
- "liaison_admin"
- ]
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "liaison_deadline_soon",
- "fields": {
- "desc": "Recipients for a message about a liaison statement deadline that is approaching.",
- "to": [
- "liaison_to_contacts"
- ],
- "cc": [
- "liaison_cc",
- "liaison_response_contacts",
- "liaison_technical_contacts"
- ]
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "liaison_manager_update_request",
- "fields": {
- "desc": "Recipients for a message requesting an updated list of authorized individuals",
- "to": [
- "liaison_manager"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "liaison_statement_posted",
- "fields": {
- "desc": "Recipient for a message when a new liaison statement is posted",
- "to": [
- "liaison_to_contacts"
- ],
- "cc": [
- "liaison_cc",
- "liaison_response_contacts",
- "liaison_technical_contacts"
- ]
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "nomcom_comment_receipt_requested",
- "fields": {
- "desc": "Recipients for a message confirming a comment was made",
- "to": [
- "commenter"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "nomcom_questionnaire",
- "fields": {
- "desc": "Recipients for the questionairre that nominees should complete",
- "to": [
- "nominee"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "nomcom_questionnaire_reminder",
- "fields": {
- "desc": "Recipients for a message reminding a nominee to return a completed questionairre response",
- "to": [
- "nominee"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "nomination_accept_reminder",
- "fields": {
- "desc": "Recipeints of message reminding a nominee to accept or decline a nomination",
- "to": [
- "nominee"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "nomination_created_person",
- "fields": {
- "desc": "Recipients for a message noting that a nomination caused a new Person record to be created in the datatracker",
- "to": [
- "ietf_secretariat",
- "nomcom_chair"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "nomination_new_nominee",
- "fields": {
- "desc": "Recipients the first time a person is nominated for a position, asking them to accept or decline the nomination",
- "to": [
- "nominee"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "nomination_receipt_requested",
- "fields": {
- "desc": "Recipients for a message confirming a nomination was made",
- "to": [
- "nominator"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "nomination_received",
- "fields": {
- "desc": "Recipients for a message noting a new nomination has been received",
- "to": [
- "nomcom_chair"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "person_merge_requested",
- "fields": {
- "desc": "Recipients for a message requesting that duplicated Person records be merged ",
- "to": [
- "ietf_secretariat"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "pubreq_iesg",
- "fields": {
- "desc": "Recipients when a draft is submitted to the IESG",
- "to": [
- "doc_ad"
- ],
- "cc": [
- "doc_group_chairs",
- "doc_group_mail_list",
- "doc_notify",
- "doc_shepherd",
- "iesg_secretary"
- ]
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "pubreq_rfced",
- "fields": {
- "desc": "Recipients when a non-IETF stream manager requests publication",
- "to": [
- "rfc_editor"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "pubreq_rfced_iana",
- "fields": {
- "desc": "Recipients for IANA message when a non-IETF stream manager requests publication",
- "to": [
- "iana_approve"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "resurrection_completed",
- "fields": {
- "desc": "Recipients when a draft resurrection request has been completed",
- "to": [
- "doc_ad",
- "iesg_secretary"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "resurrection_requested",
- "fields": {
- "desc": "Recipients of a request to change the state of a draft away from 'Dead'",
- "to": [
- "internet_draft_requests"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "review_assignments_summarized",
- "fields": {
- "desc": "Recipients when an review team secretary send a summary of open review assignments",
- "to": [
- "group_mail_list"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "review_completed",
- "fields": {
- "desc": "Recipients when an review is completed",
- "to": [
- "review_team_mail_list"
- ],
- "cc": [
- "ietf_general",
- "review_doc_all_parties",
- "review_doc_group_mail_list"
- ]
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "review_notify_ad",
- "fields": {
- "desc": "Recipients when a team notifies area directors when a review with one of a certain set of results (typically results indicating problem) is submitted",
- "to": [
- "review_doc_ad",
- "review_team_ads"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "session_minutes_reminder",
- "fields": {
- "desc": "Recipients when a group is sent a reminder to submit minutes for a session",
- "to": [
- "group_chairs",
- "group_secretaries"
- ],
- "cc": [
- "group_responsible_directors"
- ]
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "session_requested",
- "fields": {
- "desc": "Recipients for a normal meeting session request",
- "to": [
- "session_requests"
- ],
- "cc": [
- "group_chairs",
- "group_mail_list",
- "group_responsible_directors",
- "logged_in_person"
- ]
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "session_requested_long",
- "fields": {
- "desc": "Recipients for a meeting session request for more than 2 sessions",
- "to": [
- "group_responsible_directors"
- ],
- "cc": [
- "group_chairs",
- "logged_in_person",
- "session_requests"
- ]
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "session_request_cancelled",
- "fields": {
- "desc": "Recipients for a message cancelling a session request",
- "to": [
- "session_requests"
- ],
- "cc": [
- "group_chairs",
- "group_mail_list",
- "group_responsible_directors",
- "logged_in_person"
- ]
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "session_request_not_meeting",
- "fields": {
- "desc": "Recipients for a message noting a group plans to not meet",
- "to": [
- "session_requests"
- ],
- "cc": [
- "group_chairs",
- "group_mail_list",
- "group_responsible_directors",
- "logged_in_person"
- ]
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "session_scheduled",
- "fields": {
- "desc": "Recipients for details when a session has been scheduled",
- "to": [
- "group_chairs",
- "session_requester"
- ],
- "cc": [
- "group_mail_list",
- "group_responsible_directors"
- ]
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "slides_proposed",
- "fields": {
- "desc": "Recipients when slides are proposed for a given session",
- "to": [
- "group_chairs",
- "group_responsible_directors",
- "group_secretaries"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "sub_announced",
- "fields": {
- "desc": "Recipients for the announcement of a successfully submitted draft",
- "to": [
- "id_announce"
- ],
- "cc": [
- "submission_group_mail_list"
- ]
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "sub_announced_to_authors",
- "fields": {
- "desc": "Recipients for the announcement to the authors of a successfully submitted draft",
- "to": [
- "submission_authors",
- "submission_confirmers"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "sub_chair_approval_requested",
- "fields": {
- "desc": "Recipients for a message requesting group chair approval of a draft submission",
- "to": [
- "submission_group_chairs"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "sub_confirmation_requested",
- "fields": {
- "desc": "Recipients for a message requesting confirmation of a draft submission",
- "to": [
- "submission_confirmers"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "sub_management_url_requested",
- "fields": {
- "desc": "Recipients for a message with the full URL for managing a draft submission",
- "to": [
- "submission_confirmers"
- ],
- "cc": []
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "sub_manual_post_requested",
- "fields": {
- "desc": "Recipients for a manual post request for a draft submission",
- "to": [
- "internet_draft_requests"
- ],
- "cc": [
- "submission_authors",
- "submission_group_chairs",
- "submission_submitter"
- ]
- }
-},
-{
- "model": "mailtrigger.mailtrigger",
- "pk": "sub_new_version",
- "fields": {
- "desc": "Recipients for notification of a new version of an existing document",
- "to": [
- "doc_ad",
- "doc_discussing_ads",
- "doc_non_ietf_stream_manager",
- "doc_notify",
- "rfc_editor_if_doc_in_queue"
- ],
- "cc": []
- }
-},
-{
- "model": "utils.versioninfo",
- "pk": 1,
- "fields": {
- "time": "2019-03-22T00:08:26.658",
- "command": "xym",
- "switch": "--version",
- "version": "xym 0.4",
- "used": true
- }
-},
-{
- "model": "utils.versioninfo",
- "pk": 2,
- "fields": {
- "time": "2019-03-22T00:08:27.896",
- "command": "pyang",
- "switch": "--version",
- "version": "pyang 1.7.8",
- "used": true
- }
-},
-{
- "model": "utils.versioninfo",
- "pk": 3,
- "fields": {
- "time": "2019-03-22T00:08:28.143",
- "command": "yanglint",
- "switch": "--version",
- "version": "yanglint 0.14.80",
- "used": true
- }
-},
-{
- "model": "utils.versioninfo",
- "pk": 4,
- "fields": {
- "time": "2019-03-22T00:08:29.133",
- "command": "xml2rfc",
- "switch": "--version",
- "version": "xml2rfc 2.21.1",
- "used": true
- }
-}
+ {
+ "fields": {
+ "doc_type": "charter",
+ "name": "Ready for external review",
+ "order": 1,
+ "positions": [
+ "yes",
+ "noobj",
+ "block",
+ "abstain",
+ "norecord"
+ ],
+ "question": "Is this charter ready for external review?",
+ "slug": "r-extrev",
+ "used": true
+ },
+ "model": "doc.ballottype",
+ "pk": 1
+ },
+ {
+ "fields": {
+ "doc_type": "charter",
+ "name": "Ready w/o external review",
+ "order": 2,
+ "positions": [
+ "yes",
+ "noobj",
+ "block",
+ "abstain",
+ "norecord"
+ ],
+ "question": "Is this charter ready for external review? Is this charter ready for approval without external review?",
+ "slug": "r-wo-ext",
+ "used": true
+ },
+ "model": "doc.ballottype",
+ "pk": 2
+ },
+ {
+ "fields": {
+ "doc_type": "charter",
+ "name": "Approve",
+ "order": 3,
+ "positions": [
+ "yes",
+ "noobj",
+ "block",
+ "abstain",
+ "norecord"
+ ],
+ "question": "Do we approve of this charter?",
+ "slug": "approve",
+ "used": true
+ },
+ "model": "doc.ballottype",
+ "pk": 3
+ },
+ {
+ "fields": {
+ "doc_type": "draft",
+ "name": "Approve",
+ "order": 1,
+ "positions": [
+ "yes",
+ "noobj",
+ "discuss",
+ "abstain",
+ "recuse",
+ "norecord"
+ ],
+ "question": "",
+ "slug": "approve",
+ "used": true
+ },
+ "model": "doc.ballottype",
+ "pk": 4
+ },
+ {
+ "fields": {
+ "doc_type": "conflrev",
+ "name": "Approve",
+ "order": 0,
+ "positions": [
+ "yes",
+ "noobj",
+ "discuss",
+ "abstain",
+ "recuse",
+ "norecord"
+ ],
+ "question": "Is this the correct conflict review response?",
+ "slug": "conflrev",
+ "used": true
+ },
+ "model": "doc.ballottype",
+ "pk": 5
+ },
+ {
+ "fields": {
+ "doc_type": "statchg",
+ "name": "Approve",
+ "order": 0,
+ "positions": [
+ "yes",
+ "noobj",
+ "discuss",
+ "abstain",
+ "recuse",
+ "norecord"
+ ],
+ "question": "Do we approve these RFC status changes?",
+ "slug": "statchg",
+ "used": true
+ },
+ "model": "doc.ballottype",
+ "pk": 6
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Active",
+ "next_states": [],
+ "order": 1,
+ "slug": "active",
+ "type": "draft",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 1
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Expired",
+ "next_states": [],
+ "order": 2,
+ "slug": "expired",
+ "type": "draft",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 2
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "RFC",
+ "next_states": [],
+ "order": 3,
+ "slug": "rfc",
+ "type": "draft",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 3
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Replaced",
+ "next_states": [],
+ "order": 4,
+ "slug": "repl",
+ "type": "draft",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 4
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Withdrawn by Submitter",
+ "next_states": [],
+ "order": 5,
+ "slug": "auth-rm",
+ "type": "draft",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 5
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Withdrawn by IETF",
+ "next_states": [],
+ "order": 6,
+ "slug": "ietf-rm",
+ "type": "draft",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 6
+ },
+ {
+ "fields": {
+ "desc": "The ID has been published as an RFC.",
+ "name": "RFC Published",
+ "next_states": [
+ 8
+ ],
+ "order": 32,
+ "slug": "pub",
+ "type": "draft-iesg",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 7
+ },
+ {
+ "fields": {
+ "desc": "Document is \"dead\" and is no longer being tracked. (E.g., it has been replaced by another document with a different name, it has been withdrawn, etc.)",
+ "name": "Dead",
+ "next_states": [
+ 16
+ ],
+ "order": 99,
+ "slug": "dead",
+ "type": "draft-iesg",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 8
+ },
+ {
+ "fields": {
+ "desc": "The IESG has approved the document for publication, but the Secretariat has not yet sent out on official approval message.",
+ "name": "Approved-announcement to be sent",
+ "next_states": [
+ 10
+ ],
+ "order": 27,
+ "slug": "approved",
+ "type": "draft-iesg",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 9
+ },
+ {
+ "fields": {
+ "desc": "The IESG has approved the document for publication, and the Secretariat has sent out the official approval message to the RFC editor.",
+ "name": "Approved-announcement sent",
+ "next_states": [
+ 17
+ ],
+ "order": 30,
+ "slug": "ann",
+ "type": "draft-iesg",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 10
+ },
+ {
+ "fields": {
+ "desc": "An AD is aware of the document and has chosen to place the document in a separate state in order to keep a closer eye on it (for whatever reason). Documents in this state are still not being actively tracked in the sense that no formal request has been made to publish or advance the document. The sole difference between this state and \"I-D Exists\" is that an AD has chosen to put it in a separate state, to make it easier to keep track of (for the AD's own reasons).",
+ "name": "AD is watching",
+ "next_states": [
+ 16
+ ],
+ "order": 42,
+ "slug": "watching",
+ "type": "draft-iesg",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 11
+ },
+ {
+ "fields": {
+ "desc": "The document is now (finally!) being formally reviewed by the entire IESG. Documents are discussed in email or during a bi-weekly IESG telechat. In this phase, each AD reviews the document and airs any issues they may have. Unresolvable issues are documented as \"discuss\" comments that can be forwarded to the authors/WG. See the description of substates for additional details about the current state of the IESG discussion.",
+ "name": "IESG Evaluation",
+ "next_states": [
+ 18,
+ 9,
+ 22
+ ],
+ "order": 20,
+ "slug": "iesg-eva",
+ "type": "draft-iesg",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 12
+ },
+ {
+ "fields": {
+ "desc": "A specific AD (e.g., the Area Advisor for the WG) has begun reviewing the document to verify that it is ready for advancement. The shepherding AD is responsible for doing any necessary review before starting an IETF Last Call or sending the document directly to the IESG as a whole.",
+ "name": "AD Evaluation",
+ "next_states": [
+ 21,
+ 14,
+ 12,
+ 11
+ ],
+ "order": 11,
+ "slug": "ad-eval",
+ "type": "draft-iesg",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 13
+ },
+ {
+ "fields": {
+ "desc": "The AD has requested that the Secretariat start an IETF Last Call, but the the actual Last Call message has not been sent yet.",
+ "name": "Last Call Requested",
+ "next_states": [
+ 15
+ ],
+ "order": 15,
+ "slug": "lc-req",
+ "type": "draft-iesg",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 14
+ },
+ {
+ "fields": {
+ "desc": "The document is currently waiting for IETF Last Call to complete. Last Calls for WG documents typically last 2 weeks, those for individual submissions last 4 weeks.",
+ "name": "In Last Call",
+ "next_states": [
+ 19,
+ 20
+ ],
+ "order": 16,
+ "slug": "lc",
+ "type": "draft-iesg",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 15
+ },
+ {
+ "fields": {
+ "desc": "A formal request has been made to advance/publish the document, following the procedures in Section 7.5 of RFC 2418. The request could be from a WG chair, from an individual through the RFC Editor, etc. (The Secretariat (iesg-secretary@ietf.org) is copied on these requests to ensure that the request makes it into the ID tracker.) A document in this state has not (yet) been reviewed by an AD nor has any official action been taken on it yet (other than to note that its publication has been requested.",
+ "name": "Publication Requested",
+ "next_states": [
+ 13,
+ 11,
+ 8
+ ],
+ "order": 10,
+ "slug": "pub-req",
+ "type": "draft-iesg",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 16
+ },
+ {
+ "fields": {
+ "desc": "The document is in the RFC editor Queue (as confirmed by http://www.rfc-editor.org/queue.html).",
+ "name": "RFC Ed Queue",
+ "next_states": [
+ 7
+ ],
+ "order": 31,
+ "slug": "rfcqueue",
+ "type": "draft-iesg",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 17
+ },
+ {
+ "fields": {
+ "desc": "During a telechat, one or more ADs requested an additional 2 weeks to review the document. A defer is designed to be an exception mechanism, and can only be invoked once, the first time the document comes up for discussion during a telechat.",
+ "name": "IESG Evaluation - Defer",
+ "next_states": [
+ 12
+ ],
+ "order": 21,
+ "slug": "defer",
+ "type": "draft-iesg",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 18
+ },
+ {
+ "fields": {
+ "desc": "Before a standards-track or BCP document is formally considered by the entire IESG, the AD must write up a protocol action. The protocol action is included in the approval message that the Secretariat sends out when the document is approved for publication as an RFC.",
+ "name": "Waiting for Writeup",
+ "next_states": [
+ 20
+ ],
+ "order": 18,
+ "slug": "writeupw",
+ "type": "draft-iesg",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 19
+ },
+ {
+ "fields": {
+ "desc": "As a result of the IETF Last Call, comments may need to be responded to and a revision of the ID may be needed as well. The AD is responsible for verifying that all Last Call comments have been adequately addressed and that the (possibly revised) document is in the ID directory and ready for consideration by the IESG as a whole.",
+ "name": "Waiting for AD Go-Ahead",
+ "next_states": [
+ 12
+ ],
+ "order": 19,
+ "slug": "goaheadw",
+ "type": "draft-iesg",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 20
+ },
+ {
+ "fields": {
+ "desc": "An AD sometimes asks for an external review by an outside party as part of evaluating whether a document is ready for advancement. MIBs, for example, are reviewed by the \"MIB doctors\". Other types of reviews may also be requested (e.g., security, operations impact, etc.). Documents stay in this state until the review is complete and possibly until the issues raised in the review are addressed. See the \"note\" field for specific details on the nature of the review.",
+ "name": "Expert Review",
+ "next_states": [
+ 13
+ ],
+ "order": 12,
+ "slug": "review-e",
+ "type": "draft-iesg",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 21
+ },
+ {
+ "fields": {
+ "desc": "Do Not Publish: The IESG recommends against publishing the document, but the writeup explaining its reasoning has not yet been produced. DNPs apply primarily to individual submissions received through the RFC editor. See the \"note\" field for more details on who has the action item.",
+ "name": "DNP-waiting for AD note",
+ "next_states": [
+ 23
+ ],
+ "order": 33,
+ "slug": "nopubadw",
+ "type": "draft-iesg",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 22
+ },
+ {
+ "fields": {
+ "desc": "The IESG recommends against publishing the document, the writeup explaining its reasoning has been produced, but the Secretariat has not yet sent out the official \"do not publish\" recommendation message.",
+ "name": "DNP-announcement to be sent",
+ "next_states": [
+ 8
+ ],
+ "order": 34,
+ "slug": "nopubanw",
+ "type": "draft-iesg",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 23
+ },
+ {
+ "fields": {
+ "desc": "Awaiting author action",
+ "name": "AUTH",
+ "next_states": [],
+ "order": 0,
+ "slug": "auth",
+ "type": "draft-rfceditor",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 24
+ },
+ {
+ "fields": {
+ "desc": "Awaiting final author approval",
+ "name": "AUTH48",
+ "next_states": [],
+ "order": 0,
+ "slug": "auth48",
+ "type": "draft-rfceditor",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 25
+ },
+ {
+ "fields": {
+ "desc": "Approved by the stream manager (e.g., IESG, IAB, IRSG, ISE), awaiting processing and publishing",
+ "name": "EDIT",
+ "next_states": [],
+ "order": 0,
+ "slug": "edit",
+ "type": "draft-rfceditor",
+ "used": false
+ },
+ "model": "doc.state",
+ "pk": 26
+ },
+ {
+ "fields": {
+ "desc": "Document has been edited, but is holding for completion of IANA actions",
+ "name": "IANA",
+ "next_states": [],
+ "order": 0,
+ "slug": "iana",
+ "type": "draft-rfceditor",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 27
+ },
+ {
+ "fields": {
+ "desc": "Awaiting IESG action",
+ "name": "IESG",
+ "next_states": [],
+ "order": 0,
+ "slug": "iesg",
+ "type": "draft-rfceditor",
+ "used": false
+ },
+ "model": "doc.state",
+ "pk": 28
+ },
+ {
+ "fields": {
+ "desc": "Independent Submission Review by the ISE ",
+ "name": "ISR",
+ "next_states": [],
+ "order": 0,
+ "slug": "isr",
+ "type": "draft-rfceditor",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 29
+ },
+ {
+ "fields": {
+ "desc": "Independent submission awaiting author action, or in discussion between author and ISE",
+ "name": "ISR-AUTH",
+ "next_states": [],
+ "order": 0,
+ "slug": "isr-auth",
+ "type": "draft-rfceditor",
+ "used": false
+ },
+ "model": "doc.state",
+ "pk": 30
+ },
+ {
+ "fields": {
+ "desc": "Holding for normative reference",
+ "name": "REF",
+ "next_states": [],
+ "order": 0,
+ "slug": "ref",
+ "type": "draft-rfceditor",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 31
+ },
+ {
+ "fields": {
+ "desc": "Awaiting final RFC Editor review before AUTH48",
+ "name": "RFC-EDITOR",
+ "next_states": [],
+ "order": 0,
+ "slug": "rfc-edit",
+ "type": "draft-rfceditor",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 32
+ },
+ {
+ "fields": {
+ "desc": "Time-out period during which the IESG reviews document for conflict/concurrence with other IETF working group work",
+ "name": "TO",
+ "next_states": [],
+ "order": 0,
+ "slug": "timeout",
+ "type": "draft-rfceditor",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 33
+ },
+ {
+ "fields": {
+ "desc": "Awaiting missing normative reference",
+ "name": "MISSREF",
+ "next_states": [],
+ "order": 0,
+ "slug": "missref",
+ "type": "draft-rfceditor",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 34
+ },
+ {
+ "fields": {
+ "desc": "4.2.1. Call for Adoption by WG Issued \n\n The \"Call for Adoption by WG Issued\" state should be used to indicate when an I-D is being considered for adoption by an IETF WG. An I-D that is in this state is actively being considered for adoption and has not yet achieved consensus, preference, or selection in the WG.\n\n This state may be used to describe an I-D that someone has asked a WG to consider for adoption, if the WG Chair has agreed with the request. This state may also be used to identify an I-D that a WG Chair asked an author to write specifically for consideration as a candidate WG item [WGDTSPEC], and/or an I-D that is listed as a 'candidate draft' in the WG's charter.\n\n Under normal conditions, it should not be possible for an I-D to be in the \"Call for Adoption by WG Issued\" state in more than one working group at the same time. This said, it is not uncommon for authors to \"shop\" their I-Ds to more than one WG at a time, with the hope of getting their documents adopted somewhere.\n\n After this state is implemented in the Datatracker, an I-D that is in the \"Call for Adoption by WG Issued\" state will not be able to be \"shopped\" to any other WG without the consent of the WG Chairs and the responsible ADs impacted by the shopping.\n\n Note that Figure 1 includes an arc leading from this state to outside of the WG state machine. This illustrates that some I-Ds that are considered do not get adopted as WG drafts. An I-D that is not adopted as a WG draft will transition out of the WG state machine and revert back to having no stream-specific state; however, the status change history log of the I-D will record that the I-D was previously in the \"Call for Adoption by WG Issued\" state.",
+ "name": "Call For Adoption By WG Issued",
+ "next_states": [
+ 36,
+ 37
+ ],
+ "order": 1,
+ "slug": "c-adopt",
+ "type": "draft-stream-ietf",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 35
+ },
+ {
+ "fields": {
+ "desc": "4.2.2. Adopted by a WG \n\n The \"Adopted by a WG\" state describes an individual submission I-D that an IETF WG has agreed to adopt as one of its WG drafts.\n\n WG Chairs who use this state will be able to clearly indicate when their WGs adopt individual submission I-Ds. This will facilitate the Datatracker's ability to correctly capture \"Replaces\" information for WG drafts and correct \"Replaced by\" information for individual submission I-Ds that have been replaced by WG drafts.\n\n This state is needed because the Datatracker uses the filename of an I-D as a key to search its database for status information about the I-D, and because the filename of a WG I-D is supposed to be different from the filename of an individual submission I-D. The filename of an individual submission I-D will typically be formatted as 'draft-author-wgname-topic-nn'.\n\n The filename of a WG document is supposed to be formatted as 'draft- ietf-wgname-topic-nn'.\n\n An individual I-D that is adopted by a WG may take weeks or months to be resubmitted by the author as a new (version-00) WG draft. If the \"Adopted by a WG\" state is not used, the Datatracker has no way to determine that an I-D has been adopted until a new version of the I-D is submitted to the WG by the author and until the I-D is approved for posting by a WG Chair.",
+ "name": "Adopted by a WG",
+ "next_states": [
+ 38
+ ],
+ "order": 2,
+ "slug": "adopt-wg",
+ "type": "draft-stream-ietf",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 36
+ },
+ {
+ "fields": {
+ "desc": "4.2.3. Adopted for WG Info Only \n\n The \"Adopted for WG Info Only\" state describes a document that contains useful information for the WG that adopted it, but the document is not intended to be published as an RFC. The WG will not actively develop the contents of the I-D or progress it for publication as an RFC. The only purpose of the I-D is to provide information for internal use by the WG.",
+ "name": "Adopted for WG Info Only",
+ "next_states": [],
+ "order": 3,
+ "slug": "info",
+ "type": "draft-stream-ietf",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 37
+ },
+ {
+ "fields": {
+ "desc": "4.2.4. WG Document \n\n The \"WG Document\" state describes an I-D that has been adopted by an IETF WG and is being actively developed.\n\n A WG Chair may transition an I-D into the \"WG Document\" state at any time as long as the I-D is not being considered or developed in any other WG.\n\n Alternatively, WG Chairs may rely upon new functionality to be added to the Datatracker to automatically move version-00 drafts into the \"WG Document\" state as described in Section 4.1.\n\n Under normal conditions, it should not be possible for an I-D to be in the \"WG Document\" state in more than one WG at a time. This said, I-Ds may be transferred from one WG to another with the consent of the WG Chairs and the responsible ADs.",
+ "name": "WG Document",
+ "next_states": [
+ 39,
+ 40,
+ 41,
+ 43
+ ],
+ "order": 4,
+ "slug": "wg-doc",
+ "type": "draft-stream-ietf",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 38
+ },
+ {
+ "fields": {
+ "desc": "4.2.5. Parked WG Document \n\n A \"Parked WG Document\" is an I-D that has lost its author or editor, is waiting for another document to be written or for a review to be completed, or cannot be progressed by the working group for some other reason.\n\n Some of the annotation tags described in Section 4.3 may be used in conjunction with this state to indicate why an I-D has been parked, and/or what may need to happen for the I-D to be un-parked.\n\n Parking a WG draft will not prevent it from expiring; however, this state can be used to indicate why the I-D has stopped progressing in the WG.\n\n A \"Parked WG Document\" that is not expired may be transferred from one WG to another with the consent of the WG Chairs and the responsible ADs.",
+ "name": "Parked WG Document",
+ "next_states": [
+ 38
+ ],
+ "order": 5,
+ "slug": "parked",
+ "type": "draft-stream-ietf",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 39
+ },
+ {
+ "fields": {
+ "desc": "4.2.6. Dead WG Document \n\n A \"Dead WG Document\" is an I-D that has been abandoned. Note that 'Dead' is not always a final state for a WG I-D. If consensus is subsequently achieved, a \"Dead WG Document\" may be resurrected. A \"Dead WG Document\" that is not resurrected will eventually expire.\n\n Note that an I-D that is declared to be \"Dead\" in one WG and that is not expired may be transferred to a non-dead state in another WG with the consent of the WG Chairs and the responsible ADs.",
+ "name": "Dead WG Document",
+ "next_states": [
+ 38
+ ],
+ "order": 6,
+ "slug": "dead",
+ "type": "draft-stream-ietf",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 40
+ },
+ {
+ "fields": {
+ "desc": "4.2.7. In WG Last Call \n\n A document \"In WG Last Call\" is an I-D for which a WG Last Call (WGLC) has been issued and is in progress.\n\n Note that conducting a WGLC is an optional part of the IETF WG process, per Section 7.4 of RFC 2418 [RFC2418].\n\n If a WG Chair decides to conduct a WGLC on an I-D, the \"In WG Last Call\" state can be used to track the progress of the WGLC. The Chair may configure the Datatracker to send a WGLC message to one or more mailing lists when the Chair moves the I-D into this state. The WG Chair may also be able to select a different set of mailing lists for a different document undergoing a WGLC; some documents may deserve coordination with other WGs.\n\n A WG I-D in this state should remain \"In WG Last Call\" until the WG Chair moves it to another state. The WG Chair may configure the Datatracker to send an e-mail after a specified period of time to remind or 'nudge' the Chair to conclude the WGLC and to determine the next state for the document.\n\n It is possible for one WGLC to lead into another WGLC for the same document. For example, an I-D that completed a WGLC as an \"Informational\" document may need another WGLC if a decision is taken to convert the I-D into a Standards Track document.",
+ "name": "In WG Last Call",
+ "next_states": [
+ 38,
+ 42,
+ 43
+ ],
+ "order": 7,
+ "slug": "wg-lc",
+ "type": "draft-stream-ietf",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 41
+ },
+ {
+ "fields": {
+ "desc": "4.2.8. Waiting for WG Chair Go-Ahead \n\n A WG Chair may wish to place an I-D that receives a lot of comments during a WGLC into the \"Waiting for WG Chair Go-Ahead\" state. This state describes an I-D that has undergone a WGLC; however, the Chair is not yet ready to call consensus on the document.\n\n If comments from the WGLC need to be responded to, or a revision to the I-D is needed, the Chair may place an I-D into this state until all of the WGLC comments are adequately addressed and the (possibly revised) document is in the I-D repository.",
+ "name": "Waiting for WG Chair Go-Ahead",
+ "next_states": [
+ 41,
+ 43
+ ],
+ "order": 10,
+ "slug": "chair-w",
+ "type": "draft-stream-ietf",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 42
+ },
+ {
+ "fields": {
+ "desc": "4.2.9. WG Consensus: Waiting for Writeup \n\n A document in the \"WG Consensus: Waiting for Writeup\" state has essentially completed its development within the working group, and is nearly ready to be sent to the IESG for publication. The last thing to be done is the preparation of a protocol writeup by a Document Shepherd. The IESG requires that a document shepherd writeup be completed before publication of the I-D is requested. The IETF document shepherding process and the role of a WG Document Shepherd is described in RFC 4858 [RFC4858]\n\n A WG Chair may call consensus on an I-D without a formal WGLC and transition an I-D that was in the \"WG Document\" state directly into this state.\n\n The name of this state includes the words \"Waiting for Writeup\" because a good document shepherd writeup takes time to prepare.",
+ "name": "WG Consensus: Waiting for Write-Up",
+ "next_states": [
+ 44
+ ],
+ "order": 11,
+ "slug": "writeupw",
+ "type": "draft-stream-ietf",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 43
+ },
+ {
+ "fields": {
+ "desc": "4.2.10. Submitted to IESG for Publication \n\n This state describes a WG document that has been submitted to the IESG for publication and that has not been sent back to the working group for revision.\n\n An I-D in this state may be under review by the IESG, it may have been approved and be in the RFC Editor's queue, or it may have been published as an RFC. Other possibilities exist too. The document may be \"Dead\" (in the IESG state machine) or in a \"Do Not Publish\" state.",
+ "name": "Submitted to IESG for Publication",
+ "next_states": [
+ 38
+ ],
+ "order": 12,
+ "slug": "sub-pub",
+ "type": "draft-stream-ietf",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 44
+ },
+ {
+ "fields": {
+ "desc": "A document being considered for the IAB stream.",
+ "name": "Candidate IAB Document",
+ "next_states": [],
+ "order": 1,
+ "slug": "candidat",
+ "type": "draft-stream-iab",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 45
+ },
+ {
+ "fields": {
+ "desc": "This document has been adopted by the IAB and is being actively developed.",
+ "name": "Active IAB Document",
+ "next_states": [],
+ "order": 2,
+ "slug": "active",
+ "type": "draft-stream-iab",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 46
+ },
+ {
+ "fields": {
+ "desc": "This document has lost its author or editor, is waiting for another document to be written, or cannot currently be worked on by the IAB for some other reason. Annotations probably explain why this document is parked.",
+ "name": "Parked IAB Document",
+ "next_states": [],
+ "order": 3,
+ "slug": "parked",
+ "type": "draft-stream-iab",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 47
+ },
+ {
+ "fields": {
+ "desc": "This document is awaiting the IAB itself to come to internal consensus.",
+ "name": "IAB Review",
+ "next_states": [],
+ "order": 4,
+ "slug": "review-i",
+ "type": "draft-stream-iab",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 48
+ },
+ {
+ "fields": {
+ "desc": "This document has completed internal consensus within the IAB and is now under community review.",
+ "name": "Community Review",
+ "next_states": [],
+ "order": 5,
+ "slug": "review-c",
+ "type": "draft-stream-iab",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 49
+ },
+ {
+ "fields": {
+ "desc": "The consideration of this document is complete, but it has not yet been sent to the RFC Editor for publication (although that is going to happen soon).",
+ "name": "Approved by IAB, To Be Sent to RFC Editor",
+ "next_states": [],
+ "order": 6,
+ "slug": "approved",
+ "type": "draft-stream-iab",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 50
+ },
+ {
+ "fields": {
+ "desc": "The IAB does not expect to publish the document itself, but has passed it on to a different organization that might continue work on the document. The expectation is that the other organization will eventually publish the document.",
+ "name": "Sent to a Different Organization for Publication",
+ "next_states": [],
+ "order": 7,
+ "slug": "diff-org",
+ "type": "draft-stream-iab",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 51
+ },
+ {
+ "fields": {
+ "desc": "The IAB processing of this document is complete and it has been sent to the RFC Editor for publication. The document may be in the RFC Editor's queue, or it may have been published as an RFC; this state doesn't distinguish between different states occurring after the document has left the IAB.",
+ "name": "Sent to the RFC Editor",
+ "next_states": [],
+ "order": 8,
+ "slug": "rfc-edit",
+ "type": "draft-stream-iab",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 52
+ },
+ {
+ "fields": {
+ "desc": "The document has been published as an RFC.",
+ "name": "Published RFC",
+ "next_states": [],
+ "order": 9,
+ "slug": "pub",
+ "type": "draft-stream-iab",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 53
+ },
+ {
+ "fields": {
+ "desc": "This document was an active IAB document, but for some reason it is no longer being pursued for the IAB stream. It is possible that the document might be revived later, possibly in another stream.",
+ "name": "Dead IAB Document",
+ "next_states": [],
+ "order": 10,
+ "slug": "dead",
+ "type": "draft-stream-iab",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 54
+ },
+ {
+ "fields": {
+ "desc": "This document is under consideration in an RG for becoming an IRTF document. A document in this state does not imply any RG consensus and does not imply any precedence or selection. It's simply a way to indicate that somebody has asked for a document to be considered for adoption by an RG.",
+ "name": "Candidate RG Document",
+ "next_states": [],
+ "order": 1,
+ "slug": "candidat",
+ "type": "draft-stream-irtf",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 55
+ },
+ {
+ "fields": {
+ "desc": "This document has been adopted by the RG and is being actively developed.",
+ "name": "Active RG Document",
+ "next_states": [],
+ "order": 2,
+ "slug": "active",
+ "type": "draft-stream-irtf",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 56
+ },
+ {
+ "fields": {
+ "desc": "This document has lost its author or editor, is waiting for another document to be written, or cannot currently be worked on by the RG for some other reason.",
+ "name": "Parked RG Document",
+ "next_states": [],
+ "order": 3,
+ "slug": "parked",
+ "type": "draft-stream-irtf",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 57
+ },
+ {
+ "fields": {
+ "desc": "The document is in its final review in the RG.",
+ "name": "In RG Last Call",
+ "next_states": [],
+ "order": 4,
+ "slug": "rg-lc",
+ "type": "draft-stream-irtf",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 58
+ },
+ {
+ "fields": {
+ "desc": "IRTF documents have document shepherds who help RG documents through the process after the RG has finished with the document.",
+ "name": "Waiting for Document Shepherd",
+ "next_states": [],
+ "order": 5,
+ "slug": "sheph-w",
+ "type": "draft-stream-irtf",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 59
+ },
+ {
+ "fields": {
+ "desc": "The IRTF Chair is meant to be performing some task such as sending a request for IESG Review.",
+ "name": "Waiting for IRTF Chair",
+ "next_states": [],
+ "order": 6,
+ "slug": "chair-w",
+ "type": "draft-stream-irtf",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 60
+ },
+ {
+ "fields": {
+ "desc": "The document shepherd has taken the document to the IRSG and solicited reviews from one or more IRSG members.",
+ "name": "Awaiting IRSG Reviews",
+ "next_states": [],
+ "order": 7,
+ "slug": "irsg-w",
+ "type": "draft-stream-irtf",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 61
+ },
+ {
+ "fields": {
+ "desc": "The IRSG is taking a poll on whether or not the document is ready to be published.",
+ "name": "In IRSG Poll",
+ "next_states": [],
+ "order": 8,
+ "slug": "irsgpoll",
+ "type": "draft-stream-irtf",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 62
+ },
+ {
+ "fields": {
+ "desc": "The IRSG has asked the IESG to do a review of the document, as described in RFC5742.",
+ "name": "In IESG Review",
+ "next_states": [],
+ "order": 9,
+ "slug": "iesg-rev",
+ "type": "draft-stream-irtf",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 63
+ },
+ {
+ "fields": {
+ "desc": "The RG processing of this document is complete and it has been sent to the RFC Editor for publication. The document may be in the RFC Editor's queue, or it may have been published as an RFC; this state doesn't distinguish between different states occurring after the document has left the RG.",
+ "name": "Sent to the RFC Editor",
+ "next_states": [],
+ "order": 10,
+ "slug": "rfc-edit",
+ "type": "draft-stream-irtf",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 64
+ },
+ {
+ "fields": {
+ "desc": "The document has been published as an RFC.",
+ "name": "Published RFC",
+ "next_states": [],
+ "order": 11,
+ "slug": "pub",
+ "type": "draft-stream-irtf",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 65
+ },
+ {
+ "fields": {
+ "desc": "The IESG has requested that the document be held pending further review, as specified in RFC 5742, and the IRTF has agreed to such a hold.",
+ "name": "Document on Hold Based On IESG Request",
+ "next_states": [],
+ "order": 12,
+ "slug": "iesghold",
+ "type": "draft-stream-irtf",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 66
+ },
+ {
+ "fields": {
+ "desc": "This document was an active IRTF document, but for some reason it is no longer being pursued for the IRTF stream. It is possible that the document might be revived later, possibly in another stream.",
+ "name": "Dead IRTF Document",
+ "next_states": [],
+ "order": 13,
+ "slug": "dead",
+ "type": "draft-stream-irtf",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 67
+ },
+ {
+ "fields": {
+ "desc": "The draft has been sent to the ISE with a request for publication.",
+ "name": "Submission Received",
+ "next_states": [],
+ "order": 1,
+ "slug": "receive",
+ "type": "draft-stream-ise",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 68
+ },
+ {
+ "fields": {
+ "desc": " The ISE is finding initial reviewers for the document.",
+ "name": "Finding Reviewers",
+ "next_states": [],
+ "order": 2,
+ "slug": "find-rev",
+ "type": "draft-stream-ise",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 69
+ },
+ {
+ "fields": {
+ "desc": "The ISE is actively working on the document.",
+ "name": "In ISE Review",
+ "next_states": [],
+ "order": 3,
+ "slug": "ise-rev",
+ "type": "draft-stream-ise",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 70
+ },
+ {
+ "fields": {
+ "desc": " One or more reviews have been sent to the author, and the ISE is awaiting response.",
+ "name": "Response to Review Needed",
+ "next_states": [],
+ "order": 4,
+ "slug": "need-res",
+ "type": "draft-stream-ise",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 71
+ },
+ {
+ "fields": {
+ "desc": "The ISE has asked the IESG to do a review of the document, as described in RFC5742.",
+ "name": "In IESG Review",
+ "next_states": [],
+ "order": 5,
+ "slug": "iesg-rev",
+ "type": "draft-stream-ise",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 72
+ },
+ {
+ "fields": {
+ "desc": "The ISE processing of this document is complete and it has been sent to the RFC Editor for publication. The document may be in the RFC Editor's queue, or it may have been published as an RFC; this state doesn't distinguish between different states occurring after the document has left the ISE.",
+ "name": "Sent to the RFC Editor",
+ "next_states": [],
+ "order": 6,
+ "slug": "rfc-edit",
+ "type": "draft-stream-ise",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 73
+ },
+ {
+ "fields": {
+ "desc": "The document has been published as an RFC.",
+ "name": "Published RFC",
+ "next_states": [],
+ "order": 7,
+ "slug": "pub",
+ "type": "draft-stream-ise",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 74
+ },
+ {
+ "fields": {
+ "desc": "This document was actively considered in the Independent Submission stream, but the ISE chose not to publish it. It is possible that the document might be revived later. A document in this state may have a comment explaining the reasoning of the ISE (such as if the document was going to move to a different stream).",
+ "name": "No Longer In Independent Submission Stream",
+ "next_states": [],
+ "order": 8,
+ "slug": "dead",
+ "type": "draft-stream-ise",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 75
+ },
+ {
+ "fields": {
+ "desc": "The IESG has requested that the document be held pending further review, as specified in RFC 5742, and the ISE has agreed to such a hold.",
+ "name": "Document on Hold Based On IESG Request",
+ "next_states": [],
+ "order": 9,
+ "slug": "iesghold",
+ "type": "draft-stream-ise",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 76
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Active",
+ "next_states": [],
+ "order": 1,
+ "slug": "active",
+ "type": "slides",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 77
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Deleted",
+ "next_states": [],
+ "order": 4,
+ "slug": "deleted",
+ "type": "slides",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 78
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Active",
+ "next_states": [],
+ "order": 1,
+ "slug": "active",
+ "type": "minutes",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 79
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Deleted",
+ "next_states": [],
+ "order": 2,
+ "slug": "deleted",
+ "type": "minutes",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 80
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Active",
+ "next_states": [],
+ "order": 1,
+ "slug": "active",
+ "type": "agenda",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 81
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Deleted",
+ "next_states": [],
+ "order": 2,
+ "slug": "deleted",
+ "type": "agenda",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 82
+ },
+ {
+ "fields": {
+ "desc": "The proposed charter is not being considered at this time. A proposed charter will remain in this state until an AD moves it to Informal IESG review.",
+ "name": "Not currently under review",
+ "next_states": [],
+ "order": 0,
+ "slug": "notrev",
+ "type": "charter",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 83
+ },
+ {
+ "fields": {
+ "desc": "The proposed charter is not being considered at this time. A proposed charter will remain in this state until an AD moves it to Start Chartering/Rechartering (Internal IESG/IAB Review). This state is useful for drafting the charter, discussing with chairs, etc.",
+ "name": "Draft Charter",
+ "next_states": [],
+ "order": 0,
+ "slug": "infrev",
+ "type": "charter",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 84
+ },
+ {
+ "fields": {
+ "desc": "This is the state when you'd like to propose the charter / new charter. This state also allows you to ask whether external review can be skipped in ballot. After you select this state, the Secretariat takes over and drives the rest of the process.",
+ "name": "Start Chartering/Rechartering (Internal IESG/IAB Review)",
+ "next_states": [],
+ "order": 0,
+ "slug": "intrev",
+ "type": "charter",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 85
+ },
+ {
+ "fields": {
+ "desc": "This state is selected by the Secretariat (AD's, keep yer grubby mits off this!) when it has been decided that the charter needs external review.",
+ "name": "External Review (Message to Community, Selected by Secretariat)",
+ "next_states": [],
+ "order": 0,
+ "slug": "extrev",
+ "type": "charter",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 86
+ },
+ {
+ "fields": {
+ "desc": "This state is selected by the Secretariat (AD's, keep yer grubby mits off this!) when the IESG is reviewing the discussion from the external review of the proposed charter (this is similar to the IESG Evaluation state for a draft).",
+ "name": "IESG Review (Charter for Approval, Selected by Secretariat)",
+ "next_states": [],
+ "order": 0,
+ "slug": "iesgrev",
+ "type": "charter",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 87
+ },
+ {
+ "fields": {
+ "desc": "The charter is approved by the IESG.",
+ "name": "Approved",
+ "next_states": [],
+ "order": 0,
+ "slug": "approved",
+ "type": "charter",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 88
+ },
+ {
+ "fields": {
+ "desc": "Final approvals are complete",
+ "name": "AUTH48-DONE",
+ "next_states": [
+ 74
+ ],
+ "order": 0,
+ "slug": "auth48done",
+ "type": "draft-rfceditor",
+ "used": false
+ },
+ "model": "doc.state",
+ "pk": 89
+ },
+ {
+ "fields": {
+ "desc": "A conflict review has been requested, but a shepherding AD has not yet been assigned",
+ "name": "Needs Shepherd",
+ "next_states": [
+ 91,
+ 98,
+ 99
+ ],
+ "order": 1,
+ "slug": "needshep",
+ "type": "conflrev",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 90
+ },
+ {
+ "fields": {
+ "desc": "The sponsoring AD is reviewing the document and preparing a proposed response",
+ "name": "AD Review",
+ "next_states": [
+ 92,
+ 98,
+ 99
+ ],
+ "order": 2,
+ "slug": "adrev",
+ "type": "conflrev",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 91
+ },
+ {
+ "fields": {
+ "desc": "The IESG is considering the proposed conflict review response",
+ "name": "IESG Evaluation",
+ "next_states": [
+ 93,
+ 94,
+ 95,
+ 98,
+ 99
+ ],
+ "order": 3,
+ "slug": "iesgeval",
+ "type": "conflrev",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 92
+ },
+ {
+ "fields": {
+ "desc": "The evaluation of the proposed conflict review response has been deferred to the next telechat",
+ "name": "IESG Evaluation - Defer",
+ "next_states": [
+ 92,
+ 94,
+ 95,
+ 98,
+ 99
+ ],
+ "order": 4,
+ "slug": "defer",
+ "type": "conflrev",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 93
+ },
+ {
+ "fields": {
+ "desc": "The IESG has approved the conflict review response (a request to not publish), but the secretariat has not yet sent the response",
+ "name": "Approved Request to Not Publish - announcement to be sent",
+ "next_states": [
+ 96,
+ 98
+ ],
+ "order": 7,
+ "slug": "appr-reqnopub-pend",
+ "type": "conflrev",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 94
+ },
+ {
+ "fields": {
+ "desc": "The IESG has approved the conflict review response, but the secretariat has not yet sent the response",
+ "name": "Approved No Problem - announcement to be sent",
+ "next_states": [
+ 97,
+ 98
+ ],
+ "order": 8,
+ "slug": "appr-noprob-pend",
+ "type": "conflrev",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 95
+ },
+ {
+ "fields": {
+ "desc": "The secretariat has delivered the IESG's approved conflict review response (a request to not publish) to the requester",
+ "name": "Approved Request to Not Publish - announcement sent",
+ "next_states": [
+ 96
+ ],
+ "order": 9,
+ "slug": "appr-reqnopub-sent",
+ "type": "conflrev",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 96
+ },
+ {
+ "fields": {
+ "desc": "The secretariat has delivered the IESG's approved conflict review response to the requester",
+ "name": "Approved No Problem - announcement sent",
+ "next_states": [
+ 97
+ ],
+ "order": 10,
+ "slug": "appr-noprob-sent",
+ "type": "conflrev",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 97
+ },
+ {
+ "fields": {
+ "desc": "The request for conflict review was withdrawn",
+ "name": "Withdrawn",
+ "next_states": [
+ 90
+ ],
+ "order": 11,
+ "slug": "withdraw",
+ "type": "conflrev",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 98
+ },
+ {
+ "fields": {
+ "desc": "The conflict review has been abandoned",
+ "name": "Dead",
+ "next_states": [
+ 90
+ ],
+ "order": 12,
+ "slug": "dead",
+ "type": "conflrev",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 99
+ },
+ {
+ "fields": {
+ "desc": "The IESG has approved the conflict review response (a request to not publish), but a point has been raised that should be cleared before moving to announcement to be sent",
+ "name": "Approved Request to Not Publish - point raised",
+ "next_states": [
+ 94
+ ],
+ "order": 5,
+ "slug": "appr-reqnopub-pr",
+ "type": "conflrev",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 100
+ },
+ {
+ "fields": {
+ "desc": "The IESG has approved the conflict review response, but a point has been raised that should be cleared before proceeding to announcement to be sent",
+ "name": "Approved No Problem - point raised",
+ "next_states": [
+ 95
+ ],
+ "order": 6,
+ "slug": "appr-noprob-pr",
+ "type": "conflrev",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 101
+ },
+ {
+ "fields": {
+ "desc": "A new document has been received by IANA, but no actions have been taken",
+ "name": "New Document",
+ "next_states": [],
+ "order": 1,
+ "slug": "newdoc",
+ "type": "draft-iana-action",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 102
+ },
+ {
+ "fields": {
+ "desc": "IANA is currently processing the actions for this document",
+ "name": "In Progress",
+ "next_states": [],
+ "order": 2,
+ "slug": "inprog",
+ "type": "draft-iana-action",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 103
+ },
+ {
+ "fields": {
+ "desc": "IANA is waiting on the document's authors to respond",
+ "name": "Waiting on Authors",
+ "next_states": [],
+ "order": 3,
+ "slug": "waitauth",
+ "type": "draft-iana-action",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 104
+ },
+ {
+ "fields": {
+ "desc": "IANA is waiting on the IETF Area Directors to respond",
+ "name": "Waiting on ADs",
+ "next_states": [],
+ "order": 4,
+ "slug": "waitad",
+ "type": "draft-iana-action",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 105
+ },
+ {
+ "fields": {
+ "desc": "IANA is waiting on the IETF Working Group Chairs to respond",
+ "name": "Waiting on WGC",
+ "next_states": [],
+ "order": 5,
+ "slug": "waitwgc",
+ "type": "draft-iana-action",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 106
+ },
+ {
+ "fields": {
+ "desc": "IANA has notified the RFC Editor that the actions have been completed",
+ "name": "Waiting on RFC Editor",
+ "next_states": [],
+ "order": 6,
+ "slug": "waitrfc",
+ "type": "draft-iana-action",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 107
+ },
+ {
+ "fields": {
+ "desc": "Request completed. The RFC Editor has acknowledged receipt of IANA's message that the actions have been completed",
+ "name": "RFC-Ed-Ack",
+ "next_states": [],
+ "order": 7,
+ "slug": "rfcedack",
+ "type": "draft-iana-action",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 108
+ },
+ {
+ "fields": {
+ "desc": "IANA has suspended work on the document",
+ "name": "On Hold",
+ "next_states": [],
+ "order": 8,
+ "slug": "onhold",
+ "type": "draft-iana-action",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 109
+ },
+ {
+ "fields": {
+ "desc": "Request completed. There were no IANA actions for this document",
+ "name": "No IANA Actions",
+ "next_states": [],
+ "order": 9,
+ "slug": "noic",
+ "type": "draft-iana-action",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 110
+ },
+ {
+ "fields": {
+ "desc": "Document has not yet been reviewed by IANA.",
+ "name": "IANA - Review Needed",
+ "next_states": [],
+ "order": 1,
+ "slug": "need-rev",
+ "type": "draft-iana-review",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 111
+ },
+ {
+ "fields": {
+ "desc": "Document requires IANA actions, and the IANA Considerations section indicates the details of the actions correctly.",
+ "name": "IANA OK - Actions Needed",
+ "next_states": [],
+ "order": 2,
+ "slug": "ok-act",
+ "type": "draft-iana-review",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 112
+ },
+ {
+ "fields": {
+ "desc": "Document requires no IANA action, and the IANA Considerations section indicates this correctly.",
+ "name": "IANA OK - No Actions Needed",
+ "next_states": [],
+ "order": 3,
+ "slug": "ok-noact",
+ "type": "draft-iana-review",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 113
+ },
+ {
+ "fields": {
+ "desc": "IANA has issues with the text of the IANA Considerations section of the document.",
+ "name": "IANA - Not OK",
+ "next_states": [],
+ "order": 4,
+ "slug": "not-ok",
+ "type": "draft-iana-review",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 114
+ },
+ {
+ "fields": {
+ "desc": "Document revision has changed after review by IANA.",
+ "name": "Version Changed - Review Needed",
+ "next_states": [],
+ "order": 5,
+ "slug": "changed",
+ "type": "draft-iana-review",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 115
+ },
+ {
+ "fields": {
+ "desc": "Final approvals are complete",
+ "name": "AUTH48-DONE",
+ "next_states": [],
+ "order": 0,
+ "slug": "auth48-done",
+ "type": "draft-rfceditor",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 116
+ },
+ {
+ "fields": {
+ "desc": "Approved by the stream manager (e.g., IESG, IAB, IRSG, ISE), awaiting processing and publishing",
+ "name": "EDIT",
+ "next_states": [],
+ "order": 0,
+ "slug": "edit",
+ "type": "draft-rfceditor",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 117
+ },
+ {
+ "fields": {
+ "desc": "RFC-Editor/IANA Registration Coordination",
+ "name": "IANA",
+ "next_states": [],
+ "order": 0,
+ "slug": "iana-crd",
+ "type": "draft-rfceditor",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 118
+ },
+ {
+ "fields": {
+ "desc": "Holding for IESG action",
+ "name": "IESG",
+ "next_states": [],
+ "order": 0,
+ "slug": "iesg",
+ "type": "draft-rfceditor",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 119
+ },
+ {
+ "fields": {
+ "desc": "Independent Submission awaiting author update, or in discussion between author and ISE",
+ "name": "ISR-AUTH",
+ "next_states": [],
+ "order": 0,
+ "slug": "isr-auth",
+ "type": "draft-rfceditor",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 120
+ },
+ {
+ "fields": {
+ "desc": "An RFC status change has been requested, but a shepherding AD has not yet been assigned",
+ "name": "Needs Shepherd",
+ "next_states": [
+ 122,
+ 129
+ ],
+ "order": 1,
+ "slug": "needshep",
+ "type": "statchg",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 121
+ },
+ {
+ "fields": {
+ "desc": "The sponsoring AD is preparing an RFC status change document",
+ "name": "AD Review",
+ "next_states": [
+ 130,
+ 123,
+ 129
+ ],
+ "order": 2,
+ "slug": "adrev",
+ "type": "statchg",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 122
+ },
+ {
+ "fields": {
+ "desc": "The IESG is considering the proposed RFC status changes",
+ "name": "IESG Evaluation",
+ "next_states": [
+ 124,
+ 125,
+ 126,
+ 129
+ ],
+ "order": 6,
+ "slug": "iesgeval",
+ "type": "statchg",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 123
+ },
+ {
+ "fields": {
+ "desc": "The evaluation of the proposed RFC status changes have been deferred to the next telechat",
+ "name": "IESG Evaluation - Defer",
+ "next_states": [
+ 123,
+ 125,
+ 126,
+ 129
+ ],
+ "order": 7,
+ "slug": "defer",
+ "type": "statchg",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 124
+ },
+ {
+ "fields": {
+ "desc": "The IESG has approved the RFC status changes, but a point has been raised that should be cleared before proceeding to announcement to be sent",
+ "name": "Approved - point raised",
+ "next_states": [
+ 126,
+ 127
+ ],
+ "order": 8,
+ "slug": "appr-pr",
+ "type": "statchg",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 125
+ },
+ {
+ "fields": {
+ "desc": "The IESG has approved the RFC status changes, but the secretariat has not yet sent the announcement",
+ "name": "Approved - announcement to be sent",
+ "next_states": [
+ 127
+ ],
+ "order": 9,
+ "slug": "appr-pend",
+ "type": "statchg",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 126
+ },
+ {
+ "fields": {
+ "desc": "The secretariat has announced the IESG's approved RFC status changes",
+ "name": "Approved - announcement sent",
+ "next_states": [],
+ "order": 10,
+ "slug": "appr-sent",
+ "type": "statchg",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 127
+ },
+ {
+ "fields": {
+ "desc": "The RFC status changes have been abandoned",
+ "name": "Dead",
+ "next_states": [
+ 121
+ ],
+ "order": 11,
+ "slug": "dead",
+ "type": "statchg",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 129
+ },
+ {
+ "fields": {
+ "desc": "Last Call has been requested for this proposed status change",
+ "name": "Last Call Requested",
+ "next_states": [
+ 131
+ ],
+ "order": 3,
+ "slug": "lc-req",
+ "type": "statchg",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 130
+ },
+ {
+ "fields": {
+ "desc": "This proposed status change is in IETF Last Call",
+ "name": "In Last Call",
+ "next_states": [
+ 132
+ ],
+ "order": 4,
+ "slug": "in-lc",
+ "type": "statchg",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 131
+ },
+ {
+ "fields": {
+ "desc": "The AD is following up on IETF LC comments",
+ "name": "Waiting for AD Go-Ahead",
+ "next_states": [
+ 123,
+ 129
+ ],
+ "order": 5,
+ "slug": "goahead",
+ "type": "statchg",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 132
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Pending",
+ "next_states": [],
+ "order": 0,
+ "slug": "pending",
+ "type": "draft-rfceditor",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 133
+ },
+ {
+ "fields": {
+ "desc": "The document has been marked as a candidate for WG adoption by the WG Chair. This state can be used before a call for adoption is issued (and the document is put in the \"Call For Adoption By WG Issued\" state), to indicate that the document is in the queue for a call for adoption, even if none has been issued yet.",
+ "name": "Candidate for WG Adoption",
+ "next_states": [
+ 35
+ ],
+ "order": 0,
+ "slug": "wg-cand",
+ "type": "draft-stream-ietf",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 134
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Active",
+ "next_states": [],
+ "order": 0,
+ "slug": "active",
+ "type": "recording",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 135
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Deleted",
+ "next_states": [],
+ "order": 0,
+ "slug": "deleted",
+ "type": "recording",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 136
+ },
+ {
+ "fields": {
+ "desc": "This document is not active, but is available in the archives",
+ "name": "Archived",
+ "next_states": [],
+ "order": 3,
+ "slug": "archived",
+ "type": "slides",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 138
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Active",
+ "next_states": [],
+ "order": 0,
+ "slug": "active",
+ "type": "bluesheets",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 139
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Deleted",
+ "next_states": [],
+ "order": 0,
+ "slug": "deleted",
+ "type": "bluesheets",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 140
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Single Meeting",
+ "next_states": [],
+ "order": 0,
+ "slug": "single",
+ "type": "reuse_policy",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 141
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Multiple Meetings",
+ "next_states": [],
+ "order": 0,
+ "slug": "multiple",
+ "type": "reuse_policy",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 142
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Active",
+ "next_states": [],
+ "order": 1,
+ "slug": "active",
+ "type": "review",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 143
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Deleted",
+ "next_states": [],
+ "order": 2,
+ "slug": "deleted",
+ "type": "review",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 144
+ },
+ {
+ "fields": {
+ "desc": "In some areas, it can be desirable to wait for multiple interoperable implementations before progressing a draft to be an RFC, and in some WGs this is required. This state should be entered after WG Last Call has completed.",
+ "name": "Waiting for Implementation",
+ "next_states": [],
+ "order": 8,
+ "slug": "waiting-for-implementation",
+ "type": "draft-stream-ietf",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 145
+ },
+ {
+ "fields": {
+ "desc": "Held by WG, see document history for details.",
+ "name": "Held by WG",
+ "next_states": [],
+ "order": 9,
+ "slug": "held-by-wg",
+ "type": "draft-stream-ietf",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 146
+ },
+ {
+ "fields": {
+ "desc": "Replaced",
+ "name": "Replaced",
+ "next_states": [],
+ "order": 0,
+ "slug": "repl",
+ "type": "draft-stream-iab",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 147
+ },
+ {
+ "fields": {
+ "desc": "Replaced",
+ "name": "Replaced",
+ "next_states": [],
+ "order": 0,
+ "slug": "repl",
+ "type": "draft-stream-ise",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 148
+ },
+ {
+ "fields": {
+ "desc": "Replaced",
+ "name": "Replaced",
+ "next_states": [],
+ "order": 0,
+ "slug": "repl",
+ "type": "draft-stream-irtf",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 149
+ },
+ {
+ "fields": {
+ "desc": "The IESG has not started processing this draft, or has stopped processing it without publicastion.",
+ "name": "I-D Exists",
+ "next_states": [
+ 16,
+ 11
+ ],
+ "order": 0,
+ "slug": "idexists",
+ "type": "draft-iesg",
+ "used": true
+ },
+ "model": "doc.state",
+ "pk": 150
+ },
+ {
+ "fields": {
+ "label": "State"
+ },
+ "model": "doc.statetype",
+ "pk": "agenda"
+ },
+ {
+ "fields": {
+ "label": "State"
+ },
+ "model": "doc.statetype",
+ "pk": "bluesheets"
+ },
+ {
+ "fields": {
+ "label": "State"
+ },
+ "model": "doc.statetype",
+ "pk": "charter"
+ },
+ {
+ "fields": {
+ "label": "Conflict Review State"
+ },
+ "model": "doc.statetype",
+ "pk": "conflrev"
+ },
+ {
+ "fields": {
+ "label": "State"
+ },
+ "model": "doc.statetype",
+ "pk": "draft"
+ },
+ {
+ "fields": {
+ "label": "IANA state"
+ },
+ "model": "doc.statetype",
+ "pk": "draft-iana"
+ },
+ {
+ "fields": {
+ "label": "IANA Action state"
+ },
+ "model": "doc.statetype",
+ "pk": "draft-iana-action"
+ },
+ {
+ "fields": {
+ "label": "IANA Review state"
+ },
+ "model": "doc.statetype",
+ "pk": "draft-iana-review"
+ },
+ {
+ "fields": {
+ "label": "IESG state"
+ },
+ "model": "doc.statetype",
+ "pk": "draft-iesg"
+ },
+ {
+ "fields": {
+ "label": "RFC Editor state"
+ },
+ "model": "doc.statetype",
+ "pk": "draft-rfceditor"
+ },
+ {
+ "fields": {
+ "label": "IAB state"
+ },
+ "model": "doc.statetype",
+ "pk": "draft-stream-iab"
+ },
+ {
+ "fields": {
+ "label": "IETF WG state"
+ },
+ "model": "doc.statetype",
+ "pk": "draft-stream-ietf"
+ },
+ {
+ "fields": {
+ "label": "IRTF state"
+ },
+ "model": "doc.statetype",
+ "pk": "draft-stream-irtf"
+ },
+ {
+ "fields": {
+ "label": "ISE state"
+ },
+ "model": "doc.statetype",
+ "pk": "draft-stream-ise"
+ },
+ {
+ "fields": {
+ "label": "State"
+ },
+ "model": "doc.statetype",
+ "pk": "liai-att"
+ },
+ {
+ "fields": {
+ "label": "Liason Statement State"
+ },
+ "model": "doc.statetype",
+ "pk": "liaison"
+ },
+ {
+ "fields": {
+ "label": "State"
+ },
+ "model": "doc.statetype",
+ "pk": "minutes"
+ },
+ {
+ "fields": {
+ "label": "State"
+ },
+ "model": "doc.statetype",
+ "pk": "recording"
+ },
+ {
+ "fields": {
+ "label": "Policy"
+ },
+ "model": "doc.statetype",
+ "pk": "reuse_policy"
+ },
+ {
+ "fields": {
+ "label": "Review"
+ },
+ "model": "doc.statetype",
+ "pk": "review"
+ },
+ {
+ "fields": {
+ "label": "Shepherd's Writeup State"
+ },
+ "model": "doc.statetype",
+ "pk": "shepwrit"
+ },
+ {
+ "fields": {
+ "label": "State"
+ },
+ "model": "doc.statetype",
+ "pk": "slides"
+ },
+ {
+ "fields": {
+ "label": "RFC Status Change state"
+ },
+ "model": "doc.statetype",
+ "pk": "statchg"
+ },
+ {
+ "fields": {
+ "about_page": "ietf.group.views.group_about",
+ "acts_like_wg": false,
+ "admin_roles": "[\"chair\"]",
+ "agenda_type": "ietf",
+ "create_wiki": true,
+ "custom_group_roles": false,
+ "customize_workflow": false,
+ "default_tab": "ietf.group.views.group_about",
+ "docman_roles": "[\"chair\"]",
+ "groupman_roles": "[\"chair\",\"lead\",\"delegate\"]",
+ "has_chartering_process": false,
+ "has_default_jabber": true,
+ "has_documents": false,
+ "has_meetings": true,
+ "has_milestones": false,
+ "has_nonsession_materials": false,
+ "has_reviews": false,
+ "has_session_materials": true,
+ "is_schedulable": true,
+ "material_types": "[\"slides\"]",
+ "matman_roles": "[\"chair\",\"lead\",\"delegate\",\"matman\"]",
+ "req_subm_approval": true,
+ "role_order": "[\"chair\",\"lead\",\"delegate\",\"matman\"]",
+ "show_on_agenda": true
+ },
+ "model": "group.groupfeatures",
+ "pk": "adhoc"
+ },
+ {
+ "fields": {
+ "about_page": "ietf.group.views.group_about",
+ "acts_like_wg": true,
+ "admin_roles": "[\"chair\"]",
+ "agenda_type": "ietf",
+ "create_wiki": true,
+ "custom_group_roles": true,
+ "customize_workflow": false,
+ "default_tab": "ietf.group.views.group_about",
+ "docman_roles": "[\"chair\",\"delegate\",\"secr\"]",
+ "groupman_roles": "[\"ad\",\"chair\",\"delegate\"]",
+ "has_chartering_process": false,
+ "has_default_jabber": false,
+ "has_documents": true,
+ "has_meetings": true,
+ "has_milestones": false,
+ "has_nonsession_materials": false,
+ "has_reviews": false,
+ "has_session_materials": true,
+ "is_schedulable": true,
+ "material_types": "[\"slides\"]",
+ "matman_roles": "[\"ad\",\"chair\",\"delegate\",\"secr\"]",
+ "req_subm_approval": true,
+ "role_order": "[\"chair\",\"secr\"]",
+ "show_on_agenda": true
+ },
+ "model": "group.groupfeatures",
+ "pk": "ag"
+ },
+ {
+ "fields": {
+ "about_page": "ietf.group.views.group_about",
+ "acts_like_wg": false,
+ "admin_roles": "[\"ad\"]",
+ "agenda_type": "ietf",
+ "create_wiki": true,
+ "custom_group_roles": true,
+ "customize_workflow": false,
+ "default_tab": "ietf.group.views.group_about",
+ "docman_roles": "[\"ad\",\"delegate\",\"secr\"]",
+ "groupman_roles": "[\"ad\"]",
+ "has_chartering_process": false,
+ "has_default_jabber": false,
+ "has_documents": false,
+ "has_meetings": false,
+ "has_milestones": false,
+ "has_nonsession_materials": false,
+ "has_reviews": false,
+ "has_session_materials": false,
+ "is_schedulable": false,
+ "material_types": "[\"slides\"]",
+ "matman_roles": "[\"ad\",\"chair\",\"delegate\",\"secr\"]",
+ "req_subm_approval": true,
+ "role_order": "[\"chair\",\"secr\"]",
+ "show_on_agenda": false
+ },
+ "model": "group.groupfeatures",
+ "pk": "area"
+ },
+ {
+ "fields": {
+ "about_page": "ietf.group.views.group_about",
+ "acts_like_wg": false,
+ "admin_roles": "[\"chair\",\"secr\"]",
+ "agenda_type": null,
+ "create_wiki": true,
+ "custom_group_roles": true,
+ "customize_workflow": false,
+ "default_tab": "ietf.group.views.group_about",
+ "docman_roles": "[]",
+ "groupman_roles": "[\"ad\",\"secr\"]",
+ "has_chartering_process": false,
+ "has_default_jabber": false,
+ "has_documents": false,
+ "has_meetings": false,
+ "has_milestones": false,
+ "has_nonsession_materials": false,
+ "has_reviews": false,
+ "has_session_materials": false,
+ "is_schedulable": false,
+ "material_types": "[\"slides\"]",
+ "matman_roles": "[\"ad\",\"chair\",\"delegate\",\"secr\"]",
+ "req_subm_approval": true,
+ "role_order": "[\"chair\",\"secr\"]",
+ "show_on_agenda": false
+ },
+ "model": "group.groupfeatures",
+ "pk": "dir"
+ },
+ {
+ "fields": {
+ "about_page": "ietf.group.views.group_about",
+ "acts_like_wg": false,
+ "admin_roles": "[\"chair\"]",
+ "agenda_type": "ietf",
+ "create_wiki": false,
+ "custom_group_roles": true,
+ "customize_workflow": false,
+ "default_tab": "ietf.group.views.group_about",
+ "docman_roles": "[\"chair\"]",
+ "groupman_roles": "[]",
+ "has_chartering_process": false,
+ "has_default_jabber": false,
+ "has_documents": false,
+ "has_meetings": true,
+ "has_milestones": false,
+ "has_nonsession_materials": false,
+ "has_reviews": false,
+ "has_session_materials": false,
+ "is_schedulable": false,
+ "material_types": "[\"slides\"]",
+ "matman_roles": "[\"chair\",\"delegate\"]",
+ "req_subm_approval": true,
+ "role_order": "[\"chair\",\"secr\"]",
+ "show_on_agenda": true
+ },
+ "model": "group.groupfeatures",
+ "pk": "iab"
+ },
+ {
+ "fields": {
+ "about_page": "ietf.group.views.group_about",
+ "acts_like_wg": false,
+ "admin_roles": "[\"chair\"]",
+ "agenda_type": "ad",
+ "create_wiki": false,
+ "custom_group_roles": true,
+ "customize_workflow": false,
+ "default_tab": "ietf.group.views.group_about",
+ "docman_roles": "[\"chair\"]",
+ "groupman_roles": "[\"chair\",\"delegate\"]",
+ "has_chartering_process": false,
+ "has_default_jabber": false,
+ "has_documents": false,
+ "has_meetings": false,
+ "has_milestones": false,
+ "has_nonsession_materials": false,
+ "has_reviews": false,
+ "has_session_materials": false,
+ "is_schedulable": false,
+ "material_types": "\"[]\"",
+ "matman_roles": "[\"chair\",\"delegate\",\"member\"]",
+ "req_subm_approval": true,
+ "role_order": "[\"chair\",\"delegate\",\"member\"]",
+ "show_on_agenda": false
+ },
+ "model": "group.groupfeatures",
+ "pk": "iesg"
+ },
+ {
+ "fields": {
+ "about_page": "ietf.group.views.group_about",
+ "acts_like_wg": false,
+ "admin_roles": "[\"chair\",\"lead\"]",
+ "agenda_type": "ietf",
+ "create_wiki": false,
+ "custom_group_roles": true,
+ "customize_workflow": false,
+ "default_tab": "ietf.group.views.group_about",
+ "docman_roles": "[\"chair\"]",
+ "groupman_roles": "[\"chair\",\"delegate\"]",
+ "has_chartering_process": false,
+ "has_default_jabber": false,
+ "has_documents": false,
+ "has_meetings": true,
+ "has_milestones": false,
+ "has_nonsession_materials": false,
+ "has_reviews": false,
+ "has_session_materials": true,
+ "is_schedulable": false,
+ "material_types": "[\"slides\"]",
+ "matman_roles": "[\"chair\",\"delegate\"]",
+ "req_subm_approval": true,
+ "role_order": "[\"chair\",\"secr\"]",
+ "show_on_agenda": false
+ },
+ "model": "group.groupfeatures",
+ "pk": "ietf"
+ },
+ {
+ "fields": {
+ "about_page": "ietf.group.views.group_about",
+ "acts_like_wg": false,
+ "admin_roles": "[\"chair\"]",
+ "agenda_type": null,
+ "create_wiki": false,
+ "custom_group_roles": true,
+ "customize_workflow": false,
+ "default_tab": "ietf.group.views.group_about",
+ "docman_roles": "[\"auth\"]",
+ "groupman_roles": "[]",
+ "has_chartering_process": false,
+ "has_default_jabber": false,
+ "has_documents": false,
+ "has_meetings": false,
+ "has_milestones": false,
+ "has_nonsession_materials": false,
+ "has_reviews": false,
+ "has_session_materials": false,
+ "is_schedulable": false,
+ "material_types": "[\"slides\"]",
+ "matman_roles": "[]",
+ "req_subm_approval": false,
+ "role_order": "[\"chair\",\"secr\"]",
+ "show_on_agenda": false
+ },
+ "model": "group.groupfeatures",
+ "pk": "individ"
+ },
+ {
+ "fields": {
+ "about_page": "ietf.group.views.group_about",
+ "acts_like_wg": false,
+ "admin_roles": "[\"chair\"]",
+ "agenda_type": "ietf",
+ "create_wiki": false,
+ "custom_group_roles": true,
+ "customize_workflow": false,
+ "default_tab": "ietf.group.views.group_about",
+ "docman_roles": "[]",
+ "groupman_roles": "[\"chair\",\"delegate\"]",
+ "has_chartering_process": false,
+ "has_default_jabber": false,
+ "has_documents": false,
+ "has_meetings": false,
+ "has_milestones": false,
+ "has_nonsession_materials": false,
+ "has_reviews": false,
+ "has_session_materials": false,
+ "is_schedulable": false,
+ "material_types": "[\"slides\"]",
+ "matman_roles": "[\"chair\",\"delegate\",\"secr\"]",
+ "req_subm_approval": true,
+ "role_order": "[\"chair\",\"secr\"]",
+ "show_on_agenda": false
+ },
+ "model": "group.groupfeatures",
+ "pk": "irtf"
+ },
+ {
+ "fields": {
+ "about_page": "ietf.group.views.group_about",
+ "acts_like_wg": false,
+ "admin_roles": "[\"chair\",\"lead\"]",
+ "agenda_type": "ad",
+ "create_wiki": false,
+ "custom_group_roles": true,
+ "customize_workflow": false,
+ "default_tab": "ietf.group.views.group_about",
+ "docman_roles": "[\"chair\"]",
+ "groupman_roles": "[\"chair\",\"delegate\"]",
+ "has_chartering_process": false,
+ "has_default_jabber": false,
+ "has_documents": false,
+ "has_meetings": false,
+ "has_milestones": false,
+ "has_nonsession_materials": false,
+ "has_reviews": false,
+ "has_session_materials": false,
+ "is_schedulable": false,
+ "material_types": "[\"slides\"]",
+ "matman_roles": "[\"chair\",\"delegate\"]",
+ "req_subm_approval": true,
+ "role_order": "[\"chair\",\"delegate\"]",
+ "show_on_agenda": false
+ },
+ "model": "group.groupfeatures",
+ "pk": "ise"
+ },
+ {
+ "fields": {
+ "about_page": "ietf.group.views.group_about",
+ "acts_like_wg": false,
+ "admin_roles": "[\"chair\"]",
+ "agenda_type": null,
+ "create_wiki": false,
+ "custom_group_roles": true,
+ "customize_workflow": false,
+ "default_tab": "ietf.group.views.group_about",
+ "docman_roles": "[]",
+ "groupman_roles": "[\"chair\"]",
+ "has_chartering_process": false,
+ "has_default_jabber": false,
+ "has_documents": false,
+ "has_meetings": false,
+ "has_milestones": false,
+ "has_nonsession_materials": false,
+ "has_reviews": false,
+ "has_session_materials": false,
+ "is_schedulable": false,
+ "material_types": "[\"slides\"]",
+ "matman_roles": "[\"chair\",\"secr\"]",
+ "req_subm_approval": true,
+ "role_order": "[\"chair\",\"secr\"]",
+ "show_on_agenda": false
+ },
+ "model": "group.groupfeatures",
+ "pk": "isoc"
+ },
+ {
+ "fields": {
+ "about_page": "ietf.group.views.group_about",
+ "acts_like_wg": false,
+ "admin_roles": "[\"chair\"]",
+ "agenda_type": "side",
+ "create_wiki": true,
+ "custom_group_roles": true,
+ "customize_workflow": false,
+ "default_tab": "ietf.group.views.group_about",
+ "docman_roles": "[]",
+ "groupman_roles": "[\"chair\",\"advisor\"]",
+ "has_chartering_process": false,
+ "has_default_jabber": false,
+ "has_documents": false,
+ "has_meetings": false,
+ "has_milestones": false,
+ "has_nonsession_materials": false,
+ "has_reviews": false,
+ "has_session_materials": false,
+ "is_schedulable": false,
+ "material_types": "[\"slides\"]",
+ "matman_roles": "[\"chair\"]",
+ "req_subm_approval": true,
+ "role_order": "[\"chair\",\"member\",\"advisor\"]",
+ "show_on_agenda": false
+ },
+ "model": "group.groupfeatures",
+ "pk": "nomcom"
+ },
+ {
+ "fields": {
+ "about_page": "ietf.group.views.group_about",
+ "acts_like_wg": false,
+ "admin_roles": "[\"lead\"]",
+ "agenda_type": "ad",
+ "create_wiki": false,
+ "custom_group_roles": true,
+ "customize_workflow": false,
+ "default_tab": "ietf.group.views.group_about",
+ "docman_roles": "[\"lead\",\"secr\"]",
+ "groupman_roles": "[\"lead\",\"secr\"]",
+ "has_chartering_process": false,
+ "has_default_jabber": false,
+ "has_documents": true,
+ "has_meetings": false,
+ "has_milestones": true,
+ "has_nonsession_materials": false,
+ "has_reviews": false,
+ "has_session_materials": false,
+ "is_schedulable": false,
+ "material_types": "[\"slides\"]",
+ "matman_roles": "[\"lead\",\"secr\"]",
+ "req_subm_approval": false,
+ "role_order": "[\"lead\",\"secr\"]",
+ "show_on_agenda": false
+ },
+ "model": "group.groupfeatures",
+ "pk": "program"
+ },
+ {
+ "fields": {
+ "about_page": "ietf.group.views.group_about",
+ "acts_like_wg": false,
+ "admin_roles": "[\"chair\",\"secr\"]",
+ "agenda_type": null,
+ "create_wiki": true,
+ "custom_group_roles": true,
+ "customize_workflow": false,
+ "default_tab": "ietf.group.views.review_requests",
+ "docman_roles": "[\"secr\"]",
+ "groupman_roles": "[\"ad\",\"secr\"]",
+ "has_chartering_process": false,
+ "has_default_jabber": false,
+ "has_documents": false,
+ "has_meetings": false,
+ "has_milestones": false,
+ "has_nonsession_materials": false,
+ "has_reviews": true,
+ "has_session_materials": false,
+ "is_schedulable": false,
+ "material_types": "[\"slides\"]",
+ "matman_roles": "[\"ad\",\"secr\"]",
+ "req_subm_approval": true,
+ "role_order": "[\"chair\",\"secr\"]",
+ "show_on_agenda": false
+ },
+ "model": "group.groupfeatures",
+ "pk": "review"
+ },
+ {
+ "fields": {
+ "about_page": "ietf.group.views.group_about",
+ "acts_like_wg": false,
+ "admin_roles": "[\"chair\"]",
+ "agenda_type": "side",
+ "create_wiki": false,
+ "custom_group_roles": true,
+ "customize_workflow": false,
+ "default_tab": "ietf.group.views.group_about",
+ "docman_roles": "[]",
+ "groupman_roles": "[]",
+ "has_chartering_process": false,
+ "has_default_jabber": false,
+ "has_documents": false,
+ "has_meetings": false,
+ "has_milestones": false,
+ "has_nonsession_materials": false,
+ "has_reviews": false,
+ "has_session_materials": false,
+ "is_schedulable": false,
+ "material_types": "[\"slides\"]",
+ "matman_roles": "[]",
+ "req_subm_approval": true,
+ "role_order": "[\"chair\",\"secr\"]",
+ "show_on_agenda": false
+ },
+ "model": "group.groupfeatures",
+ "pk": "rfcedtyp"
+ },
+ {
+ "fields": {
+ "about_page": "ietf.group.views.group_about",
+ "acts_like_wg": true,
+ "admin_roles": "[\"chair\"]",
+ "agenda_type": "ietf",
+ "create_wiki": true,
+ "custom_group_roles": false,
+ "customize_workflow": true,
+ "default_tab": "ietf.group.views.group_documents",
+ "docman_roles": "[\"chair\",\"delegate\",\"secr\"]",
+ "groupman_roles": "[\"chair\",\"delegate\"]",
+ "has_chartering_process": true,
+ "has_default_jabber": true,
+ "has_documents": true,
+ "has_meetings": true,
+ "has_milestones": true,
+ "has_nonsession_materials": false,
+ "has_reviews": false,
+ "has_session_materials": true,
+ "is_schedulable": true,
+ "material_types": "[\"slides\"]",
+ "matman_roles": "[\"chair\",\"delegate\",\"secr\"]",
+ "req_subm_approval": true,
+ "role_order": "[\"chair\",\"delegate\",\"secr\"]",
+ "show_on_agenda": true
+ },
+ "model": "group.groupfeatures",
+ "pk": "rg"
+ },
+ {
+ "fields": {
+ "about_page": "ietf.group.views.group_about",
+ "acts_like_wg": false,
+ "admin_roles": "[\"chair\"]",
+ "agenda_type": null,
+ "create_wiki": false,
+ "custom_group_roles": true,
+ "customize_workflow": false,
+ "default_tab": "ietf.group.views.group_about",
+ "docman_roles": "[\"liaiman\",\"matman\"]",
+ "groupman_roles": "[]",
+ "has_chartering_process": false,
+ "has_default_jabber": false,
+ "has_documents": false,
+ "has_meetings": false,
+ "has_milestones": false,
+ "has_nonsession_materials": false,
+ "has_reviews": false,
+ "has_session_materials": false,
+ "is_schedulable": false,
+ "material_types": "[\"slides\"]",
+ "matman_roles": "[]",
+ "req_subm_approval": true,
+ "role_order": "[\"liaiman\"]",
+ "show_on_agenda": false
+ },
+ "model": "group.groupfeatures",
+ "pk": "sdo"
+ },
+ {
+ "fields": {
+ "about_page": "ietf.group.views.group_about",
+ "acts_like_wg": false,
+ "admin_roles": "[\"chair\"]",
+ "agenda_type": "ietf",
+ "create_wiki": true,
+ "custom_group_roles": true,
+ "customize_workflow": false,
+ "default_tab": "ietf.group.views.group_about",
+ "docman_roles": "[\"chair\"]",
+ "groupman_roles": "[\"chair\"]",
+ "has_chartering_process": false,
+ "has_default_jabber": false,
+ "has_documents": false,
+ "has_meetings": true,
+ "has_milestones": false,
+ "has_nonsession_materials": true,
+ "has_reviews": false,
+ "has_session_materials": false,
+ "is_schedulable": false,
+ "material_types": "[\"slides\"]",
+ "matman_roles": "[\"chair\",\"matman\"]",
+ "req_subm_approval": false,
+ "role_order": "[\"chair\",\"member\",\"matman\"]",
+ "show_on_agenda": false
+ },
+ "model": "group.groupfeatures",
+ "pk": "team"
+ },
+ {
+ "fields": {
+ "about_page": "ietf.group.views.group_about",
+ "acts_like_wg": true,
+ "admin_roles": "[\"chair\"]",
+ "agenda_type": "ietf",
+ "create_wiki": true,
+ "custom_group_roles": false,
+ "customize_workflow": true,
+ "default_tab": "ietf.group.views.group_documents",
+ "docman_roles": "[\"chair\",\"delegate\",\"secr\"]",
+ "groupman_roles": "[\"ad\",\"chair\",\"delegate\",\"secr\"]",
+ "has_chartering_process": true,
+ "has_default_jabber": true,
+ "has_documents": true,
+ "has_meetings": true,
+ "has_milestones": true,
+ "has_nonsession_materials": false,
+ "has_reviews": false,
+ "has_session_materials": true,
+ "is_schedulable": true,
+ "material_types": "[\"slides\"]",
+ "matman_roles": "[\"ad\",\"chair\",\"delegate\",\"secr\"]",
+ "req_subm_approval": true,
+ "role_order": "[\"chair\",\"secr\",\"delegate\"]",
+ "show_on_agenda": true
+ },
+ "model": "group.groupfeatures",
+ "pk": "wg"
+ },
+ {
+ "fields": {
+ "cc": [
+ "doc_notify",
+ "group_chairs",
+ "group_mail_list",
+ "group_steering_group"
+ ],
+ "desc": "Recipients when a charter is approved",
+ "to": [
+ "ietf_announce"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "ballot_approved_charter"
+ },
+ {
+ "fields": {
+ "cc": [
+ "iana",
+ "iesg",
+ "ietf_announce"
+ ],
+ "desc": "Recipients when a conflict review ballot is approved",
+ "to": [
+ "conflict_review_steering_group",
+ "conflict_review_stream_manager",
+ "doc_affecteddoc_authors",
+ "doc_affecteddoc_group_chairs",
+ "doc_affecteddoc_notify",
+ "doc_notify"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "ballot_approved_conflrev"
+ },
+ {
+ "fields": {
+ "cc": [
+ "doc_ad",
+ "doc_authors",
+ "doc_group_chairs",
+ "doc_group_mail_list",
+ "doc_notify",
+ "doc_shepherd",
+ "iesg",
+ "rfc_editor"
+ ],
+ "desc": "Recipients when an IETF stream document ballot is approved",
+ "to": [
+ "ietf_announce"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "ballot_approved_ietf_stream"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients for IANA message when an IETF stream document ballot is approved",
+ "to": [
+ "iana_approve"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "ballot_approved_ietf_stream_iana"
+ },
+ {
+ "fields": {
+ "cc": [
+ "doc_affecteddoc_authors",
+ "doc_affecteddoc_group_chairs",
+ "doc_affecteddoc_notify",
+ "doc_notify",
+ "iana",
+ "iesg",
+ "rfc_editor"
+ ],
+ "desc": "Recipients when a status change is approved",
+ "to": [
+ "ietf_announce"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "ballot_approved_status_change"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients when a ballot is deferred to or undeferred from a future telechat",
+ "to": [
+ "conflict_review_stream_manager",
+ "doc_affecteddoc_authors",
+ "doc_affecteddoc_group_chairs",
+ "doc_affecteddoc_notify",
+ "doc_authors",
+ "doc_group_chairs",
+ "doc_notify",
+ "doc_shepherd",
+ "iesg",
+ "iesg_secretary"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "ballot_deferred"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients when the RFC Editor note for a document is changed after the document has been approved",
+ "to": [
+ "iesg",
+ "rfc_editor"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "ballot_ednote_changed_late"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients when a ballot is issued",
+ "to": [
+ "iesg",
+ "iesg_secretary"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "ballot_issued"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients for IANA message when a ballot is issued",
+ "to": [
+ "iana_eval"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "ballot_issued_iana"
+ },
+ {
+ "fields": {
+ "cc": [
+ "conflict_review_stream_manager",
+ "doc_affecteddoc_authors",
+ "doc_affecteddoc_group_chairs",
+ "doc_affecteddoc_notify",
+ "doc_authors",
+ "doc_group_chairs",
+ "doc_group_mail_list",
+ "doc_notify",
+ "doc_shepherd"
+ ],
+ "desc": "Recipients when a new ballot position (with discusses, other blocking positions, or comments) is saved",
+ "to": [
+ "iesg"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "ballot_saved"
+ },
+ {
+ "fields": {
+ "cc": [
+ "group_mail_list"
+ ],
+ "desc": "Recipients for a charter external review",
+ "to": [
+ "ietf_announce"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "charter_external_review"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients for a message to new-work about a charter review",
+ "to": [
+ "new_work"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "charter_external_review_new_work"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients for message noting that internal review has started on a charter",
+ "to": [
+ "iab",
+ "iesg"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "charter_internal_review"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients for message to adminstrators when a charter state edit needs followon administrative action",
+ "to": [
+ "iesg_secretary"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "charter_state_edit_admin_needed"
+ },
+ {
+ "fields": {
+ "cc": [
+ "conflict_review_steering_group",
+ "conflict_review_stream_manager",
+ "doc_affecteddoc_authors",
+ "doc_affecteddoc_group_chairs",
+ "doc_affecteddoc_notify",
+ "doc_notify",
+ "iesg"
+ ],
+ "desc": "Recipients when the responsible AD for a conflict review is changed",
+ "to": []
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "conflrev_ad_changed"
+ },
+ {
+ "fields": {
+ "cc": [
+ "conflict_review_steering_group",
+ "conflict_review_stream_manager",
+ "doc_affecteddoc_authors",
+ "doc_affecteddoc_group_chairs",
+ "doc_affecteddoc_notify",
+ "doc_notify",
+ "iesg"
+ ],
+ "desc": "Recipients for a stream manager's request for an IETF conflict review",
+ "to": [
+ "iesg_secretary"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "conflrev_requested"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients for IANA message when a stream manager requests an IETF conflict review",
+ "to": [
+ "iana_eval"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "conflrev_requested_iana"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients for a message when a new comment is manually entered into the document's history",
+ "to": [
+ "doc_authors",
+ "doc_group_chairs",
+ "doc_group_responsible_directors",
+ "doc_non_ietf_stream_manager",
+ "doc_shepherd"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "doc_added_comment"
+ },
+ {
+ "fields": {
+ "cc": [
+ "doc_ad",
+ "doc_notify",
+ "doc_shepherd"
+ ],
+ "desc": "Recipients for notification that a document has been adopted by a group",
+ "to": [
+ "doc_authors",
+ "doc_group_chairs",
+ "doc_group_mail_list"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "doc_adopted_by_group"
+ },
+ {
+ "fields": {
+ "cc": [
+ "doc_group_chairs",
+ "doc_group_responsible_directors",
+ "doc_notify",
+ "doc_shepherd"
+ ],
+ "desc": "Recipients for notification of a document's expiration",
+ "to": [
+ "doc_authors"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "doc_expired"
+ },
+ {
+ "fields": {
+ "cc": [
+ "doc_group_chairs",
+ "doc_group_responsible_directors",
+ "doc_notify",
+ "doc_shepherd"
+ ],
+ "desc": "Recipients for notification of impending expiration of a document",
+ "to": [
+ "doc_authors"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "doc_expires_soon"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients when IANA state information for a document changes ",
+ "to": [
+ "doc_ad",
+ "doc_affecteddoc_authors",
+ "doc_affecteddoc_group_chairs",
+ "doc_affecteddoc_notify",
+ "doc_authors",
+ "doc_group_chairs",
+ "doc_notify",
+ "doc_shepherd"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "doc_iana_state_changed"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients for a message when the IESG begins processing a document ",
+ "to": [
+ "doc_ad",
+ "doc_authors",
+ "doc_group_chairs",
+ "doc_shepherd"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "doc_iesg_processing_started"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients for a message when a document's intended publication status changes",
+ "to": [
+ "doc_authors",
+ "doc_group_chairs",
+ "doc_group_responsible_directors",
+ "doc_non_ietf_stream_manager",
+ "doc_shepherd"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "doc_intended_status_changed"
+ },
+ {
+ "fields": {
+ "cc": [
+ "doc_authors",
+ "doc_group_chairs",
+ "doc_notify",
+ "doc_shepherd",
+ "iesg",
+ "iesg_secretary"
+ ],
+ "desc": "Recipients when a document is taken out of the RFC's editor queue before publication",
+ "to": [
+ "iana",
+ "rfc_editor"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "doc_pulled_from_rfc_queue"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients when what a document replaces or is replaced by changes",
+ "to": [
+ "doc_authors_expanded"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "doc_replacement_changed"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients for suggestions that this doc replaces or is replace by some other document",
+ "to": [
+ "doc_group_chairs",
+ "doc_group_responsible_directors",
+ "doc_non_ietf_stream_manager",
+ "iesg_secretary"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "doc_replacement_suggested"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients when a document's state is manually edited",
+ "to": [
+ "doc_ad",
+ "doc_affecteddoc_authors",
+ "doc_affecteddoc_group_chairs",
+ "doc_affecteddoc_notify",
+ "doc_authors",
+ "doc_group_chairs",
+ "doc_group_responsible_directors",
+ "doc_notify",
+ "doc_shepherd"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "doc_state_edited"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients for notification when a document's stream changes",
+ "to": [
+ "doc_authors",
+ "doc_notify",
+ "stream_managers"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "doc_stream_changed"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients when the stream state of a document is manually edited",
+ "to": [
+ "doc_authors",
+ "doc_group_chairs",
+ "doc_group_delegates",
+ "doc_shepherd"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "doc_stream_state_edited"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients when a document's telechat date or other telechat specific details are changed",
+ "to": [
+ "conflict_review_steering_group",
+ "conflict_review_stream_manager",
+ "doc_affecteddoc_authors",
+ "doc_affecteddoc_group_chairs",
+ "doc_affecteddoc_notify",
+ "doc_authors",
+ "doc_group_chairs",
+ "doc_notify",
+ "doc_shepherd",
+ "iesg",
+ "iesg_secretary"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "doc_telechat_details_changed"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients when a comment is added to a group's history",
+ "to": [
+ "group_chairs",
+ "group_responsible_directors",
+ "group_secretaries"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "group_added_comment"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients when the set of approved milestones for a group are edited",
+ "to": [
+ "group_mail_list"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "group_approved_milestones_edited"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients for message requesting closure of a group",
+ "to": [
+ "iesg_secretary"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "group_closure_requested"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients when any of a group's milestones are edited",
+ "to": [
+ "group_chairs",
+ "group_responsible_directors"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "group_milestones_edited"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients for a message noting changes in a group's personnel",
+ "to": [
+ "group_chairs",
+ "group_changed_personnel",
+ "group_responsible_directors",
+ "group_secretaries",
+ "iesg_secretary"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "group_personnel_change"
+ },
+ {
+ "fields": {
+ "cc": [
+ "group_mail_list"
+ ],
+ "desc": "Recipients when an interim meeting is announced",
+ "to": [
+ "group_stream_announce",
+ "ietf_announce"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "interim_announced"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients when an interim meeting is approved and an announcement needs to be sent",
+ "to": [
+ "iesg_secretary"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "interim_approved"
+ },
+ {
+ "fields": {
+ "cc": [
+ "group_chairs",
+ "group_mail_list",
+ "logged_in_person"
+ ],
+ "desc": "Recipients when an interim meeting is cancelled",
+ "to": [
+ "group_stream_announce",
+ "ietf_announce"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "interim_cancelled"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients when the secretary follows up on an IPR disclosure submission",
+ "to": [
+ "ipr_submitter"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "ipr_disclosure_followup"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients when an IPR disclosure is submitted",
+ "to": [
+ "ipr_requests"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "ipr_disclosure_submitted"
+ },
+ {
+ "fields": {
+ "cc": [
+ "doc_ipr_group_or_ad",
+ "ipr_announce"
+ ],
+ "desc": "Recipients when an IPR disclosure calls out a given document",
+ "to": [
+ "doc_authors"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "ipr_posted_on_doc"
+ },
+ {
+ "fields": {
+ "cc": [
+ "ipr_updatedipr_contacts",
+ "ipr_updatedipr_holders"
+ ],
+ "desc": "Recipients for a message confirming that a disclosure has been posted",
+ "to": [
+ "ipr_submitter"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "ipr_posting_confirmation"
+ },
+ {
+ "fields": {
+ "cc": [
+ "iesg_secretary"
+ ],
+ "desc": "Recipients when a last call has expired",
+ "to": [
+ "doc_ad",
+ "doc_authors",
+ "doc_notify",
+ "doc_shepherd"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "last_call_expired"
+ },
+ {
+ "fields": {
+ "cc": [
+ "doc_ad",
+ "doc_affecteddoc_authors",
+ "doc_affecteddoc_group_chairs",
+ "doc_affecteddoc_notify",
+ "doc_authors",
+ "doc_group_chairs",
+ "doc_group_mail_list",
+ "doc_notify",
+ "doc_shepherd"
+ ],
+ "desc": "Recipients when a last call is issued",
+ "to": [
+ "ietf_announce"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "last_call_issued"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients for IANA message when a last call is issued",
+ "to": [
+ "iana_last_call"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "last_call_issued_iana"
+ },
+ {
+ "fields": {
+ "cc": [
+ "doc_ad",
+ "doc_notify",
+ "doc_shepherd"
+ ],
+ "desc": "Recipients when AD requests a last call",
+ "to": [
+ "iesg_secretary"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "last_call_requested"
+ },
+ {
+ "fields": {
+ "cc": [
+ "liaison_admin"
+ ],
+ "desc": "Recipients for a message that a pending liaison statement needs approval",
+ "to": [
+ "liaison_approvers"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "liaison_approval_requested"
+ },
+ {
+ "fields": {
+ "cc": [
+ "liaison_cc",
+ "liaison_response_contacts",
+ "liaison_technical_contacts"
+ ],
+ "desc": "Recipients for a message about a liaison statement deadline that is approaching.",
+ "to": [
+ "liaison_to_contacts"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "liaison_deadline_soon"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients for a message requesting an updated list of authorized individuals",
+ "to": [
+ "liaison_manager"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "liaison_manager_update_request"
+ },
+ {
+ "fields": {
+ "cc": [
+ "liaison_cc",
+ "liaison_response_contacts",
+ "liaison_technical_contacts"
+ ],
+ "desc": "Recipient for a message when a new liaison statement is posted",
+ "to": [
+ "liaison_to_contacts"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "liaison_statement_posted"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients for a message confirming a comment was made",
+ "to": [
+ "commenter"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "nomcom_comment_receipt_requested"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients for the questionairre that nominees should complete",
+ "to": [
+ "nominee"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "nomcom_questionnaire"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients for a message reminding a nominee to return a completed questionairre response",
+ "to": [
+ "nominee"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "nomcom_questionnaire_reminder"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipeints of message reminding a nominee to accept or decline a nomination",
+ "to": [
+ "nominee"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "nomination_accept_reminder"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients for a message noting that a nomination caused a new Person record to be created in the datatracker",
+ "to": [
+ "ietf_secretariat",
+ "nomcom_chair"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "nomination_created_person"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients the first time a person is nominated for a position, asking them to accept or decline the nomination",
+ "to": [
+ "nominee"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "nomination_new_nominee"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients for a message confirming a nomination was made",
+ "to": [
+ "nominator"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "nomination_receipt_requested"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients for a message noting a new nomination has been received",
+ "to": [
+ "nomcom_chair"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "nomination_received"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients for a message requesting that duplicated Person records be merged ",
+ "to": [
+ "ietf_secretariat"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "person_merge_requested"
+ },
+ {
+ "fields": {
+ "cc": [
+ "doc_group_chairs",
+ "doc_group_mail_list",
+ "doc_notify",
+ "doc_shepherd",
+ "iesg_secretary"
+ ],
+ "desc": "Recipients when a draft is submitted to the IESG",
+ "to": [
+ "doc_ad"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "pubreq_iesg"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients when a non-IETF stream manager requests publication",
+ "to": [
+ "rfc_editor"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "pubreq_rfced"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients for IANA message when a non-IETF stream manager requests publication",
+ "to": [
+ "iana_approve"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "pubreq_rfced_iana"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients when a draft resurrection request has been completed",
+ "to": [
+ "doc_ad",
+ "iesg_secretary"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "resurrection_completed"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients of a request to change the state of a draft away from 'Dead'",
+ "to": [
+ "internet_draft_requests"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "resurrection_requested"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients when an review team secretary send a summary of open review assignments",
+ "to": [
+ "group_mail_list"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "review_assignments_summarized"
+ },
+ {
+ "fields": {
+ "cc": [
+ "ietf_general",
+ "review_doc_all_parties",
+ "review_doc_group_mail_list"
+ ],
+ "desc": "Recipients when an review is completed",
+ "to": [
+ "review_team_mail_list"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "review_completed"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients when a team notifies area directors when a review with one of a certain set of results (typically results indicating problem) is submitted",
+ "to": [
+ "review_doc_ad",
+ "review_team_ads"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "review_notify_ad"
+ },
+ {
+ "fields": {
+ "cc": [
+ "group_responsible_directors"
+ ],
+ "desc": "Recipients when a group is sent a reminder to submit minutes for a session",
+ "to": [
+ "group_chairs",
+ "group_secretaries"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "session_minutes_reminder"
+ },
+ {
+ "fields": {
+ "cc": [
+ "group_chairs",
+ "group_mail_list",
+ "group_responsible_directors",
+ "logged_in_person"
+ ],
+ "desc": "Recipients for a message cancelling a session request",
+ "to": [
+ "session_requests"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "session_request_cancelled"
+ },
+ {
+ "fields": {
+ "cc": [
+ "group_chairs",
+ "group_mail_list",
+ "group_responsible_directors",
+ "logged_in_person"
+ ],
+ "desc": "Recipients for a message noting a group plans to not meet",
+ "to": [
+ "session_requests"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "session_request_not_meeting"
+ },
+ {
+ "fields": {
+ "cc": [
+ "group_chairs",
+ "group_mail_list",
+ "group_responsible_directors",
+ "logged_in_person"
+ ],
+ "desc": "Recipients for a normal meeting session request",
+ "to": [
+ "session_requests"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "session_requested"
+ },
+ {
+ "fields": {
+ "cc": [
+ "group_chairs",
+ "logged_in_person",
+ "session_requests"
+ ],
+ "desc": "Recipients for a meeting session request for more than 2 sessions",
+ "to": [
+ "group_responsible_directors"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "session_requested_long"
+ },
+ {
+ "fields": {
+ "cc": [
+ "group_mail_list",
+ "group_responsible_directors"
+ ],
+ "desc": "Recipients for details when a session has been scheduled",
+ "to": [
+ "group_chairs",
+ "session_requester"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "session_scheduled"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients when slides are proposed for a given session",
+ "to": [
+ "group_chairs",
+ "group_responsible_directors",
+ "group_secretaries"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "slides_proposed"
+ },
+ {
+ "fields": {
+ "cc": [
+ "submission_group_mail_list"
+ ],
+ "desc": "Recipients for the announcement of a successfully submitted draft",
+ "to": [
+ "id_announce"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "sub_announced"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients for the announcement to the authors of a successfully submitted draft",
+ "to": [
+ "submission_authors",
+ "submission_confirmers"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "sub_announced_to_authors"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients for a message requesting group chair approval of a draft submission",
+ "to": [
+ "submission_group_chairs"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "sub_chair_approval_requested"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients for a message requesting confirmation of a draft submission",
+ "to": [
+ "submission_confirmers"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "sub_confirmation_requested"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients for a message with the full URL for managing a draft submission",
+ "to": [
+ "submission_confirmers"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "sub_management_url_requested"
+ },
+ {
+ "fields": {
+ "cc": [
+ "submission_authors",
+ "submission_group_chairs",
+ "submission_submitter"
+ ],
+ "desc": "Recipients for a manual post request for a draft submission",
+ "to": [
+ "internet_draft_requests"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "sub_manual_post_requested"
+ },
+ {
+ "fields": {
+ "cc": [],
+ "desc": "Recipients for notification of a new version of an existing document",
+ "to": [
+ "doc_ad",
+ "doc_discussing_ads",
+ "doc_non_ietf_stream_manager",
+ "doc_notify",
+ "rfc_editor_if_doc_in_queue"
+ ]
+ },
+ "model": "mailtrigger.mailtrigger",
+ "pk": "sub_new_version"
+ },
+ {
+ "fields": {
+ "desc": "The person providing a comment to nomcom",
+ "template": "{{commenter}}"
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "commenter"
+ },
+ {
+ "fields": {
+ "desc": "The steering group (e.g. IRSG) of a document being reviewed for IETF stream conflicts",
+ "template": null
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "conflict_review_steering_group"
+ },
+ {
+ "fields": {
+ "desc": "The stream manager of a document being reviewed for IETF stream conflicts",
+ "template": null
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "conflict_review_stream_manager"
+ },
+ {
+ "fields": {
+ "desc": "The document's responsible Area Director",
+ "template": "{% if doc.ad %}<{{doc.ad.email_address}}>{% endif %}"
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "doc_ad"
+ },
+ {
+ "fields": {
+ "desc": "The authors of the subject documents of a conflict-review or status-change",
+ "template": null
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "doc_affecteddoc_authors"
+ },
+ {
+ "fields": {
+ "desc": "The chairs of groups of the subject documents of a conflict-review or status-change",
+ "template": null
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "doc_affecteddoc_group_chairs"
+ },
+ {
+ "fields": {
+ "desc": "The notify field of the subject documents of a conflict-review or status-change",
+ "template": null
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "doc_affecteddoc_notify"
+ },
+ {
+ "fields": {
+ "desc": "The document's authors",
+ "template": "{% if doc.type_id == \"draft\" %}<{{doc.name}}@ietf.org>{% endif %}"
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "doc_authors"
+ },
+ {
+ "fields": {
+ "desc": "The authors of the document, without using the draft aliases",
+ "template": "{{doc.author_list}}"
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "doc_authors_expanded"
+ },
+ {
+ "fields": {
+ "desc": "Any ADs holding an active DISCUSS position on a given document",
+ "template": null
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "doc_discussing_ads"
+ },
+ {
+ "fields": {
+ "desc": "The document's group chairs (if the document is assigned to a working or research group)",
+ "template": null
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "doc_group_chairs"
+ },
+ {
+ "fields": {
+ "desc": "The document's group delegates (if the document is assigned to a working or research group)",
+ "template": null
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "doc_group_delegates"
+ },
+ {
+ "fields": {
+ "desc": "The list address of the document's group",
+ "template": null
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "doc_group_mail_list"
+ },
+ {
+ "fields": {
+ "desc": "The document's group's responsible AD(s) or IRTF chair",
+ "template": null
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "doc_group_responsible_directors"
+ },
+ {
+ "fields": {
+ "desc": "Leadership for a document that has a new IPR disclosure",
+ "template": null
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "doc_ipr_group_or_ad"
+ },
+ {
+ "fields": {
+ "desc": "The document's stream manager if the document is not in the IETF stream",
+ "template": null
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "doc_non_ietf_stream_manager"
+ },
+ {
+ "fields": {
+ "desc": "The addresses in the document's notify field",
+ "template": "{{doc.notify}}"
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "doc_notify"
+ },
+ {
+ "fields": {
+ "desc": "The document's shepherd",
+ "template": "{% if doc.shepherd %}<{{doc.shepherd.address}}>{% endif %}"
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "doc_shepherd"
+ },
+ {
+ "fields": {
+ "desc": "The manager of the document's stream",
+ "template": null
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "doc_stream_manager"
+ },
+ {
+ "fields": {
+ "desc": "The group's chairs",
+ "template": "{% if group and group.acronym %}<{{group.acronym}}-chairs@ietf.org>{% endif %}"
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "group_chairs"
+ },
+ {
+ "fields": {
+ "desc": "Any personnel who were added or deleted when a group's personnel changes",
+ "template": "{% if changed_personnel %} {{ changed_personnel | join:\", \" }} {% endif %}"
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "group_changed_personnel"
+ },
+ {
+ "fields": {
+ "desc": "The group's mailing list",
+ "template": "{% if group.list_email %}<{{ group.list_email }}>{% endif %}"
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "group_mail_list"
+ },
+ {
+ "fields": {
+ "desc": "The group's responsible AD(s) or IRTF chair",
+ "template": null
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "group_responsible_directors"
+ },
+ {
+ "fields": {
+ "desc": "The group's secretaries",
+ "template": null
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "group_secretaries"
+ },
+ {
+ "fields": {
+ "desc": "The group's steering group (IESG or IRSG)",
+ "template": null
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "group_steering_group"
+ },
+ {
+ "fields": {
+ "desc": "The group's stream's announce list",
+ "template": "{% if group.type_id == 'wg' %}IETF-Announce {% elif group.type_id == 'rg' %}IRTF-Announce {% endif %}"
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "group_stream_announce"
+ },
+ {
+ "fields": {
+ "desc": "The IAB",
+ "template": "The IAB "
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "iab"
+ },
+ {
+ "fields": {
+ "desc": "IANA",
+ "template": ""
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "iana"
+ },
+ {
+ "fields": {
+ "desc": "IANA's draft approval address",
+ "template": "IANA "
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "iana_approve"
+ },
+ {
+ "fields": {
+ "desc": "IANA's draft evaluation address",
+ "template": "IANA "
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "iana_eval"
+ },
+ {
+ "fields": {
+ "desc": "IANA's draft last call address",
+ "template": "IANA "
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "iana_last_call"
+ },
+ {
+ "fields": {
+ "desc": "The I-D-Announce Email List",
+ "template": ""
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "id_announce"
+ },
+ {
+ "fields": {
+ "desc": "The IESG",
+ "template": "The IESG "
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "iesg"
+ },
+ {
+ "fields": {
+ "desc": "The Secretariat",
+ "template": ""
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "iesg_secretary"
+ },
+ {
+ "fields": {
+ "desc": "The IETF Announce list",
+ "template": "IETF-Announce "
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "ietf_announce"
+ },
+ {
+ "fields": {
+ "desc": "The IETF general discussion list",
+ "template": "ietf@ietf.org"
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "ietf_general"
+ },
+ {
+ "fields": {
+ "desc": "The Secretariat",
+ "template": ""
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "ietf_secretariat"
+ },
+ {
+ "fields": {
+ "desc": "The internet drafts ticketing system",
+ "template": ""
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "internet_draft_requests"
+ },
+ {
+ "fields": {
+ "desc": "The IETF IPR announce list",
+ "template": "ipr-announce@ietf.org"
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "ipr_announce"
+ },
+ {
+ "fields": {
+ "desc": "The ipr disclosure handling system",
+ "template": ""
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "ipr_requests"
+ },
+ {
+ "fields": {
+ "desc": "The submitter of an IPR disclosure",
+ "template": "{% if ipr.submitter_email %}{{ ipr.submitter_email }}{% endif %}"
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "ipr_submitter"
+ },
+ {
+ "fields": {
+ "desc": "The submitter (or ietf participant if the submitter is not available) of all IPR disclosures updated directly by this disclosure, without recursing to what the updated disclosures might have updated.",
+ "template": null
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "ipr_updatedipr_contacts"
+ },
+ {
+ "fields": {
+ "desc": "The holders of all IPR disclosures updated by disclosure and disclosures updated by those and so on.",
+ "template": null
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "ipr_updatedipr_holders"
+ },
+ {
+ "fields": {
+ "desc": "Alias for secretariat liaison administration",
+ "template": ""
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "liaison_admin"
+ },
+ {
+ "fields": {
+ "desc": "The set of people who can approve this liasion statemetns",
+ "template": "{{liaison.approver_emails|join:\", \"}}"
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "liaison_approvers"
+ },
+ {
+ "fields": {
+ "desc": "The addresses captured in the Cc field of the liaison statement form",
+ "template": "{{liaison.cc_contacts}}"
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "liaison_cc"
+ },
+ {
+ "fields": {
+ "desc": "The assigned liaison manager for an external group ",
+ "template": null
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "liaison_manager"
+ },
+ {
+ "fields": {
+ "desc": "The addresses captured in the response contact field of the liaison statement form",
+ "template": "{{liaison.response_contacts}}"
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "liaison_response_contacts"
+ },
+ {
+ "fields": {
+ "desc": "The addresses captured in the technical contact field of the liaison statement form",
+ "template": "{{liaison.technical_contacts}}"
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "liaison_technical_contacts"
+ },
+ {
+ "fields": {
+ "desc": "The addresses captured in the To field of the liaison statement form",
+ "template": "{{liaison.to_contacts}}"
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "liaison_to_contacts"
+ },
+ {
+ "fields": {
+ "desc": "The person currently logged into the datatracker who initiated a given action",
+ "template": "{% if person and person.email_address %}<{{ person.email_address }}>{% endif %}"
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "logged_in_person"
+ },
+ {
+ "fields": {
+ "desc": "The IETF New Work list",
+ "template": ""
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "new_work"
+ },
+ {
+ "fields": {
+ "desc": "The chair of a given nomcom",
+ "template": "{{nomcom.group.get_chair.email.address}}"
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "nomcom_chair"
+ },
+ {
+ "fields": {
+ "desc": "The person that submitted a nomination to nomcom",
+ "template": "{{nominator}}"
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "nominator"
+ },
+ {
+ "fields": {
+ "desc": "The person nominated for a position",
+ "template": "{{nominee}}"
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "nominee"
+ },
+ {
+ "fields": {
+ "desc": "The reviewed document's responsible area director",
+ "template": "{% if review_req.doc.ad %}{{review_req.doc.ad.email_address}}{% endif %}"
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "review_doc_ad"
+ },
+ {
+ "fields": {
+ "desc": "The .all alias for the document being reviewed",
+ "template": "{% if review_req.doc.type_id == 'draft' %}<{{review_req.doc.name}}.all@ietf.org>{% endif %}"
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "review_doc_all_parties"
+ },
+ {
+ "fields": {
+ "desc": "The working group list for the document being reviewed",
+ "template": "{{review_req.doc.group.list_email}}"
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "review_doc_group_mail_list"
+ },
+ {
+ "fields": {
+ "desc": "The ADs of the team reviewing the document",
+ "template": null
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "review_team_ads"
+ },
+ {
+ "fields": {
+ "desc": "The review team's email list",
+ "template": "{{review_req.team.list_email}}"
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "review_team_mail_list"
+ },
+ {
+ "fields": {
+ "desc": "The RFC Editor",
+ "template": ""
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "rfc_editor"
+ },
+ {
+ "fields": {
+ "desc": "The RFC Editor if a document is in the RFC Editor queue",
+ "template": null
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "rfc_editor_if_doc_in_queue"
+ },
+ {
+ "fields": {
+ "desc": "The person that requested a meeting slot for a given group",
+ "template": null
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "session_requester"
+ },
+ {
+ "fields": {
+ "desc": "The session request ticketing system",
+ "template": ""
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "session_requests"
+ },
+ {
+ "fields": {
+ "desc": "The managers of any related streams",
+ "template": null
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "stream_managers"
+ },
+ {
+ "fields": {
+ "desc": "The authors of a submitted draft",
+ "template": null
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "submission_authors"
+ },
+ {
+ "fields": {
+ "desc": "The people who can confirm a draft submission",
+ "template": null
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "submission_confirmers"
+ },
+ {
+ "fields": {
+ "desc": "The chairs of a submitted draft belonging to a group",
+ "template": null
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "submission_group_chairs"
+ },
+ {
+ "fields": {
+ "desc": "The mailing list of the group associated with a submitted document",
+ "template": ""
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "submission_group_mail_list"
+ },
+ {
+ "fields": {
+ "desc": "IETF manual post handling",
+ "template": ""
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "submission_manualpost_handling"
+ },
+ {
+ "fields": {
+ "desc": "The person that submitted a draft",
+ "template": "{{submission.submitter}}"
+ },
+ "model": "mailtrigger.recipient",
+ "pk": "submission_submitter"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "AD Office Hours",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.agendatypename",
+ "pk": "ad"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "IETF Agenda",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.agendatypename",
+ "pk": "ietf"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Side Meetings",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.agendatypename",
+ "pk": "side"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Workshops",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.agendatypename",
+ "pk": "workshop"
+ },
+ {
+ "fields": {
+ "blocking": false,
+ "desc": "",
+ "name": "Abstain",
+ "order": 4,
+ "used": true
+ },
+ "model": "name.ballotpositionname",
+ "pk": "abstain"
+ },
+ {
+ "fields": {
+ "blocking": true,
+ "desc": "",
+ "name": "Block",
+ "order": 3,
+ "used": true
+ },
+ "model": "name.ballotpositionname",
+ "pk": "block"
+ },
+ {
+ "fields": {
+ "blocking": true,
+ "desc": "",
+ "name": "Discuss",
+ "order": 3,
+ "used": true
+ },
+ "model": "name.ballotpositionname",
+ "pk": "discuss"
+ },
+ {
+ "fields": {
+ "blocking": false,
+ "desc": "",
+ "name": "No Objection",
+ "order": 2,
+ "used": true
+ },
+ "model": "name.ballotpositionname",
+ "pk": "noobj"
+ },
+ {
+ "fields": {
+ "blocking": false,
+ "desc": "",
+ "name": "No Record",
+ "order": 6,
+ "used": true
+ },
+ "model": "name.ballotpositionname",
+ "pk": "norecord"
+ },
+ {
+ "fields": {
+ "blocking": false,
+ "desc": "",
+ "name": "Recuse",
+ "order": 5,
+ "used": true
+ },
+ "model": "name.ballotpositionname",
+ "pk": "recuse"
+ },
+ {
+ "fields": {
+ "blocking": false,
+ "desc": "",
+ "name": "Yes",
+ "order": 1,
+ "used": true
+ },
+ "model": "name.ballotpositionname",
+ "pk": "yes"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Person must be present",
+ "order": 0,
+ "penalty": 200000,
+ "used": true
+ },
+ "model": "name.constraintname",
+ "pk": "bethere"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Conflicts with (secondary)",
+ "order": 0,
+ "penalty": 10000,
+ "used": true
+ },
+ "model": "name.constraintname",
+ "pk": "conflic2"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Conflicts with (tertiary)",
+ "order": 0,
+ "penalty": 1000,
+ "used": true
+ },
+ "model": "name.constraintname",
+ "pk": "conflic3"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Conflicts with",
+ "order": 0,
+ "penalty": 100000,
+ "used": true
+ },
+ "model": "name.constraintname",
+ "pk": "conflict"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Africa",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.continentname",
+ "pk": "africa"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Antarctica",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.continentname",
+ "pk": "antarctica"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Asia",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.continentname",
+ "pk": "asia"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Europe",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.continentname",
+ "pk": "europe"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "North America",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.continentname",
+ "pk": "north-america"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Oceania",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.continentname",
+ "pk": "oceania"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "South America",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.continentname",
+ "pk": "south-america"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": false,
+ "name": "Andorra",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "AD"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "United Arab Emirates",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "AE"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Afghanistan",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "AF"
+ },
+ {
+ "fields": {
+ "continent": "north-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Antigua and Barbuda",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "AG"
+ },
+ {
+ "fields": {
+ "continent": "north-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Anguilla",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "AI"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": false,
+ "name": "Albania",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "AL"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Armenia",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "AM"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Angola",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "AO"
+ },
+ {
+ "fields": {
+ "continent": "antarctica",
+ "desc": "",
+ "in_eu": false,
+ "name": "Antarctica",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "AQ"
+ },
+ {
+ "fields": {
+ "continent": "south-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Argentina",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "AR"
+ },
+ {
+ "fields": {
+ "continent": "oceania",
+ "desc": "",
+ "in_eu": false,
+ "name": "American Samoa",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "AS"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": true,
+ "name": "Austria",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "AT"
+ },
+ {
+ "fields": {
+ "continent": "oceania",
+ "desc": "",
+ "in_eu": false,
+ "name": "Australia",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "AU"
+ },
+ {
+ "fields": {
+ "continent": "north-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Aruba",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "AW"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": false,
+ "name": "Ã…land Islands",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "AX"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Azerbaijan",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "AZ"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": false,
+ "name": "Bosnia and Herzegovina",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "BA"
+ },
+ {
+ "fields": {
+ "continent": "north-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Barbados",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "BB"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Bangladesh",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "BD"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": true,
+ "name": "Belgium",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "BE"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Burkina Faso",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "BF"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": true,
+ "name": "Bulgaria",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "BG"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Bahrain",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "BH"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Burundi",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "BI"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Benin",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "BJ"
+ },
+ {
+ "fields": {
+ "continent": "north-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Saint Barthélemy",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "BL"
+ },
+ {
+ "fields": {
+ "continent": "north-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Bermuda",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "BM"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Brunei",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "BN"
+ },
+ {
+ "fields": {
+ "continent": "south-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Bolivia",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "BO"
+ },
+ {
+ "fields": {
+ "continent": "north-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Bonaire, Sint Eustatius and Saba",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "BQ"
+ },
+ {
+ "fields": {
+ "continent": "south-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Brazil",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "BR"
+ },
+ {
+ "fields": {
+ "continent": "north-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Bahamas",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "BS"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Bhutan",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "BT"
+ },
+ {
+ "fields": {
+ "continent": "antarctica",
+ "desc": "",
+ "in_eu": false,
+ "name": "Bouvet Island",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "BV"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Botswana",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "BW"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": false,
+ "name": "Belarus",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "BY"
+ },
+ {
+ "fields": {
+ "continent": "north-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Belize",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "BZ"
+ },
+ {
+ "fields": {
+ "continent": "north-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Canada",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "CA"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Cocos (Keeling) Islands",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "CC"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Congo (the Democratic Republic of the)",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "CD"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Central African Republic",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "CF"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Congo",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "CG"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": false,
+ "name": "Switzerland",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "CH"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Côte d'Ivoire",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "CI"
+ },
+ {
+ "fields": {
+ "continent": "oceania",
+ "desc": "",
+ "in_eu": false,
+ "name": "Cook Islands",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "CK"
+ },
+ {
+ "fields": {
+ "continent": "south-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Chile",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "CL"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Cameroon",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "CM"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "China",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "CN"
+ },
+ {
+ "fields": {
+ "continent": "south-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Colombia",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "CO"
+ },
+ {
+ "fields": {
+ "continent": "north-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Costa Rica",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "CR"
+ },
+ {
+ "fields": {
+ "continent": "north-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Cuba",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "CU"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Cabo Verde",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "CV"
+ },
+ {
+ "fields": {
+ "continent": "north-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Curaçao",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "CW"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Christmas Island",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "CX"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": true,
+ "name": "Cyprus",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "CY"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": true,
+ "name": "Czech Republic",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "CZ"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": true,
+ "name": "Germany",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "DE"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Djibouti",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "DJ"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": true,
+ "name": "Denmark",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "DK"
+ },
+ {
+ "fields": {
+ "continent": "north-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Dominica",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "DM"
+ },
+ {
+ "fields": {
+ "continent": "north-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Dominican Republic",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "DO"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Algeria",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "DZ"
+ },
+ {
+ "fields": {
+ "continent": "south-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Ecuador",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "EC"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": true,
+ "name": "Estonia",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "EE"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Egypt",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "EG"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Western Sahara",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "EH"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Eritrea",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "ER"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": true,
+ "name": "Spain",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "ES"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Ethiopia",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "ET"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": true,
+ "name": "Finland",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "FI"
+ },
+ {
+ "fields": {
+ "continent": "oceania",
+ "desc": "",
+ "in_eu": false,
+ "name": "Fiji",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "FJ"
+ },
+ {
+ "fields": {
+ "continent": "south-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Falkland Islands [Malvinas]",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "FK"
+ },
+ {
+ "fields": {
+ "continent": "oceania",
+ "desc": "",
+ "in_eu": false,
+ "name": "Micronesia (Federated States of)",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "FM"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": false,
+ "name": "Faroe Islands",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "FO"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": true,
+ "name": "France",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "FR"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Gabon",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "GA"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": true,
+ "name": "United Kingdom",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "GB"
+ },
+ {
+ "fields": {
+ "continent": "north-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Grenada",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "GD"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Georgia",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "GE"
+ },
+ {
+ "fields": {
+ "continent": "south-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "French Guiana",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "GF"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": false,
+ "name": "Guernsey",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "GG"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Ghana",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "GH"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": false,
+ "name": "Gibraltar",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "GI"
+ },
+ {
+ "fields": {
+ "continent": "north-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Greenland",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "GL"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Gambia",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "GM"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Guinea",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "GN"
+ },
+ {
+ "fields": {
+ "continent": "north-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Guadeloupe",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "GP"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Equatorial Guinea",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "GQ"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": true,
+ "name": "Greece",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "GR"
+ },
+ {
+ "fields": {
+ "continent": "antarctica",
+ "desc": "",
+ "in_eu": false,
+ "name": "South Georgia and the South Sandwich Islands",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "GS"
+ },
+ {
+ "fields": {
+ "continent": "north-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Guatemala",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "GT"
+ },
+ {
+ "fields": {
+ "continent": "oceania",
+ "desc": "",
+ "in_eu": false,
+ "name": "Guam",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "GU"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Guinea-Bissau",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "GW"
+ },
+ {
+ "fields": {
+ "continent": "south-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Guyana",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "GY"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Hong Kong",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "HK"
+ },
+ {
+ "fields": {
+ "continent": "antarctica",
+ "desc": "",
+ "in_eu": false,
+ "name": "Heard Island and McDonald Islands",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "HM"
+ },
+ {
+ "fields": {
+ "continent": "north-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Honduras",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "HN"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": true,
+ "name": "Croatia",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "HR"
+ },
+ {
+ "fields": {
+ "continent": "north-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Haiti",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "HT"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": true,
+ "name": "Hungary",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "HU"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Indonesia",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "ID"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": true,
+ "name": "Ireland",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "IE"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Israel",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "IL"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": false,
+ "name": "Isle of Man",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "IM"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "India",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "IN"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "British Indian Ocean Territory",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "IO"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Iraq",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "IQ"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Iran",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "IR"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": false,
+ "name": "Iceland",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "IS"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": true,
+ "name": "Italy",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "IT"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": false,
+ "name": "Jersey",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "JE"
+ },
+ {
+ "fields": {
+ "continent": "north-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Jamaica",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "JM"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Jordan",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "JO"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Japan",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "JP"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Kenya",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "KE"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Kyrgyzstan",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "KG"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Cambodia",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "KH"
+ },
+ {
+ "fields": {
+ "continent": "oceania",
+ "desc": "",
+ "in_eu": false,
+ "name": "Kiribati",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "KI"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Comoros",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "KM"
+ },
+ {
+ "fields": {
+ "continent": "north-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Saint Kitts and Nevis",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "KN"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "North Korea",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "KP"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "South Korea",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "KR"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Kuwait",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "KW"
+ },
+ {
+ "fields": {
+ "continent": "north-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Cayman Islands",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "KY"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Kazakhstan",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "KZ"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Laos",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "LA"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Lebanon",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "LB"
+ },
+ {
+ "fields": {
+ "continent": "north-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Saint Lucia",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "LC"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": false,
+ "name": "Liechtenstein",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "LI"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Sri Lanka",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "LK"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Liberia",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "LR"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Lesotho",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "LS"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": true,
+ "name": "Lithuania",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "LT"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": true,
+ "name": "Luxembourg",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "LU"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": true,
+ "name": "Latvia",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "LV"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Libya",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "LY"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Morocco",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "MA"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": false,
+ "name": "Monaco",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "MC"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": false,
+ "name": "Moldova",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "MD"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": false,
+ "name": "Montenegro",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "ME"
+ },
+ {
+ "fields": {
+ "continent": "north-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Saint Martin (French part)",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "MF"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Madagascar",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "MG"
+ },
+ {
+ "fields": {
+ "continent": "oceania",
+ "desc": "",
+ "in_eu": false,
+ "name": "Marshall Islands",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "MH"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": false,
+ "name": "Macedonia",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "MK"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Mali",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "ML"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Myanmar",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "MM"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Mongolia",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "MN"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Macao",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "MO"
+ },
+ {
+ "fields": {
+ "continent": "oceania",
+ "desc": "",
+ "in_eu": false,
+ "name": "Northern Mariana Islands",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "MP"
+ },
+ {
+ "fields": {
+ "continent": "north-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Martinique",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "MQ"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Mauritania",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "MR"
+ },
+ {
+ "fields": {
+ "continent": "north-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Montserrat",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "MS"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": true,
+ "name": "Malta",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "MT"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Mauritius",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "MU"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Maldives",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "MV"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Malawi",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "MW"
+ },
+ {
+ "fields": {
+ "continent": "north-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Mexico",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "MX"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Malaysia",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "MY"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Mozambique",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "MZ"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Namibia",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "NA"
+ },
+ {
+ "fields": {
+ "continent": "oceania",
+ "desc": "",
+ "in_eu": false,
+ "name": "New Caledonia",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "NC"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Niger",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "NE"
+ },
+ {
+ "fields": {
+ "continent": "oceania",
+ "desc": "",
+ "in_eu": false,
+ "name": "Norfolk Island",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "NF"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Nigeria",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "NG"
+ },
+ {
+ "fields": {
+ "continent": "north-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Nicaragua",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "NI"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": true,
+ "name": "Netherlands",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "NL"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": false,
+ "name": "Norway",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "NO"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Nepal",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "NP"
+ },
+ {
+ "fields": {
+ "continent": "oceania",
+ "desc": "",
+ "in_eu": false,
+ "name": "Nauru",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "NR"
+ },
+ {
+ "fields": {
+ "continent": "oceania",
+ "desc": "",
+ "in_eu": false,
+ "name": "Niue",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "NU"
+ },
+ {
+ "fields": {
+ "continent": "oceania",
+ "desc": "",
+ "in_eu": false,
+ "name": "New Zealand",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "NZ"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Oman",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "OM"
+ },
+ {
+ "fields": {
+ "continent": "north-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Panama",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "PA"
+ },
+ {
+ "fields": {
+ "continent": "south-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Peru",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "PE"
+ },
+ {
+ "fields": {
+ "continent": "oceania",
+ "desc": "",
+ "in_eu": false,
+ "name": "French Polynesia",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "PF"
+ },
+ {
+ "fields": {
+ "continent": "oceania",
+ "desc": "",
+ "in_eu": false,
+ "name": "Papua New Guinea",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "PG"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Philippines",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "PH"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Pakistan",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "PK"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": true,
+ "name": "Poland",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "PL"
+ },
+ {
+ "fields": {
+ "continent": "north-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Saint Pierre and Miquelon",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "PM"
+ },
+ {
+ "fields": {
+ "continent": "oceania",
+ "desc": "",
+ "in_eu": false,
+ "name": "Pitcairn",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "PN"
+ },
+ {
+ "fields": {
+ "continent": "north-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Puerto Rico",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "PR"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Palestine, State of",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "PS"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": true,
+ "name": "Portugal",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "PT"
+ },
+ {
+ "fields": {
+ "continent": "oceania",
+ "desc": "",
+ "in_eu": false,
+ "name": "Palau",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "PW"
+ },
+ {
+ "fields": {
+ "continent": "south-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Paraguay",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "PY"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Qatar",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "QA"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Réunion",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "RE"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": true,
+ "name": "Romania",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "RO"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": false,
+ "name": "Serbia",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "RS"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": false,
+ "name": "Russia",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "RU"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Rwanda",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "RW"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Saudi Arabia",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "SA"
+ },
+ {
+ "fields": {
+ "continent": "oceania",
+ "desc": "",
+ "in_eu": false,
+ "name": "Solomon Islands",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "SB"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Seychelles",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "SC"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Sudan",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "SD"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": true,
+ "name": "Sweden",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "SE"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Singapore",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "SG"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Saint Helena, Ascension and Tristan da Cunha",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "SH"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": true,
+ "name": "Slovenia",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "SI"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": false,
+ "name": "Svalbard and Jan Mayen",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "SJ"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": true,
+ "name": "Slovakia",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "SK"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Sierra Leone",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "SL"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": false,
+ "name": "San Marino",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "SM"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Senegal",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "SN"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Somalia",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "SO"
+ },
+ {
+ "fields": {
+ "continent": "south-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Suriname",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "SR"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "South Sudan",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "SS"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Sao Tome and Principe",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "ST"
+ },
+ {
+ "fields": {
+ "continent": "north-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "El Salvador",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "SV"
+ },
+ {
+ "fields": {
+ "continent": "north-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Sint Maarten (Dutch part)",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "SX"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Syria",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "SY"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Swaziland",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "SZ"
+ },
+ {
+ "fields": {
+ "continent": "north-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Turks and Caicos Islands",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "TC"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Chad",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "TD"
+ },
+ {
+ "fields": {
+ "continent": "antarctica",
+ "desc": "",
+ "in_eu": false,
+ "name": "French Southern Territories",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "TF"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Togo",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "TG"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Thailand",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "TH"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Tajikistan",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "TJ"
+ },
+ {
+ "fields": {
+ "continent": "oceania",
+ "desc": "",
+ "in_eu": false,
+ "name": "Tokelau",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "TK"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Timor-Leste",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "TL"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Turkmenistan",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "TM"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Tunisia",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "TN"
+ },
+ {
+ "fields": {
+ "continent": "oceania",
+ "desc": "",
+ "in_eu": false,
+ "name": "Tonga",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "TO"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": false,
+ "name": "Turkey",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "TR"
+ },
+ {
+ "fields": {
+ "continent": "north-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Trinidad and Tobago",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "TT"
+ },
+ {
+ "fields": {
+ "continent": "oceania",
+ "desc": "",
+ "in_eu": false,
+ "name": "Tuvalu",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "TV"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Taiwan",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "TW"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Tanzania",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "TZ"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": false,
+ "name": "Ukraine",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "UA"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Uganda",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "UG"
+ },
+ {
+ "fields": {
+ "continent": "oceania",
+ "desc": "",
+ "in_eu": false,
+ "name": "United States Minor Outlying Islands",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "UM"
+ },
+ {
+ "fields": {
+ "continent": "north-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "United States of America",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "US"
+ },
+ {
+ "fields": {
+ "continent": "south-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Uruguay",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "UY"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Uzbekistan",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "UZ"
+ },
+ {
+ "fields": {
+ "continent": "europe",
+ "desc": "",
+ "in_eu": false,
+ "name": "Holy See",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "VA"
+ },
+ {
+ "fields": {
+ "continent": "north-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Saint Vincent and the Grenadines",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "VC"
+ },
+ {
+ "fields": {
+ "continent": "south-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Venezuela",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "VE"
+ },
+ {
+ "fields": {
+ "continent": "north-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Virgin Islands (British)",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "VG"
+ },
+ {
+ "fields": {
+ "continent": "north-america",
+ "desc": "",
+ "in_eu": false,
+ "name": "Virgin Islands (U.S.)",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "VI"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Vietnam",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "VN"
+ },
+ {
+ "fields": {
+ "continent": "oceania",
+ "desc": "",
+ "in_eu": false,
+ "name": "Vanuatu",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "VU"
+ },
+ {
+ "fields": {
+ "continent": "oceania",
+ "desc": "",
+ "in_eu": false,
+ "name": "Wallis and Futuna",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "WF"
+ },
+ {
+ "fields": {
+ "continent": "oceania",
+ "desc": "",
+ "in_eu": false,
+ "name": "Samoa",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "WS"
+ },
+ {
+ "fields": {
+ "continent": "asia",
+ "desc": "",
+ "in_eu": false,
+ "name": "Yemen",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "YE"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Mayotte",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "YT"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "South Africa",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "ZA"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Zambia",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "ZM"
+ },
+ {
+ "fields": {
+ "continent": "africa",
+ "desc": "",
+ "in_eu": false,
+ "name": "Zimbabwe",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.countryname",
+ "pk": "ZW"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Django",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.dbtemplatetypename",
+ "pk": "django"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Plain",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.dbtemplatetypename",
+ "pk": "plain"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "reStructuredText",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.dbtemplatetypename",
+ "pk": "rst"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "conflict reviews",
+ "order": 0,
+ "revname": "Conflict reviewed by",
+ "used": true
+ },
+ "model": "name.docrelationshipname",
+ "pk": "conflrev"
+ },
+ {
+ "fields": {
+ "desc": "Approval for downref",
+ "name": "approves downref to",
+ "order": 0,
+ "revname": "was approved for downref by",
+ "used": true
+ },
+ "model": "name.docrelationshipname",
+ "pk": "downref-approval"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Obsoletes",
+ "order": 0,
+ "revname": "Obsoleted by",
+ "used": true
+ },
+ "model": "name.docrelationshipname",
+ "pk": "obs"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Possibly Replaces",
+ "order": 0,
+ "revname": "Possibly Replaced By",
+ "used": true
+ },
+ "model": "name.docrelationshipname",
+ "pk": "possibly-replaces"
+ },
+ {
+ "fields": {
+ "desc": "Informative Reference",
+ "name": "informatively references",
+ "order": 0,
+ "revname": "is informatively referenced by",
+ "used": true
+ },
+ "model": "name.docrelationshipname",
+ "pk": "refinfo"
+ },
+ {
+ "fields": {
+ "desc": "Normative Reference",
+ "name": "normatively references",
+ "order": 0,
+ "revname": "is normatively referenced by",
+ "used": true
+ },
+ "model": "name.docrelationshipname",
+ "pk": "refnorm"
+ },
+ {
+ "fields": {
+ "desc": "A reference found in a document which does not have split normative/informative reference sections.",
+ "name": "Reference",
+ "order": 0,
+ "revname": "Referenced by",
+ "used": true
+ },
+ "model": "name.docrelationshipname",
+ "pk": "refold"
+ },
+ {
+ "fields": {
+ "desc": "Reference of unknown type, likely found in the text of the document.",
+ "name": "Possible Reference",
+ "order": 3,
+ "revname": "Possibly Referenced By",
+ "used": true
+ },
+ "model": "name.docrelationshipname",
+ "pk": "refunk"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Replaces",
+ "order": 0,
+ "revname": "Replaced by",
+ "used": true
+ },
+ "model": "name.docrelationshipname",
+ "pk": "replaces"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Moves to BCP",
+ "order": 0,
+ "revname": "Moved to BCP by",
+ "used": true
+ },
+ "model": "name.docrelationshipname",
+ "pk": "tobcp"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Moves to Experimental",
+ "order": 0,
+ "revname": "Moved to Experimental by",
+ "used": true
+ },
+ "model": "name.docrelationshipname",
+ "pk": "toexp"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Moves to Historic",
+ "order": 0,
+ "revname": "Moved to Historic by",
+ "used": true
+ },
+ "model": "name.docrelationshipname",
+ "pk": "tohist"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Moves to Informational",
+ "order": 0,
+ "revname": "Moved to Informational by",
+ "used": true
+ },
+ "model": "name.docrelationshipname",
+ "pk": "toinf"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Moves to Internet Standard",
+ "order": 0,
+ "revname": "Moved to Internet Standard by",
+ "used": true
+ },
+ "model": "name.docrelationshipname",
+ "pk": "tois"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Moves to Proposed Standard",
+ "order": 0,
+ "revname": "Moved to Proposed Standard by",
+ "used": true
+ },
+ "model": "name.docrelationshipname",
+ "pk": "tops"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Updates",
+ "order": 0,
+ "revname": "Updated by",
+ "used": true
+ },
+ "model": "name.docrelationshipname",
+ "pk": "updates"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Stream state should change",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.docremindertypename",
+ "pk": "stream-s"
+ },
+ {
+ "fields": {
+ "desc": "A generic substate indicating that the shepherding AD has the action item to determine appropriate next steps. In particular, the appropriate steps (and the corresponding next state or substate) depend entirely on the nature of the issues that were raised and can only be decided with active involvement of the shepherding AD. Examples include:\n\n- if another AD raises an issue, the shepherding AD may first iterate with the other AD to get a better understanding of the exact issue. Or, the shepherding AD may attempt to argue that the issue is not serious enough to bring to the attention of the authors/WG.\n\n- if a documented issue is forwarded to a WG, some further iteration may be needed before it can be determined whether a new revision is needed or whether the WG response to an issue clarifies the issue sufficiently.\n\n- when a new revision appears, the shepherding AD will first look at the changes to determine whether they believe all outstanding issues have been raised satisfactorily, prior to asking the ADs who raised the original issues to verify the changes.",
+ "name": "AD Followup",
+ "order": 2,
+ "used": true
+ },
+ "model": "name.doctagname",
+ "pk": "ad-f-up"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Approved in minutes",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.doctagname",
+ "pk": "app-min"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Has errata",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.doctagname",
+ "pk": "errata"
+ },
+ {
+ "fields": {
+ "desc": "The document is awaiting review or input from an external party (i.e, someone other than the shepherding AD, the authors, or the WG). See the \"note\" field for more details on who has the action.",
+ "name": "External Party",
+ "order": 3,
+ "used": true
+ },
+ "model": "name.doctagname",
+ "pk": "extpty"
+ },
+ {
+ "fields": {
+ "desc": "The document has IANA actions that are not yet completed.",
+ "name": "IANA",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.doctagname",
+ "pk": "iana"
+ },
+ {
+ "fields": {
+ "desc": "RFC-Editor/IANA Registration Coordination",
+ "name": "IANA coordination",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.doctagname",
+ "pk": "iana-crd"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "IESG Review Completed",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.doctagname",
+ "pk": "iesg-com"
+ },
+ {
+ "fields": {
+ "desc": "Awaiting missing normative reference",
+ "name": "Missing references",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.doctagname",
+ "pk": "missref"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Author or Editor Needed",
+ "order": 4,
+ "used": true
+ },
+ "model": "name.doctagname",
+ "pk": "need-aut"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Editor Needed",
+ "order": 1,
+ "used": true
+ },
+ "model": "name.doctagname",
+ "pk": "need-ed"
+ },
+ {
+ "fields": {
+ "desc": "An updated I-D is needed to address the issues that have been raised.",
+ "name": "Revised I-D Needed",
+ "order": 5,
+ "used": true
+ },
+ "model": "name.doctagname",
+ "pk": "need-rev"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Shepherd Needed",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.doctagname",
+ "pk": "need-sh"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Polled for WG adoption but not adopted",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.doctagname",
+ "pk": "no-adopt"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Other - see Comment Log",
+ "order": 11,
+ "used": true
+ },
+ "model": "name.doctagname",
+ "pk": "other"
+ },
+ {
+ "fields": {
+ "desc": "IESG discussions on the document have raised some issues that need to be brought to the attention of the authors/WG, but those issues have not been written down yet. (It is common for discussions during a telechat to result in such situations. An AD may raise a possible issue during a telechat and only decide as a result of that discussion whether the issue is worth formally writing up and bringing to the attention of the authors/WG). A document stays in the \"Point Raised - Writeup Needed\" state until *ALL* IESG comments that have been raised have been documented.",
+ "name": "Point Raised - writeup needed",
+ "order": 1,
+ "used": true
+ },
+ "model": "name.doctagname",
+ "pk": "point"
+ },
+ {
+ "fields": {
+ "desc": "Holding for normative reference",
+ "name": "Holding for references",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.doctagname",
+ "pk": "ref"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Revised I-D Needed - Issue raised by AD",
+ "order": 8,
+ "used": true
+ },
+ "model": "name.doctagname",
+ "pk": "rev-ad"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Revised I-D Needed - Issue raised by IESG",
+ "order": 9,
+ "used": true
+ },
+ "model": "name.doctagname",
+ "pk": "rev-iesg"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Revised I-D Needed - Issue raised by WG",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.doctagname",
+ "pk": "rev-wg"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Revised I-D Needed - Issue raised by WGLC",
+ "order": 7,
+ "used": true
+ },
+ "model": "name.doctagname",
+ "pk": "rev-wglc"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Review by RFC Editor",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.doctagname",
+ "pk": "rfc-rev"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Document Shepherd Followup",
+ "order": 4,
+ "used": true
+ },
+ "model": "name.doctagname",
+ "pk": "sh-f-up"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Doc Shepherd Follow-up Underway",
+ "order": 10,
+ "used": true
+ },
+ "model": "name.doctagname",
+ "pk": "sheph-u"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Via RFC Editor",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.doctagname",
+ "pk": "via-rfc"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Waiting for Dependency on Other Document",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.doctagname",
+ "pk": "w-dep"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Awaiting Expert Review/Resolution of Issues Raised",
+ "order": 1,
+ "used": true
+ },
+ "model": "name.doctagname",
+ "pk": "w-expert"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Awaiting External Review/Resolution of Issues Raised",
+ "order": 2,
+ "used": true
+ },
+ "model": "name.doctagname",
+ "pk": "w-extern"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Awaiting Merge with Other Document",
+ "order": 3,
+ "used": true
+ },
+ "model": "name.doctagname",
+ "pk": "w-merge"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Waiting for Partner Feedback",
+ "order": 2,
+ "used": true
+ },
+ "model": "name.doctagname",
+ "pk": "w-part"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Waiting for Referenced Document",
+ "order": 5,
+ "used": true
+ },
+ "model": "name.doctagname",
+ "pk": "w-refdoc"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Waiting for Referencing Document",
+ "order": 6,
+ "used": true
+ },
+ "model": "name.doctagname",
+ "pk": "w-refing"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Awaiting Reviews",
+ "order": 3,
+ "used": true
+ },
+ "model": "name.doctagname",
+ "pk": "w-review"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Agenda",
+ "order": 0,
+ "prefix": "agenda",
+ "used": true
+ },
+ "model": "name.doctypename",
+ "pk": "agenda"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Bluesheets",
+ "order": 0,
+ "prefix": "bluesheets",
+ "used": true
+ },
+ "model": "name.doctypename",
+ "pk": "bluesheets"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Charter",
+ "order": 0,
+ "prefix": "charter",
+ "used": true
+ },
+ "model": "name.doctypename",
+ "pk": "charter"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Conflict Review",
+ "order": 0,
+ "prefix": "conflict-review",
+ "used": true
+ },
+ "model": "name.doctypename",
+ "pk": "conflrev"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Draft",
+ "order": 0,
+ "prefix": "draft",
+ "used": true
+ },
+ "model": "name.doctypename",
+ "pk": "draft"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Liaison Attachment",
+ "order": 0,
+ "prefix": "liai-att",
+ "used": true
+ },
+ "model": "name.doctypename",
+ "pk": "liai-att"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Liaison",
+ "order": 0,
+ "prefix": "liaison",
+ "used": false
+ },
+ "model": "name.doctypename",
+ "pk": "liaison"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Minutes",
+ "order": 0,
+ "prefix": "minutes",
+ "used": true
+ },
+ "model": "name.doctypename",
+ "pk": "minutes"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Recording",
+ "order": 0,
+ "prefix": "recording",
+ "used": true
+ },
+ "model": "name.doctypename",
+ "pk": "recording"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Review",
+ "order": 0,
+ "prefix": "review",
+ "used": true
+ },
+ "model": "name.doctypename",
+ "pk": "review"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Shepherd's writeup",
+ "order": 0,
+ "prefix": "shepherd",
+ "used": false
+ },
+ "model": "name.doctypename",
+ "pk": "shepwrit"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Slides",
+ "order": 0,
+ "prefix": "slides",
+ "used": true
+ },
+ "model": "name.doctypename",
+ "pk": "slides"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Status Change",
+ "order": 0,
+ "prefix": "status-change",
+ "used": true
+ },
+ "model": "name.doctypename",
+ "pk": "statchg"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Document issue tracker",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.docurltagname",
+ "pk": "issues"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Document source repository",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.docurltagname",
+ "pk": "repository"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Document wiki",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.docurltagname",
+ "pk": "wiki"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Yang impact analysis",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.docurltagname",
+ "pk": "yang-impact-analysis"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Extracted yang module",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.docurltagname",
+ "pk": "yang-module"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Yang module metadata",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.docurltagname",
+ "pk": "yang-module-metadata"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Awaiting Approval from Previous Version Authors",
+ "next_states": [
+ "confirmed",
+ "cancel",
+ "posted"
+ ],
+ "order": 3,
+ "used": true
+ },
+ "model": "name.draftsubmissionstatename",
+ "pk": "aut-appr"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Awaiting Submitter Authentication",
+ "next_states": [
+ "confirmed",
+ "cancel",
+ "posted"
+ ],
+ "order": 2,
+ "used": true
+ },
+ "model": "name.draftsubmissionstatename",
+ "pk": "auth"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Cancelled",
+ "next_states": [],
+ "order": 6,
+ "used": true
+ },
+ "model": "name.draftsubmissionstatename",
+ "pk": "cancel"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Confirmed",
+ "next_states": [
+ "cancel",
+ "posted"
+ ],
+ "order": 0,
+ "used": true
+ },
+ "model": "name.draftsubmissionstatename",
+ "pk": "confirmed"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Awaiting Initial Version Approval",
+ "next_states": [
+ "cancel",
+ "posted"
+ ],
+ "order": 4,
+ "used": true
+ },
+ "model": "name.draftsubmissionstatename",
+ "pk": "grp-appr"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Awaiting Manual Post",
+ "next_states": [
+ "cancel",
+ "posted"
+ ],
+ "order": 5,
+ "used": true
+ },
+ "model": "name.draftsubmissionstatename",
+ "pk": "manual"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Posted",
+ "next_states": [],
+ "order": 7,
+ "used": true
+ },
+ "model": "name.draftsubmissionstatename",
+ "pk": "posted"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Uploaded",
+ "next_states": [
+ "auth",
+ "aut-appr",
+ "grp-appr",
+ "manual",
+ "cancel"
+ ],
+ "order": 1,
+ "used": true
+ },
+ "model": "name.draftsubmissionstatename",
+ "pk": "uploaded"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Manual Post Waiting for Draft",
+ "next_states": [
+ "cancel",
+ "posted"
+ ],
+ "order": 8,
+ "used": true
+ },
+ "model": "name.draftsubmissionstatename",
+ "pk": "waiting-for-draft"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Comment",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.feedbacktypename",
+ "pk": "comment"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Junk",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.feedbacktypename",
+ "pk": "junk"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Nomination",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.feedbacktypename",
+ "pk": "nomina"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Questionnaire response",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.feedbacktypename",
+ "pk": "questio"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Read",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.feedbacktypename",
+ "pk": "read"
+ },
+ {
+ "fields": {
+ "desc": "Augmented Backus-Naur Form",
+ "name": "ABNF",
+ "order": 1,
+ "used": true
+ },
+ "model": "name.formallanguagename",
+ "pk": "abnf"
+ },
+ {
+ "fields": {
+ "desc": "Abstract Syntax Notation One",
+ "name": "ASN.1",
+ "order": 2,
+ "used": true
+ },
+ "model": "name.formallanguagename",
+ "pk": "asn1"
+ },
+ {
+ "fields": {
+ "desc": "Concise Binary Object Representation",
+ "name": "CBOR",
+ "order": 3,
+ "used": true
+ },
+ "model": "name.formallanguagename",
+ "pk": "cbor"
+ },
+ {
+ "fields": {
+ "desc": "Code in the C Programming Language",
+ "name": "C Code",
+ "order": 4,
+ "used": true
+ },
+ "model": "name.formallanguagename",
+ "pk": "ccode"
+ },
+ {
+ "fields": {
+ "desc": "Javascript Object Notation",
+ "name": "JSON",
+ "order": 5,
+ "used": true
+ },
+ "model": "name.formallanguagename",
+ "pk": "json"
+ },
+ {
+ "fields": {
+ "desc": "Extensible Markup Language",
+ "name": "XML",
+ "order": 6,
+ "used": true
+ },
+ "model": "name.formallanguagename",
+ "pk": "xml"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Active",
+ "order": 1,
+ "used": true
+ },
+ "model": "name.groupmilestonestatename",
+ "pk": "active"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Chartering/rechartering",
+ "order": 4,
+ "used": true
+ },
+ "model": "name.groupmilestonestatename",
+ "pk": "charter"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Deleted",
+ "order": 2,
+ "used": true
+ },
+ "model": "name.groupmilestonestatename",
+ "pk": "deleted"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "For review",
+ "order": 3,
+ "used": true
+ },
+ "model": "name.groupmilestonestatename",
+ "pk": "review"
+ },
+ {
+ "fields": {
+ "desc": "Formation of the group (most likely a BoF or Proposed WG) was abandoned",
+ "name": "Abandonded",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.groupstatename",
+ "pk": "abandon"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Active",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.groupstatename",
+ "pk": "active"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "BOF",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.groupstatename",
+ "pk": "bof"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "BOF Concluded",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.groupstatename",
+ "pk": "bof-conc"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Concluded",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.groupstatename",
+ "pk": "conclude"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Dormant",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.groupstatename",
+ "pk": "dormant"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Proposed",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.groupstatename",
+ "pk": "proposed"
+ },
+ {
+ "fields": {
+ "desc": "Replaced by dnssd",
+ "name": "Replaced",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.groupstatename",
+ "pk": "replaced"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Unknown",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.groupstatename",
+ "pk": "unknown"
+ },
+ {
+ "fields": {
+ "desc": "Ad Hoc schedulable Group Type, for instance HotRfc",
+ "name": "Ad Hoc",
+ "order": 0,
+ "used": true,
+ "verbose_name": "Ad Hoc Group Type"
+ },
+ "model": "name.grouptypename",
+ "pk": "adhoc"
+ },
+ {
+ "fields": {
+ "desc": "Area group",
+ "name": "AG",
+ "order": 0,
+ "used": true,
+ "verbose_name": "Area Group"
+ },
+ "model": "name.grouptypename",
+ "pk": "ag"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Area",
+ "order": 0,
+ "used": true,
+ "verbose_name": "Area"
+ },
+ "model": "name.grouptypename",
+ "pk": "area"
+ },
+ {
+ "fields": {
+ "desc": "In many areas, the Area Directors have formed an advisory group or directorate. These comprise experienced members of the IETF and the technical community represented by the area. The specific name and the details of the role for each group differ from area to area, but the primary intent is that these groups assist the Area Director(s), e.g., with the review of specifications produced in the area.",
+ "name": "Directorate",
+ "order": 0,
+ "used": true,
+ "verbose_name": "Area Directorate"
+ },
+ "model": "name.grouptypename",
+ "pk": "dir"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "IAB",
+ "order": 0,
+ "used": true,
+ "verbose_name": "Internet Architecture Board"
+ },
+ "model": "name.grouptypename",
+ "pk": "iab"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "IESG",
+ "order": 0,
+ "used": true,
+ "verbose_name": "Internet Engineering Steering Group"
+ },
+ "model": "name.grouptypename",
+ "pk": "iesg"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "IETF",
+ "order": 0,
+ "used": true,
+ "verbose_name": "Internet Engineering Task Force"
+ },
+ "model": "name.grouptypename",
+ "pk": "ietf"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Individual",
+ "order": 0,
+ "used": true,
+ "verbose_name": "An Individual"
+ },
+ "model": "name.grouptypename",
+ "pk": "individ"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "IRTF",
+ "order": 0,
+ "used": true,
+ "verbose_name": "Internet Research Task Force"
+ },
+ "model": "name.grouptypename",
+ "pk": "irtf"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "ISE",
+ "order": 0,
+ "used": true,
+ "verbose_name": "Independent Stream Editor"
+ },
+ "model": "name.grouptypename",
+ "pk": "ise"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "ISOC",
+ "order": 0,
+ "used": true,
+ "verbose_name": "The Internet Society"
+ },
+ "model": "name.grouptypename",
+ "pk": "isoc"
+ },
+ {
+ "fields": {
+ "desc": "An IETF/IAB Nominating Committee. Use 'SDO' for external nominating committees.",
+ "name": "Nomcom",
+ "order": 0,
+ "used": true,
+ "verbose_name": "IETF/IAB Nominating Committee"
+ },
+ "model": "name.grouptypename",
+ "pk": "nomcom"
+ },
+ {
+ "fields": {
+ "desc": "Program",
+ "name": "Program",
+ "order": 0,
+ "used": true,
+ "verbose_name": ""
+ },
+ "model": "name.grouptypename",
+ "pk": "program"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Directorate (with reviews)",
+ "order": 0,
+ "used": true,
+ "verbose_name": ""
+ },
+ "model": "name.grouptypename",
+ "pk": "review"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "RFC Editor",
+ "order": 0,
+ "used": true,
+ "verbose_name": "The RFC Editor"
+ },
+ "model": "name.grouptypename",
+ "pk": "rfcedtyp"
+ },
+ {
+ "fields": {
+ "desc": "Research group",
+ "name": "RG",
+ "order": 0,
+ "used": true,
+ "verbose_name": "Research Group"
+ },
+ "model": "name.grouptypename",
+ "pk": "rg"
+ },
+ {
+ "fields": {
+ "desc": "Standards organization",
+ "name": "SDO",
+ "order": 0,
+ "used": true,
+ "verbose_name": "Standards Organization"
+ },
+ "model": "name.grouptypename",
+ "pk": "sdo"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Team",
+ "order": 0,
+ "used": true,
+ "verbose_name": "Team"
+ },
+ "model": "name.grouptypename",
+ "pk": "team"
+ },
+ {
+ "fields": {
+ "desc": "Working group",
+ "name": "WG",
+ "order": 0,
+ "used": true,
+ "verbose_name": "Working Group"
+ },
+ "model": "name.grouptypename",
+ "pk": "wg"
+ },
+ {
+ "fields": {
+ "default_offset_days": -19,
+ "desc": "Internet Draft submission cut-off for -00 drafts by UTC 23:59",
+ "name": "00 ID Cutoff",
+ "order": 0,
+ "used": false
+ },
+ "model": "name.importantdatename",
+ "pk": "00cutoff"
+ },
+ {
+ "fields": {
+ "default_offset_days": -12,
+ "desc": "Internet Draft submission cut-off for revised (-01 and above) drafts by UTC 23:59",
+ "name": "01 ID Cutoff",
+ "order": 0,
+ "used": false
+ },
+ "model": "name.importantdatename",
+ "pk": "01cutoff"
+ },
+ {
+ "fields": {
+ "default_offset_days": -36,
+ "desc": "Cut-off date for Area Directors to approve BOFs at UTC 23:59",
+ "name": "Cut-off BOF approval",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.importantdatename",
+ "pk": "cutoffbofapprove"
+ },
+ {
+ "fields": {
+ "default_offset_days": -43,
+ "desc": "Cut-off date for BOF proposal requests to Area Directors at UTC 23:59",
+ "name": "Cut-off BOF scheduling Requests",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.importantdatename",
+ "pk": "cutoffbofreq"
+ },
+ {
+ "fields": {
+ "default_offset_days": -5,
+ "desc": "Registration cancellation cut-off at UTC 23:59",
+ "name": "Registration Cancellation Cut-off",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.importantdatename",
+ "pk": "cutoffcancel"
+ },
+ {
+ "fields": {
+ "default_offset_days": -1,
+ "desc": "Final Pre-Registration and Pre-Payment cut-off at 17:00 local meeting time",
+ "name": "Pre-Registration Cutoff",
+ "order": 0,
+ "used": false
+ },
+ "model": "name.importantdatename",
+ "pk": "cutoffpre"
+ },
+ {
+ "fields": {
+ "default_offset_days": -24,
+ "desc": "Cut-off date for requests to reschedule Working Group or BOF meetings UTC 23:59",
+ "name": "Cut-off Reschedule Requests",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.importantdatename",
+ "pk": "cutoffresched"
+ },
+ {
+ "fields": {
+ "default_offset_days": -43,
+ "desc": "Cut-off date for requests to schedule Working Group Meetings at UTC 23:59",
+ "name": "Cut-off WG scheduling Requests",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.importantdatename",
+ "pk": "cutoffwgreq"
+ },
+ {
+ "fields": {
+ "default_offset_days": -10,
+ "desc": "Draft Working Group agendas due by UTC 23:59",
+ "name": "Draft Working Group Agendas",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.importantdatename",
+ "pk": "draftwgagenda"
+ },
+ {
+ "fields": {
+ "default_offset_days": -47,
+ "desc": "Early Bird registration and payment cut-off at UTC 23:59",
+ "name": "Earlybird cutoff",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.importantdatename",
+ "pk": "earlybird"
+ },
+ {
+ "fields": {
+ "default_offset_days": -22,
+ "desc": "Final agenda to be published",
+ "name": "Final Agenda",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.importantdatename",
+ "pk": "finalagenda"
+ },
+ {
+ "fields": {
+ "default_offset_days": -12,
+ "desc": "Internet Draft submission cut-off (for all drafts, including -00) by UTC 23:59",
+ "name": "ID Cutoff",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.importantdatename",
+ "pk": "idcutoff"
+ },
+ {
+ "fields": {
+ "default_offset_days": -82,
+ "desc": "IETF Online Registration Opens",
+ "name": "Registration Opens",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.importantdatename",
+ "pk": "openreg"
+ },
+ {
+ "fields": {
+ "default_offset_days": -89,
+ "desc": "Working Group and BOF scheduling begins",
+ "name": "Scheduling Opens",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.importantdatename",
+ "pk": "opensched"
+ },
+ {
+ "fields": {
+ "default_offset_days": -29,
+ "desc": "Preliminary Agenda published for comment",
+ "name": "Preliminary Agenda",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.importantdatename",
+ "pk": "prelimagenda"
+ },
+ {
+ "fields": {
+ "default_offset_days": 27,
+ "desc": "Proceedings submission cutoff date by UTC 23:59",
+ "name": "Proceedings Submission Cut-off",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.importantdatename",
+ "pk": "procsub"
+ },
+ {
+ "fields": {
+ "default_offset_days": 51,
+ "desc": "Proceedings submission corrections cutoff date by UTC 23:59",
+ "name": "Proceedings Submission Revision Cut-off",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.importantdatename",
+ "pk": "revsub"
+ },
+ {
+ "fields": {
+ "default_offset_days": -5,
+ "desc": "Revised Working Group agendas due by UTC 23:59",
+ "name": "Revised Working Group Agendas",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.importantdatename",
+ "pk": "revwgagenda"
+ },
+ {
+ "fields": {
+ "default_offset_days": -12,
+ "desc": "Standard rate registration and payment cut-off at UTC 23:59.",
+ "name": "Standard rate registration ends",
+ "order": 18,
+ "used": true
+ },
+ "model": "name.importantdatename",
+ "pk": "stdratecutoff"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Best Current Practice",
+ "order": 4,
+ "used": true
+ },
+ "model": "name.intendedstdlevelname",
+ "pk": "bcp"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Draft Standard",
+ "order": 2,
+ "used": false
+ },
+ "model": "name.intendedstdlevelname",
+ "pk": "ds"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Experimental",
+ "order": 6,
+ "used": true
+ },
+ "model": "name.intendedstdlevelname",
+ "pk": "exp"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Historic",
+ "order": 7,
+ "used": true
+ },
+ "model": "name.intendedstdlevelname",
+ "pk": "hist"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Informational",
+ "order": 5,
+ "used": true
+ },
+ "model": "name.intendedstdlevelname",
+ "pk": "inf"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Proposed Standard",
+ "order": 1,
+ "used": true
+ },
+ "model": "name.intendedstdlevelname",
+ "pk": "ps"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Internet Standard",
+ "order": 3,
+ "used": true
+ },
+ "model": "name.intendedstdlevelname",
+ "pk": "std"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Parked",
+ "order": 1,
+ "used": true
+ },
+ "model": "name.iprdisclosurestatename",
+ "pk": "parked"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Pending",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.iprdisclosurestatename",
+ "pk": "pending"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Posted",
+ "order": 2,
+ "used": true
+ },
+ "model": "name.iprdisclosurestatename",
+ "pk": "posted"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Rejected",
+ "order": 3,
+ "used": true
+ },
+ "model": "name.iprdisclosurestatename",
+ "pk": "rejected"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Removed",
+ "order": 4,
+ "used": true
+ },
+ "model": "name.iprdisclosurestatename",
+ "pk": "removed"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Changed disclosure metadata",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.ipreventtypename",
+ "pk": "changed_disclosure"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Comment",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.ipreventtypename",
+ "pk": "comment"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Legacy",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.ipreventtypename",
+ "pk": "legacy"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "MsgIn",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.ipreventtypename",
+ "pk": "msgin"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "MsgOut",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.ipreventtypename",
+ "pk": "msgout"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Parked",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.ipreventtypename",
+ "pk": "parked"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Pending",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.ipreventtypename",
+ "pk": "pending"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Posted",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.ipreventtypename",
+ "pk": "posted"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Private Comment",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.ipreventtypename",
+ "pk": "private_comment"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Rejected",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.ipreventtypename",
+ "pk": "rejected"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Removed",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.ipreventtypename",
+ "pk": "removed"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Submitted",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.ipreventtypename",
+ "pk": "submitted"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Update Notify",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.ipreventtypename",
+ "pk": "update_notify"
+ },
+ {
+ "fields": {
+ "desc": "a) No License Required for Implementers",
+ "name": "No License",
+ "order": 1,
+ "used": true
+ },
+ "model": "name.iprlicensetypename",
+ "pk": "no-license"
+ },
+ {
+ "fields": {
+ "desc": "[None selected]",
+ "name": "None Selected",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.iprlicensetypename",
+ "pk": "none-selected"
+ },
+ {
+ "fields": {
+ "desc": "d) Licensing Declaration to be Provided Later (implies a willingness to commit to the provisions of a), b), or c) above to all implementers; otherwise, the next option 'Unwilling to Commit to the Provisions of a), b), or c) Above'. - must be selected)",
+ "name": "Provided Later",
+ "order": 4,
+ "used": true
+ },
+ "model": "name.iprlicensetypename",
+ "pk": "provided-later"
+ },
+ {
+ "fields": {
+ "desc": "c) Reasonable and Non-Discriminatory License to All Implementers with Possible Royalty/Fee",
+ "name": "Reasonable",
+ "order": 3,
+ "used": true
+ },
+ "model": "name.iprlicensetypename",
+ "pk": "reasonable"
+ },
+ {
+ "fields": {
+ "desc": "b) Royalty-Free, Reasonable and Non-Discriminatory License to All Implementers",
+ "name": "Royalty Free",
+ "order": 2,
+ "used": true
+ },
+ "model": "name.iprlicensetypename",
+ "pk": "royalty-free"
+ },
+ {
+ "fields": {
+ "desc": "f) See Text Below for Licensing Declaration",
+ "name": "See Below",
+ "order": 6,
+ "used": true
+ },
+ "model": "name.iprlicensetypename",
+ "pk": "see-below"
+ },
+ {
+ "fields": {
+ "desc": "e) Unwilling to Commit to the Provisions of a), b), or c) Above",
+ "name": "Unwilling to Commit",
+ "order": 5,
+ "used": true
+ },
+ "model": "name.iprlicensetypename",
+ "pk": "unwilling-to-commit"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Approved",
+ "order": 3,
+ "used": true
+ },
+ "model": "name.liaisonstatementeventtypename",
+ "pk": "approved"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Comment",
+ "order": 9,
+ "used": true
+ },
+ "model": "name.liaisonstatementeventtypename",
+ "pk": "comment"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Killed",
+ "order": 5,
+ "used": true
+ },
+ "model": "name.liaisonstatementeventtypename",
+ "pk": "killed"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Modified",
+ "order": 2,
+ "used": true
+ },
+ "model": "name.liaisonstatementeventtypename",
+ "pk": "modified"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "MsgIn",
+ "order": 7,
+ "used": true
+ },
+ "model": "name.liaisonstatementeventtypename",
+ "pk": "msgin"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "MsgOut",
+ "order": 8,
+ "used": true
+ },
+ "model": "name.liaisonstatementeventtypename",
+ "pk": "msgout"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Posted",
+ "order": 4,
+ "used": true
+ },
+ "model": "name.liaisonstatementeventtypename",
+ "pk": "posted"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Private Comment",
+ "order": 10,
+ "used": true
+ },
+ "model": "name.liaisonstatementeventtypename",
+ "pk": "private_comment"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Re-sent",
+ "order": 11,
+ "used": true
+ },
+ "model": "name.liaisonstatementeventtypename",
+ "pk": "resent"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Resurrected",
+ "order": 6,
+ "used": true
+ },
+ "model": "name.liaisonstatementeventtypename",
+ "pk": "resurrected"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Submitted",
+ "order": 1,
+ "used": true
+ },
+ "model": "name.liaisonstatementeventtypename",
+ "pk": "submitted"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "For action",
+ "order": 1,
+ "used": true
+ },
+ "model": "name.liaisonstatementpurposename",
+ "pk": "action"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "For comment",
+ "order": 2,
+ "used": true
+ },
+ "model": "name.liaisonstatementpurposename",
+ "pk": "comment"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "For information",
+ "order": 3,
+ "used": true
+ },
+ "model": "name.liaisonstatementpurposename",
+ "pk": "info"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "In response",
+ "order": 4,
+ "used": true
+ },
+ "model": "name.liaisonstatementpurposename",
+ "pk": "response"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Approved",
+ "order": 2,
+ "used": true
+ },
+ "model": "name.liaisonstatementstate",
+ "pk": "approved"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Dead",
+ "order": 4,
+ "used": true
+ },
+ "model": "name.liaisonstatementstate",
+ "pk": "dead"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Pending",
+ "order": 1,
+ "used": true
+ },
+ "model": "name.liaisonstatementstate",
+ "pk": "pending"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Posted",
+ "order": 3,
+ "used": true
+ },
+ "model": "name.liaisonstatementstate",
+ "pk": "posted"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Action Required",
+ "order": 1,
+ "used": true
+ },
+ "model": "name.liaisonstatementtagname",
+ "pk": "required"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Action Taken",
+ "order": 2,
+ "used": true
+ },
+ "model": "name.liaisonstatementtagname",
+ "pk": "taken"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "IETF",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.meetingtypename",
+ "pk": "ietf"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Interim",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.meetingtypename",
+ "pk": "interim"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Accepted",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.nomineepositionstatename",
+ "pk": "accepted"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Declined",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.nomineepositionstatename",
+ "pk": "declined"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Nominated, pending response",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.nomineepositionstatename",
+ "pk": "pending"
+ },
+ {
+ "fields": {
+ "desc": "The reviewer has accepted the assignment",
+ "name": "Accepted",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.reviewassignmentstatename",
+ "pk": "accepted"
+ },
+ {
+ "fields": {
+ "desc": "The review has been assigned to this reviewer",
+ "name": "Assigned",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.reviewassignmentstatename",
+ "pk": "assigned"
+ },
+ {
+ "fields": {
+ "desc": "The reviewer completed the assignment",
+ "name": "Completed",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.reviewassignmentstatename",
+ "pk": "completed"
+ },
+ {
+ "fields": {
+ "desc": "The reviewer did not provide a review by the deadline",
+ "name": "No Response",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.reviewassignmentstatename",
+ "pk": "no-response"
+ },
+ {
+ "fields": {
+ "desc": "The review was abandoned because of circumstances",
+ "name": "Overtaken By Events",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.reviewassignmentstatename",
+ "pk": "overtaken"
+ },
+ {
+ "fields": {
+ "desc": "The reviewer partially completed the assignment",
+ "name": "Partially Completed",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.reviewassignmentstatename",
+ "pk": "part-completed"
+ },
+ {
+ "fields": {
+ "desc": "The reviewer has rejected the assignment",
+ "name": "Rejected",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.reviewassignmentstatename",
+ "pk": "rejected"
+ },
+ {
+ "fields": {
+ "desc": "The assignment is was imported from an earlier database and its state could not be computed",
+ "name": "Unknown",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.reviewassignmentstatename",
+ "pk": "unknown"
+ },
+ {
+ "fields": {
+ "desc": "The team secretary has withdrawn the assignment",
+ "name": "Withdrawn by Team",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.reviewassignmentstatename",
+ "pk": "withdrawn"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Accepted",
+ "order": 2,
+ "used": false
+ },
+ "model": "name.reviewrequeststatename",
+ "pk": "accepted"
+ },
+ {
+ "fields": {
+ "desc": "The ReviewRequest has been assigned to at least one reviewer",
+ "name": "Assigned",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.reviewrequeststatename",
+ "pk": "assigned"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Completed",
+ "order": 10,
+ "used": false
+ },
+ "model": "name.reviewrequeststatename",
+ "pk": "completed"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "No Response",
+ "order": 6,
+ "used": false
+ },
+ "model": "name.reviewrequeststatename",
+ "pk": "no-response"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Team Will not Review Document",
+ "order": 8,
+ "used": true
+ },
+ "model": "name.reviewrequeststatename",
+ "pk": "no-review-document"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Team Will not Review Version",
+ "order": 7,
+ "used": true
+ },
+ "model": "name.reviewrequeststatename",
+ "pk": "no-review-version"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Overtaken by Events",
+ "order": 5,
+ "used": true
+ },
+ "model": "name.reviewrequeststatename",
+ "pk": "overtaken"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Partially Completed",
+ "order": 9,
+ "used": false
+ },
+ "model": "name.reviewrequeststatename",
+ "pk": "part-completed"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Rejected",
+ "order": 3,
+ "used": false
+ },
+ "model": "name.reviewrequeststatename",
+ "pk": "rejected"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Requested",
+ "order": 1,
+ "used": true
+ },
+ "model": "name.reviewrequeststatename",
+ "pk": "requested"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Unknown",
+ "order": 20,
+ "used": false
+ },
+ "model": "name.reviewrequeststatename",
+ "pk": "unknown"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Withdrawn",
+ "order": 4,
+ "used": true
+ },
+ "model": "name.reviewrequeststatename",
+ "pk": "withdrawn"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Almost Ready",
+ "order": 6,
+ "used": true
+ },
+ "model": "name.reviewresultname",
+ "pk": "almost-ready"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Has Issues",
+ "order": 2,
+ "used": true
+ },
+ "model": "name.reviewresultname",
+ "pk": "issues"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Has Nits",
+ "order": 3,
+ "used": true
+ },
+ "model": "name.reviewresultname",
+ "pk": "nits"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Not Ready",
+ "order": 4,
+ "used": true
+ },
+ "model": "name.reviewresultname",
+ "pk": "not-ready"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Ready",
+ "order": 9,
+ "used": true
+ },
+ "model": "name.reviewresultname",
+ "pk": "ready"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Ready with Issues",
+ "order": 7,
+ "used": true
+ },
+ "model": "name.reviewresultname",
+ "pk": "ready-issues"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Ready with Nits",
+ "order": 8,
+ "used": true
+ },
+ "model": "name.reviewresultname",
+ "pk": "ready-nits"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "On the Right Track",
+ "order": 5,
+ "used": true
+ },
+ "model": "name.reviewresultname",
+ "pk": "right-track"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Serious Issues",
+ "order": 1,
+ "used": true
+ },
+ "model": "name.reviewresultname",
+ "pk": "serious-issues"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Early",
+ "order": 1,
+ "used": true
+ },
+ "model": "name.reviewtypename",
+ "pk": "early"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Last Call",
+ "order": 2,
+ "used": true
+ },
+ "model": "name.reviewtypename",
+ "pk": "lc"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Telechat",
+ "order": 3,
+ "used": true
+ },
+ "model": "name.reviewtypename",
+ "pk": "telechat"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Area Director",
+ "order": 2,
+ "used": true
+ },
+ "model": "name.rolename",
+ "pk": "ad"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Administrative Director",
+ "order": 3,
+ "used": true
+ },
+ "model": "name.rolename",
+ "pk": "admdir"
+ },
+ {
+ "fields": {
+ "desc": "Advisor in a group that has explicit membership, such as the NomCom",
+ "name": "Advisor",
+ "order": 4,
+ "used": true
+ },
+ "model": "name.rolename",
+ "pk": "advisor"
+ },
+ {
+ "fields": {
+ "desc": "Authorised to send announcements to the ietf-announce and other lists",
+ "name": "List Announcer",
+ "order": 12,
+ "used": true
+ },
+ "model": "name.rolename",
+ "pk": "announce"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "At Large Member",
+ "order": 10,
+ "used": true
+ },
+ "model": "name.rolename",
+ "pk": "atlarge"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Authorized Individual",
+ "order": 5,
+ "used": true
+ },
+ "model": "name.rolename",
+ "pk": "auth"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "CEO",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.rolename",
+ "pk": "ceo"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Chair",
+ "order": 1,
+ "used": true
+ },
+ "model": "name.rolename",
+ "pk": "chair"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Co-ordinator",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.rolename",
+ "pk": "coord"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Delegate",
+ "order": 6,
+ "used": true
+ },
+ "model": "name.rolename",
+ "pk": "delegate"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Editor",
+ "order": 5,
+ "used": true
+ },
+ "model": "name.rolename",
+ "pk": "editor"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Executive Director",
+ "order": 2,
+ "used": true
+ },
+ "model": "name.rolename",
+ "pk": "execdir"
+ },
+ {
+ "fields": {
+ "desc": "Lead member (such as the Lead of an IAB program)",
+ "name": "Lead",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.rolename",
+ "pk": "lead"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Liaison Manager",
+ "order": 4,
+ "used": true
+ },
+ "model": "name.rolename",
+ "pk": "liaiman"
+ },
+ {
+ "fields": {
+ "desc": "Liaison group member in a group that has explicit membership, such as the NomCom",
+ "name": "Liaison Member",
+ "order": 11,
+ "used": true
+ },
+ "model": "name.rolename",
+ "pk": "liaison"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Materials Manager",
+ "order": 13,
+ "used": true
+ },
+ "model": "name.rolename",
+ "pk": "matman"
+ },
+ {
+ "fields": {
+ "desc": "Regular group member in a group that has explicit membership, such as the NomCom",
+ "name": "Member",
+ "order": 7,
+ "used": true
+ },
+ "model": "name.rolename",
+ "pk": "member"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Incoming Area Director",
+ "order": 3,
+ "used": true
+ },
+ "model": "name.rolename",
+ "pk": "pre-ad"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Recording Manager",
+ "order": 13,
+ "used": true
+ },
+ "model": "name.rolename",
+ "pk": "recman"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Reviewer",
+ "order": 14,
+ "used": true
+ },
+ "model": "name.rolename",
+ "pk": "reviewer"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Secretary",
+ "order": 6,
+ "used": true
+ },
+ "model": "name.rolename",
+ "pk": "secr"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Tech Advisor",
+ "order": 4,
+ "used": true
+ },
+ "model": "name.rolename",
+ "pk": "techadv"
+ },
+ {
+ "fields": {
+ "desc": "Assigned permission TRAC_ADMIN in datatracker-managed Trac Wiki instances",
+ "name": "Trac Admin",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.rolename",
+ "pk": "trac-admin"
+ },
+ {
+ "fields": {
+ "desc": "Provides log-in permission to restricted Trac instances",
+ "name": "Trac Editor",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.rolename",
+ "pk": "trac-editor"
+ },
+ {
+ "fields": {
+ "desc": "Audio streaming support",
+ "name": "Audio Stream",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.roomresourcename",
+ "pk": "audiostream"
+ },
+ {
+ "fields": {
+ "desc": "Experimental room setup (boardroom and classroom) subject to availability",
+ "name": "Boardroom Layout",
+ "order": 0,
+ "used": false
+ },
+ "model": "name.roomresourcename",
+ "pk": "boardroom"
+ },
+ {
+ "fields": {
+ "desc": "Flipchars",
+ "name": "Flipcharts",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.roomresourcename",
+ "pk": "flipcharts"
+ },
+ {
+ "fields": {
+ "desc": "The room will have a meetecho wrangler",
+ "name": "Meetecho Support",
+ "order": 0,
+ "used": false
+ },
+ "model": "name.roomresourcename",
+ "pk": "meetecho"
+ },
+ {
+ "fields": {
+ "desc": "The room will have a second computer projector",
+ "name": "second LCD projector",
+ "order": 0,
+ "used": false
+ },
+ "model": "name.roomresourcename",
+ "pk": "proj2"
+ },
+ {
+ "fields": {
+ "desc": "The room will have a computer projector",
+ "name": "LCD projector",
+ "order": 0,
+ "used": false
+ },
+ "model": "name.roomresourcename",
+ "pk": "project"
+ },
+ {
+ "fields": {
+ "desc": "Experimental Room Setup (U-Shape and classroom, subject to availability)",
+ "name": "Experimental Room Setup (U-Shape and classroom)",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.roomresourcename",
+ "pk": "u-shape"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Approved",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.sessionstatusname",
+ "pk": "appr"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Waiting for Approval",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.sessionstatusname",
+ "pk": "apprw"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Cancelled",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.sessionstatusname",
+ "pk": "canceled"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Cancelled - Pre Announcement",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.sessionstatusname",
+ "pk": "canceledpa"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Deleted",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.sessionstatusname",
+ "pk": "deleted"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Disapproved",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.sessionstatusname",
+ "pk": "disappr"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Not meeting",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.sessionstatusname",
+ "pk": "notmeet"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Scheduled",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.sessionstatusname",
+ "pk": "sched"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Scheduled - Announcement to be sent",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.sessionstatusname",
+ "pk": "scheda"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Waiting for Scheduling",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.sessionstatusname",
+ "pk": "schedw"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Best Current Practice",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.stdlevelname",
+ "pk": "bcp"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Draft Standard",
+ "order": 0,
+ "used": false
+ },
+ "model": "name.stdlevelname",
+ "pk": "ds"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Experimental",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.stdlevelname",
+ "pk": "exp"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Historic",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.stdlevelname",
+ "pk": "hist"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Informational",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.stdlevelname",
+ "pk": "inf"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Proposed Standard",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.stdlevelname",
+ "pk": "ps"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Internet Standard",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.stdlevelname",
+ "pk": "std"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Unknown",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.stdlevelname",
+ "pk": "unkn"
+ },
+ {
+ "fields": {
+ "desc": "IAB stream",
+ "name": "IAB",
+ "order": 4,
+ "used": true
+ },
+ "model": "name.streamname",
+ "pk": "iab"
+ },
+ {
+ "fields": {
+ "desc": "IETF stream",
+ "name": "IETF",
+ "order": 1,
+ "used": true
+ },
+ "model": "name.streamname",
+ "pk": "ietf"
+ },
+ {
+ "fields": {
+ "desc": "IRTF Stream",
+ "name": "IRTF",
+ "order": 3,
+ "used": true
+ },
+ "model": "name.streamname",
+ "pk": "irtf"
+ },
+ {
+ "fields": {
+ "desc": "Independent Submission Editor stream",
+ "name": "ISE",
+ "order": 2,
+ "used": true
+ },
+ "model": "name.streamname",
+ "pk": "ise"
+ },
+ {
+ "fields": {
+ "desc": "Legacy stream",
+ "name": "Legacy",
+ "order": 5,
+ "used": true
+ },
+ "model": "name.streamname",
+ "pk": "legacy"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Break",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.timeslottypename",
+ "pk": "break"
+ },
+ {
+ "fields": {
+ "desc": "Leadership Meetings",
+ "name": "Leadership",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.timeslottypename",
+ "pk": "lead"
+ },
+ {
+ "fields": {
+ "desc": "Other Meetings Not Published on Agenda",
+ "name": "Off Agenda",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.timeslottypename",
+ "pk": "offagenda"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Other",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.timeslottypename",
+ "pk": "other"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Plenary",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.timeslottypename",
+ "pk": "plenary"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Registration",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.timeslottypename",
+ "pk": "reg"
+ },
+ {
+ "fields": {
+ "desc": "A room has been reserved for use by another body the timeslot indicated",
+ "name": "Room Reserved",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.timeslottypename",
+ "pk": "reserved"
+ },
+ {
+ "fields": {
+ "desc": "",
+ "name": "Session",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.timeslottypename",
+ "pk": "session"
+ },
+ {
+ "fields": {
+ "desc": "A room was not booked for the timeslot indicated",
+ "name": "Room Unavailable",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.timeslottypename",
+ "pk": "unavail"
+ },
+ {
+ "fields": {
+ "desc": "Anyone who can log in",
+ "name": "General",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.topicaudiencename",
+ "pk": "general"
+ },
+ {
+ "fields": {
+ "desc": "Members of this nomcom",
+ "name": "Nomcom Members",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.topicaudiencename",
+ "pk": "nomcom"
+ },
+ {
+ "fields": {
+ "desc": "Anyone who has accepted a Nomination for an open position",
+ "name": "Nominees",
+ "order": 0,
+ "used": true
+ },
+ "model": "name.topicaudiencename",
+ "pk": "nominees"
+ },
+ {
+ "fields": {
+ "command": "xym",
+ "switch": "--version",
+ "time": "2019-04-28T00:08:08.288",
+ "used": true,
+ "version": "xym 0.4"
+ },
+ "model": "utils.versioninfo",
+ "pk": 1
+ },
+ {
+ "fields": {
+ "command": "pyang",
+ "switch": "--version",
+ "time": "2019-04-28T00:08:09.335",
+ "used": true,
+ "version": "pyang 1.7.8"
+ },
+ "model": "utils.versioninfo",
+ "pk": 2
+ },
+ {
+ "fields": {
+ "command": "yanglint",
+ "switch": "--version",
+ "time": "2019-04-28T00:08:09.623",
+ "used": true,
+ "version": "yanglint 0.14.80"
+ },
+ "model": "utils.versioninfo",
+ "pk": 3
+ },
+ {
+ "fields": {
+ "command": "xml2rfc",
+ "switch": "--version",
+ "time": "2019-04-28T00:08:11.596",
+ "used": true,
+ "version": "xml2rfc 2.22.3"
+ },
+ "model": "utils.versioninfo",
+ "pk": 4
+ }
]
diff --git a/ietf/name/migrations/0005_reviewassignmentstatename.py b/ietf/name/migrations/0005_reviewassignmentstatename.py
new file mode 100644
index 000000000..dbf253e51
--- /dev/null
+++ b/ietf/name/migrations/0005_reviewassignmentstatename.py
@@ -0,0 +1,29 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.18 on 2019-01-04 13:59
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('name', '0004_add_prefix_to_doctypenames'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='ReviewAssignmentStateName',
+ fields=[
+ ('slug', models.CharField(max_length=32, primary_key=True, serialize=False)),
+ ('name', models.CharField(max_length=255)),
+ ('desc', models.TextField(blank=True)),
+ ('used', models.BooleanField(default=True)),
+ ('order', models.IntegerField(default=0)),
+ ],
+ options={
+ 'ordering': ['order', 'name'],
+ 'abstract': False,
+ },
+ ),
+ ]
diff --git a/ietf/name/migrations/0006_adjust_statenames.py b/ietf/name/migrations/0006_adjust_statenames.py
new file mode 100644
index 000000000..18c464a8c
--- /dev/null
+++ b/ietf/name/migrations/0006_adjust_statenames.py
@@ -0,0 +1,93 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.18 on 2019-01-04 14:02
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+def forward(apps, schema_editor):
+ ReviewRequestStateName = apps.get_model('name','ReviewRequestStateName')
+ ReviewAssignmentStateName = apps.get_model('name','ReviewAssignmentStateName')
+
+ # TODO: Remove these newly unused states in a future release
+ ReviewRequestStateName.objects.filter(slug__in=['accepted', 'rejected', 'no-response', 'part-completed', 'completed', 'unknown']).update(used=False)
+ ReviewRequestStateName.objects.create(slug = 'assigned', name = 'Assigned', desc = 'The ReviewRequest has been assigned to at least one reviewer' , used = True, order = 0)
+
+ assignment_states = [
+ { 'slug': 'assigned',
+ 'name': 'Assigned',
+ 'desc': 'The review has been assigned to this reviewer',
+ 'used': True,
+ 'order': 0
+ },
+ { 'slug':'accepted',
+ 'name':'Accepted',
+ 'desc':'The reviewer has accepted the assignment',
+ 'used': True,
+ 'order':0
+ },
+ { 'slug':'rejected',
+ 'name':'Rejected',
+ 'desc':'The reviewer has rejected the assignment',
+ 'used': True,
+ 'order':0
+ },
+ { 'slug':'withdrawn',
+ 'name':'Withdrawn by Team',
+ 'desc':'The team secretary has withdrawn the assignment',
+ 'used': True,
+ 'order':0
+ },
+ { 'slug':'overtaken',
+ 'name':'Overtaken By Events',
+ 'desc':'The review was abandoned because of circumstances',
+ 'used': True,
+ 'order':0
+ },
+ { 'slug':'no-response',
+ 'name':'No Response',
+ 'desc':'The reviewer did not provide a review by the deadline',
+ 'used': True,
+ 'order':0
+ },
+ { 'slug':'part-completed',
+ 'name':'Partially Completed',
+ 'desc':'The reviewer partially completed the assignment',
+ 'used': True,
+ 'order':0
+ },
+ { 'slug':'completed',
+ 'name':'Completed',
+ 'desc':'The reviewer completed the assignment',
+ 'used': True,
+ 'order':0
+ },
+ { 'slug':'unknown',
+ 'name':'Unknown',
+ 'desc':'The assignment is was imported from an earlier database and its state could not be computed',
+ 'used':'True',
+ 'order':0
+ }
+ ]
+
+ for entry in assignment_states:
+ ReviewAssignmentStateName.objects.create(**entry)
+
+
+def reverse(apps, schema_editor):
+ ReviewRequestStateName = apps.get_model('name','ReviewRequestStateName')
+ ReviewAssignmentStateName = apps.get_model('name','ReviewAssignmentStateName')
+ ReviewRequestStateName.objects.filter(slug__in=['accepted', 'rejected', 'no-response', 'part-completed', 'completed', 'unknown']).update(used=True)
+ ReviewRequestStateName.objects.filter(slug='assigned').update(used=False)
+ ReviewAssignmentStateName.objects.update(used=False)
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('name', '0005_reviewassignmentstatename'),
+ ('doc','0011_reviewassignmentdocevent'),
+ ]
+
+ operations = [
+ migrations.RunPython(forward, reverse)
+ ]
diff --git a/ietf/name/models.py b/ietf/name/models.py
index ac96ab9bc..5a257c22f 100644
--- a/ietf/name/models.py
+++ b/ietf/name/models.py
@@ -95,8 +95,9 @@ class LiaisonStatementEventTypeName(NameModel):
class LiaisonStatementTagName(NameModel):
"Action Required, Action Taken"
class ReviewRequestStateName(NameModel):
- """Requested, Accepted, Rejected, Withdrawn, Overtaken By Events,
- No Response, No Review of Version, No Review of Document, Partially Completed, Completed"""
+ """Requested, Assigned, Withdrawn, Overtaken By Events, No Review of Version, No Review of Document"""
+class ReviewAssignmentStateName(NameModel):
+ """Accepted, Rejected, Withdrawn, Overtaken By Events, No Response, Partially Completed, Completed"""
class ReviewTypeName(NameModel):
"""Early Review, Last Call, Telechat"""
class ReviewResultName(NameModel):
diff --git a/ietf/name/resources.py b/ietf/name/resources.py
index 76dca2a15..83f8d0b6f 100644
--- a/ietf/name/resources.py
+++ b/ietf/name/resources.py
@@ -14,8 +14,9 @@ from ietf.name.models import ( AgendaTypeName, BallotPositionName, ConstraintNam
ImportantDateName, IntendedStdLevelName, IprDisclosureStateName, IprEventTypeName,
IprLicenseTypeName, LiaisonStatementEventTypeName, LiaisonStatementPurposeName,
LiaisonStatementState, LiaisonStatementTagName, MeetingTypeName, NomineePositionStateName,
- ReviewRequestStateName, ReviewResultName, ReviewTypeName, RoleName, RoomResourceName,
- SessionStatusName, StdLevelName, StreamName, TimeSlotTypeName, TopicAudienceName, )
+ ReviewAssignmentStateName, ReviewRequestStateName, ReviewResultName, ReviewTypeName,
+ RoleName, RoomResourceName, SessionStatusName, StdLevelName, StreamName, TimeSlotTypeName,
+ TopicAudienceName, )
class TimeSlotTypeNameResource(ModelResource):
class Meta:
@@ -428,6 +429,20 @@ class ReviewRequestStateNameResource(ModelResource):
}
api.name.register(ReviewRequestStateNameResource())
+class ReviewAssignmentStateNameResource(ModelResource):
+ class Meta:
+ cache = SimpleCache()
+ queryset = ReviewAssignmentStateName.objects.all()
+ #resource_name = 'reviewassignmentstatename'
+ filtering = {
+ "slug": ALL,
+ "name": ALL,
+ "desc": ALL,
+ "used": ALL,
+ "order": ALL,
+ }
+api.name.register(ReviewAssignmentStateNameResource())
+
class ReviewTypeNameResource(ModelResource):
class Meta:
cache = SimpleCache()
@@ -567,3 +582,5 @@ class AgendaTypeNameResource(ModelResource):
"order": ALL,
}
api.name.register(AgendaTypeNameResource())
+
+
diff --git a/ietf/review/admin.py b/ietf/review/admin.py
index 691cee738..4fbe41059 100644
--- a/ietf/review/admin.py
+++ b/ietf/review/admin.py
@@ -3,7 +3,7 @@ import simple_history
from django.contrib import admin
from ietf.review.models import (ReviewerSettings, ReviewSecretarySettings, UnavailablePeriod,
- ReviewWish, NextReviewerInTeam, ReviewRequest, ReviewTeamSettings )
+ ReviewWish, NextReviewerInTeam, ReviewRequest, ReviewAssignment, ReviewTeamSettings )
class ReviewerSettingsAdmin(simple_history.admin.SimpleHistoryAdmin):
def acronym(self, obj):
@@ -53,14 +53,23 @@ admin.site.register(NextReviewerInTeam, NextReviewerInTeamAdmin)
class ReviewRequestAdmin(admin.ModelAdmin):
list_display = ["doc", "time", "type", "team", "deadline"]
list_display_links = ["doc"]
- list_filter = ["team", "type", "state", "result"]
+ list_filter = ["team", "type", "state"]
ordering = ["-id"]
- raw_id_fields = ["doc", "team", "requested_by", "reviewer", "review"]
+ raw_id_fields = ["doc", "team", "requested_by"]
date_hierarchy = "time"
- search_fields = ["doc__name", "reviewer__person__name"]
+ search_fields = ["doc__name"]
admin.site.register(ReviewRequest, ReviewRequestAdmin)
+class ReviewAssignmentAdmin(admin.ModelAdmin):
+ list_display = ["review_request", "reviewer", "assigned_on", "result"]
+ list_filter = ["result", "state"]
+ ordering = ["-id"]
+ raw_id_fields = ["reviewer", "result"]
+ search_fields = ["review_request__doc__name"]
+
+admin.site.register(ReviewAssignment, ReviewAssignmentAdmin)
+
class ReviewTeamSettingsAdmin(admin.ModelAdmin):
list_display = ["group", ]
search_fields = ["group__acronym", ]
diff --git a/ietf/review/factories.py b/ietf/review/factories.py
index 80353b4be..7e7a2480f 100644
--- a/ietf/review/factories.py
+++ b/ietf/review/factories.py
@@ -1,7 +1,7 @@
import factory
import datetime
-from ietf.review.models import ReviewTeamSettings, ReviewRequest, ReviewerSettings
+from ietf.review.models import ReviewTeamSettings, ReviewRequest, ReviewAssignment, ReviewerSettings
from ietf.name.models import ReviewTypeName, ReviewResultName
class ReviewTeamSettingsFactory(factory.DjangoModelFactory):
@@ -39,6 +39,15 @@ class ReviewRequestFactory(factory.DjangoModelFactory):
deadline = datetime.datetime.today()+datetime.timedelta(days=14)
requested_by = factory.SubFactory('ietf.person.factories.PersonFactory')
+class ReviewAssignmentFactory(factory.DjangoModelFactory):
+ class Meta:
+ model = ReviewAssignment
+
+ review_request = factory.SubFactory('ietf.review.factories.ReviewRequestFactory')
+ state_id = 'assigned'
+ reviewer = factory.SubFactory('ietf.person.factories.EmailFactory')
+ assigned_on = datetime.datetime.now()
+
class ReviewerSettingsFactory(factory.DjangoModelFactory):
class Meta:
model = ReviewerSettings
diff --git a/ietf/review/migrations/0009_refactor_review_request.py b/ietf/review/migrations/0009_refactor_review_request.py
new file mode 100644
index 000000000..766dc209e
--- /dev/null
+++ b/ietf/review/migrations/0009_refactor_review_request.py
@@ -0,0 +1,67 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.18 on 2019-01-04 14:27
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+import ietf.utils.models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('doc', '0009_move_non_url_externalurls_to_uploaded_filename'),
+ ('name', '0005_reviewassignmentstatename'),
+ ('person', '0008_auto_20181014_1448'),
+ ('review', '0008_remove_reviewrequest_old_id'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='ReviewAssignment',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('assigned_on', models.DateTimeField(blank=True, null=True)),
+ ('completed_on', models.DateTimeField(blank=True, null=True)),
+ ('reviewed_rev', models.CharField(blank=True, max_length=16, verbose_name=b'reviewed revision')),
+ ('mailarch_url', models.URLField(blank=True, null=True)),
+ ('result', ietf.utils.models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='name.ReviewResultName')),
+ ('review', ietf.utils.models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='doc.Document')),
+ ],
+ ),
+ migrations.RenameField(
+ model_name='reviewrequest',
+ old_name='result',
+ new_name='unused_result',
+ ),
+ migrations.RenameField(
+ model_name='reviewrequest',
+ old_name='review',
+ new_name='unused_review',
+ ),
+ migrations.RenameField(
+ model_name='reviewrequest',
+ old_name='reviewed_rev',
+ new_name='unused_reviewed_rev',
+ ),
+ migrations.RenameField(
+ model_name='reviewrequest',
+ old_name='reviewer',
+ new_name='unused_reviewer',
+ ),
+ migrations.AddField(
+ model_name='reviewassignment',
+ name='review_request',
+ field=ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='review.ReviewRequest'),
+ ),
+ migrations.AddField(
+ model_name='reviewassignment',
+ name='reviewer',
+ field=ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='person.Email'),
+ ),
+ migrations.AddField(
+ model_name='reviewassignment',
+ name='state',
+ field=ietf.utils.models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='name.ReviewAssignmentStateName'),
+ ),
+ ]
diff --git a/ietf/review/migrations/0010_populate_review_assignments.py b/ietf/review/migrations/0010_populate_review_assignments.py
new file mode 100644
index 000000000..f18b63d61
--- /dev/null
+++ b/ietf/review/migrations/0010_populate_review_assignments.py
@@ -0,0 +1,121 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.18 on 2019-01-04 14:34
+from __future__ import unicode_literals
+
+from tqdm import tqdm
+
+from django.db import migrations
+
+def assigned_time(model, request):
+ e = model.objects.filter(doc=request.doc, type="assigned_review_request", review_request=request).order_by('-time', '-id').first()
+ return e.time if e and e.time else None
+
+def done_time(model, request):
+ if request.unused_review and request.unused_review.time:
+ return request.unused_review.time
+ e = model.objects.filter(doc=request.doc, type="closed_review_request", review_request=request).order_by('-time', '-id').first()
+ time = e.time if e and e.time else None
+ return time if time else request.time
+
+def map_request_state_to_assignment_state(req_state_id):
+ if req_state_id == 'requested':
+ return 'assigned'
+ elif req_state_id in ('no-review-document', 'no-review-version'):
+ return 'withdrawn'
+ else:
+ return req_state_id
+
+def forward(apps, schema_editor):
+ ReviewRequest = apps.get_model('review', 'ReviewRequest')
+ ReviewAssignment = apps.get_model('review', 'ReviewAssignment')
+ Document = apps.get_model('doc', 'Document')
+ ReviewRequestDocEvent = apps.get_model('doc','ReviewRequestDocEvent')
+ ReviewAssignmentDocEvent = apps.get_model('doc','ReviewAssignmentDocEvent')
+
+ print('') # introduce a newline before tqdm starts writing
+
+ for request in tqdm(ReviewRequest.objects.exclude(unused_reviewer__isnull=True)):
+ assignment_state = map_request_state_to_assignment_state(request.state_id)
+ if not (assignment_state in (u'assigned', u'accepted', u'completed', u'no-response', u'overtaken', u'part-completed', u'rejected', u'withdrawn', u'unknown')):
+ print ("Trouble with review_request",request.pk,"with state",request.state_id)
+ exit(-1)
+ ReviewAssignment.objects.create(
+ review_request = request,
+ state_id = assignment_state,
+ reviewer = request.unused_reviewer,
+ assigned_on = assigned_time(ReviewRequestDocEvent, request),
+ completed_on = done_time(ReviewRequestDocEvent, request),
+ review = request.unused_review,
+ reviewed_rev = request.unused_reviewed_rev,
+ result = request.unused_result,
+ mailarch_url = request.unused_review and request.unused_review.external_url,
+ )
+ Document.objects.filter(type_id='review').update(external_url='')
+ ReviewRequest.objects.filter(state_id__in=('accepted', 'rejected', 'no-response', 'part-completed', 'completed', 'unknown')).update(state_id='assigned')
+ ReviewRequest.objects.filter(state_id='requested',unused_reviewer__isnull=False).update(state_id='assigned')
+
+ for req_event in tqdm(ReviewRequestDocEvent.objects.filter(type="assigned_review_request",review_request__unused_reviewer__isnull=False)):
+ ReviewAssignmentDocEvent.objects.create(
+ time = req_event.time,
+ type = req_event.type,
+ by = req_event.by,
+ doc = req_event.doc,
+ rev = req_event.rev,
+ desc = req_event.desc,
+ review_assignment = req_event.review_request.reviewassignment_set.first(),
+ state_id = 'assigned'
+ )
+
+ for req_event in tqdm(ReviewRequestDocEvent.objects.filter(type="closed_review_request",
+ state_id__in=('completed', 'no-response', 'part-completed', 'rejected', 'unknown', 'withdrawn'),
+ review_request__unused_reviewer__isnull=False)):
+ ReviewAssignmentDocEvent.objects.create(
+ time = req_event.time,
+ type = req_event.type,
+ by = req_event.by,
+ doc = req_event.doc,
+ rev = req_event.rev,
+ desc = req_event.desc,
+ review_assignment = req_event.review_request.reviewassignment_set.first(),
+ state_id = req_event.state_id
+ )
+
+ ReviewRequestDocEvent.objects.filter(type="closed_review_request",
+ state_id__in=('completed', 'no-response', 'part-completed', 'rejected', 'unknown', 'withdrawn'),
+ review_request__unused_reviewer__isnull=False).delete()
+
+
+def reverse(apps, schema_editor):
+ ReviewAssignment = apps.get_model('review', 'ReviewAssignment')
+ ReviewRequestDocEvent = apps.get_model('doc','ReviewRequestDocEvent')
+ ReviewAssignmentDocEvent = apps.get_model('doc','ReviewAssignmentDocEvent')
+
+ for assignment in tqdm(ReviewAssignment.objects.all()):
+ assignment.review_request.unused_review.external_url = assignment.mailarch_url
+ assignment.review_request.unused_review.save()
+ assignment.review_request.state_id = assignment.state_id
+ assignment.review_request.save()
+
+ for asgn_event in tqdm(ReviewAssignmentDocEvent.objects.filter(state_id__in=('completed', 'no-response', 'part-completed', 'rejected', 'unknown', 'withdrawn'))):
+ ReviewRequestDocEvent.objects.create(
+ time = asgn_event.time,
+ type = asgn_event.type,
+ by = asgn_event.by,
+ doc = asgn_event.doc,
+ rev = asgn_event.rev,
+ desc = asgn_event.desc,
+ review_request = asgn_event.review_request,
+ state_id = asgn_event.state_id
+ )
+ ReviewAssignmentDocEvent.objects.all().delete()
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('review', '0009_refactor_review_request'),
+ ('doc','0011_reviewassignmentdocevent')
+ ]
+
+ operations = [
+ migrations.RunPython(forward, reverse)
+ ]
diff --git a/ietf/review/models.py b/ietf/review/models.py
index d4a89619d..dab758d50 100644
--- a/ietf/review/models.py
+++ b/ietf/review/models.py
@@ -7,7 +7,7 @@ from django.db import models
from ietf.doc.models import Document
from ietf.group.models import Group
from ietf.person.models import Person, Email
-from ietf.name.models import ReviewTypeName, ReviewRequestStateName, ReviewResultName
+from ietf.name.models import ReviewTypeName, ReviewRequestStateName, ReviewResultName, ReviewAssignmentStateName
from ietf.utils.validators import validate_regular_expression_string
from ietf.utils.models import ForeignKey, OneToOneField
@@ -105,9 +105,7 @@ class NextReviewerInTeam(models.Model):
verbose_name_plural = "next reviewer in team settings"
class ReviewRequest(models.Model):
- """Represents a request for a review and the process it goes through.
- There should be one ReviewRequest entered for each combination of
- document, rev, and reviewer."""
+ """Represents a request for a review and the process it goes through."""
state = ForeignKey(ReviewRequestStateName)
# Fields filled in on the initial record creation - these
@@ -121,34 +119,38 @@ class ReviewRequest(models.Model):
requested_rev = models.CharField(verbose_name="requested revision", max_length=16, blank=True, help_text="Fill in if a specific revision is to be reviewed, e.g. 02")
comment = models.TextField(verbose_name="Requester's comments and instructions", max_length=2048, blank=True, help_text="Provide any additional information to show to the review team secretary and reviewer", default='')
- # Fields filled in as reviewer is assigned and as the review is
- # uploaded. Once these are filled in and we progress beyond being
- # requested/assigned, any changes to the assignment happens by
- # closing down the current request and making a new one, copying
- # the request-part fields above.
- reviewer = ForeignKey(Email, blank=True, null=True)
+ # Moved to class ReviewAssignment:
+ # These exist only to facilitate data migrations. They will be removed in the next release.
+ unused_reviewer = ForeignKey(Email, blank=True, null=True)
- review = OneToOneField(Document, blank=True, null=True)
- reviewed_rev = models.CharField(verbose_name="reviewed revision", max_length=16, blank=True)
- result = ForeignKey(ReviewResultName, blank=True, null=True)
+ unused_review = OneToOneField(Document, blank=True, null=True)
+ unused_reviewed_rev = models.CharField(verbose_name="reviewed revision", max_length=16, blank=True)
+ unused_result = ForeignKey(ReviewResultName, blank=True, null=True)
def __unicode__(self):
return u"%s review on %s by %s %s" % (self.type, self.doc, self.team, self.state)
- def other_requests(self):
- return self.doc.reviewrequest_set.exclude(id=self.id)
+ def all_completed_assignments_for_doc(self):
+ return ReviewAssignment.objects.filter(review_request__doc=self.doc, state__in=['completed','part-completed'])
- def other_completed_requests(self):
- return self.other_requests().filter(state_id__in=['completed','part-completed'])
+ def request_closed_time(self):
+ return self.doc.request_closed_time(self) or self.time
+
+class ReviewAssignment(models.Model):
+ """ One of possibly many reviews assigned in response to a ReviewRequest """
+ review_request = ForeignKey(ReviewRequest)
+ state = ForeignKey(ReviewAssignmentStateName)
+ reviewer = ForeignKey(Email)
+ assigned_on = models.DateTimeField(blank=True, null=True)
+ completed_on = models.DateTimeField(blank=True, null=True)
+ review = OneToOneField(Document, blank=True, null=True)
+ reviewed_rev = models.CharField(verbose_name="reviewed revision", max_length=16, blank=True)
+ result = ForeignKey(ReviewResultName, blank=True, null=True)
+ mailarch_url = models.URLField(blank=True, null = True)
+
+ def __unicode__(self):
+ return u"Assignment for %s (%s) : %s %s of %s" % (self.reviewer.person, self.state, self.review_request.team.acronym, self.review_request.type, self.review_request.doc)
- def review_done_time(self):
- # First check if this is completed review having review and if so take time from there.
- if self.review and self.review.time:
- return self.review.time
- # If not, then it is closed review, so it either has event in doc or if not then take
- # time from the request.
- time = self.doc.request_closed_time(self)
- return time if time else self.time
def get_default_review_types():
return ReviewTypeName.objects.filter(slug__in=['early','lc','telechat'])
diff --git a/ietf/review/resources.py b/ietf/review/resources.py
index 059b801c5..abbf10202 100644
--- a/ietf/review/resources.py
+++ b/ietf/review/resources.py
@@ -7,7 +7,7 @@ from tastypie.cache import SimpleCache
from ietf import api
from ietf.api import ToOneField # pyflakes:ignore
-from ietf.review.models import (ReviewerSettings, ReviewRequest,
+from ietf.review.models import (ReviewerSettings, ReviewRequest, ReviewAssignment,
UnavailablePeriod, ReviewWish, NextReviewerInTeam,
ReviewSecretarySettings, ReviewTeamSettings,
HistoricalReviewerSettings )
@@ -45,9 +45,6 @@ class ReviewRequestResource(ModelResource):
doc = ToOneField(DocumentResource, 'doc')
team = ToOneField(GroupResource, 'team')
requested_by = ToOneField(PersonResource, 'requested_by')
- reviewer = ToOneField(EmailResource, 'reviewer', null=True)
- review = ToOneField(DocumentResource, 'review', null=True)
- result = ToOneField(ReviewResultNameResource, 'result', null=True)
class Meta:
queryset = ReviewRequest.objects.all()
serializer = api.Serializer()
@@ -59,17 +56,38 @@ class ReviewRequestResource(ModelResource):
"deadline": ALL,
"requested_rev": ALL,
"comment": ALL,
- "reviewed_rev": ALL,
"state": ALL_WITH_RELATIONS,
"type": ALL_WITH_RELATIONS,
"doc": ALL_WITH_RELATIONS,
"team": ALL_WITH_RELATIONS,
"requested_by": ALL_WITH_RELATIONS,
+ }
+api.review.register(ReviewRequestResource())
+
+from ietf.name.resources import ReviewAssignmentStateNameResource
+class ReviewAssignmentResource(ModelResource):
+ review_request = ToOneField(ReviewRequest, 'review_request')
+ state = ToOneField(ReviewAssignmentStateNameResource, 'state')
+ reviewer = ToOneField(EmailResource, 'reviewer', null=True)
+ review = ToOneField(DocumentResource, 'review', null=True)
+ result = ToOneField(ReviewResultNameResource, 'result', null=True)
+ class Meta:
+ queryset = ReviewAssignment.objects.all()
+ serializer = api.Serializer()
+ cache = SimpleCache()
+ #resource_name = 'reviewassignment'
+ filtering = {
+ "id": ALL,
+ "reviewed_rev": ALL,
+ "mailarch_url": ALL,
+ "assigned_on": ALL,
+ "completed_on": ALL,
+ "state": ALL_WITH_RELATIONS,
"reviewer": ALL_WITH_RELATIONS,
"review": ALL_WITH_RELATIONS,
"result": ALL_WITH_RELATIONS,
}
-api.review.register(ReviewRequestResource())
+api.review.register(ReviewAssignmentResource())
from ietf.person.resources import PersonResource
from ietf.group.resources import GroupResource
diff --git a/ietf/review/utils.py b/ietf/review/utils.py
index eeb809acd..be0517074 100644
--- a/ietf/review/utils.py
+++ b/ietf/review/utils.py
@@ -13,13 +13,13 @@ from django.contrib.sites.models import Site
import debug # pyflakes:ignore
from ietf.group.models import Group, Role
-from ietf.doc.models import (Document, ReviewRequestDocEvent, State,
+from ietf.doc.models import (Document, ReviewRequestDocEvent, ReviewAssignmentDocEvent, State,
LastCallDocEvent, TelechatDocEvent,
DocumentAuthor, DocAlias)
from ietf.iesg.models import TelechatDate
from ietf.person.models import Person
from ietf.ietfauth.utils import has_role, is_authorized_in_doc_stream
-from ietf.review.models import (ReviewRequest, ReviewRequestStateName, ReviewTypeName,
+from ietf.review.models import (ReviewRequest, ReviewAssignment, ReviewRequestStateName, ReviewTypeName,
ReviewerSettings, UnavailablePeriod, ReviewWish, NextReviewerInTeam,
ReviewTeamSettings, ReviewSecretarySettings)
from ietf.utils.mail import send_mail, get_email_addresses_from_text
@@ -29,7 +29,7 @@ def active_review_teams():
return Group.objects.filter(reviewteamsettings__isnull=False,state="active")
def close_review_request_states():
- return ReviewRequestStateName.objects.filter(used=True).exclude(slug__in=["requested", "accepted", "rejected", "part-completed", "completed"])
+ return ReviewRequestStateName.objects.filter(used=True).exclude(slug__in=["requested", "assigned"])
def can_request_review_of_doc(user, doc):
if not user.is_authenticated:
@@ -55,14 +55,14 @@ def can_access_review_stats_for_team(user, team):
return (Role.objects.filter(name__in=("secr", "reviewer"), person__user=user, group=team).exists()
or has_role(user, ["Secretariat", "Area Director"]))
-def review_requests_to_list_for_docs(docs):
- request_qs = ReviewRequest.objects.filter(
- state__in=["requested", "accepted", "part-completed", "completed"],
+def review_assignments_to_list_for_docs(docs):
+ assignment_qs = ReviewAssignment.objects.filter(
+ state__in=["assigned", "accepted", "part-completed", "completed"],
).prefetch_related("result")
doc_names = [d.name for d in docs]
- return extract_revision_ordered_review_requests_for_documents_and_replaced(request_qs, doc_names)
+ return extract_revision_ordered_review_assignments_for_documents_and_replaced(assignment_qs, doc_names)
def augment_review_requests_with_events(review_reqs):
req_dict = { r.pk: r for r in review_reqs }
@@ -72,7 +72,7 @@ def augment_review_requests_with_events(review_reqs):
def no_review_from_teams_on_doc(doc, rev):
return Group.objects.filter(
reviewrequest__doc__name=doc.name,
- reviewrequest__reviewed_rev=rev,
+ reviewrequest__requested_rev=rev,
reviewrequest__state__slug="no-review-version",
).distinct()
@@ -145,9 +145,9 @@ def days_needed_to_fulfill_min_interval_for_reviewers(team):
"""Returns person_id -> days needed until min_interval is fulfilled
for reviewer (in case it is necessary to wait, otherwise reviewer
is absent in result)."""
- latest_assignments = dict(ReviewRequest.objects.filter(
- team=team,
- ).values_list("reviewer__person").annotate(Max("time")))
+ latest_assignments = dict(ReviewAssignment.objects.filter(
+ review_request__team=team,
+ ).values_list("reviewer__person").annotate(Max("assigned_on")))
min_intervals = dict(ReviewerSettings.objects.filter(team=team).values_list("person_id", "min_interval"))
@@ -166,40 +166,39 @@ def days_needed_to_fulfill_min_interval_for_reviewers(team):
return res
-ReviewRequestData = namedtuple("ReviewRequestData", [
- "req_pk", "doc", "doc_pages", "req_time", "state", "assigned_time", "deadline", "reviewed_rev", "result", "team", "reviewer",
+ReviewAssignmentData = namedtuple("ReviewAssignmentData", [
+ "assignment_pk", "doc", "doc_pages", "req_time", "state", "assigned_time", "deadline", "reviewed_rev", "result", "team", "reviewer",
"late_days",
"request_to_assignment_days", "assignment_to_closure_days", "request_to_closure_days"])
-def extract_review_request_data(teams=None, reviewers=None, time_from=None, time_to=None, ordering=[]):
- """Yield data on each review request, sorted by (*ordering, time)
+def extract_review_assignment_data(teams=None, reviewers=None, time_from=None, time_to=None, ordering=[]):
+ """Yield data on each review assignment, sorted by (*ordering, assigned_on)
for easy use with itertools.groupby. Valid entries in *ordering are "team" and "reviewer"."""
filters = Q()
if teams:
- filters &= Q(team__in=teams)
+ filters &= Q(review_request__team__in=teams)
if reviewers:
filters &= Q(reviewer__person__in=reviewers)
if time_from:
- filters &= Q(time__gte=time_from)
+ filters &= Q(review_request__time__gte=time_from)
if time_to:
- filters &= Q(time__lte=time_to)
+ filters &= Q(review_request__time__lte=time_to)
- # we may be dealing with a big bunch of data, so treat it carefully
- event_qs = ReviewRequest.objects.filter(filters)
+ # This doesn't do the left-outer join on docevent that the previous code did. These variables could be renamed
+ event_qs = ReviewAssignment.objects.filter(filters)
- # left outer join with RequestRequestDocEvent for request/assign/close time
event_qs = event_qs.values_list(
- "pk", "doc", "doc__pages", "time", "state", "deadline", "reviewed_rev", "result", "team",
- "reviewer__person", "reviewrequestdocevent__time", "reviewrequestdocevent__type"
+ "pk", "review_request__doc", "review_request__doc__pages", "review_request__time", "state", "review_request__deadline", "reviewed_rev", "result", "review_request__team",
+ "reviewer__person", "assigned_on", "completed_on"
)
- event_qs = event_qs.order_by(*[o.replace("reviewer", "reviewer__person") for o in ordering] + ["time", "pk", "-reviewrequestdocevent__time"])
+ event_qs = event_qs.order_by(*[o.replace("reviewer", "reviewer__person").replace("team","review_request__team") for o in ordering] + ["review_request__time", "assigned_on", "pk", "completed_on"])
def positive_days(time_from, time_to):
if time_from is None or time_to is None:
@@ -212,33 +211,31 @@ def extract_review_request_data(teams=None, reviewers=None, time_from=None, time
else:
return 0.0
- for _, events in itertools.groupby(event_qs.iterator(), lambda t: t[0]):
- requested_time = assigned_time = closed_time = None
+ requested_time = assigned_time = closed_time = None
- for e in events:
- req_pk, doc, doc_pages, req_time, state, deadline, reviewed_rev, result, team, reviewer, event_time, event_type = e
+ for assignment in event_qs:
- if event_type == "requested_review" and requested_time is None:
- requested_time = event_time
- elif event_type == "assigned_review_request" and assigned_time is None:
- assigned_time = event_time
- elif event_type == "closed_review_request" and closed_time is None:
- closed_time = event_time
+ assignment_pk, doc, doc_pages, req_time, state, deadline, reviewed_rev, result, team, reviewer, assigned_on, completed_on = assignment
+
+ requested_time = req_time
+ assigned_time = assigned_on
+ closed_time = completed_on
late_days = positive_days(datetime.datetime.combine(deadline, datetime.time.max), closed_time)
request_to_assignment_days = positive_days(requested_time, assigned_time)
assignment_to_closure_days = positive_days(assigned_time, closed_time)
request_to_closure_days = positive_days(requested_time, closed_time)
- d = ReviewRequestData(req_pk, doc, doc_pages, req_time, state, assigned_time, deadline, reviewed_rev, result, team, reviewer,
+ d = ReviewAssignmentData(assignment_pk, doc, doc_pages, req_time, state, assigned_time, deadline, reviewed_rev, result, team, reviewer,
late_days, request_to_assignment_days, assignment_to_closure_days,
request_to_closure_days)
yield d
-def aggregate_raw_period_review_request_stats(review_request_data, count=None):
+
+def aggregate_raw_period_review_assignment_stats(review_assignment_data, count=None):
"""Take a sequence of review request data from
- extract_review_request_data and aggregate them."""
+ extract_review_assignment_data and aggregate them."""
state_dict = defaultdict(int)
late_state_dict = defaultdict(int)
@@ -246,8 +243,8 @@ def aggregate_raw_period_review_request_stats(review_request_data, count=None):
assignment_to_closure_days_list = []
assignment_to_closure_days_count = 0
- for (req_pk, doc, doc_pages, req_time, state, assigned_time, deadline, reviewed_rev, result, team, reviewer,
- late_days, request_to_assignment_days, assignment_to_closure_days, request_to_closure_days) in review_request_data:
+ for (assignment_pk, doc, doc_pages, req_time, state, assigned_time, deadline, reviewed_rev, result, team, reviewer,
+ late_days, request_to_assignment_days, assignment_to_closure_days, request_to_closure_days) in review_assignment_data:
if count == "pages":
c = doc_pages
else:
@@ -266,7 +263,7 @@ def aggregate_raw_period_review_request_stats(review_request_data, count=None):
return state_dict, late_state_dict, result_dict, assignment_to_closure_days_list, assignment_to_closure_days_count
-def sum_period_review_request_stats(raw_aggregation):
+def sum_period_review_assignment_stats(raw_aggregation):
"""Compute statistics from aggregated review request data for one aggregation point."""
state_dict, late_state_dict, result_dict, assignment_to_closure_days_list, assignment_to_closure_days_count = raw_aggregation
@@ -274,11 +271,11 @@ def sum_period_review_request_stats(raw_aggregation):
res["state"] = state_dict
res["result"] = result_dict
- res["open"] = sum(state_dict.get(s, 0) for s in ("requested", "accepted"))
+ res["open"] = sum(state_dict.get(s, 0) for s in ("assigned", "accepted"))
res["completed"] = sum(state_dict.get(s, 0) for s in ("completed", "part-completed"))
res["not_completed"] = sum(state_dict.get(s, 0) for s in state_dict if s in ("rejected", "withdrawn", "overtaken", "no-response"))
- res["open_late"] = sum(late_state_dict.get(s, 0) for s in ("requested", "accepted"))
+ res["open_late"] = sum(late_state_dict.get(s, 0) for s in ("assigned", "accepted"))
res["open_in_time"] = res["open"] - res["open_late"]
res["completed_late"] = sum(late_state_dict.get(s, 0) for s in ("completed", "part-completed"))
res["completed_in_time"] = res["completed"] - res["completed_late"]
@@ -287,7 +284,7 @@ def sum_period_review_request_stats(raw_aggregation):
return res
-def sum_raw_review_request_aggregations(raw_aggregations):
+def sum_raw_review_assignment_aggregations(raw_aggregations):
"""Collapse a sequence of aggregations into one aggregation."""
state_dict = defaultdict(int)
late_state_dict = defaultdict(int)
@@ -309,34 +306,61 @@ def sum_raw_review_request_aggregations(raw_aggregations):
return state_dict, late_state_dict, result_dict, assignment_to_closure_days_list, assignment_to_closure_days_count
-def latest_review_requests_for_reviewers(team, days_back=365):
- """Collect and return stats for reviewers on latest requests, in
- extract_review_request_data format."""
+def latest_review_assignments_for_reviewers(team, days_back=365):
+ """Collect and return stats for reviewers on latest assignments, in
+ extract_review_assignment_data format."""
- extracted_data = extract_review_request_data(
+ extracted_data = extract_review_assignment_data(
teams=[team],
time_from=datetime.date.today() - datetime.timedelta(days=days_back),
ordering=["reviewer"],
)
- req_data_for_reviewers = {
+ assignment_data_for_reviewers = {
reviewer: list(reversed(list(req_data_items)))
for reviewer, req_data_items in itertools.groupby(extracted_data, key=lambda data: data.reviewer)
}
- return req_data_for_reviewers
+ return assignment_data_for_reviewers
-def make_new_review_request_from_existing(review_req):
- obj = ReviewRequest()
- obj.time = review_req.time
- obj.type = review_req.type
- obj.doc = review_req.doc
- obj.team = review_req.team
- obj.deadline = review_req.deadline
- obj.requested_rev = review_req.requested_rev
- obj.requested_by = review_req.requested_by
- obj.state = ReviewRequestStateName.objects.get(slug="requested")
- return obj
+def email_review_assignment_change(request, review_assignment, subject, msg, by, notify_secretary, notify_reviewer, notify_requested_by):
+
+ system_email = Person.objects.get(name="(System)").formatted_email()
+
+ to = set()
+
+ def extract_email_addresses(objs):
+ for o in objs:
+ if o and o.person!=by:
+ e = o.formatted_email()
+ if e != system_email:
+ to.add(e)
+
+ if notify_secretary:
+ rts = ReviewTeamSettings.objects.filter(group=review_assignment.review_request.team).first()
+ if rts and rts.secr_mail_alias and rts.secr_mail_alias.strip() != '':
+ for addr in get_email_addresses_from_text(rts.secr_mail_alias):
+ to.add(addr)
+ else:
+ extract_email_addresses(Role.objects.filter(name="secr", group=review_assignment.review_request.team).distinct())
+ if notify_reviewer:
+ extract_email_addresses([review_assignment.reviewer])
+ if notify_requested_by:
+ extract_email_addresses([review_assignment.review_request.requested_by.email()])
+
+ if not to:
+ return
+
+ to = list(to)
+
+ url = urlreverse("ietf.doc.views_review.review_request_forced_login", kwargs={ "name": review_assignment.review_request.doc.name, "request_id": review_assignment.review_request.pk })
+ url = request.build_absolute_uri(url)
+ send_mail(request, to, request.user.person.formatted_email(), subject, "review/review_request_changed.txt", {
+ "review_req_url": url,
+ "review_req": review_assignment.review_request,
+ "msg": msg,
+ })
+
def email_review_request_change(request, review_req, subject, msg, by, notify_secretary, notify_reviewer, notify_requested_by):
@@ -362,7 +386,8 @@ def email_review_request_change(request, review_req, subject, msg, by, notify_se
else:
extract_email_addresses(Role.objects.filter(name="secr", group=review_req.team).distinct())
if notify_reviewer:
- extract_email_addresses([review_req.reviewer])
+ for assignment in review_req.reviewassignment_set.all():
+ extract_email_addresses([assignment.reviewer])
if notify_requested_by:
extract_email_addresses([review_req.requested_by.email()])
@@ -423,24 +448,21 @@ def email_reviewer_availability_change(request, team, reviewer_role, msg, by):
})
def assign_review_request_to_reviewer(request, review_req, reviewer, add_skip=False):
- assert review_req.state_id in ("requested", "accepted")
+ assert review_req.state_id in ("requested", "assigned")
- if reviewer == review_req.reviewer:
+ if review_req.reviewassignment_set.filter(reviewer=reviewer).exists():
return
- if review_req.reviewer:
- email_review_request_change(
- request, review_req,
- "Unassigned from review of %s" % review_req.doc.name,
- "%s has cancelled your assignment to the review." % request.user.person,
- by=request.user.person, notify_secretary=False, notify_reviewer=True, notify_requested_by=False)
+ # Note that assigning a review no longer unassigns other reviews
- review_req.state = ReviewRequestStateName.objects.get(slug="requested")
- review_req.reviewer = reviewer
- review_req.save()
+ if review_req.state_id != 'assigned':
+ review_req.state_id = 'assigned'
+ review_req.save()
+
+ assignment = review_req.reviewassignment_set.create(state_id='assigned', reviewer = reviewer, assigned_on = datetime.datetime.now())
- if review_req.reviewer:
- possibly_advance_next_reviewer_for_team(review_req.team, review_req.reviewer.person_id, add_skip)
+ if reviewer:
+ possibly_advance_next_reviewer_for_team(review_req.team, reviewer.person_id, add_skip)
ReviewRequestDocEvent.objects.create(
type="assigned_review_request",
@@ -450,26 +472,40 @@ def assign_review_request_to_reviewer(request, review_req, reviewer, add_skip=Fa
desc="Request for {} review by {} is assigned to {}".format(
review_req.type.name,
review_req.team.acronym.upper(),
- review_req.reviewer.person if review_req.reviewer else "(None)",
+ reviewer.person if reviewer else "(None)",
),
review_request=review_req,
- state=None,
+ state_id='assigned',
+ )
+
+ ReviewAssignmentDocEvent.objects.create(
+ type="assigned_review_request",
+ doc=review_req.doc,
+ rev=review_req.doc.rev,
+ by=request.user.person,
+ desc="Request for {} review by {} is assigned to {}".format(
+ review_req.type.name,
+ review_req.team.acronym.upper(),
+ reviewer.person if reviewer else "(None)",
+ ),
+ review_assignment=assignment,
+ state_id='assigned',
)
msg = "%s has assigned you as a reviewer for this document." % request.user.person.ascii
- prev_team_reviews = ReviewRequest.objects.filter(
- doc=review_req.doc,
+ prev_team_reviews = ReviewAssignment.objects.filter(
+ review_request__doc=review_req.doc,
state="completed",
- team=review_req.team,
+ review_request__team=review_req.team,
)
if prev_team_reviews.exists():
msg = msg + '\n\nThis team has completed other reviews of this document:\n'
- for req in prev_team_reviews:
+ for assignment in prev_team_reviews:
msg += u'%s %s -%s %s\n'% (
- req.review_done_time().strftime('%d %b %Y'),
- req.reviewer.person.ascii,
- req.reviewed_rev or req.requested_rev,
- req.result.name,
+ assignment.completed_on.strftime('%d %b %Y'),
+ assignment.reviewer.person.ascii,
+ assignment.reviewed_rev or assignment.review_request.requested_rev,
+ assignment.result.name,
)
email_review_request_change(
@@ -526,8 +562,9 @@ def close_review_request(request, review_req, close_state):
suggested_req = review_req.pk is None
review_req.state = close_state
- if close_state.slug == "no-review-version":
- review_req.reviewed_rev = review_req.requested_rev or review_req.doc.rev # save rev for later reference
+# This field no longer exists, and it's not clear what the later reference was...
+# if close_state.slug == "no-review-version":
+# review_req.reviewed_rev = review_req.requested_rev or review_req.doc.rev # save rev for later reference
review_req.save()
if not suggested_req:
@@ -542,6 +579,19 @@ def close_review_request(request, review_req, close_state):
state=review_req.state,
)
+ for assignment in review_req.reviewassignment_set.filter(state_id__in=['assigned','accepted']):
+ assignment.state_id = 'withdrawn'
+ assignment.save()
+ ReviewAssignmentDocEvent.objects.create(
+ type='closed_review_request',
+ doc=review_req.doc,
+ rev=review_req.doc.rev,
+ by=request.user.person,
+ desc="Request closed, assignment withdrawn: {} {} {} review".format(assignment.reviewer.person.plain_name(), assignment.review_request.type.name, assignment.review_request.team.acronym.upper()),
+ review_assignment=assignment,
+ state=assignment.state,
+ )
+
email_review_request_change(
request, review_req,
"Closed review request for {}: {}".format(review_req.doc.name, close_state.name),
@@ -636,7 +686,7 @@ def suggested_review_requests_for_team(team):
seen_deadlines[doc_pk] = deadline
- # filter those with existing requests
+ # filter those with existing explicit requests
existing_requests = defaultdict(list)
for r in ReviewRequest.objects.filter(doc__in=requests.iterkeys(), team=team):
existing_requests[r.doc_id].append(r)
@@ -646,18 +696,67 @@ def suggested_review_requests_for_team(team):
return False
no_review_document = existing.state_id == "no-review-document"
- pending = (existing.state_id in ("requested", "accepted")
+ no_review_rev = ( existing.state_id == "no-review-version") and (not existing.requested_rev or existing.requested_rev == request.doc.rev)
+ pending = (existing.state_id == "assigned"
+ and existing.reviewassignment_set.filter(state_id__in=("assigned", "accepted")).exists()
and (not existing.requested_rev or existing.requested_rev == request.doc.rev))
- completed_or_closed = (existing.state_id not in ("part-completed", "rejected", "overtaken", "no-response")
- and existing.reviewed_rev == request.doc.rev)
+ request_closed = existing.state_id not in ('requested','assigned')
+ # at least one assignment was completed for the requested version or the current doc version if no specific version was requested:
+ some_assignment_completed = existing.reviewassignment_set.filter(reviewed_rev=existing.requested_rev or existing.doc.rev, state_id='completed').exists()
- return no_review_document or pending or completed_or_closed
+ return any([no_review_document, no_review_rev, pending, request_closed, some_assignment_completed])
res = [r for r in requests.itervalues()
if not any(blocks(e, r) for e in existing_requests[r.doc_id])]
res.sort(key=lambda r: (r.deadline, r.doc_id), reverse=True)
return res
+def extract_revision_ordered_review_assignments_for_documents_and_replaced(review_assignment_queryset, names):
+ """Extracts all review assignments for document names (including replaced ancestors), return them neatly sorted."""
+
+ names = set(names)
+
+ replaces = extract_complete_replaces_ancestor_mapping_for_docs(names)
+
+ assignments_for_each_doc = defaultdict(list)
+ for r in review_assignment_queryset.filter(review_request__doc__in=set(e for l in replaces.itervalues() for e in l) | names).order_by("-reviewed_rev","-assigned_on", "-id").iterator():
+ assignments_for_each_doc[r.review_request.doc_id].append(r)
+
+ # now collect in breadth-first order to keep the revision order intact
+ res = defaultdict(list)
+ for name in names:
+ front = replaces.get(name, [])
+ res[name].extend(assignments_for_each_doc.get(name, []))
+
+ seen = set()
+
+ while front:
+ replaces_assignments = []
+ next_front = []
+ for replaces_name in front:
+ if replaces_name in seen:
+ continue
+
+ seen.add(replaces_name)
+
+ assignments = assignments_for_each_doc.get(replaces_name, [])
+ if assignments:
+ replaces_assignments.append(assignments)
+
+ next_front.extend(replaces.get(replaces_name, []))
+
+ # in case there are multiple replaces, move the ones with
+ # the latest reviews up front
+ replaces_assignments.sort(key=lambda l: l[0].assigned_on, reverse=True)
+
+ for assignments in replaces_assignments:
+ res[name].extend(assignments)
+
+ # move one level down
+ front = next_front
+
+ return res
+
def extract_revision_ordered_review_requests_for_documents_and_replaced(review_request_queryset, names):
"""Extracts all review requests for document names (including replaced ancestors), return them neatly sorted."""
@@ -666,7 +765,7 @@ def extract_revision_ordered_review_requests_for_documents_and_replaced(review_r
replaces = extract_complete_replaces_ancestor_mapping_for_docs(names)
requests_for_each_doc = defaultdict(list)
- for r in review_request_queryset.filter(doc__in=set(e for l in replaces.itervalues() for e in l) | names).order_by("-reviewed_rev", "-time", "-id").iterator():
+ for r in review_request_queryset.filter(doc__in=set(e for l in replaces.itervalues() for e in l) | names).order_by("-time", "-id").iterator():
requests_for_each_doc[r.doc_id].append(r)
# now collect in breadth-first order to keep the revision order intact
@@ -704,10 +803,12 @@ def extract_revision_ordered_review_requests_for_documents_and_replaced(review_r
return res
+# TODO : Change this field to deal with multiple already assigned reviewers
def setup_reviewer_field(field, review_req):
field.queryset = field.queryset.filter(role__name="reviewer", role__group=review_req.team)
- if review_req.reviewer:
- field.initial = review_req.reviewer_id
+ one_assignment = review_req.reviewassignment_set.first()
+ if one_assignment:
+ field.initial = one_assignment.reviewer_id
choices = make_assignment_choices(field.queryset, review_req)
if not field.required:
@@ -752,15 +853,15 @@ def make_assignment_choices(email_queryset, review_req):
# previous review of document
has_reviewed_previous = ReviewRequest.objects.filter(
doc=doc,
- reviewer__person__in=possible_person_ids,
- state="completed",
+ reviewassignment__reviewer__person__in=possible_person_ids,
+ reviewassignment__state="completed",
team=team,
- )
+ ).distinct()
if review_req.pk is not None:
has_reviewed_previous = has_reviewed_previous.exclude(pk=review_req.pk)
- has_reviewed_previous = set(has_reviewed_previous.values_list("reviewer__person", flat=True))
+ has_reviewed_previous = set(has_reviewed_previous.values_list("reviewassignment__reviewer__person", flat=True))
# review wishes
wish_to_review = set(ReviewWish.objects.filter(team=team, person__in=possible_person_ids, doc=doc).values_list("person", flat=True))
@@ -780,7 +881,7 @@ def make_assignment_choices(email_queryset, review_req):
unavailable_periods = current_unavailable_periods_for_reviewers(team)
# reviewers statistics
- req_data_for_reviewers = latest_review_requests_for_reviewers(team)
+ assignment_data_for_reviewers = latest_review_assignments_for_reviewers(team)
ranking = []
for e in possible_emails:
@@ -835,21 +936,21 @@ def make_assignment_choices(email_queryset, review_req):
# stats
stats = []
- req_data = req_data_for_reviewers.get(e.person_id, [])
+ assignment_data = assignment_data_for_reviewers.get(e.person_id, [])
- currently_open = sum(1 for d in req_data if d.state in ["requested", "accepted"])
- pages = sum(rd.doc_pages for rd in req_data if rd.state in ["requested", "accepted"])
+ currently_open = sum(1 for d in assignment_data if d.state in ["assigned", "accepted"])
+ pages = sum(rd.doc_pages for rd in assignment_data if rd.state in ["assigned", "accepted"])
if currently_open > 0:
stats.append("currently {count} open, {pages} pages".format(count=currently_open, pages=pages))
- could_have_completed = [d for d in req_data if d.state in ["part-completed", "completed", "no-response"]]
+ could_have_completed = [d for d in assignment_data if d.state in ["part-completed", "completed", "no-response"]]
if could_have_completed:
- no_response = len([d for d in req_data if d.state == 'no-response'])
+ no_response = len([d for d in assignment_data if d.state == 'no-response'])
if no_response:
stats.append("%s no response" % no_response)
- part_completed = len([d for d in req_data if d.state == 'part-completed'])
+ part_completed = len([d for d in assignment_data if d.state == 'part-completed'])
if part_completed:
stats.append("%s partially complete" % part_completed)
- completed = len([d for d in req_data if d.state == 'completed'])
+ completed = len([d for d in assignment_data if d.state == 'completed'])
if completed:
stats.append("%s fully completed" % completed)
@@ -870,21 +971,19 @@ def make_assignment_choices(email_queryset, review_req):
return [(r["email"].pk, r["label"]) for r in ranking]
-def review_requests_needing_reviewer_reminder(remind_date):
- reqs_qs = ReviewRequest.objects.filter(
- state__in=("requested", "accepted"),
+def review_assignments_needing_reviewer_reminder(remind_date):
+ assignment_qs = ReviewAssignment.objects.filter(
+ state__in=("assigned", "accepted"),
reviewer__person__reviewersettings__remind_days_before_deadline__isnull=False,
- reviewer__person__reviewersettings__team=F("team"),
- ).exclude(
- reviewer=None
- ).values_list("pk", "deadline", "reviewer__person__reviewersettings__remind_days_before_deadline").distinct()
+ reviewer__person__reviewersettings__team=F("review_request__team"),
+ ).values_list("pk", "review_request__deadline", "reviewer__person__reviewersettings__remind_days_before_deadline").distinct()
- req_pks = []
- for r_pk, deadline, remind_days in reqs_qs:
+ assignment_pks = []
+ for a_pk, deadline, remind_days in assignment_qs:
if (deadline - remind_date).days == remind_days:
- req_pks.append(r_pk)
+ assignment_pks.append(a_pk)
- return ReviewRequest.objects.filter(pk__in=req_pks).select_related("reviewer", "reviewer__person", "state", "team")
+ return ReviewAssignment.objects.filter(pk__in=assignment_pks).select_related("reviewer", "reviewer__person", "state", "review_request__team")
def email_reviewer_reminder(review_request):
team = review_request.team
@@ -911,24 +1010,24 @@ def email_reviewer_reminder(review_request):
"remind_days": remind_days,
})
-def review_requests_needing_secretary_reminder(remind_date):
- reqs_qs = ReviewRequest.objects.filter(
- state__in=("requested", "accepted"),
- team__role__person__reviewsecretarysettings__remind_days_before_deadline__isnull=False,
- team__role__person__reviewsecretarysettings__team=F("team"),
+def review_assignments_needing_secretary_reminder(remind_date):
+ assignment_qs = ReviewAssignment.objects.filter(
+ state__in=("assigned", "accepted"),
+ review_request__team__role__person__reviewsecretarysettings__remind_days_before_deadline__isnull=False,
+ review_request__team__role__person__reviewsecretarysettings__team=F("review_request__team"),
).exclude(
reviewer=None
- ).values_list("pk", "deadline", "team__role", "team__role__person__reviewsecretarysettings__remind_days_before_deadline").distinct()
+ ).values_list("pk", "review_request__deadline", "review_request__team__role", "review_request__team__role__person__reviewsecretarysettings__remind_days_before_deadline").distinct()
- req_pks = {}
- for r_pk, deadline, secretary_role_pk, remind_days in reqs_qs:
+ assignment_pks = {}
+ for a_pk, deadline, secretary_role_pk, remind_days in assignment_qs:
if (deadline - remind_date).days == remind_days:
- req_pks[r_pk] = secretary_role_pk
+ assignment_pks[a_pk] = secretary_role_pk
- review_reqs = { r.pk: r for r in ReviewRequest.objects.filter(pk__in=req_pks.keys()).select_related("reviewer", "reviewer__person", "state", "team") }
- secretary_roles = { r.pk: r for r in Role.objects.filter(pk__in=req_pks.values()).select_related("email", "person") }
+ review_assignments = { a.pk: a for a in ReviewAssignment.objects.filter(pk__in=assignment_pks.keys()).select_related("reviewer", "reviewer__person", "state", "review_request__team") }
+ secretary_roles = { r.pk: r for r in Role.objects.filter(pk__in=assignment_pks.values()).select_related("email", "person") }
- return [ (review_reqs[req_pk], secretary_roles[secretary_role_pk]) for req_pk, secretary_role_pk in req_pks.iteritems() ]
+ return [ (review_assignments[a_pk], secretary_roles[secretary_role_pk]) for a_pk, secretary_role_pk in assignment_pks.iteritems() ]
def email_secretary_reminder(review_request, secretary_role):
team = review_request.team
diff --git a/ietf/static/ietf/css/ietf.css b/ietf/static/ietf/css/ietf.css
index ad2a0c9aa..19485abcf 100644
--- a/ietf/static/ietf/css/ietf.css
+++ b/ietf/static/ietf/css/ietf.css
@@ -451,7 +451,11 @@ table tbody.meta th:nth-child(2), table tbody.meta td:nth-child(2) {
width: 9em;
}
-
+table tbody.panel-meta th, table tbody.panel-meta td { border-top: 0; }
+table tbody.panel-meta th:first-child, table tbody.panel-meta td:first-child {
+ text-align: right;
+ width: 9em;
+}
td.area-director div { border-bottom: solid #ccc 1px; }
diff --git a/ietf/stats/tests.py b/ietf/stats/tests.py
index ee7571f4b..13656a723 100644
--- a/ietf/stats/tests.py
+++ b/ietf/stats/tests.py
@@ -4,6 +4,8 @@ from mock import patch
from pyquery import PyQuery
from requests import Response
+import debug # pyflakes:ignore
+
from django.urls import reverse as urlreverse
from django.contrib.auth.models import User
@@ -18,7 +20,7 @@ from ietf.meeting.factories import MeetingFactory
from ietf.person.factories import PersonFactory
from ietf.person.models import Person, Email
from ietf.name.models import FormalLanguageName, DocRelationshipName, CountryName
-from ietf.review.factories import ReviewRequestFactory, ReviewerSettingsFactory
+from ietf.review.factories import ReviewRequestFactory, ReviewerSettingsFactory, ReviewAssignmentFactory
from ietf.stats.models import MeetingRegistration, CountryAlias
from ietf.stats.utils import get_meeting_registration_data
@@ -157,7 +159,8 @@ class StatisticsTests(TestCase):
def test_review_stats(self):
reviewer = PersonFactory()
- review_req = ReviewRequestFactory(reviewer=reviewer.email_set.first())
+ review_req = ReviewRequestFactory(state_id='assigned')
+ ReviewAssignmentFactory(review_request=review_req, state_id='assigned', reviewer=reviewer.email_set.first())
RoleFactory(group=review_req.team,name_id='reviewer',person=reviewer)
ReviewerSettingsFactory(team=review_req.team, person=reviewer)
PersonFactory(user__username='plain')
diff --git a/ietf/stats/views.py b/ietf/stats/views.py
index f2848b36f..4eeac6506 100644
--- a/ietf/stats/views.py
+++ b/ietf/stats/views.py
@@ -19,15 +19,15 @@ from django.utils.text import slugify
import debug # pyflakes:ignore
-from ietf.review.utils import (extract_review_request_data,
- aggregate_raw_period_review_request_stats,
- ReviewRequestData,
- sum_period_review_request_stats,
- sum_raw_review_request_aggregations)
+from ietf.review.utils import (extract_review_assignment_data,
+ aggregate_raw_period_review_assignment_stats,
+ ReviewAssignmentData,
+ sum_period_review_assignment_stats,
+ sum_raw_review_assignment_aggregations)
from ietf.submit.models import Submission
from ietf.group.models import Role, Group
from ietf.person.models import Person
-from ietf.name.models import ReviewRequestStateName, ReviewResultName, CountryName, DocRelationshipName
+from ietf.name.models import ReviewResultName, CountryName, DocRelationshipName, ReviewAssignmentStateName
from ietf.person.name import plain_name
from ietf.doc.models import DocAlias, Document, State, DocEvent
from ietf.meeting.models import Meeting
@@ -1020,7 +1020,7 @@ def review_stats(request, stats_type=None, acronym=None):
possible_stats_types = [
("completion", "Completion status"),
("results", "Review results"),
- ("states", "Request states"),
+ ("states", "Assignment states"),
]
if level == "team":
@@ -1094,7 +1094,7 @@ def review_stats(request, stats_type=None, acronym=None):
query_reviewers = None
group_by_objs = { t.pk: t for t in query_teams }
- group_by_index = ReviewRequestData._fields.index("team")
+ group_by_index = ReviewAssignmentData._fields.index("team")
elif level == "reviewer":
for t in teams:
@@ -1105,9 +1105,9 @@ def review_stats(request, stats_type=None, acronym=None):
return HttpResponseRedirect(urlreverse(review_stats))
query_reviewers = list(Person.objects.filter(
- email__reviewrequest__time__gte=from_time,
- email__reviewrequest__time__lte=to_time,
- email__reviewrequest__team=reviewers_for_team,
+ email__reviewassignment__review_request__time__gte=from_time,
+ email__reviewassignment__review_request__time__lte=to_time,
+ email__reviewassignment__review_request__team=reviewers_for_team,
**reviewer_filter_args.get(t.pk, {})
).distinct())
query_reviewers.sort(key=lambda p: p.last_name())
@@ -1115,7 +1115,7 @@ def review_stats(request, stats_type=None, acronym=None):
query_teams = [t]
group_by_objs = { r.pk: r for r in query_reviewers }
- group_by_index = ReviewRequestData._fields.index("reviewer")
+ group_by_index = ReviewAssignmentData._fields.index("reviewer")
# now filter and aggregate the data
possible_teams = possible_completion_types = possible_results = possible_states = None
@@ -1139,22 +1139,23 @@ def review_stats(request, stats_type=None, acronym=None):
)
query_teams = [t for t in query_teams if t.acronym in selected_teams]
- extracted_data = extract_review_request_data(query_teams, query_reviewers, from_time, to_time)
+ extracted_data = extract_review_assignment_data(query_teams, query_reviewers, from_time, to_time)
- req_time_index = ReviewRequestData._fields.index("req_time")
+ req_time_index = ReviewAssignmentData._fields.index("req_time")
def time_key_fn(t):
d = t[req_time_index].date()
#d -= datetime.timedelta(days=d.weekday()) # weekly
- d -= datetime.timedelta(days=d.day) # monthly
+ # NOTE: Earlier releases had an off-by-one error here - some stat counts may move a month.
+ d -= datetime.timedelta(days=d.day-1) # monthly
return d
found_results = set()
found_states = set()
aggrs = []
for d, request_data_items in itertools.groupby(extracted_data, key=time_key_fn):
- raw_aggr = aggregate_raw_period_review_request_stats(request_data_items, count=count)
- aggr = sum_period_review_request_stats(raw_aggr)
+ raw_aggr = aggregate_raw_period_review_assignment_stats(request_data_items, count=count)
+ aggr = sum_period_review_assignment_stats(raw_aggr)
aggrs.append((d, aggr))
@@ -1164,7 +1165,7 @@ def review_stats(request, stats_type=None, acronym=None):
found_states.add(slug)
results = ReviewResultName.objects.filter(slug__in=found_results)
- states = ReviewRequestStateName.objects.filter(slug__in=found_states)
+ states = ReviewAssignmentStateName.objects.filter(slug__in=found_states)
# choice
@@ -1213,7 +1214,7 @@ def review_stats(request, stats_type=None, acronym=None):
}])
else: # tabular data
- extracted_data = extract_review_request_data(query_teams, query_reviewers, from_time, to_time, ordering=[level])
+ extracted_data = extract_review_assignment_data(query_teams, query_reviewers, from_time, to_time, ordering=[level])
data = []
@@ -1221,10 +1222,10 @@ def review_stats(request, stats_type=None, acronym=None):
found_states = set()
raw_aggrs = []
for group_pk, request_data_items in itertools.groupby(extracted_data, key=lambda t: t[group_by_index]):
- raw_aggr = aggregate_raw_period_review_request_stats(request_data_items, count=count)
+ raw_aggr = aggregate_raw_period_review_assignment_stats(request_data_items, count=count)
raw_aggrs.append(raw_aggr)
- aggr = sum_period_review_request_stats(raw_aggr)
+ aggr = sum_period_review_assignment_stats(raw_aggr)
# skip zero-valued rows
if aggr["open"] == 0 and aggr["completed"] == 0 and aggr["not_completed"] == 0:
@@ -1241,12 +1242,12 @@ def review_stats(request, stats_type=None, acronym=None):
# add totals row
if len(raw_aggrs) > 1:
- totals = sum_period_review_request_stats(sum_raw_review_request_aggregations(raw_aggrs))
+ totals = sum_period_review_assignment_stats(sum_raw_review_assignment_aggregations(raw_aggrs))
totals["obj"] = "Totals"
data.append(totals)
results = ReviewResultName.objects.filter(slug__in=found_results)
- states = ReviewRequestStateName.objects.filter(slug__in=found_states)
+ states = ReviewAssignmentStateName.objects.filter(slug__in=found_states)
# massage states/results breakdowns for template rendering
for aggr in data:
diff --git a/ietf/templates/doc/document_draft.html b/ietf/templates/doc/document_draft.html
index d8c4ad95c..884b2db37 100644
--- a/ietf/templates/doc/document_draft.html
+++ b/ietf/templates/doc/document_draft.html
@@ -204,14 +204,14 @@
{% endif %}
{% endfor %}
- {% if review_requests or can_request_review %}
+ {% if review_assignments or can_request_review %}
Reviews
- {% for review_request in review_requests %}
- {% include "doc/review_request_summary.html" with current_doc_name=doc.name current_rev=doc.rev %}
+ {% for review_assignment in review_assignments %}
+ {% include "doc/review_assignment_summary.html" with current_doc_name=doc.name current_rev=doc.rev %}
{% endfor %}
{% if no_review_from_teams %}
diff --git a/ietf/templates/doc/document_review.html b/ietf/templates/doc/document_review.html
index 263ee5cfd..efa13552f 100644
--- a/ietf/templates/doc/document_review.html
+++ b/ietf/templates/doc/document_review.html
@@ -43,8 +43,8 @@
Other reviews
- {% for review_request in other_reviews %}
- {% include "doc/review_request_summary.html" with current_doc_name=review_req.doc_id current_rev=review_req.reviewed_rev %}
+ {% for review_assignment in other_reviews %}
+ {% include "doc/review_assignment_summary.html" with current_doc_name=review_assignemnt.review_request.doc_id current_rev=review_assignment.reviewed_rev %}
{% endfor %}
diff --git a/ietf/templates/doc/review/complete_review.html b/ietf/templates/doc/review/complete_review.html
index 12dda2b60..cfc586529 100644
--- a/ietf/templates/doc/review/complete_review.html
+++ b/ietf/templates/doc/review/complete_review.html
@@ -11,14 +11,14 @@
{% block content %}
{% origin %}
{% if revising_review %}Revise{% else %}Complete{% endif %} review
- {{ review_req.doc.name }}
+ {{ assignment.review_request.doc.name }}
-
Review type: {{ review_req.team.acronym }} - {{ review_req.type }} review
- Requested version for review: {{ review_req.requested_rev|default:"Current" }}
- Requsted: {{ review_req.time|date:"Y-m-d" }}
- Reviewer: {{ review_req.reviewer.person.name }}
+ Review type: {{ assignment.review_request.team.acronym }} - {{ assignment.review_request.type }} review
+ Requested version for review: {{ assignment.review_request.requested_rev|default:"Current" }}
+ Requested: {{ assignment.review_request.time|date:"Y-m-d" }}
+ Reviewer: {{ assignment.reviewer.person.name }}
{% if not revising_review %}
@@ -37,7 +37,7 @@
{% bootstrap_form form layout="horizontal" %}
{% buttons %}
- Cancel
+ Cancel
{% if revising_review %}Revise{% else %}Complete{% endif %} review
{% endbuttons %}
@@ -95,7 +95,7 @@
{% block js %}
{% endblock %}
diff --git a/ietf/templates/doc/review/mark_reviewer_assignment_no_response.html b/ietf/templates/doc/review/mark_reviewer_assignment_no_response.html
new file mode 100644
index 000000000..aa23b3c6a
--- /dev/null
+++ b/ietf/templates/doc/review/mark_reviewer_assignment_no_response.html
@@ -0,0 +1,22 @@
+{% extends "base.html" %}
+{# Copyright The IETF Trust 2019, All Rights Reserved #}
+{% load origin bootstrap3 static %}
+
+{% block title %}Mark review assignment for {{ assignment.review_request.doc.name }} as No Response{% endblock %}
+
+{% block content %}
+ {% origin %}
+ No-Response: Review assignment{{ assignment.review_request.doc.name }}
+
+ Mark review assignment for {{ assignment.reviewer.person }} as No Response
+
+
+
+{% endblock %}
diff --git a/ietf/templates/doc/review/reject_reviewer_assignment.html b/ietf/templates/doc/review/reject_reviewer_assignment.html
index 93380a405..d70ce0770 100644
--- a/ietf/templates/doc/review/reject_reviewer_assignment.html
+++ b/ietf/templates/doc/review/reject_reviewer_assignment.html
@@ -10,7 +10,7 @@
{% include "doc/review/request_info.html" %}
- {{ review_req.reviewer.person }} is currently assigned to do the review. Do you want to reject this assignment?
+ Do you want to reject this assignment?
+ {% csrf_token %}
+
+ {% buttons %}
+ Cancel
+ Withdraw assignment
+ {% endbuttons %}
+
+
+{% endblock %}
diff --git a/ietf/templates/doc/review_assignment_summary.html b/ietf/templates/doc/review_assignment_summary.html
new file mode 100644
index 000000000..e6e9bcca6
--- /dev/null
+++ b/ietf/templates/doc/review_assignment_summary.html
@@ -0,0 +1,12 @@
+
diff --git a/ietf/templates/doc/review_request_summary.html b/ietf/templates/doc/review_request_summary.html
deleted file mode 100644
index e06b8176a..000000000
--- a/ietf/templates/doc/review_request_summary.html
+++ /dev/null
@@ -1,12 +0,0 @@
-
diff --git a/ietf/templates/group/email_open_review_assignments.html b/ietf/templates/group/email_open_review_assignments.html
index 74dcc5b03..4ac55fc46 100644
--- a/ietf/templates/group/email_open_review_assignments.html
+++ b/ietf/templates/group/email_open_review_assignments.html
@@ -11,7 +11,7 @@
Email summary of assigned review requests for {{ group.acronym }}
- {% if review_requests %}
+ {% if review_assignments %}
{% csrf_token %}
{% bootstrap_form form %}
diff --git a/ietf/templates/group/review_requests.html b/ietf/templates/group/review_requests.html
index 6122f07a9..bcae4ccbf 100644
--- a/ietf/templates/group/review_requests.html
+++ b/ietf/templates/group/review_requests.html
@@ -17,61 +17,103 @@
{% endif %}
- {% for label, review_requests in open_review_requests %}
- {% if review_requests %}
+ {% if unassigned_review_requests %}
- {{ label }} open review requests
+ Unassigned review requests
-
-
+
+
+
+ Request
+ Type
+ Requested
+ Deadline
+ {% if review_requests.0.reviewer %}
+ Reviewer
+ Document state
+ {% else %}
+ Document state
+ {% endif %}
+ IESG Telechat
+
+
+
+ {% for r in unassigned_review_requests %}
- Request
- Type
- Requested
- Deadline
- {% if review_requests.0.reviewer %}
- Reviewer
- Document state
- {% else %}
- Document state
+ {% if r.pk != None %}{% endif %}{{ r.doc.name }}-{% if r.requested_rev %}{{ r.requested_rev }}{% else %}{{ r.doc.rev }}{% endif %}{% if r.pk != None %} {% endif %}
+ {{ r.type.name }}
+ X {% if r.pk %}{{ r.time|date:"Y-m-d" }} by {{r.requested_by.plain_name}}{% else %}auto-suggested {% endif %}
+ X
+ {{ r.deadline|date:"Y-m-d" }}
+ {% if r.due %}{{ r.due }} day{{ r.due|pluralize }} {% endif %}
+
+ {% if r.reviewer %}
+
+ {{ r.reviewer.person }}
+ {% if r.state_id == "accepted" %}Accepted {% endif %}
+ {% if r.reviewer_unavailable %}Unavailable {% endif %}
+
{% endif %}
- IESG Telechat
-
-
-
- {% for r in review_requests %}
-
- {% if r.pk != None %}{% endif %}{{ r.doc.name }}-{% if r.requested_rev %}{{ r.requested_rev }}{% else %}{{ r.doc.rev }}{% endif %}{% if r.pk != None %} {% endif %}
- {{ r.type.name }}
- X {% if r.pk %}{{ r.time|date:"Y-m-d" }} by {{r.requested_by.plain_name}}{% else %}auto-suggested {% endif %}
- X
- {{ r.deadline|date:"Y-m-d" }}
- {% if r.due %}{{ r.due }} day{{ r.due|pluralize }} {% endif %}
-
- {% if r.reviewer %}
-
- {{ r.reviewer.person }}
- {% if r.state_id == "accepted" %}Accepted {% endif %}
- {% if r.reviewer_unavailable %}Unavailable {% endif %}
-
+
+ {{ r.doc.friendly_state }}
+
+
+ {% if r.doc.telechat_date %}
+ {{ r.doc.telechat_date }}
{% endif %}
-
- {{ r.doc.friendly_state }}
-
-
- {% if r.doc.telechat_date %}
- {{ r.doc.telechat_date }}
- {% endif %}
-
-
- {% endfor %}
-
-
+
+
+ {% endfor %}
+
+
- {% endif %}
- {% endfor %}
+ {% endif %}
- Closed review requests
+ {% if open_review_assignments %}
+ Open review assignments
+
+
+
+
+ Request
+ Type
+ Assigned
+ Deadline
+ Reviewer
+ Document state
+ IESG Telechat
+
+
+
+ {% for a in open_review_assignments %}
+
+ {{ a.review_request.doc.name }}-{% if a.review_request.requested_rev %}{{ a.review_requests.requested_rev }}{% else %}{{ a.review_request.doc.rev }}{% endif %}
+ {{ a.review_request.type.name }}
+ X {{ a.assigned_on|date:"Y-m-d" }}
+ X
+ {{ a.review_request.deadline|date:"Y-m-d" }}
+ {% if a.due %}{{ a.due }} day{{ a.due|pluralize }} {% endif %}
+
+
+ {{ a.reviewer.person }}
+ {% if a.state_id == "accepted" %}Accepted {% endif %}
+ {% if a.reviewer_unavailable %}Unavailable {% endif %}
+
+
+ {{ a.review_request.doc.friendly_state }}
+
+
+ {% if a.review_request.doc.telechat_date %}
+ {{ a.review_request.doc.telechat_date }}
+ {% endif %}
+
+
+ {% endfor %}
+
+
+ {% endif %}
+
+ Closed review requests and assignments
Past:
@@ -83,7 +125,8 @@
{% if closed_review_requests %}
-
+ Closed review requests
+
Request
@@ -91,9 +134,7 @@
Requested
Deadline
Closed
- Reviewer
State
- Result
@@ -103,27 +144,49 @@
{{ r.type }}
X {{ r.time|date:"Y-m-d" }} by {{ r.requested_by.plain_name }}
{{ r.deadline|date:"Y-m-d" }}
- {{ r.review_done_time|date:"Y-m-d" }}
-
- {% if r.reviewer %}
- {{ r.reviewer.person }}
- {% else %}
- not yet assigned
- {% endif %}
-
+ {{ r.request_closed_time|date:"Y-m-d" }}
{{ r.state.name }}
-
- {% if r.result %}
- {{ r.result.name }}
- {% endif %}
-
{% endfor %}
-
- {% else %}
- No closed requests found.
+ {% endif %}
+
+ {% if closed_review_assignments %}
+ Closed review assignments
+
+
+ {% endif %}
+
+ {% if not closed_review_requests and not closed_review_assignments %}
+ None found
{% endif %}
{% endblock %}
diff --git a/ietf/templates/iesg/agenda_doc.html b/ietf/templates/iesg/agenda_doc.html
index 4095122c5..3a018097e 100644
--- a/ietf/templates/iesg/agenda_doc.html
+++ b/ietf/templates/iesg/agenda_doc.html
@@ -47,11 +47,11 @@
Consensus {{ doc.consensus }}
{% endif %}
- {% if doc.review_requests %}
+ {% if doc.review_assignments %}
Reviews
- {% for review_request in doc.review_requests %}
- {% include "doc/review_request_summary.html" with current_doc_name=doc.name current_rev=doc.rev %}
+ {% for review_assignment in doc.review_assignments %}
+ {% include "doc/review_assignment_summary.html" with current_doc_name=doc.name current_rev=doc.rev %}
{% endfor %}
{% endif %}
diff --git a/ietf/templates/iesg/agenda_doc.txt b/ietf/templates/iesg/agenda_doc.txt
index 49ed89043..c5700d795 100644
--- a/ietf/templates/iesg/agenda_doc.txt
+++ b/ietf/templates/iesg/agenda_doc.txt
@@ -5,7 +5,7 @@
{% endif %} Token: {{ doc.ad }}{% if doc.iana_review_state %}
IANA Review: {{ doc.iana_review_state }}{% endif %}{% if doc.consensus %}
Consensus: {{ doc.consensus }}{% endif %}{% if doc.lastcall_expires %}
- Last call expires: {{ doc.lastcall_expires|date:"Y-m-d" }}{% endif %}{% if doc.review_requests %}
- Reviews: {% for review_request in doc.review_requests %}{% with current_doc_name=doc.name current_rev=doc.rev %}{% if not forloop.first %} {% endif %}{{ review_request.team.acronym|upper }} {{ review_request.type.name }} Review{% if review_request.state_id == "completed" or review_request.state_id == "part-completed" %}{% if review_request.reviewed_rev and review_request.reviewed_rev != current_rev or review_request.doc_id != current_doc_name %} (of {% if review_request.doc_id != current_doc_name %}{{ review_request.doc_id }}{% endif %}-{{ review_request.reviewed_rev }}){% endif %}{% if review_request.result %}: {{ review_request.result.name }}{% endif %} {% if review_request.state_id == "part-completed" %}(partially completed){% endif %}{% else %} - due: {{ review_request.deadline|date:"Y-m-d" }}{% endif %}{% endwith %}
+ Last call expires: {{ doc.lastcall_expires|date:"Y-m-d" }}{% endif %}{% if doc.review_assignments %}
+ Reviews: {% for assignment in doc.review_assignments %}{% with current_doc_name=doc.name current_rev=doc.rev %}{% if not forloop.first %} {% endif %}{{ assignment.review_request.team.acronym|upper }} {{ assignment.review_request.type.name }} Review{% if assignment.state_id == "completed" or assignment.state_id == "part-completed" %}{% if assignment.reviewed_rev and assignment.reviewed_rev != current_rev or assignment.review_request.doc_id != current_doc_name %} (of {% if assignment.review_request.doc_id != current_doc_name %}{{ assignment.review_request.doc_id }}{% endif %}-{{ assignment.reviewed_rev }}){% endif %}{% if assignment.result %}: {{ assignment.result.name }}{% endif %} {% if assignment.state_id == "part-completed" %}(partially completed){% endif %}{% else %} - due: {{ assignment.review_request.deadline|date:"Y-m-d" }}{% endif %}{% endwith %}
{% endfor %}{% endif %}
{% with doc.active_defer_event as defer %}{% if defer %} Was deferred by {{defer.by}} on {{defer.time|date:"Y-m-d"}}{% endif %}{% endwith %}
diff --git a/ietf/templates/ietfauth/review_overview.html b/ietf/templates/ietfauth/review_overview.html
index 1451f5458..e79259a5b 100644
--- a/ietf/templates/ietfauth/review_overview.html
+++ b/ietf/templates/ietfauth/review_overview.html
@@ -17,7 +17,7 @@
Assigned reviews
- {% if open_review_requests %}
+ {% if open_review_assignments %}
@@ -30,15 +30,15 @@
- {% for r in open_review_requests %}
+ {% for r in open_review_assignments %}
- {{ r.doc.name }}
- {% if r.requested_rev %}{{ r.requested_rev }}{% else %}Current{% endif %}
- {{r.doc.rev}}
- {{ r.team.acronym }}
- {{ r.type.name }}
+ {{ r.review_request.doc.name }}
+ {% if r.review_request.requested_rev %}{{ r.review_request.requested_rev }}{% else %}Current{% endif %}
+ {{r.review_request.doc.rev}}
+ {{ r.review_request.team.acronym }}
+ {{ r.review_request.type.name }}
- {{ r.deadline|date:"Y-m-d" }}
+ {{ r.review_request.deadline|date:"Y-m-d" }}
{% if r.due %}{{ r.due }} day{{ r.due|pluralize }} {% endif %}
@@ -50,9 +50,9 @@
{% endif %}
- Latest closed review requests
+ Latest closed review assignments
- {% if closed_review_requests %}
+ {% if closed_review_assignments %}
@@ -66,14 +66,14 @@
- {% for r in closed_review_requests %}
+ {% for r in closed_review_assignments %}
- {{ r.doc.name }}
- {{r.reviewed_rev|default:"See review"}}{% if r.requested_rev %}{% if r.requested_rev != r.reviewed_rev %}({{ r.requested_rev }} requested){% endif %}{% endif %}
- {{ r.team.acronym }}
- {{ r.type.name }}
+ {{ r.review_request.doc.name }}
+ {{r.reviewed_rev|default:"See review"}}{% if r.review_request.requested_rev %}{% if r.review_request.requested_rev != r.reviewed_rev %}({{ r.review_request.requested_rev }} requested){% endif %}{% endif %}
+ {{ r.review_request.team.acronym }}
+ {{ r.review_request.type.name }}
- {{ r.deadline|date:"Y-m-d" }}
+ {{ r.review_request.deadline|date:"Y-m-d" }}
{% if r.due %}{{ r.due }} day{{ r.due|pluralize }} {% endif %}
{{ r.state.name }}
diff --git a/ietf/templates/review/completed_review.txt b/ietf/templates/review/completed_review.txt
index ca4eb28fd..bdbe321ca 100644
--- a/ietf/templates/review/completed_review.txt
+++ b/ietf/templates/review/completed_review.txt
@@ -1,9 +1,8 @@
-{% load ietf_filters %}{% autoescape off %}{% filter maybewordwrap:80 %}{% if review_req.state_id == "part-completed" %}
-Review is partially done. Another review request has been registered for
-completing it.
+{% load ietf_filters %}{% autoescape off %}{% filter maybewordwrap:80 %}{% if assignment.state_id == "part-completed" %}
+Review is partially done. Another assignment may be needed to complete it.
-{% endif %}Reviewer: {{ review_req.reviewer.person }}
-Review result: {{ review_req.result.name }}
+{% endif %}Reviewer: {{ assignment.reviewer.person }}
+Review result: {{ assignment.result.name }}
{{ content }}
{% endfilter %}{% endautoescape %}
diff --git a/ietf/templates/review/notify_ad.txt b/ietf/templates/review/notify_ad.txt
index 9e5196a9a..7dc585b2d 100644
--- a/ietf/templates/review/notify_ad.txt
+++ b/ietf/templates/review/notify_ad.txt
@@ -1,13 +1,13 @@
{% load ietf_filters %}{% autoescape off %}From: {{settings.DEFAULT_FROM_EMAIL}}
To: {{to}}{% if cc %}
Cc: {{cc}}{% endif %}
-Subject: "{{review_req.result}}" review submitted for {{review_req.doc}}{% if review_req.reviewed_rev %}-{{review_req.reviewed_rev}}{% endif %}
+Subject: "{{assignment.result}}" review submitted for {{assignment.review_request.doc}}{% if assignment.reviewed_rev %}-{{assignment.reviewed_rev}}{% endif %}
-{{review_req.reviewer.person.name}} has submitted a "{{review_req.result}}" review result for {{review_req.doc}}{% if review_req.reviewed_rev %}-{{review_req.reviewed_rev}}{% endif %}.
+{{assignment.reviewer.person}} has submitted a "{{assignment.result}}" review result for {{assignment.review_request.doc}}{% if assignment.reviewed_rev %}-{{assignment.reviewed_rev}}{% endif %}.
-The review is available at {{settings.IDTRACKER_BASE_URL}}{% url 'ietf.doc.views_doc.document_main' name=review_req.review.name %}
+The review is available at {{settings.IDTRACKER_BASE_URL}}{% url 'ietf.doc.views_doc.document_main' name=assignment.review.name %}
-The document is available at {{settings.IDTRACKER_BASE_URL}}{% url 'ietf.doc.views_doc.document_main' name=review_req.doc.name %}
+The document is available at {{settings.IDTRACKER_BASE_URL}}{% url 'ietf.doc.views_doc.document_main' name=assignment.review_request.doc.name %}
This message was sent because {% if explicit_request %}the reviewer indicated it should be on the review completion form{% else %}the review team settings indicated it should be{% endif %}.
diff --git a/ietf/templates/review/partially_completed_review.txt b/ietf/templates/review/partially_completed_review.txt
index 6d518357c..8316ee7fd 100644
--- a/ietf/templates/review/partially_completed_review.txt
+++ b/ietf/templates/review/partially_completed_review.txt
@@ -1,10 +1,7 @@
{% autoescape off %}Review was partially completed by {{ by }}.
-{% if new_review_req_url %}
-A new review request has been added for completing the review:
-
-{{ new_review_req_url }}
-{% else %}
-Found {{ existing_open_reqs|length }} open review request{{ existing_open_reqs|pluralize }} on the document so a new
-review request has not been added.
+A new reviewer may need to be assigned to get a complete review.
+{% if existing_assignments %}
+The following are already assigned to review this document:{% for assignment in existing_assignments %}
+{{ assignment.reviewer.name }} : {{ assignment.state }}{% endfor %}
{% endif %}{% endautoescape %}
diff --git a/release-coverage.json.gz b/release-coverage.json.gz
index cb557d0ef..1f101eae7 100644
Binary files a/release-coverage.json.gz and b/release-coverage.json.gz differ