示例#1
0
 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 ""
示例#2
0
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")
示例#3
0
    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")
示例#4
0
    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
示例#6
0
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 ""
示例#8
0
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")