read-only mode might be achieved adding at the begining of db_dml & db_exec_psql a check against a parameter that you create that allow you to perform the given proc or not, though this is might not be the best solution, has worked for us at Galileo to allow users see classes that are expired but disallowing any change on them.
Here are the lines that does that for us:
# if { [ad_conn user_id] && ![empty_string_p [dotlrn_community::get_community_id]] } {
# if { ![dotlrn::admin_p] } {
# if { [permission::permission_p -party_id [ad_conn user_id] -object_id [ad_conn package_id] -privilege admin] } {
# set segment_id [dotlrn_community::get_rel_segment_id -community_id [dotlrn_community::get_community_id] -rel_type dotlrn_admin_rel]
# } else {
# set segment_id [dotlrn_community::get_rel_segment_id -community_id [dotlrn_community::get_community_id] -rel_type dotlrn_member_rel]
# }
# if { [permission::permission_p -party_id $segment_id -object_id [ad_conn package_id] -privilege ges_view] } {
# ad_return_forbidden "Permiso denegado" "<blockquote>
# Esta clase ha expirado, la información no puede ser modificada.
# </blockquote>"
# }
# }
# }