it's not overly complex, actually. i was surprised no one had done it before when i realized that.
you basically reverse the functionality of the func_movewalls and func_rotate_door.
drop the func_rotate_door into an endless loop and then set movewalls to use a touch function that sends the player's velocity to the rotate_door. from there, use dot product to figure out how fast to move based on angle of door.
there might be a smarter way to do this actually. calling the rotation code directly from the touch function for the first time or something instead of just leaving the door looping all the time, even if it's not moving.
for monsters, it's a little trickier. they will never proc a touch function on a solid_bsp like movewalls because movetogoal and walkmove will detect if it *would* hit, and just not let it.
luckily, the rotate_object has a nice bounding box sized to cover the entire area that it will rotate (i think that's done automatically by qbsp?).
so you give a touch function for the rotate_object and then use this math:
http://mathforum.org/library/drmath/view/54823.html to figure out if the monster is 'touching' the door or not. from there, it's a simple matter of deciding which way to push the door based on monster position.