Generalize bulk_operations logic

LMS-11366

@nasthagiri @cpennington please review
This should probably set `dirty` to `False`, right?