Skip to content

Commit 08130f4

Browse files
committed
Merged in [17396] from rjsparks@nostrum.com:
Move charters for replaced groups to a new replaced state. Close any outstanding ballots on them. Fixes ietf-tools#2889, ietf-tools#2873, and ietf-tools#1286. - Legacy-Id: 17420 Note: SVN reference [17396] has been migrated to Git commit 79bb245
2 parents 60e302a + 79bb245 commit 08130f4

6 files changed

Lines changed: 99 additions & 14 deletions

File tree

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
# -*- coding: utf-8 -*-
2+
# Copyright The IETF Trust 2020, All Rights Reserved
3+
# Generated by Django 1.11.28 on 2020-03-03 13:54
4+
from __future__ import unicode_literals
5+
6+
from django.db import migrations
7+
8+
def forward(apps, schema_editor):
9+
10+
Person = apps.get_model('person', 'Person')
11+
12+
Document = apps.get_model('doc','Document')
13+
State = apps.get_model('doc','State')
14+
BallotDocEvent = apps.get_model('doc','BallotDocEvent')
15+
16+
replaced_state = State.objects.create(type_id='charter', slug='replaced', name='Replaced', used=True, desc="This charter's group was replaced.", order = 0)
17+
by = Person.objects.get(name='(System)')
18+
19+
for doc in Document.objects.filter(type_id='charter',states__type_id='charter',states__slug__in=['intrev','extrev'],group__state='replaced'):
20+
doc.states.remove(*list(doc.states.filter(type_id='charter')))
21+
doc.states.add(replaced_state)
22+
ballot = BallotDocEvent.objects.filter(doc=doc, type__in=('created_ballot', 'closed_ballot')).order_by('-time', '-id').first()
23+
if ballot and ballot.type == 'created_ballot':
24+
e = BallotDocEvent(type="closed_ballot", doc=doc, rev=doc.rev, by=by)
25+
e.ballot_type = ballot.ballot_type
26+
e.desc = 'Closed "%s" ballot' % e.ballot_type.name
27+
e.save()
28+
29+
30+
def reverse(apps, schema_editor):
31+
pass
32+
33+
class Migration(migrations.Migration):
34+
35+
dependencies = [
36+
('doc', '0030_fix_bytes_mailarch_url'),
37+
('person', '0009_auto_20190118_0725'),
38+
]
39+
40+
operations = [
41+
migrations.RunPython(forward, reverse),
42+
]

ietf/doc/utils_charter.py

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

44

@@ -17,7 +17,8 @@
1717

1818
import debug # pyflakes:ignore
1919

20-
from ietf.doc.models import NewRevisionDocEvent, WriteupDocEvent
20+
from ietf.doc.models import NewRevisionDocEvent, WriteupDocEvent, State, StateDocEvent
21+
from ietf.doc.utils import close_open_ballots
2122
from ietf.group.models import ChangeStateGroupEvent
2223
from ietf.name.models import GroupStateName
2324
from ietf.utils.history import find_history_active_at
@@ -246,4 +247,18 @@ def generate_issue_ballot_mail(request, doc, ballot):
246247
)
247248
)
248249

249-
250+
def replace_charter_of_replaced_group(group, by):
251+
252+
assert group.state_id == 'replaced'
253+
254+
charter = group.charter
255+
256+
if charter:
257+
258+
close_open_ballots(charter, by)
259+
260+
replaced_state = State.objects.get(type_id='charter', slug='replaced')
261+
charter.set_state(replaced_state)
262+
state_change_event = StateDocEvent.objects.create(state_type_id='charter', state=replaced_state, doc=charter, rev=charter.rev, by=by, type="changed_state", desc="Charter's group has been replaced")
263+
264+
charter.save_with_history([state_change_event])

ietf/doc/views_search.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright The IETF Trust 2009-2019, All Rights Reserved
1+
# Copyright The IETF Trust 2009-2020, All Rights Reserved
22
# -*- coding: utf-8 -*-
33
#
44
# Some parts Copyright (C) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
@@ -354,7 +354,7 @@ def ad_dashboard_sort_key(doc):
354354
state = State.objects.get(type__slug='draft-iesg',slug='ad-eval')
355355
return "1%d%s" % (state.order,seed)
356356

357-
if doc.type.slug=='charter':
357+
if doc.type.slug=='charter' and doc.get_state_slug('charter') != 'replaced':
358358
if doc.get_state_slug('charter') in ('notrev','infrev'):
359359
return "100%s" % seed
360360
elif doc.get_state_slug('charter') == 'intrev':

ietf/group/tests_info.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626

