Skip to content

Commit f5a0426

Browse files
committed
Added the notion of responsible leadership.
- Legacy-Id: 19202
1 parent 338da98 commit f5a0426

20 files changed

Lines changed: 432 additions & 93 deletions

ietf/doc/admin.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
TelechatDocEvent, BallotPositionDocEvent, ReviewRequestDocEvent, InitialReviewDocEvent,
1313
AddedMessageEvent, SubmissionDocEvent, DeletedEvent, EditedAuthorsDocEvent, DocumentURL,
1414
ReviewAssignmentDocEvent, IanaExpertDocEvent, IRSGBallotDocEvent, DocExtResource, DocumentActionHolder,
15-
BofreqEditorDocEvent )
15+
BofreqEditorDocEvent, BofreqResponsibleDocEvent )
1616

1717
from ietf.utils.validators import validate_external_resource_value
1818

@@ -198,6 +198,10 @@ class BofreqEditorDocEventAdmin(DocEventAdmin):
198198
raw_id_fields = ["doc", "by", "editors" ]
199199
admin.site.register(BofreqEditorDocEvent, BofreqEditorDocEventAdmin)
200200

201+
class BofreqResponsibleDocEventAdmin(DocEventAdmin):
202+
raw_id_fields = ["doc", "by", "responsible" ]
203+
admin.site.register(BofreqResponsibleDocEvent, BofreqResponsibleDocEventAdmin)
204+
201205
class DocumentUrlAdmin(admin.ModelAdmin):
202206
list_display = ['id', 'doc', 'tag', 'url', 'desc', ]
203207
search_fields = ['doc__name', 'url', ]

ietf/doc/factories.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,10 @@
1313

1414
from ietf.doc.models import ( Document, DocEvent, NewRevisionDocEvent, DocAlias, State, DocumentAuthor,
1515
StateDocEvent, BallotPositionDocEvent, BallotDocEvent, BallotType, IRSGBallotDocEvent, TelechatDocEvent,
16-
DocumentActionHolder, BofreqEditorDocEvent )
16+
DocumentActionHolder, BofreqEditorDocEvent, BofreqResponsibleDocEvent )
1717
from ietf.group.models import Group
1818
from ietf.person.factories import PersonFactory
19+
from ietf.group.factories import RoleFactory
1920
from ietf.utils.text import xslugify
2021

2122

@@ -401,12 +402,32 @@ def editors(obj, create, extracted, **kwargs):
401402
obj.editors.set(PersonFactory.create_batch(3))
402403
obj.desc = f'Changed editors to {", ".join(obj.editors.values_list("name",flat=True)) or "(None)"}'
403404

405+
class BofreqResponsibleDocEventFactory(DocEventFactory):
406+
class Meta:
407+
model = BofreqResponsibleDocEvent
408+
409+
type = "changed_responsible"
410+
doc = factory.SubFactory('ietf.doc.factories.BofreqFactory')
411+
412+
413+
@factory.post_generation
414+
def responsible(obj, create, extracted, **kwargs):
415+
if not create:
416+
return
417+
if extracted:
418+
obj.responsible.set(extracted)
419+
else:
420+
ad = RoleFactory(group__type_id='area',name_id='ad').person
421+
obj.responsible.set([ad])
422+
obj.desc = f'Changed responsible leadership to {", ".join(obj.responsible.values_list("name",flat=True)) or "(None)"}'
423+
404424
class BofreqFactory(BaseDocumentFactory):
405425
type_id = 'bofreq'
406426
title = factory.Faker('sentence')
407427
name = factory.LazyAttribute(lambda o: 'bofreq-%s'%(xslugify(o.title)))
408428

409429
bofreqeditordocevent = factory.RelatedFactory('ietf.doc.factories.BofreqEditorDocEventFactory','doc')
430+
bofreqresponsibledocevent = factory.RelatedFactory('ietf.doc.factories.BofreqResponsibleDocEventFactory','doc')
410431

411432
@factory.post_generation
412433
def states(obj, create, extracted, **kwargs):

ietf/doc/mails.py

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,9 @@
1818
from ietf.utils import log
1919
from ietf.utils.mail import send_mail, send_mail_text
2020
from ietf.ipr.utils import iprs_from_docs, related_docs
21-
from ietf.doc.models import WriteupDocEvent, LastCallDocEvent, DocAlias, ConsensusDocEvent, BofreqEditorDocEvent
21+
from ietf.doc.models import WriteupDocEvent, LastCallDocEvent, DocAlias, ConsensusDocEvent
2222
from ietf.doc.utils import needed_ballot_positions
23+
from ietf.doc.utils_bofreq import bofreq_editors, bofreq_responsible
2324
from ietf.group.models import Role
2425
from ietf.doc.models import Document
2526
from ietf.mailtrigger.utils import gather_address_lists
@@ -699,14 +700,27 @@ def email_bofreq_title_changed(request, bofreq):
699700
dict(bofreq=bofreq, request=request),
700701
cc=addrs.cc)
701702

