All pastes #181053 Raw Edit

Someone

public text v1 · immutable
#181053 ·published 2006-09-24 13:30 UTC
rendered paste body
from django import template
from django.template import loader
from django.core.exceptions import ObjectDoesNotExist
from django.contrib.contenttypes.models import ContentType
import re

register = template.Library()

class RatingDisplay(template.Node):
	def __init__(self, content_type, obj_id_lookup_var, obj_id):
		self.content_type = content_type
		self.obj_id_lookup_var, self.obj_id = obj_id_lookup_var, obj_id

	def render(self, context):
		from django.utils.text import normalize_newlines
		import base64
		context.push()
		if self.obj_id_lookup_var is not None:
			try:
				self.obj_id = template.resolve_variable(self.obj_id_lookup_var, context)
			except template.VariableDoesNotExist:
				return ''
			try:
				self.content_type.get_object_for_this_type(pk=self.obj_id)
			except ObjectDoesNotExist:
				context['display_form'] = False
			else:
				context['display_form'] = True
		else:
			context['display_form'] = True
		context['target'] = '%s:%s' % (self.content_type.id, self.obj_id)
		options = []
		for var, abbr in (('rating_choices', RATING_CHOICES),):
			context[var] = getattr(self, var)
			if getattr(self, var):
				options.append(abbr)
		context['options'] = ','.join(options)
		default_form = loader.get_template('ratings/display.html')
		output = default_form.render(context)
		context.pop()
		return output

class DoRating():
	def __init_(self):
		pass

	def __call__(self, parser, token):
		tokens = token.contents.split()
		if len(tokens) < 4:
			raise template.TemplateSyntaxError, "%r tag requires at least 3 arguments" % tokens[0]
		if tokens[1] != 'for':
			raise template.TemplateSyntaxError, "Second argument in %r tag must be 'for'" % tokens[0]
		try:
			package, module = tokens[2].split('.')
		except ValueError: # unpack list of wrong size
			raise template.TemplateSyntaxError, "Third argument in %r tag must be in the format 'package.module'" % tokens[0]
		try:
			content_type = ContentType.objects.get(app_label__exact=package, model__exact=module)
		except ContentType.DoesNotExist:
			raise template.TemplateSyntaxError, "%r tag has invalid content-type '%s.%s'" % (tokens[0], package, module)
		obj_id_lookup_var, obj_id = None, None
		if tokens[3].isdigit():
			obj_id = tokens[3]
			try: # ensure the object ID is valid
				content_type.get_object_for_this_type(pk=obj_id)
			except ObjectDoesNotExist:
				raise template.TemplateSyntaxError, "%r tag refers to %s object with ID %s, which doesn't exist" % (tokens[0], content_type.name, obj_id)
		else:
			obj_id_lookup_var = tokens[3]
		return RatingDisplay(content_type, obj_id_lookup_var, obj_id)

register.tag('rating', DoRating())