def render(self, context): obj = self.obj.resolve(context) if self.category: category = self.category.resolve(context) else: category = None try: ct = ContentType.objects.get_for_model(obj) if category is None: rating = OverallRating.objects.filter( object_id = obj.pk, content_type = ct ).aggregate(r = models.Avg("rating"))["r"] rating = Decimal(str(rating or "0")) else: rating = OverallRating.objects.get( object_id = obj.pk, content_type = ct, category = category_value(obj, category) ).rating or 0 except OverallRating.DoesNotExist: rating = 0 context[self.as_var] = rating return ""
def rate(request, content_type_id, object_id): ct = get_object_or_404(ContentType, pk=content_type_id) obj = get_object_or_404(ct.model_class(), pk=object_id) rating_input = int(request.POST.get("rating")) category = request.POST.get("category") if category: cat_choice = category_value(obj, category) else: cat_choice = None # Check for errors and bail early if category is not None and cat_choice is None: return HttpResponseForbidden( "Invalid category. It must match a preconfigured setting") if rating_input not in range(NUM_OF_RATINGS + 1): return HttpResponseForbidden( "Invalid rating. It must be a value between 0 and %s" % NUM_OF_RATINGS) data = { "user_rating": rating_input, "overall_rating": 0, "category": category } # @@@ Seems like this could be much more DRY with a model method or something if rating_input == 0: # clear the rating try: rating = Rating.objects.get(object_id=object_id, content_type=ct, user=request.user, category=cat_choice) overall = rating.overall_rating rating.delete() overall.update() data["overall_rating"] = str(overall.rating) except Rating.DoesNotExist: pass else: # set the rating rating, created = Rating.objects.get_or_create( object_id=obj.pk, content_type=ct, user=request.user, category=cat_choice, defaults={"rating": rating_input}) overall, created = OverallRating.objects.get_or_create( object_id=obj.pk, content_type=ct, category=cat_choice) rating.overall_rating = overall rating.rating = rating_input rating.save() overall.update() data["overall_rating"] = str(overall.rating) return HttpResponse(json.dumps(data), mimetype="application/json")
def top_rated(self, klass, category=None): if category: cat = category_value(klass, category) else: cat = None return self.filter( content_type=ContentType.objects.get_for_model(klass), category=cat).extra(select={ "sortable_rating": "COALESCE(rating, 0)" }).order_by("-sortable_rating")
def top_rated(self, klass, category=None): if category: cat = category_value(klass, category) else: cat = None return self.filter( content_type=ContentType.objects.get_for_model(klass), category=cat ).extra( select={ "sortable_rating": "COALESCE(rating, 0)" } ).order_by("-sortable_rating")
def user_rating_value(user, obj, category=None): try: ct = ContentType.objects.get_for_model(obj) if category is None: rating = Rating.objects.filter( object_id=obj.pk, content_type=ct, user=user).aggregate(r=models.Avg("rating"))["r"] rating = Decimal(str(rating or "0")) else: rating = Rating.objects.get(object_id=obj.pk, content_type=ct, user=user, category=category_value( obj, category)).rating except Rating.DoesNotExist: rating = 0 return rating
def user_rating_value(user, obj, category=None): try: ct = ContentType.objects.get_for_model(obj) if category is None: rating = Rating.objects.filter( object_id = obj.pk, content_type = ct, user = user ).aggregate(r = models.Avg("rating"))["r"] rating = Decimal(str(rating or "0")) else: rating = Rating.objects.get( object_id = obj.pk, content_type = ct, user = user, category = category_value(obj, category) ).rating except Rating.DoesNotExist: rating = 0 return rating
def render(self, context): obj = self.obj.resolve(context) if self.category: category = self.category.resolve(context) else: category = None try: ct = ContentType.objects.get_for_model(obj) if category is None: rating = OverallRating.objects.filter( object_id=obj.pk, content_type=ct).aggregate(r=models.Avg("rating"))["r"] rating = Decimal(str(rating or "0")) else: rating = OverallRating.objects.get( object_id=obj.pk, content_type=ct, category=category_value(obj, category)).rating or 0 except OverallRating.DoesNotExist: rating = 0 context[self.as_var] = rating return ""
def rate(request, content_type_id, object_id): ct = get_object_or_404(ContentType, pk=content_type_id) obj = get_object_or_404(ct.model_class(), pk=object_id) rating_input = int(request.POST.get("rating")) category = request.POST.get("category") if category: cat_choice = category_value(obj, category) else: cat_choice = None # Check for errors and bail early if category is not None and cat_choice is None: return HttpResponseForbidden( "Invalid category. It must match a preconfigured setting" ) if rating_input not in range(NUM_OF_RATINGS + 1): return HttpResponseForbidden( "Invalid rating. It must be a value between 0 and %s" % NUM_OF_RATINGS ) data = { "user_rating": rating_input, "overall_rating": 0, "category": category } # @@@ Seems like this could be much more DRY with a model method or something if rating_input == 0: # clear the rating try: rating = Rating.objects.get( object_id = object_id, content_type = ct, user = request.user, category = cat_choice ) overall = rating.overall_rating rating.delete() overall.update() data["overall_rating"] = str(overall.rating) except Rating.DoesNotExist: pass else: # set the rating rating, created = Rating.objects.get_or_create( object_id = obj.pk, content_type = ct, user = request.user, category = cat_choice, defaults = { "rating": rating_input } ) overall, created = OverallRating.objects.get_or_create( object_id = obj.pk, content_type = ct, category = cat_choice ) rating.overall_rating = overall rating.rating = rating_input rating.save() overall.update() data["overall_rating"] = str(overall.rating) return HttpResponse(json.dumps(data), content_type="application/json")