• This repository has been archived on 17/Jul/2018
  • Stars
    star
    409
  • Rank 102,175 (Top 3 %)
  • Language
    Python
  • License
    BSD 2-Clause "Sim...
  • Created almost 15 years ago
  • Updated about 7 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Pluggable rating fields in Django.

django-ratings

This project is no longer maintained

A generic ratings module. The field itself appends two additional fields on the model, for optimization reasons. It adds <field>_score, and <field>_votes fields, which are both integer fields.

Installation

You will need to add djangoratings to your INSTALLED_APPS:

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'djangoratings',
)

Finally, run python manage.py syncdb in your application's directory to create the tables.

Setup your models

The way django-ratings is built requires you to attach a RatingField to your models. This field will create two columns, a votes column, and a score column. They will both be prefixed with your field name:

from djangoratings.fields import RatingField

class MyModel(models.Model):
    rating = RatingField(range=5) # 5 possible rating values, 1-5

Alternatively you could do something like:

from djangoratings.fields import AnonymousRatingField

class MyModel(models.Model):
    rating = AnonymousRatingField(range=10)

If you'd like to use the built-in weighting methods, to make it appear more difficult for an object to obtain a higher rating, you can use the weight kwarg:

class MyModel(models.Model):
    rating = RatingField(range=10, weight=10)

RatingField allows the following options:

  • range = 2 - The range in which values are accepted. For example, a range of 2, says there are 2 possible vote scores.
  • can_change_vote = False - Allow the modification of votes that have already been made.
  • allow_delete = False - Allow the deletion of existent votes. Works only if can_change_vote = True
  • allow_anonymous = False - Whether to allow anonymous votes.
  • use_cookies = False - Use COOKIES to authenticate user votes. Works only if allow_anonymous = True.

Using the model API

And adding votes is also simple:

myinstance.rating.add(score=1, user=request.user, ip_address=request.META['REMOTE_ADDR'], request.COOKIES) # last param is optional - only if you use COOKIES-auth

Retrieving votes is just as easy:

myinstance.rating.get_rating_for_user(request.user, request.META['REMOTE_ADDR'], request.COOKIES) # last param is optional - only if you use COOKIES-auth

New You're also able to delete existent votes (if deletion enabled):

myinstance.rating.delete(request.user, request.META['REMOTE_ADDR'], request.COOKIES) # last param is optional - only if you use COOKIES-auth

Accessing information about the rating of an object is also easy:

# these do not hit the database
myinstance.rating.votes
myinstance.rating.score

How you can order by top-rated using an algorithm (example from Nibbits.com source):

# In this example, ``rating`` is the attribute name for your ``RatingField``
qs = qs.extra(select={
    'rating': '((100/%s*rating_score/(rating_votes+%s))+100)/2' % (MyModel.rating.range, MyModel.rating.weight)
})
qs = qs.order_by('-rating')

Get overall rating for your instance on a scale [0-range]:

myinstance.rating.get_rating()

Get recent ratings for your instance:

# This returns ``Vote`` instances.
myinstance.rating.get_ratings()[0:5]

Get the percent of voters approval:

myinstance.rating.get_percent()

Get that same percentage, but excluding your weight:

myinstance.rating.get_real_percent()

Generic Views: Processing Votes

The best way to use the generic views is by extending it, or calling it within your own code:

from djangoratings.views import AddRatingFromModel

urlpatterns = patterns('',
    url(r'rate-my-post/(?P<object_id>\d+)/(?P<score>\d+)/', AddRatingFromModel(), {
        'app_label': 'blogs',
        'model': 'post',
        'field_name': 'rating',
    }),
)

Another example, on Nibbits we use a basic API interface, and we simply call the AddRatingView within our own view:

from djangoratings.views import AddRatingView

# For the sake of this actually looking like documentation:
params = {
    'content_type_id': 23,
    'object_id': 34,
    'field_name': 'ratings', # this should match the field name defined in your model
    'score': 1, # the score value they're sending
}
response = AddRatingView()(request, **params)
if response.status_code == 200:
    if response.content == 'Vote recorded.':
        request.user.add_xp(settings.XP_BONUSES['submit-rating'])
    return {'message': response.content, 'score': params['score']}
return {'error': 9, 'message': response.content}

COOKIE format

