Skip to content

Commit 338da98

Browse files
committed
merged forward. Gave IAB same abilities as IESG.
- Legacy-Id: 19201
2 parents 99830f3 + 6b38325 commit 338da98

31 files changed

Lines changed: 1350 additions & 13 deletions

ietf/doc/admin.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright The IETF Trust 2010-2020, All Rights Reserved
1+
# Copyright The IETF Trust 2010-2021, All Rights Reserved
22
# -*- coding: utf-8 -*-
33

44

@@ -11,7 +11,8 @@
1111
StateDocEvent, ConsensusDocEvent, BallotType, BallotDocEvent, WriteupDocEvent, LastCallDocEvent,
1212
TelechatDocEvent, BallotPositionDocEvent, ReviewRequestDocEvent, InitialReviewDocEvent,
1313
AddedMessageEvent, SubmissionDocEvent, DeletedEvent, EditedAuthorsDocEvent, DocumentURL,
14-
ReviewAssignmentDocEvent, IanaExpertDocEvent, IRSGBallotDocEvent, DocExtResource, DocumentActionHolder )
14+
ReviewAssignmentDocEvent, IanaExpertDocEvent, IRSGBallotDocEvent, DocExtResource, DocumentActionHolder,
15+
BofreqEditorDocEvent )
1516

1617
from ietf.utils.validators import validate_external_resource_value
1718

@@ -192,6 +193,10 @@ class BallotPositionDocEventAdmin(DocEventAdmin):
192193
class IRSGBallotDocEventAdmin(DocEventAdmin):
193194
raw_id_fields = ["doc", "by"]
194195
admin.site.register(IRSGBallotDocEvent, IRSGBallotDocEventAdmin)
196+
197+
class BofreqEditorDocEventAdmin(DocEventAdmin):
198+
raw_id_fields = ["doc", "by", "editors" ]
199+
admin.site.register(BofreqEditorDocEvent, BofreqEditorDocEventAdmin)
195200

196201
class DocumentUrlAdmin(admin.ModelAdmin):
197202
list_display = ['id', 'doc', 'tag', 'url', 'desc', ]

ietf/doc/factories.py

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,11 @@
1313

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

