Index: openacs-4/packages/forums/tcl/messages-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/forums/tcl/messages-procs.tcl,v diff -u -r1.1.1.1 -r1.1.1.2 --- openacs-4/packages/forums/tcl/messages-procs.tcl 29 May 2002 21:40:10 -0000 1.1.1.1 +++ openacs-4/packages/forums/tcl/messages-procs.tcl 28 Jun 2006 20:30:28 -0000 1.1.1.2 @@ -8,147 +8,338 @@ } -namespace eval forum::message { +namespace eval forum::message {} - ad_proc -public new { - {-forum_id:required} - {-message_id ""} - {-parent_id ""} - {-subject:required} - {-content:required} - {-html_p "f"} - {-user_id ""} - } { - create a new message - } { - # If no user_id is provided, we set it - # to the currently logged-in user - if {[empty_string_p $user_id]} { - set user_id [ad_conn user_id] - } +ad_proc -public forum::message::new { + {-forum_id:required} + {-message_id ""} + {-parent_id ""} + {-subject:required} + {-content:required} + {-format "text/plain"} + {-user_id ""} + -no_callback:boolean +} { + create a new message +} { + # If no user_id is provided, we set it + # to the currently logged-in user + if {[empty_string_p $user_id]} { + set user_id [ad_conn user_id] + } - # Prepare the variables for instantiation - set extra_vars [ns_set create] - oacs_util::vars_to_ns_set -ns_set $extra_vars -var_list {forum_id message_id parent_id subject content html_p user_id} + set original_message_id $message_id - db_transaction { - # Instantiate the message - set message_id [package_instantiate_object -extra_vars $extra_vars forums_message] + db_transaction { + set var_list [list \ + [list forum_id $forum_id] \ + [list message_id $message_id] \ + [list parent_id $parent_id] \ + [list subject $subject] \ + [list content $content] \ + [list format $format] \ + [list user_id $user_id]] + + set message_id [package_instantiate_object -var_list $var_list forums_message] + + get -message_id $message_id -array message + if {[info exists message(state)] && [string equal $message(state) approved]} { do_notifications -message_id $message_id } - return $message_id + if {!$no_callback_p} { + callback forum::message_new -package_id [ad_conn package_id] -message_id $message_id + } + } on_error { + + db_abort_transaction + + # Check to see if the message with a message_id matching the + # message_id arguement was in the database before calling + # this procedure. If so, the error is due to a double click + # and we should continue without returning an error. + + if {![empty_string_p $original_message_id]} { + # The was a non-null message_id arguement + if {[db_string message_exists_p { *SQL* }]} { + return $message_id + } else { + # OK - it wasn't a simple double-click, so bomb + ad_return_error \ + "OACS Internal Error" \ + "Error in forums::message::new - $errmsg" + } + } } + + return $message_id +} - ad_proc -public do_notifications { - {-message_id:required} - } { - # Select all the important information - get -message_id $message_id -array message +ad_proc -public forum::message::do_notifications { + {-message_id:required} +} { + # Select all the important information + forum::message::get -message_id $message_id -array message - set new_content "$message(user_name) ($message(user_email)) posted on [util_AnsiDatetoPrettyDate $message(posting_date)]:" - append new_content "\n\n" - append new_content $message(content) + set forum_id $message(forum_id) + set url "[ad_url][db_string select_forums_package_url {}]" - # Do the notification for the forum - notification::new -type_id [notification::type::get_type_id -short_name forums_forum_notif] \ - -object_id $message(forum_id) -response_id $message(message_id) -notif_subject $message(subject) -notif_text $new_content - - # Eventually we need notification for the root message too - # FIXME + set attachments [attachments::get_attachments -object_id $message(message_id)] + + set message_text [ad_html_text_convert -from $message(format) -to text/plain -- $message(content)] + set message_html [ad_html_text_convert -from $message(format) -to text/html -- $message(content)] + + set html_version "" + append html_version "Forum: $message(forum_name)
\n" + append html_version "Thread: $message(root_subject)
\n" + append html_version "Author: $message(user_name)
\n" + append html_version "Posted: $message(posting_date)
" + append html_version "\n
\n" + append html_version $message_html + append html_version "

" + + if {[llength $attachments] > 0} { + append html_version "Attachments: +

" + } + + set html_version $html_version + + set text_version "" + append text_version " +Forum: $message(forum_name) +Thread: $message(root_message_id) +Author: $message(user_name) +Posted: $message(posting_date) +---------------------------------- +$message_text +--------------------------------- +To post a reply to this email or view this message go to: +${url}message-view?message_id=$message(root_message_id) + +To view Forum $message(forum_name) go to: +${url}forum-view?forum_id=$message(forum_id) +" + # Do the notification for the forum + notification::new \ + -type_id [notification::type::get_type_id \ + -short_name forums_forum_notif] \ + -object_id $message(forum_id) \ + -response_id $message(message_id) \ + -notif_subject "\[$message(forum_name)\] $message(subject)" \ + -notif_text $text_version \ + -notif_html $html_version + - ad_proc -public edit { - {-message_id:required} - {-subject:required} - {-content:required} - {-html_p:required} - } { - Editing a message. There is no versioning here! - This means this function is for admins only! - } { - # do the update - db_dml update_message {} - } + # Eventually we need notification for the root message too + notification::new \ + -type_id [notification::type::get_type_id \ + -short_name forums_message_notif] \ + -object_id $message(root_message_id) \ + -response_id $message(message_id) \ + -notif_subject "\[$message(forum_name)\] $message(subject)" \ + -notif_text $text_version \ + -notif_html $html_version +} + +ad_proc -public forum::message::edit { + {-message_id:required} + {-subject:required} + {-content:required} + {-format:required} + -no_callback:boolean +} { + Editing a message. There is no versioning here! + This means this function is for admins only! +} { + # do the update + db_dml update_message {} + db_dml update_message_title {} - ad_proc -public set_html_p { - {-message_id:required} - {-html_p:required} - } { - set whether a message is HTML or not - } { - # Straight update to the DB - db_dml update_message_html_p + if {!$no_callback_p} { + callback forum::message_edit -package_id [ad_conn package_id] -message_id $message_id } +} - ad_proc -public get { - {-message_id:required} - {-array:required} - } { - get the fields for a forum - } { - # Select the info into the upvar'ed Tcl Array - upvar $array row - db_1row select_message {} -column_array row - } +ad_proc -public forum::message::set_format { + {-message_id:required} + {-format:required} +} { + set whether a message is HTML or not +} { + # Straight update to the DB + db_dml update_message_format +} - ad_proc -private set_state { - {-message_id:required} - {-state:required} - } { - Set the new state for a message - Usually used for approval - } { - # simple DB update - db_dml update_message_state {} +ad_proc -public forum::message::get { + {-message_id:required} + {-array:required} +} { + get the fields for a forum +} { + # Select the info into the upvar'ed Tcl Array + upvar $array row + + set query select_message + + if {[ad_conn isconnected] && [forum::attachments_enabled_p]} { + set query select_message_with_attachment } - ad_proc -public reject { - {-message_id:required} - } { - Reject a message - } { - set_state -message_id $message_id -state rejected + if {![db_0or1row $query {} -column_array row]} { + if {[array exists row]} { + array unset row + } + } else { + # Convert to user's date/time format + set row(posting_date_ansi) [lc_time_system_to_conn $row(posting_date_ansi)] + set row(posting_date_pretty) [lc_time_fmt $row(posting_date_ansi) "%x %X"] } +} - ad_proc -public approve { - {-message_id:required} - } { - approve a message - } { +ad_proc -private forum::message::set_state { + {-message_id:required} + {-state:required} +} { + Set the new state for a message + Usually used for approval +} { + set var_list [list \ + [list message_id $message_id] \ + [list state $state]] + package_exec_plsql -var_list $var_list forums_message set_state +} + +ad_proc -public forum::message::reject { + {-message_id:required} +} { + Reject a message +} { + set_state -message_id $message_id -state rejected +} + +ad_proc -public forum::message::approve { + {-message_id:required} +} { + approve a message +} { + db_transaction { set_state -message_id $message_id -state approved + do_notifications -message_id $message_id } +} - ad_proc -public delete { - {-message_id:required} - } { - delete a message and obviously all of its descendents - } { - db_transaction { - # Remove the notifications - notification::request::delete_all -object_id $message_id +ad_proc -public forum::message::delete { + {-message_id:required} + -no_callback:boolean +} { + delete a message and obviously all of its descendents +} { + db_transaction { + if {!$no_callback_p} { + callback forum::message_delete -package_id [ad_conn package_id] -message_id $message_id + } - # Remove the message - db_exec_plsql delete_message {} - } + # Remove the notifications + notification::request::delete_all -object_id $message_id + + # Remove the message + set var_list [list [list message_id $message_id]] + package_exec_plsql -var_list $var_list forums_message delete_thread } +} - ad_proc -public close { - {-message_id:required} - } { - close a thread - This is not exactly a cheap operation if the thread is long - } { - db_exec_plsql thread_close {} +ad_proc -public forum::message::close { + {-message_id:required} +} { + close a thread + This is not exactly a cheap operation if the thread is long +} { + db_exec_plsql thread_close {} +} + +ad_proc -public forum::message::open { + {-message_id:required} +} { + reopen a thread + This is not exactly a cheap operation if the thread is long +} { + db_exec_plsql thread_open {} +} + +ad_proc -public forum::message::get_attachments { + {-message_id:required} +} { + get the attachments for a message +} { + # If attachments aren't enabled, then we stop + if {![forum::attachments_enabled_p]} { + return [list] } - ad_proc -public open { - {-message_id:required} - } { - reopen a thread - This is not exactly a cheap operation if the thread is long - } { - db_exec_plsql thread_open {} + return [attachments::get_attachments -object_id $message_id] +} + +ad_proc -public forum::message::subject_sort_filter { + -forum_id:required + -order_by:required +} { + Return a piece of HTML for toggling the sort order of threads (subjects) + in a forum. The user can either sort by the first postings in subjects + (the creation date of the subjects) or the last one. + + @author Peter Marklund +} { + set subject_label "[_ forums.lt_First_post_in_subject]" + set child_label "[_ forums.Last_post_in_subject]" + set new_order_by [ad_decode $order_by posting_date last_child_post posting_date] + + set export_vars [ad_export_vars -override [list [list order_by $new_order_by]] {order_by forum_id}] + set toggle_url "[ad_conn url]?${export_vars}" + if { [string equal $order_by posting_date] } { + # subject selected + set subject_link "$subject_label" + set child_link "$child_label" + } else { + # child selected + set subject_link "$subject_label" + set child_link "$child_label" } + set sort_filter "$subject_link | $child_link" + + return $sort_filter } + +ad_proc -public forum::message::initial_message { + {-forum_id {}} + {-parent {}} + {-message:required} +} { + Create an array with values initialised for a new message. +} { + upvar $message init_msg + + if { [empty_string_p $forum_id] && [empty_string_p $parent] } { + return -code error [_ forums.lt_You_either_have_to] + } + + if { ![empty_string_p $parent] } { + upvar $parent parent_msg + + set init_msg(parent_id) $parent_msg(message_id) + set init_msg(forum_id) $parent_msg(forum_id) + set init_msg(subject) \ + [forum::format::reply_subject $parent_msg(subject)] + } else { + set init_msg(forum_id) $forum_id + set init_msg(parent_id) "" + } +}