Created
August 6, 2009 11:47
-
-
Save jokull/163271 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from django.conf import settings | |
from django.db.models import F, Q, Model, IntegerField, BooleanField | |
from django.db.models.query import QuerySet | |
from django.core.cache import cache | |
from django.utils.hashcompat import sha_constructor | |
from peopleproject.utils.models import BaseModel | |
class ModerateModel(BaseModel): | |
""" | |
Abstract model, extend from this to gain flaggable behaviour. | |
""" | |
flag_count = IntegerField(default=0) | |
is_rejected = BooleanField(default=False) | |
class Meta: | |
abstract = True | |
def _get_flag_cache_key(self, salt): | |
sha = sha_constructor(u'flag_%s-%s' % (self.__class__.__name__, salt)) | |
return sha.hexdigest() | |
def has_flag(self, owner_identifier): | |
return bool(cache.get(self._get_flag_cache_key(owner_identifier))) | |
def add_flag(self, owner_identifier): | |
""" | |
Atomically increment counter. Explicitly reload object. Only one flag | |
allowed per token, per object. Return added boolean. | |
""" | |
cache_key = self._get_flag_cache_key(owner_identifier) | |
flag = cache.get(cache_key) | |
already_flagged = (flag is not None) | |
if not already_flagged: | |
# flag_count is an F expression object after assignment so increment twice | |
cache.set(cache_key, self.flag_count + 1) | |
self.flag_count = F('flag_count') + 1 | |
self.save() | |
return not already_flagged | |
def approve(self): | |
""" Reset flag count. """ | |
self.flag_count = 0 | |
self.is_rejected = False | |
self.save() | |
class ModerateQuerySet(QuerySet): | |
def approved(self): | |
return self.filter(Q(is_rejected=False)|Q(flag_count__gt=settings.FLAG_AUTOHIDE_THRESHOLD_COUNT)) | |
from django.contrib.admin import ModelAdmin | |
class ModerateAdmin(ModelAdmin): | |
def reject(self, request, queryset): | |
queryset.update(is_rejected=True) | |
reject.short_description = 'Reject' | |
def accept(self, request, queryset): | |
queryset.update(is_rejected=False, flag_count=0) | |
accept.short_description = 'Accept (remove flags)' | |
actions = ['accept', 'reject'] |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment