Source code for app_utils.django
"""Extending the Django utilities."""
# pylint: disable = unused-import
from typing import Optional
from django.apps import apps
from django.contrib.auth.models import Permission, User
from django.db import models
from django.utils.html import format_html
from .app_settings import clean_setting # noqa: F401 - for backwards compatibility only
from .urls import static_file_absolute_url
[docs]
def app_labels() -> set:
"""returns set of all current app labels"""
return set(apps.app_configs.keys())
[docs]
def users_with_permission(
permission: Permission, include_superusers=True
) -> models.QuerySet:
"""returns queryset of users that have the given Django permission
Args:
permission: required permission
include_superusers: whether superusers are included in the returned list
"""
users_qs = (
permission.user_set.all()
| User.objects.filter(
groups__in=list(permission.group_set.values_list("pk", flat=True))
)
| User.objects.select_related("profile").filter(
profile__state__in=list(permission.state_set.values_list("pk", flat=True))
)
)
if include_superusers:
users_qs |= User.objects.filter(is_superuser=True)
return users_qs.distinct()
[docs]
def admin_boolean_icon_html(value) -> Optional[str]:
"""Variation of the admin boolean type, which returns the HTML for creating
the usual `True` and `False` icons.
But returns `None` for `None`, instead of the question mark."""
def make_html(icon_url: str, alt: str) -> str:
return format_html(f'<img src="{icon_url}" alt="{alt}">')
if value is True:
icon_url = static_file_absolute_url("admin/img/icon-yes.svg")
return make_html(icon_url, "True")
if value is False:
icon_url = static_file_absolute_url("admin/img/icon-no.svg")
return make_html(icon_url, "False")
return None