Django FreeComments cleanup script
21 September 2008
This site uses the comments module provided by the Django web framework, in particular, is uses the FreeComment model to allow you to leave comments. One field I had not used so far was the "approved" field, I had simply put all the comments up on the web straight away, and just deleted the occasional spam that managed to beat the system.
Now however, I have decided to use the approved field. I will still put comments up straight away, but now I will set ones I have read to approved. Allowing me to view new comments behind the scenes.
One flaw in this plan is that I needed to set the existing comments to approved.
I could have just gone:
# Set all comments to approved
comments = FreeComment.objects.filter(approved=0)
for comment in comments:
comment.approved = 1
comment.save()
But I was not 100% sure that the odd spam was not caught, so while eating my morning porridge, I turned it into a really simple command line adventure game.
Just in case it is useful to anyone, here is it below. I actually typed the whole thing into the shell, but ipython has a lovely history command that allows you output everything you wrote.
Obviously, the LOCATION_OF_DJANGO_PROJECT needs to be set to the directory that your Django project is in, not the project directory itself.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Simple and ugly script to sort out FreeComments."""
######################
# Configure the following three variables:
URL = "http://commandline.org.uk"
LOCATION_OF_DJANGO_PROJECT = "/home/django/sites/"
CLEAR_COMMAND = "clear" # For Windows use CLS
#
#######################
import os
import sys
# Add Django project to Path
sys.path.append(LOCATION_OF_DJANGO_PROJECT)
# The following magic spell sets up the Django Environment
from django.core.management import setup_environ
from basic import settings
setup_environ(settings)
# Get the FreeComment model
from django.contrib.comments.models import FreeComment
def main():
"""Cycle through the comments, offer a simple choice."""
# Get all the unapproved comments
comments = FreeComment.objects.filter(approved=0)
os.system(CLEAR_COMMAND)
print "There are", len(comments), "comments to judge.\n"
# Go through the comments
for comment in comments:
# Show the hyperlink to the comment,
# In case you want to check it in the browser
print URL + comment.get_absolute_url()
# Comment name
print comment.person_name, "said:"
try:
# Comment text
print comment.comment
except UnicodeEncodeError:
# The world is a big place.
print "[something in unicode]"
print "\n\n"
# Now offer choice at the command line
print "Do you approve this comment?"
print "Press y for yes, d for delete, " + \
"nothing for skip, anything else to exit."
answer = raw_input()
if answer == "y":
comment.approved = 1
comment.save()
elif answer == "d":
comment.delete()
elif answer == "":
pass
else:
sys.exit()
os.system(CLEAR_COMMAND)
# Start the ball rolling.
if __name__ == '__main__':
main()
print "All done."
So pretty dumb, but publishing it here might save someone five minutes.


