Skip to content

Commit c8552cb

Browse files
committed
Merged in [19310] from rjsparks@nostrum.com:
Add IETF Administrative LLC groups. Fixes ietf-tools#3302. - Legacy-Id: 19330 Note: SVN reference [19310] has been migrated to Git commit 847f37d
2 parents 6cdd1c5 + 847f37d commit c8552cb

9 files changed

Lines changed: 277 additions & 17 deletions

File tree

ietf/doc/templatetags/wg_menu.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,9 @@
4545
}
4646

4747
parents = Group.objects.filter(
48-
models.Q(type="area") | models.Q(type="irtf", acronym="irtf") | models.Q(acronym='iab'),
48+
models.Q(type="area") | models.Q(type="irtf", acronym="irtf") | models.Q(acronym='iab') | models.Q(acronym='ietfadminllc'),
4949
state="active"
50-
).order_by('type_id', 'acronym')
50+
).order_by('type__order','type_id', 'acronym')
5151

5252
@register.simple_tag
5353
def wg_menu():
@@ -64,5 +64,7 @@ def wg_menu():
6464
p.menu_url = "/rg/"
6565
elif p.acronym == "iab":
6666
p.menu_url = "/program/"
67+
elif p.acronym == 'ietfadminllc':
68+
p.menu_url = "/adm/"
6769

6870
return render_to_string('base/menu_wg.html', { 'parents': parents })
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
# Copyright The IETF Trust 2021 All Rights Reserved
2+
3+
from django.db import migrations
4+
5+
def forward(apps, schema_editor):
6+
GroupTypeName = apps.get_model('name','GroupTypeName')
7+
Group = apps.get_model('group', 'Group')
8+
GroupHistory = apps.get_model('group', 'GroupHistory')
9+
GroupFeatures = apps.get_model('group', 'GroupFeatures')
10+
11+
a = GroupTypeName.objects.get(pk='admin')
12+
a.pk='adm'
13+
a.order=1
14+
a.save()
15+
f = GroupFeatures.objects.get(pk='admin')
16+
f.pk='adm'
17+
f.save()
18+
19+
Group.objects.filter(type_id='admin').update(type_id='adm')
20+
GroupHistory.objects.filter(type_id='admin').update(type_id='adm')
21+
22+
GroupFeatures.objects.filter(pk='admin').delete()
23+
GroupTypeName.objects.filter(pk='admin').delete()
24+
25+
def reverse(apps, schema_editor):
26+
GroupTypeName = apps.get_model('name','GroupTypeName')
27+
Group = apps.get_model('group', 'Group')
28+
GroupHistory = apps.get_model('group','GroupHistory')
29+
GroupFeatures = apps.get_model('group', 'GroupFeatures')
30+
31+
a = GroupTypeName.objects.get(pk='adm')
32+
a.pk='admin'
33+
a.order=0
34+
a.save()
35+
f = GroupFeatures.objects.get(pk='adm')
36+
f.pk='admin'
37+
f.save()
38+
39+
Group.objects.filter(type_id='adm').update(type_id='admin')
40+
GroupHistory.objects.filter(type_id='adm').update(type_id='admin')
41+
42+
GroupFeatures.objects.filter(type_id='adm').delete()
43+
GroupTypeName.objects.filter(pk='adm').delete()
44+
45+
46+
class Migration(migrations.Migration):
47+
48+
dependencies = [
49+
('group', '0045_iabasg'),
50+
('name', '0028_iabasg'),
51+
]
52+
53+
operations = [
54+
migrations.RunPython(forward,reverse)
55+
]
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
# Copyright The IETF Trust 2021 All Rights Reserved
2+
3+
from django.db import migrations
4+
5+
def email(person):
6+
e = person.email_set.filter(primary=True).first()
7+
if not e:
8+
e = person.email_set.filter(active=True).order_by("-time").first()
9+
return e
10+
11+
def forward(apps, schema_editor):
12+
Group = apps.get_model('group', 'Group')
13+
Person = apps.get_model('person', 'Person')
14+
llc = Group.objects.create(
15+
acronym='ietfadminllc',
16+
name="IETF Administration LLC",
17+
state_id='active',
18+
type_id='adm',
19+
description="The IETF Administration LLC (IETF LLC) provides the corporate legal home for the IETF, the Internet Architecture Board (IAB), and the Internet Research Task Force (IRTF). The Administration (https://www.ietf.org/about/administration/) section of the website has full details of the LLC and is where the various policies and reports produced by the LLC are published.",
20+
)
21+
Group.objects.filter(acronym='llc-board').update(parent=llc, description="The IETF Administration LLC (IETF LLC) provides the corporate legal home for the IETF, the Internet Architecture Board (IAB), and the Internet Research Task Force (IRTF). The Administration (https://www.ietf.org/about/administration/) section of the website has full details of the LLC and is where the various policies and reports produced by the LLC are published.")
22+
llc_staff= Group.objects.create(
23+
acronym='llc-staff',
24+
name="IETF LLC employees",
25+
state_id='active',
26+
type_id='adm',
27+
parent=llc,
28+
description="The IETF Administration LLC (IETF LLC) provides the corporate legal home for the IETF, the Internet Architecture Board (IAB), and the Internet Research Task Force (IRTF). The Administration (https://www.ietf.org/about/administration/) section of the website has full details of the LLC and is where the various policies and reports produced by the LLC are published.",
29+
)
30+
legal = Group.objects.create(
31+
acronym='legal-consult',
32+
name="Legal consultation group",
33+
state_id='active',
34+
type_id='adm',
35+
parent=llc,
36+
description="The legal-consult list is a group of community participants who provide their views to the IETF Administration LLC in private on various legal matters. This was first established under the IAOC and has not been reviewed since. Legal advice is provided separately to the LLC by contracted external counsel.",
37+
)
38+
39+
for email_addr in ('jay@ietf.org', 'ghwood@ietf.org', 'lbshaw@ietf.org', 'krathnayake@ietf.org'):
40+
p = Person.objects.get(email__address=email_addr)
41+
llc_staff.role_set.create(name_id='member',person=p,email=email(p))
42+
43+
for email_addr in (
44+
'amorris@amsl.com',
45+
'brad@biddle.law',
46+
'David.Wilson@thompsonhine.com',
47+
'glenn.deen@nbcuni.com',
48+
'hall@isoc.org',
49+
'Jason_Livingood@comcast.com',
50+
'jay@ietf.org',
51+
'jmh@joelhalpern.com',
52+
'johnl@taugh.com',
53+
'kathleen.moriarty.ietf@gmail.com',
54+
'lars@eggert.org',
55+
'lflynn@amsl.com',
56+
'stewe@stewe.org',
57+
'vigdis@biddle.law',
58+
'wendy@seltzer.org',
59+
):
60+
p = Person.objects.filter(email__address=email_addr).first()
61+
if p:
62+
legal.role_set.create(name_id='member', person=p, email=email(p))
63+
64+
65+
def reverse(apps, schema_editor):
66+
Group = apps.get_model('group', 'Group')
67+
Group.objects.filter(acronym='llc-board').update(parent=None)
68+
Group.objects.filter(acronym__in=['llc_staff','legal-consult']).delete()
69+
Group.objects.filter(acronym='ietfadminllc').delete()
70+
71+
72+
class Migration(migrations.Migration):
73+
74+
dependencies = [
75+
('group', '0046_grouptypename_admin_to_adm'),
76+
('person', '0019_auto_20210604_1443'),
77+
# The below are needed for reverse migrations to work
78+
('name','0028_iabasg'),
79+
('doc', '0043_bofreq_docevents'),
80+
('liaisons','0009_delete_liaisonstatementgroupcontacts_model'),
81+
('meeting', '0018_document_primary_key_cleanup'),
82+
('review', '0014_document_primary_key_cleanup'),
83+
('submit', '0008_submissionextresource'),
84+
]
85+
86+
operations = [
87+
migrations.RunPython(forward,reverse)
88+
]

