Skip to content

Commit c87d374

Browse files
committed
Added 2 utility functions to help create group features query filters, and applied them in 3 places in order to move group feature role list code back into DB queries.
- Legacy-Id: 15911
1 parent 37f4618 commit c87d374

4 files changed

Lines changed: 41 additions & 14 deletions

File tree

ietf/doc/templatetags/managed_groups.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
from django import template
22

3-
from ietf.group.models import Group, Role
3+
import debug # pyflakes:ignore
4+
5+
from ietf.group.models import Group
6+
from ietf.group.utils import group_features_group_filter
47

58
register = template.Library()
69

@@ -9,12 +12,10 @@ def managed_groups(user):
912
if not (user and hasattr(user, "is_authenticated") and user.is_authenticated):
1013
return []
1114

12-
groups = [ g for g in Group.objects.filter(
13-
role__person__user=user,
14-
type__features__has_session_materials=True,
15-
state__slug__in=('active', 'bof')).select_related("type")
16-
if Role.objects.filter(group=g, person__user=user, name__slug__in=g.type.features.matman_roles) ]
17-
15+
groups = Group.objects.filter( role__person=user.person,
16+
type__features__has_session_materials=True,
17+
state__slug__in=('active', 'bof'))
18+
groups = group_features_group_filter(groups, user.person, 'matman_roles')
1819
return groups
1920

2021
@register.filter

ietf/doc/views_doc.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Copyright The IETF Trust 2016-2018, All Rights Reserved
2-
2+
# -*- coding: utf-8 -*-
33

44
# Parts Copyright (C) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
55
# All rights reserved. Contact: Pasi Eronen <pasi.eronen@nokia.com>
@@ -54,7 +54,7 @@
5454
add_events_message_info, get_unicode_document_content, build_doc_meta_block)
5555
from ietf.community.utils import augment_docs_with_tracking_info
5656
from ietf.group.models import Role
57-
from ietf.group.utils import can_manage_group_type, can_manage_materials
57+
from ietf.group.utils import can_manage_group_type, can_manage_materials, group_features_role_filter
5858
from ietf.ietfauth.utils import ( has_role, is_authorized_in_doc_stream, user_is_person,
5959
role_required, is_individual_draft_author)
6060
from ietf.name.models import StreamName, BallotPositionName
@@ -164,8 +164,8 @@ def document_main(request, name, rev=None):
164164
# For some reason, AnonymousUser has __iter__, but is not iterable,
165165
# which causes problems in the filter() below. Work around this:
166166
if request.user.is_authenticated:
167-
roles = [ r for r in Role.objects.filter(group__acronym__in=stream_slugs, person__user=request.user)
168-
if r.name.slug in r.group.type.features.matman_roles ]
167+
roles = Role.objects.filter(group__acronym__in=stream_slugs, person__user=request.user)
168+
roles = group_features_role_filter(roles, request.user.person, 'matman_roles')
169169
else:
170170
roles = []
171171
can_change_stream = bool(can_edit or roles)

ietf/group/utils.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1+
# Copyright The IETF Trust 2012-2019, All Rights Reserved
2+
# -*- coding: utf-8 -*-
3+
14
import os
25

6+
from django.db.models import Q
37
from django.shortcuts import get_object_or_404
48
from django.utils.safestring import mark_safe
59
from django.urls import reverse as urlreverse
@@ -11,6 +15,7 @@
1115
from ietf.doc.models import Document, State
1216
from ietf.group.models import Group, RoleHistory, Role
1317
from ietf.ietfauth.utils import has_role
18+
from ietf.name.models import GroupTypeName
1419
from ietf.person.models import Email
1520
from ietf.review.utils import can_manage_review_requests_for_team
1621
from ietf.utils import log
@@ -246,3 +251,23 @@ def construct_group_menu_context(request, group, selected, group_type, others):
246251
d.update(others)
247252

248253
return d
254+
255+
256+
def group_features_group_filter(groups, person, feature):
257+
"""This returns a queryset of groups filtered such that the given person has
258+
a role listed in the given feature for each group."""
259+
type_slugs = set(groups.values_list('type__slug', flat=True))
260+
group_types = GroupTypeName.objects.filter(slug__in=type_slugs)
261+
if not group_types.exists():
262+
return groups.none()
263+
q = reduce(lambda a,b:a|b, [ Q(role__person=person, role__name__slug__in=getattr(t.features, feature)) for t in group_types ])
264+
return groups.filter(q)
265+
266+
def group_features_role_filter(roles, person, feature):
267+
type_slugs = set(roles.values_list('group__type__slug', flat=True))
268+
group_types = GroupTypeName.objects.filter(slug__in=type_slugs)
269+
if not group_types.exists():
270+
return roles.none()
271+
q = reduce(lambda a,b:a|b, [ Q(person=person, name__slug__in=getattr(t.features, feature)) for t in group_types ])
272+
return roles.filter(q)
273+

ietf/submit/views.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# Copyright The IETF Trust 2007-2019, All Rights Reserved
2+
# -*- coding: utf-8 -*-
23

34
import re
45
import base64
@@ -17,7 +18,8 @@
1718

1819
from ietf.doc.models import Document, DocAlias, AddedMessageEvent
1920
from ietf.doc.utils import prettify_std_name
20-
from ietf.group.models import Group, Role
21+
from ietf.group.models import Group
22+
from ietf.group.utils import group_features_group_filter
2123
from ietf.ietfauth.utils import has_role, role_required
2224
from ietf.mailtrigger.utils import gather_address_lists
2325
from ietf.message.models import Message, MessageAttachment
@@ -513,8 +515,7 @@ def add_preapproval(request):
513515
groups = Group.objects.filter(type__features__acts_like_wg=True).exclude(state__in=["conclude","bof-conc"]).order_by("acronym").distinct()
514516

515517
if not has_role(request.user, "Secretariat"):
516-
groups = [ g for g in groups.filter(role__person__user=request.user)
517-
if Role.objects.filter(group=g, person__user=request.user, name__slug__in=g.type.features.matman_roles).exists() ]
518+
groups = group_features_group_filter(groups, request.user.person, 'matman_roles')
518519

519520
if request.method == "POST":
520521
form = PreapprovalForm(request.POST)

0 commit comments

Comments
 (0)