from django import template from django.template import loader from django.core.exceptions import ObjectDoesNotExist from django.contrib.contenttypes.models import ContentType from cursesite.ratings.models import Score,Vote 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): 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())