I guess that'd be fine. My feeling about the tasks.py module is that it's there to contain celery tasks that get called like `task.delay()`. Other modules then import them and call them as appropriate. It seems like this is what this code is doing, it's just being imported into the admin module instead of living there.

I do like your compromise I think. Just have a function here for creating a new subtask from the old task, and wrap that in the admin stuff in the admin module.