from django import template
from django.utils.safestring import mark_safe

from workshops.models import TrainingProgress

register = template.Library()


@register.simple_tag
def progress_label(progress):
    assert isinstance(progress, TrainingProgress)

    if progress.discarded:
        additional_label = 'default'

    else:
        switch = {
            'n': 'warning',
            'f': 'danger',
            'p': 'success',
        }
        additional_label = switch[progress.state]

    fmt = 'label label-{}'.format(additional_label)
    return mark_safe(fmt)


@register.simple_tag
def progress_description(progress):
    assert isinstance(progress, TrainingProgress)

    text = '{discarded}{state} {type}<br />{evaluated_by}<br />on {day}.{notes}'.format(
        discarded='discarded ' if progress.discarded else '',
        state=progress.get_state_display(),
        type=progress.requirement,
        evaluated_by=('evaluated by {}'.format(
                         progress.evaluated_by.full_name)
                      if progress.evaluated_by is not None else 'submitted'),
        day=progress.created_at.strftime('%A %d %B %Y at %H:%M'),
        notes='<br />Notes: {}'.format(progress.notes) if progress.notes else '',
    )
    text = text[0].upper() + text[1:]
    return mark_safe(text)

from django import template
from django.template.defaultfilters import escape
from django.utils.safestring import mark_safe

from workshops.models import TrainingProgress

register = template.Library()


@register.simple_tag
def progress_label(progress):
    assert isinstance(progress, TrainingProgress)

    if progress.discarded:
        additional_label = 'default'

    else:
        switch = {
            'n': 'warning',
            'f': 'danger',
            'p': 'success',
        }
        additional_label = switch[progress.state]

    fmt = 'label label-{}'.format(additional_label)
    return mark_safe(fmt)


@register.simple_tag
def progress_description(progress):
    assert isinstance(progress, TrainingProgress)

    text = '{discarded}{state} {type}<br />{evaluated_by}<br />on {day}.{notes}'.format(
        discarded='discarded ' if progress.discarded else '',
        state=progress.get_state_display(),
        type=progress.requirement,
        evaluated_by=('evaluated by {}'.format(
                         progress.evaluated_by.full_name)
                      if progress.evaluated_by is not None else 'submitted'),
        day=progress.created_at.strftime('%A %d %B %Y at %H:%M'),
        notes='<br />Notes: {}'.format(escape(progress.notes)) if progress.notes else '',
    )
    text = text[0].upper() + text[1:]
    return mark_safe(text)

Fix unescaped content in training progress description templatetag