Skip to content

Commit 847f37d

Browse files
committed
Add IETF Administrative LLC groups. Fixes ietf-tools#3302. Commit ready for merge.
- Legacy-Id: 19310
1 parent d427303 commit 847f37d

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
@@ -2620,7 +2620,7 @@
26202620
"show_on_agenda": false
26212621
},
26222622
"model": "group.groupfeatures",
2623-
"pk": "admin"
2623+
"pk": "adm"
26242624
},
26252625
{
26262626
"fields": {
@@ -2771,6 +2771,43 @@
27712771
"model": "group.groupfeatures",
27722772
"pk": "iab"
27732773
},
2774+
{
2775+
"fields": {
2776+
"about_page": "ietf.group.views.group_about",
2777+
"acts_like_wg": false,
2778+
"admin_roles": "[\n \"lead\"\n]",
2779+
"agenda_type": "ad",
2780+
"create_wiki": false,
2781+
"custom_group_roles": true,
2782+
"customize_workflow": false,
2783+
"default_parent": "",
2784+
"default_tab": "ietf.group.views.group_about",
2785+
"default_used_roles": "[\n \"member\",\n \"chair\",\n \"lead\"\n]",
2786+
"docman_roles": "[\n \"lead\",\n \"chair\",\n \"secr\"\n]",
2787+
"groupman_authroles": "[\n \"Secretariat\",\n \"IAB\"\n]",
2788+
"groupman_roles": "[\n \"lead\",\n \"chair\",\n \"secr\"\n]",
2789+
"has_chartering_process": false,
2790+
"has_default_jabber": false,
2791+
"has_documents": true,
2792+
"has_meetings": true,
2793+
"has_milestones": true,
2794+
"has_nonsession_materials": false,
2795+
"has_reviews": false,
2796+
"has_session_materials": false,
2797+
"is_schedulable": false,
2798+
"material_types": "[\n \"slides\"\n]",
2799+
"matman_roles": "[\n \"lead\",\n \"chair\",\n \"secr\"\n]",
2800+
"need_parent": false,
2801+
"parent_types": [
2802+
"ietf"
2803+
],
2804+
"req_subm_approval": false,
2805+
"role_order": "[\n \"lead\",\n \"chair\",\n \"secr\"\n]",
2806+
"show_on_agenda": false
2807+
},
2808+
"model": "group.groupfeatures",
2809+
"pk": "iabasg"
2810+
},
27742811
{
27752812
"fields": {
27762813
"about_page": "ietf.group.views.group_about",
@@ -3295,7 +3332,7 @@
32953332
"default_tab": "ietf.group.views.group_about",
32963333
"default_used_roles": "[\n \"ad\",\n \"member\",\n \"delegate\",\n \"secr\",\n \"liaison\",\n \"atlarge\",\n \"chair\",\n \"matman\",\n \"techadv\"\n]",
32973334
"docman_roles": "[\n \"chair\"\n]",
3298-
"groupman_authroles": "[\n \"Secretariat\"\n]",
3335+
"groupman_authroles": "[\n \"Secretariat\",\n \"Area Director\"\n]",
32993336
"groupman_roles": "[\n \"chair\"\n]",
33003337
"has_chartering_process": false,
33013338
"has_default_jabber": false,
@@ -10719,12 +10756,12 @@
1071910756
"fields": {
1072010757
"desc": "",
1072110758
"name": "Admin",
10722-
"order": 0,
10759+
"order": 1,
1072310760
"used": true,
1072410761
"verbose_name": "Administrative Group"
1072510762
},
1072610763
"model": "name.grouptypename",
10727-
"pk": "admin"
10764+
"pk": "adm"
1072810765
},
1072910766
{
1073010767
"fields": {
@@ -10770,6 +10807,17 @@
1077010807
"model": "name.grouptypename",
1077110808
"pk": "iab"
1077210809
},
10810+
{
10811+
"fields": {
10812+
"desc": "",
10813+
"name": "IAB ASG",
10814+
"order": 0,
10815+
"used": true,
10816+
"verbose_name": "IAB Administrative Support Group"
10817+
},
10818+
"model": "name.grouptypename",
10819+
"pk": "iabasg"
10820+
},
1077310821
{
1077410822
"fields": {
1077510823
"desc": "",
@@ -10968,17 +11016,39 @@
1096811016
"model": "name.importantdatename",
1096911017
"pk": "01cutoff"
1097011018
},
11019+
{
11020+
"fields": {
11021+
"default_offset_days": -57,
11022+
"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",
11023+
"name": "Cut-off preliminary BOF requests",
11024+
"order": 0,
11025+
"used": true
11026+
},
11027+
"model": "name.importantdatename",
11028+
"pk": "bofprelimcutoff"
11029+
},
1097111030
{
1097211031
"fields": {
1097311032
"default_offset_days": -57,
1097411033
"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/",
1097511034
"name": "Preliminary BOF proposals requested",
1097611035
"order": 0,
10977-
"used": true
11036+
"used": false
1097811037
},
1097911038
"model": "name.importantdatename",
1098011039
"pk": "bofproposals"
1098111040
},
11041+
{
11042+
"fields": {
11043+
"default_offset_days": -43,
11044+
"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.",
11045+
"name": "Cut-off revised BOF requests",
11046+
"order": 0,
11047+
"used": true
11048+
},
11049+
"model": "name.importantdatename",
11050+
"pk": "bofrevcutoff"
11051+
},
1098211052
{
1098311053
"fields": {
1098411054
"default_offset_days": -36,
@@ -10996,7 +11066,7 @@
1099611066
"desc": "Cut-off date for BOF proposal requests to Area Directors at UTC 23:59",
1099711067
"name": "Cut-off BOF scheduling Requests",
1099811068
"order": 0,
10999-
"used": true
11069+
"used": false
1100011070
},
1100111071
"model": "name.importantdatename",
1100211072
"pk": "cutoffbofreq"
@@ -15485,7 +15555,7 @@
1548515555
"fields": {
1548615556
"command": "xym",
1548715557
"switch": "--version",
15488-
"time": "2021-07-13T00:12:25.184",
15558+
"time": "2021-08-30T00:16:41.046",
1548915559
"used": true,
1549015560
"version": "xym 0.5"
1549115561
},
@@ -15496,7 +15566,7 @@
1549615566
"fields": {
1549715567
"command": "pyang",
1549815568
"switch": "--version",
15499-
"time": "2021-07-13T00:12:26.721",
15569+
"time": "2021-08-30T00:16:42.619",
1550015570
"used": true,
1550115571
"version": "pyang 2.5.0"
1550215572
},
@@ -15507,7 +15577,7 @@
1550715577
"fields": {
1550815578
"command": "yanglint",
1550915579
"switch": "--version",
15510-
"time": "2021-07-13T00:12:27.015",
15580+
"time": "2021-08-30T00:16:42.981",
1551115581
"used": true,
1551215582
"version": "yanglint SO 1.6.7"
1551315583
},
@@ -15518,7 +15588,7 @@
1551815588
"fields": {
1551915589
"command": "xml2rfc",
1552015590
"switch": "--version",
15521-
"time": "2021-07-13T00:12:29.814",
15591+
"time": "2021-08-30T00:16:45.742",
1552215592
"used": true,
1552315593
"version": "xml2rfc 3.9.1"
1552415594
},

0 commit comments

Comments
 (0)