Source code for swh.web.alter.templatetags.alter_extras
# Copyright (C) 2025 The Software Heritage developers
# See the AUTHORS file at the top-level directory of this distribution
# License: GNU Affero General Public License version 3, or any later version
# See top-level LICENSE file for more information
from __future__ import annotations
from typing import TYPE_CHECKING
from django_bootstrap5.templatetags.django_bootstrap5 import (
bootstrap_button,
bootstrap_field,
)
from django import template
from django.urls import reverse
from django.utils.html import conditional_escape
from django.utils.safestring import SafeString, mark_safe
from swh.web.alter.models import AlterationStatus, OriginOutcome
if TYPE_CHECKING:
from django.forms import Field
register = template.Library()
[docs]
@register.filter
def status_badge(category: str, label: str) -> SafeString:
tags = {
AlterationStatus.VALIDATING.value: "info",
AlterationStatus.REJECTED.value: "warning",
AlterationStatus.PROCESSED.value: "success",
AlterationStatus.CLOSED.value: "secondary",
AlterationStatus.EXECUTING.value: "primary",
AlterationStatus.PLANNING.value: "light",
AlterationStatus.ARCHIVED.value: "dark",
}
return mark_safe(
'<span class="badge text-bg-%s">%s</span>'
% (tags.get(category, "secondary"), conditional_escape(label))
)
[docs]
@register.filter
def outcome_badge(outcome: str, label: str) -> SafeString:
tags = {
OriginOutcome.VALIDATING.value: "info",
OriginOutcome.REJECTED.value: "warning",
OriginOutcome.MAILMAP.value: "light",
OriginOutcome.MASK.value: "secondary",
OriginOutcome.TAKEDOWN.value: "primary",
OriginOutcome.BLOCK.value: "dark",
}
return mark_safe(
'<span class="badge text-bg-%s">%s</span>'
% (tags.get(outcome, "secondary"), conditional_escape(label))
)
[docs]
@register.simple_tag(takes_context=True)
def absolute_url(context: dict, location: str, *args, **kwargs) -> str:
"""Build a _real_ absolute url to `location` (including host & port).
Location could be a relative url or a view name (as in urls.py) which would then be
`reverse` with args & kwargs.
Usage:
```
{% absolute_url 'my-route' pk=12345 %}
{% absolute_url obj.get_absolute_url %}
```
Args:
context: a django template context
location: a view name
*args: args passed to `reverse`
**kwargs: keyword args passed to `reverse`
Returns:
an absolute url to `location`
"""
if not isinstance(location, str) or "/" not in location:
location = reverse(location, args=args, kwargs=kwargs)
if "request" in context:
return context["request"].build_absolute_uri(location)
return location
[docs]
@register.simple_tag
def bootstrap_field_submit(
field: Field,
button_label: str,
) -> str:
"""A wrapper around django_bs5.bootstrap_field to make a field + submit addon.
Args:
field: a Form field
button_label: submit button label
Returns:
A form input group with a field and an appended submit button
"""
return bootstrap_field(
field=field,
addon_after=bootstrap_button(button_label, button_type="submit"),
show_label=False,
addon_after_class=None,
success_css_class="",
)