I'm skeptical about this approach.  There may be training workflows in-flight even if classifiers exist -- maybe an instructor has re-run grading, or maybe Celery has executed the task multiple times.

The main use case for the "reschedule tasks" button is to reschedule tasks that have failed.  Since grading tasks without classifiers aren't scheduled at all, they haven't failed -- they just haven't run yet.  So I think in that case we actually want to reschedule grading tasks that DO have classifier sets (`classifier_set is not None`).

The problem (I think) is that you want to re-use this task for the "reschedule after training" story.  In that case, I think we want to iterate over *all* incomplete workflows.  For each one, if it happens to be missing a classifier, we see if one's available.  If so, we set it and schedule the workflow; otherwise, we don't schedule it.

For code re-usability, one possibility would be to add a parameter to this task (something like `update_classifiers=True`) that allows you to re-use this task for both use cases.  You may also need to update the `get_incomplete_workflows` call.