templatetags: allow UUIDs as |has_role filter argument (#79857) #137

Open
pmarillonnet wants to merge 1 commits from wip/79857-has-role-uuid into main
1 changed files with 16 additions and 1 deletions

View File

@ -47,6 +47,13 @@ from combo.utils import NothingInCacheException, flatten_context
from combo.utils.date import make_date, make_datetime
from combo.utils.requests_wrapper import WaitForCacheException
try:
from hobo.agent.common.models import Role
uses_hobo = True
except ImportError:
uses_hobo = False
register = template.Library()
@ -331,7 +338,15 @@ def has_role(user, groupname):
return False
if not hasattr(user, 'groups'):
return False
return user.groups.filter(name=groupname).exists()
Review

On doit pouvoir simplifier tout ça en

qs = Role.objects.filter(name=groupname)
if is_uuid(groupname):
    qs |= Role.objects.filter(uuid=grouname)
return qs.exists()
On doit pouvoir simplifier tout ça en ``` qs = Role.objects.filter(name=groupname) if is_uuid(groupname): qs |= Role.objects.filter(uuid=grouname) return qs.exists() ```
Review

À noter que ce souci de code pas trop testable restera si on remplace uuid par slug. Je conseillerai de mocker Role pour les tests (et dans le code du module faire:

try:
     from hobo.agent.common.models import Role
except ImportError:
    Role = None

def has_role(user, groupname):
      if Role:
            ....
      else:
            return user.groups.filter(name=groupname).exists()

Ensuite dans le test on peut faire un:

   with mock.patch('combo.public.templatetags.combo.Role') as Role:
       ....
      assert Role.calls == [mock.call(...), ...]

pour vérifier que les bons appels ont été fait.

À noter que ce souci de code pas trop testable restera si on remplace uuid par slug. Je conseillerai de mocker Role pour les tests (et dans le code du module faire: ``` try: from hobo.agent.common.models import Role except ImportError: Role = None def has_role(user, groupname): if Role: .... else: return user.groups.filter(name=groupname).exists() ``` Ensuite dans le test on peut faire un: ``` with mock.patch('combo.public.templatetags.combo.Role') as Role: .... assert Role.calls == [mock.call(...), ...] ```` pour vérifier que les bons appels ont été fait.
by_uuid = False
if uses_hobo:
try:
role = Role.objects.get(uuid=groupname)
except Role.DoesNotExist:
pass
else:
by_uuid = role.user_set.filter(id=user.id).exists()
return bool(by_uuid or user.groups.filter(name=groupname).exists())
@register.filter