zinnia.templatetags.zbreadcrumbs
Covered: 80 lines
Missed: 0 lines
Skipped 23 lines
Percent: 100 %
  1
"""Breadcrumb module for Zinnia templatetags"""
  2
import re
  3
from datetime import datetime
  5
from django.core.urlresolvers import reverse
  6
from django.utils.translation import ugettext as _
  9
class Crumb(object):
 10
    """Part of the Breadcrumbs"""
 11
    def __init__(self, name, url=None):
 12
        self.name = name
 13
        self.url = url
 16
def year_crumb(creation_date):
 17
    """Crumb for a year"""
 18
    year = creation_date.strftime('%Y')
 19
    return Crumb(year, reverse('zinnia_entry_archive_year',
 20
                               args=[year]))
 23
def month_crumb(creation_date):
 24
    """Crumb for a month"""
 25
    year = creation_date.strftime('%Y')
 26
    month = creation_date.strftime('%m')
 27
    month_text = creation_date.strftime('%b').capitalize()
 28
    return Crumb(month_text, reverse('zinnia_entry_archive_month',
 29
                                     args=[year, month]))
 32
def day_crumb(creation_date):
 33
    """Crumb for a day"""
 34
    year = creation_date.strftime('%Y')
 35
    month = creation_date.strftime('%m')
 36
    day = creation_date.strftime('%d')
 37
    return Crumb(day, reverse('zinnia_entry_archive_day',
 38
                              args=[year, month, day]))
 41
ZINNIA_ROOT_URL = lambda: reverse('zinnia_entry_archive_index')
 43
MODEL_BREADCRUMBS = {'Tag': lambda x: [Crumb(_('Tags'),
 44
                                             reverse('zinnia_tag_list')),
 45
                                       Crumb(x.name)],
 46
                     'Author': lambda x: [Crumb(_('Authors'),
 47
                                              reverse('zinnia_author_list')),
 48
                                        Crumb(x.username)],
 49
                     'Category': lambda x: [Crumb(_('Categories'),
 50
                                                  reverse('zinnia_category_list'))] + \
 51
                                           [Crumb(anc.title,
 52
                                                  anc.get_absolute_url())
 53
                                            for anc in x.get_ancestors()] + \
 54
                                           [Crumb(x.title)],
 55
                     'Entry': lambda x: [year_crumb(x.creation_date),
 56
                                         month_crumb(x.creation_date),
 57
                                         day_crumb(x.creation_date),
 58
                                         Crumb(x.title)]}
 60
DATE_REGEXP = re.compile(
 61
    r'.*(?P<year>\d{4})/(?P<month>\d{2})?/(?P<day>\d{2})?.*')
 64
def retrieve_breadcrumbs(path, model_instance, root_name=''):
 65
    """Build a semi-hardcoded breadcrumbs
 66
    based of the model's url handled by Zinnia"""
 67
    breadcrumbs = []
 69
    if root_name:
 70
        breadcrumbs.append(Crumb(root_name, ZINNIA_ROOT_URL()))
 72
    if model_instance is not None:
 73
        key = model_instance.__class__.__name__
 74
        if key in MODEL_BREADCRUMBS:
 75
            breadcrumbs.extend(MODEL_BREADCRUMBS[key](model_instance))
 76
            return breadcrumbs
 78
    date_match = DATE_REGEXP.match(path)
 79
    if date_match:
 80
        date_dict = date_match.groupdict()
 81
        path_date = datetime(
 82
            int(date_dict['year']),
 83
            date_dict.get('month') is not None and \
 84
            int(date_dict.get('month')) or 1,
 85
            date_dict.get('day') is not None and \
 86
            int(date_dict.get('day')) or 1)
 88
        date_breadcrumbs = [year_crumb(path_date)]
 89
        if date_dict['month']:
 90
            date_breadcrumbs.append(month_crumb(path_date))
 91
        if date_dict['day']:
 92
            date_breadcrumbs.append(day_crumb(path_date))
 93
        breadcrumbs.extend(date_breadcrumbs)
 95
        return breadcrumbs
 97
    url_components = [comp for comp in
 98
                      path.replace(ZINNIA_ROOT_URL(), '').split('/') if comp]
 99
    if len(url_components):
100
        breadcrumbs.append(Crumb(_(url_components[-1].capitalize())))
102
    return breadcrumbs