Skip to content

Instantly share code, notes, and snippets.

@jokull
Created August 6, 2009 11:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jokull/163271 to your computer and use it in GitHub Desktop.
Save jokull/163271 to your computer and use it in GitHub Desktop.
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