PageRenderTime 49ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/zinnia/templatetags/zbreadcrumbs.py

http://github.com/Fantomas42/django-blog-zinnia
Python | 100 lines | 93 code | 5 blank | 2 comment | 0 complexity | 28ed590f2364988e1a3716aa106e3e01 MD5 | raw file
Possible License(s): BSD-3-Clause, GPL-3.0
  1. """Breadcrumb module for Zinnia templatetags"""
  2. import re
  3. from datetime import datetime
  4. from django.core.urlresolvers import reverse
  5. from django.utils.translation import ugettext as _
  6. class Crumb(object):
  7. """Part of the Breadcrumbs"""
  8. def __init__(self, name, url=None):
  9. self.name = name
  10. self.url = url
  11. def year_crumb(creation_date):
  12. """Crumb for a year"""
  13. year = creation_date.strftime('%Y')
  14. return Crumb(year, reverse('zinnia_entry_archive_year',
  15. args=[year]))
  16. def month_crumb(creation_date):
  17. """Crumb for a month"""
  18. year = creation_date.strftime('%Y')
  19. month = creation_date.strftime('%m')
  20. month_text = creation_date.strftime('%b').capitalize()
  21. return Crumb(month_text, reverse('zinnia_entry_archive_month',
  22. args=[year, month]))
  23. def day_crumb(creation_date):
  24. """Crumb for a day"""
  25. year = creation_date.strftime('%Y')
  26. month = creation_date.strftime('%m')
  27. day = creation_date.strftime('%d')
  28. return Crumb(day, reverse('zinnia_entry_archive_day',
  29. args=[year, month, day]))
  30. ZINNIA_ROOT_URL = lambda: reverse('zinnia_entry_archive_index')
  31. MODEL_BREADCRUMBS = {'Tag': lambda x: [Crumb(_('Tags'),
  32. reverse('zinnia_tag_list')),
  33. Crumb(x.name)],
  34. 'Author': lambda x: [Crumb(_('Authors'),
  35. reverse('zinnia_author_list')),
  36. Crumb(x.username)],
  37. 'Category': lambda x: [Crumb(
  38. _('Categories'), reverse('zinnia_category_list'))] + \
  39. [Crumb(anc.title, anc.get_absolute_url())
  40. for anc in x.get_ancestors()] + [Crumb(x.title)],
  41. 'Entry': lambda x: [year_crumb(x.creation_date),
  42. month_crumb(x.creation_date),
  43. day_crumb(x.creation_date),
  44. Crumb(x.title)]}
  45. DATE_REGEXP = re.compile(
  46. r'.*(?P<year>\d{4})/(?P<month>\d{2})?/(?P<day>\d{2})?.*')
  47. def retrieve_breadcrumbs(path, model_instance, root_name=''):
  48. """Build a semi-hardcoded breadcrumbs
  49. based of the model's url handled by Zinnia"""
  50. breadcrumbs = []
  51. if root_name:
  52. breadcrumbs.append(Crumb(root_name, ZINNIA_ROOT_URL()))
  53. if model_instance is not None:
  54. key = model_instance.__class__.__name__
  55. if key in MODEL_BREADCRUMBS:
  56. breadcrumbs.extend(MODEL_BREADCRUMBS[key](model_instance))
  57. return breadcrumbs
  58. date_match = DATE_REGEXP.match(path)
  59. if date_match:
  60. date_dict = date_match.groupdict()
  61. path_date = datetime(
  62. int(date_dict['year']),
  63. date_dict.get('month') is not None and \
  64. int(date_dict.get('month')) or 1,
  65. date_dict.get('day') is not None and \
  66. int(date_dict.get('day')) or 1)
  67. date_breadcrumbs = [year_crumb(path_date)]
  68. if date_dict['month']:
  69. date_breadcrumbs.append(month_crumb(path_date))
  70. if date_dict['day']:
  71. date_breadcrumbs.append(day_crumb(path_date))
  72. breadcrumbs.extend(date_breadcrumbs)
  73. return breadcrumbs
  74. url_components = [comp for comp in
  75. path.replace(ZINNIA_ROOT_URL(), '').split('/') if comp]
  76. if len(url_components):
  77. breadcrumbs.append(Crumb(_(url_components[-1].capitalize())))
  78. return breadcrumbs