1922
def draft_name_generator(type_id,group,n):
2023
return '%s-%s-%s-%s%d'%(
@@ -379,3 +382,39 @@ class Meta:
379382

380383
class WgDocumentAuthorFactory(DocumentAuthorFactory):
381384
document = factory.SubFactory(WgDraftFactory)
385+
386+
class BofreqEditorDocEventFactory(DocEventFactory):
387+
class Meta:
388+
model = BofreqEditorDocEvent
389+
390+
type = "changed_editors"
391+
doc = factory.SubFactory('ietf.doc.factories.BofreqFactory')
392+
393+
394+
@factory.post_generation
395+
def editors(obj, create, extracted, **kwargs):
396+
if not create:
397+
return
398+
if extracted:
399+
obj.editors.set(extracted)
400+
else:
401+
obj.editors.set(PersonFactory.create_batch(3))
402+
obj.desc = f'Changed editors to {", ".join(obj.editors.values_list("name",flat=True)) or "(None)"}'
403+
404+
class BofreqFactory(BaseDocumentFactory):
405+
type_id = 'bofreq'
406+
title = factory.Faker('sentence')
407+
name = factory.LazyAttribute(lambda o: 'bofreq-%s'%(xslugify(o.title)))
408+
409+
bofreqeditordocevent = factory.RelatedFactory('ietf.doc.factories.BofreqEditorDocEventFactory','doc')
410+
411+
@factory.post_generation
412+
def states(obj, create, extracted, **kwargs):
413+
if not create:
414+
return
415+
if extracted:
416+
for (state_type_id,state_slug) in extracted:
417+
obj.set_state(State.objects.get(type_id=state_type_id,slug=state_slug))
418+
else:
419+
obj.set_state(State.objects.get(type_id='bofreq',slug='proposed'))
420+

ietf/doc/mails.py

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
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
21+
from ietf.doc.models import WriteupDocEvent, LastCallDocEvent, DocAlias, ConsensusDocEvent, BofreqEditorDocEvent
2222
from ietf.doc.utils import needed_ballot_positions
2323
from ietf.group.models import Role
2424
from ietf.doc.models import Document
@@ -689,3 +689,30 @@ def send_external_resource_change_request(request, doc, submitter_info, requeste
689689
doc_url=settings.IDTRACKER_BASE_URL + doc.get_absolute_url(),
690690
),
691691
cc=list(cc),)
692+
693+
def email_bofreq_title_changed(request, bofreq):
694+
addrs = gather_address_lists('bofreq_title_changed', doc=bofreq)
695+
696+
send_mail(request, addrs.to, settings.DEFAULT_FROM_EMAIL,
697+
f'BOF Request title changed : {bofreq.name}',
698+
'doc/mail/bofreq_title_changed.txt',
699+
dict(bofreq=bofreq, request=request),
700+
cc=addrs.cc)
701+
702+
def email_bofreq_editors_changed(request, bofreq, previous_editors):
703+
editors = bofreq.latest_event(BofreqEditorDocEvent).editors.all()
704+
addrs = gather_address_lists('bofreq_editors_changed', doc=bofreq, previous_editors=previous_editors)
705+
706+
send_mail(request, addrs.to, settings.DEFAULT_FROM_EMAIL,
707+
f'BOF Request editors changed : {bofreq.name}',
708+
'doc/mail/bofreq_editors_changed.txt',
709+
dict(bofreq=bofreq, request=request, editors=editors, previous_editors=previous_editors),
710+
cc=addrs.cc)
711+
712+
def email_bofreq_new_revision(request, bofreq):
713+
addrs = gather_address_lists('bofreq_new_revision', doc=bofreq)
714+
send_mail(request, addrs.to, settings.DEFAULT_FROM_EMAIL,
715+
f'New BOF request revision uploaded: {bofreq.name}-{bofreq.rev}',
716+
'doc/mail/bofreq_new_revision.txt',
717+
dict(bofreq=bofreq, request=request ),
718+
cc=addrs.cc)
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# Copyright The IETF Trust 2021 All Rights Reserved
2+
3+
# Generated by Django 2.2.23 on 2021-05-21 13:29
4+
5+
from django.db import migrations
6+
7+
def forward(apps, schema_editor):
8+
StateType = apps.get_model('doc', 'StateType')
9+
State = apps.get_model('doc', 'State')
10+
11+
StateType.objects.create(slug='bofreq', label='Bof Request State')
12+
proposed = State.objects.create(type_id='bofreq', slug='proposed', name='Proposed', used=True, desc='The bof request is proposed', order=0)
13+
approved = State.objects.create(type_id='bofreq', slug='approved', name='Approved', used=True, desc='The bof request is approved', order=1)
14+
declined = State.objects.create(type_id='bofreq', slug='declined', name='Declined', used=True, desc='The bof request is declined', order=2)
15+
replaced = State.objects.create(type_id='bofreq', slug='replaced', name='Replaced', used=True, desc='The bof request is proposed', order=3)
16+
abandoned = State.objects.create(type_id='bofreq', slug='abandoned', name='Abandoned', used=True, desc='The bof request is abandoned', order=4)
17+
18+
proposed.next_states.set([approved,declined,replaced,abandoned])
19+
20+
def reverse(apps, schema_editor):
21+
StateType = apps.get_model('doc', 'StateType')
22+
State = apps.get_model('doc', 'State')
23+
State.objects.filter(type_id='bofreq').delete()
24+
StateType.objects.filter(slug='bofreq').delete()
25+
26+
27+
class Migration(migrations.Migration):
28+
29+
dependencies = [
30+
('doc', '0041_add_documentactionholder'),
31+
('name', '0027_add_bofrequest'),
32+
]
33+
34+
operations = [
35+
migrations.RunPython(forward, reverse)
36+
]
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Generated by Django 2.2.23 on 2021-05-25 12:02
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', '0018_auto_20201109_0439'),
11+
('doc', '0042_bofreq_states'),
12+
]
13+
14+
operations = [
15+
migrations.CreateModel(
16+
name='BofreqEditorDocEvent',
17+
fields=[
18+
('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')),
19+
('editors', models.ManyToManyField(blank=True, to='person.Person')),
20+
],
21+
bases=('doc.docevent',),
22+
),
23+
]