703+
def plain_names(persons):
704+
return [p.plain_name() for p in persons]
705+
702706
def email_bofreq_editors_changed(request, bofreq, previous_editors):
703-
editors = bofreq.latest_event(BofreqEditorDocEvent).editors.all()
707+
editors = bofreq_editors(bofreq)
704708
addrs = gather_address_lists('bofreq_editors_changed', doc=bofreq, previous_editors=previous_editors)
705709

706710
send_mail(request, addrs.to, settings.DEFAULT_FROM_EMAIL,
707711
f'BOF Request editors changed : {bofreq.name}',
708712
'doc/mail/bofreq_editors_changed.txt',
709-
dict(bofreq=bofreq, request=request, editors=editors, previous_editors=previous_editors),
713+
dict(bofreq=bofreq, request=request, editors=plain_names(editors), previous_editors=plain_names(previous_editors)),
714+
cc=addrs.cc)
715+
716+
def email_bofreq_responsible_changed(request, bofreq, previous_responsible):
717+
responsible = bofreq_responsible(bofreq)
718+
addrs = gather_address_lists('bofreq_responsible_changed', doc=bofreq, previous_responsible=previous_responsible)
719+
720+
send_mail(request, addrs.to, settings.DEFAULT_FROM_EMAIL,
721+
f'BOF Request responsible leadership changed : {bofreq.name}',
722+
'doc/mail/bofreq_responsible_changed.txt',
723+
dict(bofreq=bofreq, request=request, responsible=plain_names(responsible), previous_responsible=plain_names(previous_responsible)),
710724
cc=addrs.cc)
711725

712726
def email_bofreq_new_revision(request, bofreq):
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# Generated by Django 2.2.24 on 2021-07-06 13:34
2+
3+
from django.db import migrations, models
4+
import django.db.models.deletion
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('person', '0019_auto_20210604_1443'),
11+
('doc', '0042_bofreq_states'),
12+
]
13+
14+
operations = [
15+
migrations.AlterField(
16+
model_name='docevent',
17+
name='type',
18+
field=models.CharField(choices=[('new_revision', 'Added new revision'), ('new_submission', 'Uploaded new revision'), ('changed_document', 'Changed document metadata'), ('added_comment', 'Added comment'), ('added_message', 'Added message'), ('edited_authors', 'Edited the documents author list'), ('deleted', 'Deleted document'), ('changed_state', 'Changed state'), ('changed_stream', 'Changed document stream'), ('expired_document', 'Expired document'), ('extended_expiry', 'Extended expiry of document'), ('requested_resurrect', 'Requested resurrect'), ('completed_resurrect', 'Completed resurrect'), ('changed_consensus', 'Changed consensus'), ('published_rfc', 'Published RFC'), ('added_suggested_replaces', 'Added suggested replacement relationships'), ('reviewed_suggested_replaces', 'Reviewed suggested replacement relationships'), ('changed_action_holders', 'Changed action holders for document'), ('changed_group', 'Changed group'), ('changed_protocol_writeup', 'Changed protocol writeup'), ('changed_charter_milestone', 'Changed charter milestone'), ('initial_review', 'Set initial review time'), ('changed_review_announcement', 'Changed WG Review text'), ('changed_action_announcement', 'Changed WG Action text'), ('started_iesg_process', 'Started IESG process on document'), ('created_ballot', 'Created ballot'), ('closed_ballot', 'Closed ballot'), ('sent_ballot_announcement', 'Sent ballot announcement'), ('changed_ballot_position', 'Changed ballot position'), ('changed_ballot_approval_text', 'Changed ballot approval text'), ('changed_ballot_writeup_text', 'Changed ballot writeup text'), ('changed_rfc_editor_note_text', 'Changed RFC Editor Note text'), ('changed_last_call_text', 'Changed last call text'), ('requested_last_call', 'Requested last call'), ('sent_last_call', 'Sent last call'), ('scheduled_for_telechat', 'Scheduled for telechat'), ('iesg_approved', 'IESG approved document (no problem)'), ('iesg_disapproved', 'IESG disapproved document (do not publish)'), ('approved_in_minute', 'Approved in minute'), ('iana_review', 'IANA review comment'), ('rfc_in_iana_registry', 'RFC is in IANA registry'), ('rfc_editor_received_announcement', 'Announcement was received by RFC Editor'), ('requested_publication', 'Publication at RFC Editor requested'), ('sync_from_rfc_editor', 'Received updated information from RFC Editor'), ('requested_review', 'Requested review'), ('assigned_review_request', 'Assigned review request'), ('closed_review_request', 'Closed review request'), ('closed_review_assignment', 'Closed review assignment'), ('downref_approved', 'Downref approved'), ('posted_related_ipr', 'Posted related IPR'), ('removed_related_ipr', 'Removed related IPR'), ('changed_editors', 'Changed BOF Request editors')], max_length=50),
19+
),
20+
migrations.CreateModel(
21+
name='BofreqResponsibleDocEvent',
22+
fields=[
23+
('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')),
24+
('responsible', models.ManyToManyField(blank=True, to='person.Person')),
25+
],
26+
bases=('doc.docevent',),
27+
),
28+
migrations.CreateModel(
29+
name='BofreqEditorDocEvent',
30+
fields=[
31+
('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')),
32+
('editors', models.ManyToManyField(blank=True, to='person.Person')),
33+
],
34+
bases=('doc.docevent',),
35+
),
36+
]

