def register(model, import_unmoderated=False, auto_moderator=None, long_desc=None, manager_name='objects', status_name='moderation_status', flagged_name='flagged', moderation_object_name='moderation_object', base_manager=None): if not model in registered_models: signals.post_save.connect(save_handler, sender=model) signals.pre_delete.connect(delete_handler, sender=model) # pass extra params onto add_fields to define what fields are named add_fields(model, manager_name, status_name, flagged_name, moderation_object_name, base_manager) registered_models[model] = { 'auto_moderator': auto_moderator, 'long_desc': long_desc or _default_long_desc, } if import_unmoderated: try: mod_obj_ids = model.objects.all().values_list('pk', flat=True) unmod_objs = model._base_manager.exclude(pk__in=mod_obj_ids) print 'importing %s unmoderated objects...' % unmod_objs.count() for obj in unmod_objs: mo = ModeratedObject( moderation_status=DEFAULT_STATUS, content_object=obj, timestamp=datetime.datetime.now()) mo.save() except: pass
def save_handler(sender, instance, **kwargs): if kwargs.get('created', None): mo = ModeratedObject( moderation_status=DEFAULT_STATUS, content_object=instance, timestamp=datetime.datetime.now()) mo.save() # do automoderation auto_moderator = registered_models[instance.__class__]['auto_moderator'] if auto_moderator: mod = auto_moderator(mo) if mod is None: pass # ignore the moderator if it returns None elif mod: mo.approve(_get_automod_user()) else: mo.reject(_get_automod_user()) # do old-style automoderation if automoderator did nothing if ENABLE_AUTOMODERATION and mo.moderation_status == PENDING_STATUS: user = get_current_user() if user and user.has_perm('gatekeeper.change_moderatedobject'): mo.approve(user) if MODERATOR_LIST: from django.contrib.sites.models import Site domain = Site.objects.get(id=settings.SITE_ID).domain status = mo.get_moderation_status_display() instance_class = instance.__class__.__name__ long_desc = registered_models[instance.__class__]['long_desc'] # message message = _long_desc(instance, long_desc) if status == 'Pending': message += "\n\nTo moderate, go to http://%s/admin/gatekeeper/moderatedobject/?ot=desc&o=2" % (message, domain) # subject key = "%s:%s" % (instance_class, status) if mo.moderation_status_by and mo.moderation_status_by.username == 'gatekeeper_automod': key = "%s:auto" % key subject = "[%s] New gatekeeper object on %s" % (key, domain) # sender from_addr = settings.DEFAULT_FROM_EMAIL send_mail(subject, message, from_addr, MODERATOR_LIST, fail_silently=True)