From d42730300a4ff1263bf465033801fdfc3b54d0ba Mon Sep 17 00:00:00 2001 From: Robert Sparks Date: Mon, 30 Aug 2021 19:39:21 +0000 Subject: [PATCH] Add IAB Administrative Support Group group type. Add IAB groups to the group menu. Clearly delineate group types in the group menu. Fixes #3295 and #3296. Commit ready for merge. - Legacy-Id: 19307 --- ietf/doc/templatetags/wg_menu.py | 11 ++++-- ietf/group/migrations/0045_iabasg.py | 38 +++++++++++++++++++ ietf/group/views.py | 17 +++++---- ietf/name/migrations/0028_iabasg.py | 22 +++++++++++ ietf/static/ietf/css/ietf.css | 6 +++ ietf/static/ietf/js/ietf.js | 5 +++ ...ve_programs.html => active_iabgroups.html} | 11 ++++-- ietf/urls.py | 2 +- 8 files changed, 95 insertions(+), 17 deletions(-) create mode 100644 ietf/group/migrations/0045_iabasg.py create mode 100644 ietf/name/migrations/0028_iabasg.py rename ietf/templates/group/{active_programs.html => active_iabgroups.html} (74%) diff --git a/ietf/doc/templatetags/wg_menu.py b/ietf/doc/templatetags/wg_menu.py index 4f0c0a456..89b33c97c 100644 --- a/ietf/doc/templatetags/wg_menu.py +++ b/ietf/doc/templatetags/wg_menu.py @@ -38,13 +38,14 @@ from ietf.group.models import Group register = template.Library() -area_short_names = { +parent_short_names = { 'ops':'Ops & Mgmt', - 'rai':'RAI' + 'rai':'RAI', + 'iab':'IAB', } parents = Group.objects.filter( - models.Q(type="area") | models.Q(type="irtf", acronym="irtf"), + models.Q(type="area") | models.Q(type="irtf", acronym="irtf") | models.Q(acronym='iab'), state="active" ).order_by('type_id', 'acronym') @@ -53,7 +54,7 @@ def wg_menu(): global parents for p in parents: - p.short_name = area_short_names.get(p.acronym) or p.name + p.short_name = parent_short_names.get(p.acronym) or p.name if p.short_name.endswith(" Area"): p.short_name = p.short_name[:-len(" Area")] @@ -61,5 +62,7 @@ def wg_menu(): p.menu_url = "/wg/#" + p.acronym elif p.acronym == "irtf": p.menu_url = "/rg/" + elif p.acronym == "iab": + p.menu_url = "/program/" return render_to_string('base/menu_wg.html', { 'parents': parents }) diff --git a/ietf/group/migrations/0045_iabasg.py b/ietf/group/migrations/0045_iabasg.py new file mode 100644 index 000000000..371b7c45b --- /dev/null +++ b/ietf/group/migrations/0045_iabasg.py @@ -0,0 +1,38 @@ +# Copyright The IETF Trust 2021 All Rights Reserved + +from django.db import migrations + +def forward(apps, schema_editor): + GroupFeatures = apps.get_model('group', 'GroupFeatures') + Group = apps.get_model('group', 'Group') + + # Copy program to iabasg + feat = GroupFeatures.objects.get(pk='program') + feat.pk = 'iabasg' + feat.save() + feat.parent_types.add('ietf') + + # List provided by Cindy on 30Aug2021 + Group.objects.filter(acronym__in=['iana-evolution','iproc','liaison-oversight','ietfiana','plenary-planning','rfcedprog']).update(type_id='iabasg') + + Group.objects.filter(acronym='model-t').update(parent=Group.objects.get(acronym='iab')) + +def reverse(apps, schema_editor): + GroupFeatures = apps.get_model('group', 'GroupFeatures') + Group = apps.get_model('group', 'Group') + Group.objects.filter(type_id='iabasg').update(type_id='program') + # Intentionally not removing the parent of model-t + GroupFeatures.objects.filter(pk='iabasg').delete() + + + +class Migration(migrations.Migration): + + dependencies = [ + ('group', '0044_populate_groupfeatures_parent_type_fields'), + ('name', '0028_iabasg'), + ] + + operations = [ + migrations.RunPython(forward, reverse) + ] diff --git a/ietf/group/views.py b/ietf/group/views.py index b562374e9..a1c873c45 100644 --- a/ietf/group/views.py +++ b/ietf/group/views.py @@ -292,8 +292,8 @@ def active_groups(request, group_type=None): return active_dirs(request) elif group_type == "review": return active_review_dirs(request) - elif group_type == "program": - return active_programs(request) + elif group_type in ("program", "iabasg"): + return active_iab(request) else: raise Http404 @@ -321,11 +321,11 @@ def active_teams(request): group.chairs = sorted(roles(group, "chair"), key=extract_last_name) return render(request, 'group/active_teams.html', {'teams' : teams }) -def active_programs(request): - programs = Group.objects.filter(type="program", state="active").order_by("name") - for group in programs: +def active_iab(request): + iabgroups = Group.objects.filter(type__in=("program","iabasg"), state="active").order_by("-type_id","name") + for group in iabgroups: group.leads = sorted(roles(group, "lead"), key=extract_last_name) - return render(request, 'group/active_programs.html', {'programs' : programs }) + return render(request, 'group/active_iabgroups.html', {'iabgroups' : iabgroups }) def active_areas(request): areas = Group.objects.filter(type="area", state="active").order_by("name") @@ -1290,12 +1290,13 @@ def group_json(request, acronym): @cache_control(public=True, max_age=30*60) @cache_page(30 * 60) def group_menu_data(request): - groups = Group.objects.filter(state="active", type__features__acts_like_wg=True, parent__state="active").order_by("acronym") + 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") groups_by_parent = defaultdict(list) for g in groups: url = urlreverse("ietf.group.views.group_home", kwargs={ 'group_type': g.type_id, 'acronym': g.acronym }) - groups_by_parent[g.parent_id].append({ 'acronym': g.acronym, 'name': escape(g.name), 'url': url }) +# groups_by_parent[g.parent_id].append({ 'acronym': g.acronym, 'name': escape(g.name), 'url': url }) + groups_by_parent[g.parent_id].append({ 'acronym': g.acronym, 'name': escape(g.name), 'type': escape(g.type.verbose_name or g.type.name), 'url': url }) return JsonResponse(groups_by_parent) diff --git a/ietf/name/migrations/0028_iabasg.py b/ietf/name/migrations/0028_iabasg.py new file mode 100644 index 000000000..f339341ea --- /dev/null +++ b/ietf/name/migrations/0028_iabasg.py @@ -0,0 +1,22 @@ +# Copyright The IETF Trust 2021 All Rights Reserved + +from django.db import migrations + +def forward(apps, schema_editor): + GroupTypeName = apps.get_model('name', 'GroupTypeName') + GroupTypeName.objects.create(slug='iabasg', name='IAB ASG', verbose_name='IAB Administrative Support Group', desc='') + +def reverse(apps, schema_editor): + GroupTypeName = apps.get_model('name', 'GroupTypeName') + GroupTypeName.objects.filter(slug='iabasg').delete() + + +class Migration(migrations.Migration): + + dependencies = [ + ('name', '0027_add_bofrequest'), + ] + + operations = [ + migrations.RunPython(forward, reverse) + ] diff --git a/ietf/static/ietf/css/ietf.css b/ietf/static/ietf/css/ietf.css index ce571c539..aa79c459f 100644 --- a/ietf/static/ietf/css/ietf.css +++ b/ietf/static/ietf/css/ietf.css @@ -37,6 +37,12 @@ body { padding-top: 72px; } .dropdown-submenu > .dropdown-menu li a{ line-height: 1.2; } +.dropdown-submenu > .dropdown-menu li.separator{ + font-size: 80%; + margin-left: 1em; + padding: .5em 0; + border-bottom: 1px solid #CCC; +} .dropdown-submenu > a:after { display: block; content: " "; diff --git a/ietf/static/ietf/js/ietf.js b/ietf/static/ietf/js/ietf.js index bbe740c3d..6dd00b583 100644 --- a/ietf/static/ietf/js/ietf.js +++ b/ietf/static/ietf/js/ietf.js @@ -224,8 +224,13 @@ $(document).ready(function () { var menu = ['