ietf/group/tests_info.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ def test_active_groups(self):
7474
self.assertContains(r, group.name)
7575
self.assertContains(r, escape(group.ad_role().person.plain_name()))
7676

77-
for t in ('rg','area','ag', 'rag', 'dir','review','team','program'):
77+
for t in ('rg','area','ag', 'rag', 'dir','review','team','program','iabasg','adm'):
7878
g = GroupFactory.create(type_id=t,state_id='active')
7979
if t in ['dir','review']:
8080
g.parent = GroupFactory.create(type_id='area',state_id='active')
@@ -90,7 +90,7 @@ def test_active_groups(self):
9090
self.assertContains(r, "Directorate")
9191
self.assertContains(r, "AG")
9292

93-
for slug in GroupTypeName.objects.exclude(slug__in=['wg','rg','ag','rag','area','dir','review','team','program','adhoc','ise']).values_list('slug',flat=True):
93+
for slug in GroupTypeName.objects.exclude(slug__in=['wg','rg','ag','rag','area','dir','review','team','program','adhoc','ise','adm','iabasg']).values_list('slug',flat=True):
9494
with self.assertRaises(NoReverseMatch):
9595
url=urlreverse('ietf.group.views.active_groups', kwargs=dict(group_type=slug))
9696

ietf/group/views.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,8 @@ def active_groups(request, group_type=None):
294294
return active_review_dirs(request)
295295
elif group_type in ("program", "iabasg"):
296296
return active_iab(request)
297+
elif group_type == "adm":
298+
return active_adm(request)
297299
else:
298300
raise Http404
299301

