/blogmaker/blog/templatetags/blog_extras.py

http://blogmaker.googlecode.com/ · Python · 151 lines · 109 code · 31 blank · 11 comment · 22 complexity · 49fca3085d3ab656605e65317c90299d MD5 · raw file

  1. '''
  2. @copyright:Copyright (c) 2006-2007, PreFab Software Inc.
  3. Copyright (c) 2006, Andrew Gwozdziewycz <apgwoz@gmail.com>
  4. All rights reserved.
  5. '''
  6. import datetime
  7. from django import template
  8. from django.template import resolve_variable
  9. from django.conf import settings
  10. from blogmaker.blog.models import Entry, Tag
  11. register = template.Library()
  12. @register.tag('get_yearly_archive')
  13. def do_archive_year(parser, token):
  14. ''' get_yearly_archive as archive_list '''
  15. bits = token.contents.split()
  16. if len(bits) == 3 and bits[1] == 'as':
  17. return YearArchiveNode(bits[2])
  18. else:
  19. return template.TemplateSyntaxError
  20. class YearArchiveNode(template.Node):
  21. def __init__(self, context_variable):
  22. self.context_variable = context_variable
  23. def render(self, context):
  24. date_list = Entry.objects.current_active().dates('pub_date', 'month', order='DESC')
  25. context[self.context_variable] = date_list
  26. return ''
  27. @register.tag('get_recent_posts')
  28. def do_recent_posts(parser, token):
  29. ''' get_recent_posts 5 as post_list object.id '''
  30. bits = token.contents.split()
  31. if len(bits) == 5 and bits[2] == 'as':
  32. return RecentPostsNode(bits[3], int(bits[1]), bits[4])
  33. elif len(bits) == 4 and bits[2] == 'as':
  34. return RecentPostsNode(bits[3], int(bits[1]), 0)
  35. else:
  36. return template.TemplateSyntaxError
  37. class RecentPostsNode(template.Node):
  38. def __init__(self, context_variable, count, ident):
  39. self.context_variable = context_variable
  40. self.count = count
  41. self.ident = ident
  42. def render(self, context):
  43. if self.ident > 0:
  44. current_ident = resolve_variable(self.ident, context)
  45. else:
  46. current_ident = 0
  47. post_list = Entry.objects.current_active().extra(select={'current_post': "id=%s"}, params=[current_ident]).order_by('-pub_date')[:self.count]
  48. context[self.context_variable] = post_list
  49. return ''
  50. @register.tag('get_popular_tags')
  51. def do_popular_tags(parser, token):
  52. ''' get_popular_tags 5 as popular_tags '''
  53. bits = token.contents.split()
  54. if len(bits) == 4 and bits[2] == 'as':
  55. return PopularTagsNode(int(bits[1]), bits[3])
  56. class PopularTagsNode(template.Node):
  57. def __init__(self, num, varname):
  58. self.num = num
  59. self.varname = varname
  60. def render(self, context):
  61. tags = Tag.objects.all()
  62. popular_tags = []
  63. for tag in tags:
  64. entry_count = tag.entry_set.current_active().count()
  65. if entry_count > 0:
  66. tag = tag
  67. popular_tags.append( (entry_count, tag) )
  68. popular_tags.sort(reverse=True)
  69. context[self.varname] = popular_tags[:self.num]
  70. return ''
  71. @register.tag('get_next')
  72. def do_next_post(parser, token):
  73. ''' get_next object.id next_post '''
  74. bits = token.contents.split()
  75. if len(bits) == 3:
  76. return NextPostNode(bits[1], bits[2])
  77. else:
  78. return template.TemplateSyntaxError
  79. class NextPostNode(template.Node):
  80. def __init__(self, ident, context_variable):
  81. self.context_variable = context_variable
  82. self.ident = ident
  83. def render(self, context):
  84. current_ident = resolve_variable(self.ident, context)
  85. current_entry = Entry.objects.get(id__exact=current_ident)
  86. try:
  87. next_post = current_entry.get_next_by_pub_date(pub_date__lte=datetime.datetime.now(), active=True)
  88. except Entry.DoesNotExist:
  89. next_post = []
  90. context[self.context_variable] = next_post
  91. return ''
  92. @register.tag('get_previous')
  93. def do_previous_post(parser, token):
  94. ''' get_previous object.id previous_post '''
  95. bits = token.contents.split()
  96. if len(bits) == 3:
  97. return PreviousPostNode(bits[1], bits[2])
  98. else:
  99. return template.TemplateSyntaxError
  100. class PreviousPostNode(template.Node):
  101. def __init__(self, ident, context_variable):
  102. self.context_variable = context_variable
  103. self.ident = ident
  104. def render(self, context):
  105. current_ident = resolve_variable(self.ident, context)
  106. current_entry = Entry.objects.get(id__exact=current_ident)
  107. try:
  108. print 'here'
  109. previous_post = current_entry.get_previous_by_pub_date(pub_date__lte=datetime.datetime.now(), active=True)
  110. except Entry.DoesNotExist:
  111. previous_post = []
  112. context[self.context_variable] = previous_post
  113. return ''
  114. @register.simple_tag
  115. def BLOG_ROOT():
  116. return settings.BLOG_ROOT
  117. @register.simple_tag
  118. def SITE_ROOT():
  119. return settings.SITE_ROOT