New: For now COOKIE name has fixed format: "vote-{{ content_type.id }}.{{ object.id }}.{{ rating_field.key }}[:6]" and COOKIE value is simple datetime-stamp.

Example: vote-15.56.2c5504=20101213101523456000

And this COOKIE lives in user's browser for 1 year (this period is also fixed for now)

This feature may change in the future

Limit Votes Per IP Address

New in 0.3.5: There is now a setting, RATINGS_VOTES_PER_IP, to limit the number of unique IPs per object/rating-field combination. This is useful if you have issues with users registering multiple accounts to vote on a single object:

RATINGS_VOTES_PER_IP = 3

Template Tags

Right now django-ratings has limited support for template tags, and only for Django. Load a ratings template tag set. `{% load ratings %}`.

rating_by_request

Retrieves the Vote cast by a user on a particular object and stores it in a context variable. If the user has not voted, the context variable will be 0:

{% rating_by_request request on instance.field as vote %}

If you are using Coffin, a better approach might be:

{% with instance.field_name.get_rating_for_user(request.user, request.META['REMOTE_ADDR'], request.COOKIES) as vote %}
        Do some magic with {{ vote }}
{% endwith %}

To use the request context variable you will need to add django.core.context_processors.request to the TEMPLATE_CONTEXT_PROCESSORS setting.

rating_by_user

It is recommended that you use rating_by_request as you will gain full support for anonymous users if they are enabled

Retrieves the Vote cast by a user on a particular object and stores it in a context variable. If the user has not voted, the context variable will be 0:

{% rating_by_user user on instance.field as vote %}

More Repositories

1

django-devserver

A drop-in replacement for Django's runserver.
Python
1,272
star
2

mangodb

A database that operates at CLOUD SCALE
Python
877
star
3

taskmaster

A simple distributed queue designed for handling one-off tasks with large sets of tasks
Python
442
star
4

django-sphinx

A transparent layer for full-text search using Sphinx and Django
Python
357
star
5

django-uuidfield

A UUIDField for Django
Python
264
star
6

mock-django

Python
225
star
7

logan

Logan is a toolkit for building standalone Django applications
Python
205
star
8

django-db-log

This project is no longer updated. Please see https://sentry.io/ for its successor
Python
122
star
9

wp-lifestream

Lifestreaming plugin for Wordpress
PHP
121
star
10

django-paging

Sexy pagination in Django
Python
108
star
11

django-orm-cache

A caching layer for Django
87
star
12

decruft

python-readability, but faster (mirror-ish)
Python
83
star
13

django-view-as

A Django middleware which allows you to view the site on behalf of a user.
Python
81
star
14

django-idmapper

An identify mapper for the Django ORM
Python
72
star
15

piplint

Piplint validates your current environment against requirements files
Python
62
star
16

python-tools-tmbundle

Adds support for automated PyFlakes linting in TextMate
Python
61
star
17

django-static-compiler

Python
56
star
18

pdbinject

A Python utility which uses GDB to inject a telnet-able PDB session into an existing process
Python
54
star
19

py-wikimarkup

A MediaWiki-to-HTML parser for Python.
Python
53
star
20

feedreader

An RSS/Atom feed parsing layer for lxml.objectify in Python
Python
52
star
21

django-sentry

This repo has been moved!
49
star
22

django-indexer

A simple key/value store for indexing meta data on JSON-type fields
Python
46
star
23

chardet

Forked version of chardet
Python
41
star
24

sentry-old

(In Development) Sentry 2.x is a realtime event logging and aggregation platform
Python
40
star
25

peated

HTML
40
star
26

django-data-tools

Python
38
star
27

django-compositepks

Composite Primary Keys fork
Python
38
star
28

django-oursql

Django database backend for MySQL via oursql.
Python
37
star
29

dotfiles

My personal dotfiles
Shell
36
star
30

quickunit

A Nose plugin which enables determining which tests to run based on the current git diff
Python
34
star
31

hive

My home infrastructure
Jinja
33
star
32

nibbits-shared

Some shared libraries which we have created at Nibbits
Python
28
star
33

numbers

Python Numbers for Humans
Python
26
star
34

sexytime

Python
26
star
35

nexus-memcache

Memcache statistics plugin for Nexus
Python
23
star
36