@@ -327,6 +329,10 @@ def active_iab(request):
327329
group.leads = sorted(roles(group, "lead"), key=extract_last_name)
328330
return render(request, 'group/active_iabgroups.html', {'iabgroups' : iabgroups })
329331

332+
def active_adm(request):
333+
adm = Group.objects.filter(type="adm", state="active").order_by("parent","name")
334+
return render(request, 'group/active_adm.html', {'adm' : adm })
335+
330336
def active_areas(request):
331337
areas = Group.objects.filter(type="area", state="active").order_by("name")
332338
return render(request, 'group/active_areas.html', {'areas': areas })
@@ -1290,7 +1296,7 @@ def group_json(request, acronym):
12901296
@cache_control(public=True, max_age=30*60)
12911297
@cache_page(30 * 60)
12921298
def group_menu_data(request):
1293-
groups = Group.objects.filter(state="active", parent__state="active").filter(Q(type__features__acts_like_wg=True)|Q(type_id__in=['program','iabasg'])).order_by("-type_id","acronym")
1299+
groups = Group.objects.filter(state="active", parent__state="active").filter(Q(type__features__acts_like_wg=True)|Q(type_id__in=['program','iabasg'])|Q(parent__acronym='ietfadminllc')).order_by("-type_id","acronym")
12941300

12951301
groups_by_parent = defaultdict(list)
12961302
for g in groups:

ietf/name/fixtures/names.json