ietf/doc/migrations/0043_bofreqeditordocevent.py

Lines changed: 0 additions & 23 deletions
This file was deleted.

ietf/doc/models.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1349,4 +1349,9 @@ class EditedAuthorsDocEvent(DocEvent):
13491349
basis = models.CharField(help_text="What is the source or reasoning for the changes to the author list",max_length=255)
13501350

13511351
class BofreqEditorDocEvent(DocEvent):
1352-
editors = models.ManyToManyField('person.Person',blank=True)
1352+
""" Capture the proponents of a Bof Request."""
1353+
editors = models.ManyToManyField('person.Person', blank=True)
1354+
1355+
class BofreqResponsibleDocEvent(DocEvent):
1356+
""" Capture the responsible leadership (IAB and IESG members) for a BoF Request """
1357+
responsible = models.ManyToManyField('person.Person', blank=True)

ietf/doc/resources.py

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@
1717
InitialReviewDocEvent, DocHistoryAuthor, BallotDocEvent, RelatedDocument,
1818
RelatedDocHistory, BallotPositionDocEvent, AddedMessageEvent, SubmissionDocEvent,
1919
ReviewRequestDocEvent, ReviewAssignmentDocEvent, EditedAuthorsDocEvent, DocumentURL,
20-
IanaExpertDocEvent, IRSGBallotDocEvent, DocExtResource, DocumentActionHolder, BofreqEditorDocEvent)
20+
IanaExpertDocEvent, IRSGBallotDocEvent, DocExtResource, DocumentActionHolder,
21+
BofreqEditorDocEvent,BofreqResponsibleDocEvent)
2122

2223
from ietf.name.resources import BallotPositionNameResource, DocTypeNameResource
2324
class BallotTypeResource(ModelResource):
@@ -832,3 +833,29 @@ class Meta:
832833
"editors": ALL_WITH_RELATIONS,
833834
}
834835
api.doc.register(BofreqEditorDocEventResource())
836+
837+
838+
from ietf.person.resources import PersonResource
839+
class BofreqResponsibleDocEventResource(ModelResource):
840+
by = ToOneField(PersonResource, 'by')
841+
doc = ToOneField(DocumentResource, 'doc')
842+
docevent_ptr = ToOneField(DocEventResource, 'docevent_ptr')
843+
responsible = ToManyField(PersonResource, 'responsible', null=True)
844+
class Meta:
845+
queryset = BofreqResponsibleDocEvent.objects.all()
846+
serializer = api.Serializer()
847+
cache = SimpleCache()
848+
#resource_name = 'bofreqresponsibledocevent'
849+
ordering = ['docevent_ptr', ]
850+
filtering = {
851+
"id": ALL,
852+
"time": ALL,
853+
"type": ALL,
854+
"rev": ALL,
855+
"desc": ALL,
856+
"by": ALL_WITH_RELATIONS,
857+
"doc": ALL_WITH_RELATIONS,
858+
"docevent_ptr": ALL_WITH_RELATIONS,
859+
"responsible": ALL_WITH_RELATIONS,
860+
}
861+
api.doc.register(BofreqResponsibleDocEventResource())

0 commit comments

Comments
 (0)