byceps/byceps

View on GitHub
byceps/announce/helpers.py

Summary

Maintainability
A
0 mins
Test Coverage
A
95%
"""
byceps.announce.helpers
~~~~~~~~~~~~~~~~~~~~~~~

:Copyright: 2014-2024 Jochen Kupperschmidt
:License: Revised BSD (see `LICENSE` file for details)
"""

from functools import wraps

from flask_babel import force_locale, gettext

from byceps.events.base import EventUser
from byceps.services.webhooks.models import OutgoingWebhook
from byceps.util.l10n import get_default_locale


def matches_selectors(
    event_name: str,
    webhook: OutgoingWebhook,
    attribute_name: str,
    actual_value: str,
) -> bool:
    if event_name not in webhook.event_types:
        # This should not happen as only webhooks supporting this
        # event type should have been selected before calling an
        # event announcement handler.
        return False

    event_filter = webhook.event_filters.get(event_name)
    if event_filter is None:
        return True

    allowed_values = event_filter.get(attribute_name)
    return (allowed_values is None) or (actual_value in allowed_values)


def get_screen_name_or_fallback(user: EventUser | None) -> str:
    """Return the user's screen name or a fallback value."""
    if (user is None) or (user.screen_name is None):
        return gettext('Someone')

    return user.screen_name


def with_locale(handler):
    @wraps(handler)
    def wrapper(*args, **kwargs):
        locale = get_default_locale()
        with force_locale(locale):
            return handler(*args, **kwargs)

    return wrapper