2727
from ietf.community.models import CommunityList
2828
from ietf.community.utils import reset_name_contains_index_for_rule
29-
from ietf.doc.factories import WgDraftFactory, CharterFactory
29+
from ietf.doc.factories import WgDraftFactory, CharterFactory, BallotDocEventFactory
3030
from ietf.doc.models import Document, DocAlias, DocEvent, State
3131
from ietf.doc.utils_charter import charter_name_for_group
3232
from ietf.group.factories import (GroupFactory, RoleFactory, GroupEventFactory,
@@ -758,6 +758,19 @@ def test_conclude(self):
758758
group = Group.objects.get(acronym=group.acronym)
759759
self.assertEqual(group.state_id, "active")
760760

761+
def test_replace(self):
762+
group = GroupFactory(state_id='bof')
763+
charter = CharterFactory(group=group, states=[('charter','intrev')])
764+
BallotDocEventFactory(doc=charter, ballot_type__doc_type_id='draft', ballot_type__slug='r-extrev')
765+
url = urlreverse('ietf.group.views.edit', kwargs=dict(group_type=group.type_id, acronym=group.acronym, action="edit", field="state"))
766+
self.client.login(username='secretary',password='secretary+password')
767+
self.client.post(url, dict(state='replaced'))
768+
group = Group.objects.get(pk=group.pk)
769+
self.assertEqual(group.state_id, 'replaced')
770+
self.assertEqual(group.charter.get_state_slug('charter'), 'replaced')
771+
self.assertEqual(group.charter.active_ballot(), None)
772+
773+
761774
def test_add_comment(self):
762775
group = GroupFactory(acronym="mars",parent=GroupFactory(type_id='area'))
763776
RoleFactory(group=group,person=Person.objects.get(user__username='ad'),name_id='ad')

ietf/group/views.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@
6868
from ietf.doc.models import DocTagName, State, DocAlias, RelatedDocument, Document
6969
from ietf.doc.templatetags.ietf_filters import clean_whitespace
7070
from ietf.doc.utils import get_chartering_type, get_tags_for_stream_id
71-
from ietf.doc.utils_charter import charter_name_for_group
71+
from ietf.doc.utils_charter import charter_name_for_group, replace_charter_of_replaced_group
7272
from ietf.doc.utils_search import prepare_document_table
7373
#
7474
from ietf.group.dot import make_dot
@@ -1029,6 +1029,8 @@ def diff(attr, name):
10291029
for attr, new, desc in changes:
10301030
if attr == 'state':
10311031
ChangeStateGroupEvent.objects.create(group=group, time=group.time, state=new, by=request.user.person, type="changed_state", desc=desc)
1032+
if new.slug == 'replaced':
1033+
replace_charter_of_replaced_group(group=group, by=request.user.person)
10321034
else:
10331035
GroupEvent.objects.create(group=group, time=group.time, by=request.user.person, type="info_changed", desc=desc)
10341036

ietf/name/fixtures/names.json

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2292,6 +2292,19 @@
22922292
"model": "doc.state",
22932293
"pk": 156
22942294
},
2295+
{
2296+
"fields": {
2297+
"desc": "This charter's group was replaced.",
2298+
"name": "Replaced",
2299+
"next_states": [],
2300+
"order": 0,
2301+
"slug": "replaced",
2302+
"type": "charter",
2303+
"used": true
2304+
},
2305+
"model": "doc.state",
2306+
"pk": 157
2307+
},
22952308
{
22962309
"fields": {
22972310
"label": "State"
@@ -9681,7 +9694,7 @@
96819694
{
96829695
"fields": {
96839696
"desc": "Formation of the group (most likely a BoF or Proposed WG) was abandoned",
9684-
"name": "Abandonded",
9697+
"name": "Abandoned",
96859698
"order": 0,
96869699
"used": true
96879700
},
@@ -9750,7 +9763,7 @@
97509763
},
97519764
{
97529765
"fields": {
9753-
"desc": "Replaced by dnssd",
9766+
"desc": "Replaced by a group with a different acronym",
97549767
"name": "Replaced",
97559768
"order": 0,
97569769
"used": true
@@ -14226,7 +14239,7 @@
1422614239
"fields": {
1422714240
"command": "xym",
1422814241
"switch": "--version",
14229-
"time": "2020-01-16T00:12:27.984",
14242+
"time": "2020-02-19T00:13:43.554",
1423014243
"used": true,
1423114244
"version": "xym 0.4"
1423214245
},
@@ -14237,7 +14250,7 @@
1423714250
"fields": {
1423814251
"command": "pyang",
1423914252
"switch": "--version",
14240-
"time": "2020-01-16T00:12:29.007",
14253+
"time": "2020-02-19T00:13:44.450",
1424114254
"used": true,
1424214255
"version": "pyang 2.1.1"
1424314256
},
@@ -14248,7 +14261,7 @@
1424814261
"fields": {
1424914262
"command": "yanglint",
1425014263
"switch": "--version",
14251-
"time": "2020-01-16T00:12:29.206",
14264+
"time": "2020-02-19T00:13:44.597",
1425214265
"used": true,
1425314266
"version": "yanglint 0.14.80"
1425414267
},
@@ -14259,9 +14272,9 @@
1425914272
"fields": {
1426014273
"command": "xml2rfc",
1426114274
"switch": "--version",
14262-
"time": "2020-01-16T00:12:30.657",
14275+
"time": "2020-02-19T00:13:45.481",
1426314276
"used": true,
14264-
"version": "xml2rfc 2.37.3"
14277+
"version": "xml2rfc 2.40.0"
1426514278
},
1426614279
"model": "utils.versioninfo",
1426714280
"pk": 4

0 commit comments

Comments
 (0)