sentry

THIS REPOSITORY HAS BEEN MOVED
22
star
37

django-notices

A message notification system for Django
Python
22
star
38

django-db-routes

work in progress
Python
20
star
39

peek

Take a peek at whats slowing down your Python application
Python
20
star
40

ghostplusplus

Git Mirror of GHost++
C
20
star
41

kleenex

A Nose plugin designed to detect coverage and only run the tests that matter.
Python
18
star
42

git-owners

Python
16
star
43

nexus-redis

Redis stats in Nexus
Python
16
star
44

pastethat

A Django Pastebin (Pastethat.com)
Python
15
star
45

dateminer

Extract dates from webpages
Python
13
star
46

pmp

Python
11
star
47

selenium-saucelabs-python

Selenium driver for Sauce OnDemand
Python
11
star
48

pytest-django-lite

The bare minimum to integrate py.test with Django.
Python
11
star
49

SublimeFlakes

Inline PyFlakes in Sublime Text 2
Python
11
star
50

objtrack

Generic object 'viewed' status tracking in Django
Python
11
star
51

gitstats

Unofficial fork of GitStats with some bugfixes
Python
10
star
52

php-httplib

A port of Python's httplib in PHP
PHP
10
star
53

panelkit

WIP: A kit for building a tablet-focused Home Assistant UI.
TypeScript
9
star
54

europython-2011

9
star
55

django-bbcode

I'm tired of bitbucket
Python
9
star
56

gitboard

Python
8
star
57

nose-json

Python
8
star
58

wiki-to-overview

Redmine Plugin: Forward overview to Wiki
Ruby
8
star
59

anti-spam

8
star
60

pyconsg-tutorial-bootstrap

Python
7
star
61

lovelace-nextbus-card

A card giving richer public transit display using NextBus sensors.
TypeScript
7
star
62

tabletop-server

Python
6
star
63

muskrats

TypeScript
6
star
64

nexus-celery

6
star
65

php-database

A simple database library for MySQL and PGSQL.
PHP
6
star
66

djangospot

DjangoSpot.com Source
JavaScript
6
star
67

nose-bisect

Flush out bad tests with easy bisection in Python/Nose
Python
6
star
68

redmine-improved-revisions

Redmine Plugin: Improved revisions in Redmine
Ruby
5
star
69

nibbits-maploader

Nibbits automated map and replay installer
C#
5
star
70

forward-to-diffs

Redmine plugin: Forward revisions to diffs
Ruby
5
star
71

unifi-mqtt

Python
5
star
72

redmine_hudson

Ruby
5
star
73

soundbot

Audio player extension for Phenny
Python
4
star
74

minecraft-tools

Python
4
star
75

site

JavaScript
4
star
76

rss-to-tumblr

Allows importing an rss under a specific set of tags
Python
4
star
77

hass-luxor

FXLuminaire Luxor integration for Home Assistant
Python
4
star
78

reraise

Python
4
star
79

nexus-postgresql

4
star
80

jinja1-djangosupport

Jinja 1 with updated Django Support
Python
4
star
81

notsetuptools

Python
4
star
82

protobufs

Google Protocal Buffers
C++
4
star
83

redmine-home-to-projects

Forward a Redmine user to a the project listing when visiting the Home page.
Ruby
4
star
84

djangospot2

DjangoSpot using Pylons and Redis
Python
3
star
85

flask-redis

Redis support for Flask
Python
3
star
86

tabletop-mobile

JavaScript
3
star
87

pyconsg-tutorial-example

Python
3
star
88

raven

THIS PROJECT HAS BEEN MOVED
3
star
89

scmap

Python
3
star
90

homeline

very wip
TypeScript
2
star
91

gochatter

2
star
92

galaxyvalidator

galaxyvalidator.com source
Python
2
star
93

ghostplusplus-nibbits

Nibbit's version of GHost++
C
2
star
94

cask-server

Python
2
star
95

davidcramer-redirect

Redirects links on davidcramer.net to JustCramer.com
Python
2
star
96

redmine_disqus_ci

Disqus CI for Redmine
Ruby
2
star
97

ad-alarm-manager

Python
1
star
98

cask-web

TypeScript
1
star
99

gobot

Go
1
star
100

test-repo

So I can haz tests
1
star