ietf/doc/models.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,8 @@ def get_file_path(self):
142142
self._cached_file_path = settings.CONFLICT_REVIEW_PATH
143143
elif self.type_id == "statchg":
144144
self._cached_file_path = settings.STATUS_CHANGE_PATH
145+
elif self.type_id == "bofreq":
146+
self._cached_file_path = settings.BOFREQ_PATH
145147
else:
146148
self._cached_file_path = settings.DOCUMENT_PATH_PATTERN.format(doc=self)
147149
return self._cached_file_path
@@ -163,6 +165,8 @@ def get_base_name(self):
163165
elif self.type_id == 'review':
164166
# TODO: This will be wrong if a review is updated on the same day it was created (or updated more than once on the same day)
165167
self._cached_base_name = "%s.txt" % self.name
168+
elif self.type_id == 'bofreq':
169+
self._cached_base_name = "%s-%s.md" % (self.name, self.rev)
166170
else:
167171
if self.rev:
168172
self._cached_base_name = "%s-%s.txt" % (self.canonical_name(), self.rev)
@@ -1145,6 +1149,9 @@ class DocReminder(models.Model):
11451149
# IPR events
11461150
("posted_related_ipr", "Posted related IPR"),
11471151
("removed_related_ipr", "Removed related IPR"),
1152+
1153+
# Bofreq Editor events
1154+
("changed_editors", "Changed BOF Request editors")
11481155
]
11491156

11501157
class DocEvent(models.Model):
@@ -1340,3 +1347,6 @@ class EditedAuthorsDocEvent(DocEvent):
13401347
Example 'basis' values might be from ['manually adjusted','recomputed by parsing document', etc.]
13411348
"""
13421349
basis = models.CharField(help_text="What is the source or reasoning for the changes to the author list",max_length=255)
1350+
1351+
class BofreqEditorDocEvent(DocEvent):
1352+
editors = models.ManyToManyField('person.Person',blank=True)

ietf/doc/resources.py

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

2222
from ietf.name.resources import BallotPositionNameResource, DocTypeNameResource
2323
class BallotTypeResource(ModelResource):
@@ -806,3 +806,29 @@ class Meta:
806806
"person": ALL_WITH_RELATIONS,
807807
}
808808
api.doc.register(DocumentActionHolderResource())
809+
810+
811+
from ietf.person.resources import PersonResource
812+
class BofreqEditorDocEventResource(ModelResource):
813+
by = ToOneField(PersonResource, 'by')
814+
doc = ToOneField(DocumentResource, 'doc')
815+
docevent_ptr = ToOneField(DocEventResource, 'docevent_ptr')
816+
editors = ToManyField(PersonResource, 'editors', null=True)
817+
class Meta:
818+
queryset = BofreqEditorDocEvent.objects.all()
819+
serializer = api.Serializer()
820+
cache = SimpleCache()
821+
#resource_name = 'bofreqeditordocevent'
822+
ordering = ['docevent_ptr', ]
823+
filtering = {
824+
"id": ALL,
825+
"time": ALL,
826+
"type": ALL,
827+
"rev": ALL,
828+
"desc": ALL,
829+
"by": ALL_WITH_RELATIONS,
830+
"doc": ALL_WITH_RELATIONS,
831+
"docevent_ptr": ALL_WITH_RELATIONS,
832+
"editors": ALL_WITH_RELATIONS,
833+
}
834+
api.doc.register(BofreqEditorDocEventResource())

0 commit comments

Comments
 (0)