Index: openacs-4/packages/assessment/lib/assessment.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/assessment/lib/assessment.tcl,v diff -u -N -r1.22 -r1.23 --- openacs-4/packages/assessment/lib/assessment.tcl 21 Jan 2008 20:25:35 -0000 1.22 +++ openacs-4/packages/assessment/lib/assessment.tcl 2 Sep 2008 16:35:29 -0000 1.23 @@ -338,11 +338,6 @@ foreach one_item $item_list { util_unlist $one_item as_item_id name title description subtext required_p max_time_to_complete content_rev_id content_filename content_type as_item_type_id validate_block question_text - if {$required_p == "t"} { - # make sure that mandatory items are answered - lappend validate_list "response_to_item.$as_item_id {\[exists_and_not_null response_to_item($as_item_id)\]} \"\[_ assessment.form_element_required\]\"" - incr required_count - } foreach {check_expr check_message} [split $validate_block \n] { regsub -all {%answer%} $check_expr \$response_to_item($as_item_id) check_expr @@ -358,7 +353,16 @@ set default_value [as::item_data::get -subject_id $user_id -as_item_id $as_item_id] } set presentation_type [as::item_form::add_item_to_form -name show_item_form -session_id $session_id -section_id $section_id -item_id $as_item_id -default_value $default_value -required_p $required_p -random_p $assessment_data(random_p)] - + if {$required_p == "t"} { + # make sure that mandatory items are answered + if {[lsearch {rbo sbo cbo} $presentation_type] > -1} { + lappend validate_list "response_to_item.$as_item_id {\$\{response_to_item.$as_item_id\} ne \"\" || \[ns_queryget response_to_item.${as_item_id}\.text\] ne \"\"} \"\[_ assessment.form_element_required\]\"" + } else { + lappend validate_list "response_to_item.$as_item_id {\[exists_and_not_null response_to_item($as_item_id)\]} \"\[_ assessment.form_element_required\]\"" + } + incr required_count + } + } else { # submit each item seperately set default_value [as::item_data::get -subject_id $user_id -as_item_id $as_item_id -session_id $session_id] @@ -385,6 +389,15 @@ {item_id:text(hidden) {value $as_item_id}} } set presentation_type [as::item_form::add_item_to_form -name show_item_form_$as_item_id -session_id $session_id -section_id $section_id -item_id $as_item_id -default_value $default_value -required_p $required_p] + if {$required_p == "t"} { + # make sure that mandatory items are answered + if {[lsearch {rbo sbo cbo} $presentation_type] > -1} { + lappend validate_list "response_to_item.$as_item_id {\[exists_and_not_null response_to_item($as_item_id)\] || \[exists_and_not_null response_to_item($as_item_id)\.text\]} \"\[_ assessment.form_element_required\]\"" + } else { + lappend validate_list "response_to_item.$as_item_id {\[exists_and_not_null response_to_item($as_item_id)\]} \"\[_ assessment.form_element_required\]\"" + } + incr required_count + } # process single submit set on_submit "{ @@ -472,7 +485,6 @@ db_transaction { \# check if we already submitted this section! if {\[db_string count_submitted_session \"select count(*) from as_section_data where session_id = :session_id and section_id = :section_id and completed_datetime is not null\" -default 0\] == 0} { -\# ad_return_complaint 1 \"Double click detected\" db_dml session_updated {} # save answers @@ -500,7 +512,11 @@ as::item_type_\$item_type\\::process -type_id \$item_type_id -session_id \$session_id -as_item_id \$response_item_id -section_id \$section_id -subject_id \$user_id -response \$response -max_points \$points -allow_overwrite_p \$display(back_button_p) -package_id \$assessment_package_id } - } + as::session::update_elapsed_time -session_id $session_id -section_id $section_id + set message \"\" + } else { + set message \"\#assessment.Section_previously_submitted\#\" + } if {\$section_order != \$new_section_order} { # calculate section points at end of section as::section::calculate -section_id \$section_id -assessment_id \$assessment_rev_id -session_id \$session_id @@ -529,7 +545,7 @@ } set item_order \$new_item_order \# ad_returnredirect \[export_vars -base assessment {assessment_id session_id section_order item_order password return_url next_asm section_id item_id_list:multiple single_section_id}\] - ad_returnredirect \[export_vars -base feedback {assessment_id session_id section_order item_order password return_url next_asm section_id item_id_list:multiple next_url total_pages current_page}\] + ad_returnredirect -message \$message \[export_vars -base feedback {assessment_id session_id section_order item_order password return_url next_asm section_id item_id_list:multiple next_url total_pages current_page}\] ad_script_abort } else { # calculate session points at end of session @@ -544,7 +560,7 @@ } else { set return_url \$assessment_data(return_url) } - ad_returnredirect \[export_vars -base feedback {assessment_id session_id section_id return_url {return_p 1} item_id_list:multiple total_pages current_page}\] + ad_returnredirect -message \$message \[export_vars -base feedback {assessment_id session_id section_id return_url {return_p 1} item_id_list:multiple total_pages current_page}\] ad_script_abort } }" Index: openacs-4/packages/assessment/tcl/as-assessment-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/assessment/tcl/as-assessment-procs.tcl,v diff -u -N -r1.34 -r1.35 --- openacs-4/packages/assessment/tcl/as-assessment-procs.tcl 15 May 2007 20:14:16 -0000 1.34 +++ openacs-4/packages/assessment/tcl/as-assessment-procs.tcl 2 Sep 2008 16:35:29 -0000 1.35 @@ -175,7 +175,7 @@ } { upvar assessment_data assessment_data - if {[empty_string_p $assessment_id]} { + if {$assessment_id eq ""} { db_1row lookup_assessment_id "" } @@ -475,6 +475,32 @@ return $time } +ad_proc as::assessment::pretty_time_hours_minutes { + {-seconds} +} { + @author Timo Hentschel (timo@timohentschel.de) + @creation-date 2004-12-14 + + Returns a pretty string of min:sec +} { + if {$seconds eq "0" || $seconds eq ""} { + return $seconds + } + set time "" + if {![empty_string_p $seconds]} { + set time_hour [expr {$seconds / 3600}] + set seconds [expr {$seconds - ($time_hour * 3600)}] + + set time_min [expr {$seconds / 60}] + set time_sec [expr {$seconds - ($time_min * 60)}] + if {$time_hour > 0} { + append time "$time_hour \#acs-templating.hours\#" + } + append time " $time_min \#acs-templating.minutes\#" + } + return $time +} + ad_proc as::assessment::folder_id { -package_id:required } { Index: openacs-4/packages/assessment/tcl/as-session-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/assessment/tcl/as-session-procs.tcl,v diff -u -N -r1.10 -r1.11 --- openacs-4/packages/assessment/tcl/as-session-procs.tcl 29 Aug 2008 19:03:52 -0000 1.10 +++ openacs-4/packages/assessment/tcl/as-session-procs.tcl 2 Sep 2008 16:35:29 -0000 1.11 @@ -134,7 +134,55 @@ return [db_string unfinished_session_id {} -default ""] } +ad_proc -private as::session::update_elapsed_time { + -session_id + -section_id +} { + Update the total elapsed time in seconds for a session + based on how long the user took to submit the specified section + @author Dave Bauer (dave@solutiongrove.com) + + @param session_id + @param section_id + +} { + set last_viewed "" + set last_mod_datetime "" + db_0or1row get_last_viewed "select to_char(last_viewed,'YYYY-MM-DD HH24:MI:SS') as last_viewed, to_char(last_mod_datetime, 'YYYY-MM-DD HH24:MI:SS') as last_mod_datetime from views_views, as_sessions where subject_id = viewer_id and session_id = :session_id and object_id = :section_id" + + if {$last_viewed eq ""} { + if {$last_mod_datetime ne ""} { + set last_viewed $last_mod_datetime + } else { + set elapsed_seconds 600 + } + } + + if {$last_viewed ne ""} { + set last_seconds [clock scan $last_viewed] + set last_mod_seconds [clock scan $last_mod_datetime] + set current_seconds [clock seconds] + set elapsed_seconds [expr {$current_seconds - $last_seconds}] + set elapsed_mod_seconds [expr {$current_seconds - $last_mod_seconds}] + + if { $elapsed_mod_seconds < 600} { + set elapsed_seconds $elapsed_mod_seconds + } + + if { $elapsed_seconds > 600} { + set elapsed_seconds 600 + } + + } + + db_dml update_elapsed_time "update as_sessions set elapsed_seconds = coalesce(elapsed_seconds,0) + :elapsed_seconds where session_id = :session_id" + as::session::call_update_callback \ + -session_id $session_id + return $elapsed_seconds +} + + ad_proc as::session::response_as_email { -session_id {-mime_type "text/html"}