My take on it was that it should go with the other task-related code. The fact that it's invoked from the admin seemed less significant.  

We could compromise - have a small action method in admin.py that calls a function in tasks.py to do the work.