Lines changed: 80 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2657,7 +2657,7 @@
26572657
"show_on_agenda": false
26582658
},
26592659
"model": "group.groupfeatures",
2660-
"pk": "admin"
2660+
"pk": "adm"
26612661
},
26622662
{
26632663
"fields": {
@@ -2808,6 +2808,43 @@
28082808
"model": "group.groupfeatures",
28092809
"pk": "iab"
28102810
},
2811+
{
2812+
"fields": {
2813+
"about_page": "ietf.group.views.group_about",
2814+
"acts_like_wg": false,
2815+
"admin_roles": "[\n \"lead\"\n]",
2816+
"agenda_type": "ad",
2817+
"create_wiki": false,
2818+
"custom_group_roles": true,
2819+
"customize_workflow": false,
2820+
"default_parent": "",
2821+
"default_tab": "ietf.group.views.group_about",
2822+
"default_used_roles": "[\n \"member\",\n \"chair\",\n \"lead\"\n]",
2823+
"docman_roles": "[\n \"lead\",\n \"chair\",\n \"secr\"\n]",
2824+
"groupman_authroles": "[\n \"Secretariat\",\n \"IAB\"\n]",
2825+
"groupman_roles": "[\n \"lead\",\n \"chair\",\n \"secr\"\n]",
2826+
"has_chartering_process": false,
2827+
"has_default_jabber": false,
2828+
"has_documents": true,
2829+
"has_meetings": true,
2830+
"has_milestones": true,
2831+
"has_nonsession_materials": false,
2832+
"has_reviews": false,
2833+
"has_session_materials": false,
2834+
"is_schedulable": false,
2835+
"material_types": "[\n \"slides\"\n]",
2836+
"matman_roles": "[\n \"lead\",\n \"chair\",\n \"secr\"\n]",
2837+
"need_parent": false,
2838+
"parent_types": [
2839+
"ietf"
2840+
],
2841+
"req_subm_approval": false,
2842+
"role_order": "[\n \"lead\",\n \"chair\",\n \"secr\"\n]",
2843+
"show_on_agenda": false
2844+
},
2845+
"model": "group.groupfeatures",
2846+
"pk": "iabasg"
2847+
},
28112848
{
28122849
"fields": {
28132850
"about_page": "ietf.group.views.group_about",
@@ -3332,7 +3369,7 @@
33323369
"default_tab": "ietf.group.views.group_about",
33333370
"default_used_roles": "[\n \"ad\",\n \"member\",\n \"delegate\",\n \"secr\",\n \"liaison\",\n \"atlarge\",\n \"chair\",\n \"matman\",\n \"techadv\"\n]",
33343371
"docman_roles": "[\n \"chair\"\n]",
3335-
"groupman_authroles": "[\n \"Secretariat\"\n]",
3372+
"groupman_authroles": "[\n \"Secretariat\",\n \"Area Director\"\n]",
33363373
"groupman_roles": "[\n \"chair\"\n]",
33373374
"has_chartering_process": false,
33383375
"has_default_jabber": false,
@@ -10767,12 +10804,12 @@
1076710804
"fields": {
1076810805
"desc": "",
1076910806
"name": "Admin",
10770-
"order": 0,
10807+
"order": 1,
1077110808
"used": true,
1077210809
"verbose_name": "Administrative Group"
1077310810
},
1077410811
"model": "name.grouptypename",
10775-
"pk": "admin"
10812+
"pk": "adm"
1077610813
},
1077710814
{
1077810815
"fields": {
@@ -10818,6 +10855,17 @@
1081810855
"model": "name.grouptypename",
1081910856
"pk": "iab"
1082010857
},
10858+
{
10859+
"fields": {
10860+
"desc": "",
10861+
"name": "IAB ASG",
10862+
"order": 0,
10863+
"used": true,
10864+
"verbose_name": "IAB Administrative Support Group"
10865+
},
10866+
"model": "name.grouptypename",
10867+
"pk": "iabasg"
10868+
},
1082110869
{
1082210870
"fields": {
1082310871
"desc": "",
@@ -11016,17 +11064,39 @@
1101611064
"model": "name.importantdatename",
1101711065
"pk": "01cutoff"
1101811066
},
11067+
{
11068+
"fields": {
11069+
"default_offset_days": -57,
11070+
"desc": "Cut-off date for BOF proposal requests. To request a BOF, please see instructions at https://www.ietf.org/how/bofs/bof-procedures on Requesting a BOF",
11071+
"name": "Cut-off preliminary BOF requests",
11072+
"order": 0,
11073+
"used": true
11074+
},
11075+
"model": "name.importantdatename",
11076+
"pk": "bofprelimcutoff"
11077+
},
1101911078
{
1102011079
"fields": {
1102111080
"default_offset_days": -57,
1102211081
"desc": "Preliminary BOF proposals requested. To request a BOF, please see instructions on requesting a BOF at https://www.ietf.org/how/bofs/bof-procedures/",
1102311082
"name": "Preliminary BOF proposals requested",
1102411083
"order": 0,
11025-
"used": true
11084+
"used": false
1102611085
},
1102711086
"model": "name.importantdatename",
1102811087
"pk": "bofproposals"
1102911088
},
11089+
{
11090+
"fields": {
11091+
"default_offset_days": -43,
11092+
"desc": "Cut-off date for revised BOF proposal requests to Area Directors at UTC 23:59. To request a BOF, please see instructions at https://www.ietf.org/how/bofs/bof-procedures on Requesting a BOF.",
11093+
"name": "Cut-off revised BOF requests",
11094+
"order": 0,
11095+
"used": true
11096+
},
11097+
"model": "name.importantdatename",
11098+
"pk": "bofrevcutoff"
11099+
},
1103011100
{
1103111101
"fields": {
1103211102
"default_offset_days": -36,
@@ -11044,7 +11114,7 @@
1104411114
"desc": "Cut-off date for BOF proposal requests to Area Directors at UTC 23:59",
1104511115
"name": "Cut-off BOF scheduling Requests",
1104611116
"order": 0,
11047-
"used": true
11117+
"used": false
1104811118
},
1104911119
"model": "name.importantdatename",
1105011120
"pk": "cutoffbofreq"
@@ -15583,7 +15653,7 @@
1558315653
"fields": {
1558415654
"command": "xym",
1558515655
"switch": "--version",
15586-
"time": "2021-07-13T00:12:25.184",
15656+
"time": "2021-08-30T00:16:41.046",
1558715657
"used": true,
1558815658
"version": "xym 0.5"
1558915659
},
@@ -15594,7 +15664,7 @@
1559415664
"fields": {
1559515665
"command": "pyang",
1559615666
"switch": "--version",
15597-
"time": "2021-07-13T00:12:26.721",
15667+
"time": "2021-08-30T00:16:42.619",
1559815668
"used": true,
1559915669
"version": "pyang 2.5.0"
1560015670
},
@@ -15605,7 +15675,7 @@
1560515675
"fields": {
1560615676
"command": "yanglint",
1560715677
"switch": "--version",
15608-
"time": "2021-07-13T00:12:27.015",
15678+
"time": "2021-08-30T00:16:42.981",
1560915679
"used": true,
1561015680
"version": "yanglint SO 1.6.7"
1561115681
},
@@ -15616,7 +15686,7 @@
1561615686
"fields": {
1561715687
"command": "xml2rfc",
1561815688
"switch": "--version",
15619-
"time": "2021-07-13T00:12:29.814",
15689+
"time": "2021-08-30T00:16:45.742",
1562015690
"used": true,
1562115691
"version": "xml2rfc 3.9.1"
1562215692
},

0 commit comments

Comments
 (0)