I'm not sure about this double validation - there is check_role_valid() call and also there is validation inside the model.
I don't know if can be done better (in the time we have), but at least I'd put a FIXME note here to fix it in the future.