Index: openacs-4/packages/assessment/catalog/assessment.en_US.ISO-8859-1.xml =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/assessment/catalog/assessment.en_US.ISO-8859-1.xml,v diff -u -r1.16 -r1.17 --- openacs-4/packages/assessment/catalog/assessment.en_US.ISO-8859-1.xml 21 Dec 2004 09:58:18 -0000 1.16 +++ openacs-4/packages/assessment/catalog/assessment.en_US.ISO-8859-1.xml 24 Dec 2004 15:32:38 -0000 1.17 @@ -206,6 +206,7 @@ No Immediate retry allowed None + not yet reviewed Total Number of displayed Choices If this number is smaller than the number of added choices, choices will be picked randomly. Number of displayed Correct Choices Index: openacs-4/packages/assessment/lib/section-items.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/assessment/lib/section-items.tcl,v diff -u -r1.3 -r1.4 --- openacs-4/packages/assessment/lib/section-items.tcl 22 Dec 2004 20:52:17 -0000 1.3 +++ openacs-4/packages/assessment/lib/section-items.tcl 24 Dec 2004 15:32:38 -0000 1.4 @@ -3,7 +3,7 @@ } db_multirow -extend { presentation_type html } items section_items {} { - set presentation_type [as::item_form::add_item_to_form admin_section "" $section_id $as_item_id] + set presentation_type [as::item_form::add_item_to_form -name admin_section -section_id $section_id -item_id $as_item_id] if {$presentation_type == "fitb"} { regsub -all -line -nocase -- { + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
@items.name@:#assessment.Question# @items.rownum@:
+@items.result_points@ / @items.points@ #assessment.points# +#assessment.not_yet_reviewed# + + (#assessment.max_time# @items.max_time_to_complete@) +
+
+ @items.title;noquote@
+ + + @formgroup.widget;noquote@ @formgroup.label;noquote@
+
+
+ + @items.html;noquote@ + + + + + +
+ [i] + @items.subtext@ +
+
+
+
+ Index: openacs-4/packages/assessment/lib/session-items.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/assessment/lib/session-items.tcl,v diff -u --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ openacs-4/packages/assessment/lib/session-items.tcl 24 Dec 2004 15:32:38 -0000 1.1 @@ -0,0 +1,24 @@ +ad_form -name session_results_$section_id -mode display -form { + {section_id:text(hidden) {value $section_id}} +} + +# todo: display feedback text +db_multirow -extend { presentation_type html result_points } items session_items {} { + set default_value [as::item_data::get -subject_id $subject_id -as_item_id $as_item_id -session_id $session_id] + + ns_log notice "\#\#\# $default_value" + + set presentation_type [as::item_form::add_item_to_form -name session_results_$section_id -section_id $section_id -item_id $as_item_id -session_id $session_id -default_value $default_value] + + if {$presentation_type == "fitb"} { + regsub -all -line -nocase -- { + + + + + + select i.as_item_id, i.subtext, cr.title, ci.name, ism.required_p, + ism.section_id, ism.sort_order, + ism.max_time_to_complete, ism.points + from as_items i, cr_revisions cr, cr_items ci, as_item_section_map ism, + as_session_items si + where ci.item_id = cr.item_id + and cr.revision_id = i.as_item_id + and i.as_item_id = ism.as_item_id + and ism.section_id = si.section_id + and ism.as_item_id = si.as_item_id + and si.section_id = :section_id + and si.session_id = :session_id + order by si.sort_order + + + + + + Index: openacs-4/packages/assessment/tcl/as-item-data-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/assessment/tcl/as-item-data-procs.tcl,v diff -u -r1.4 -r1.5 --- openacs-4/packages/assessment/tcl/as-item-data-procs.tcl 20 Dec 2004 13:49:24 -0000 1.4 +++ openacs-4/packages/assessment/tcl/as-item-data-procs.tcl 24 Dec 2004 15:32:38 -0000 1.5 @@ -58,3 +58,28 @@ return $as_item_data_id } + +ad_proc -public as::item_data::get { + {-subject_id:required} + {-as_item_id:required} + {-session_id ""} +} { + @author Timo Hentschel (timo@timohentschel.de) + @creation-date 2004-12-24 + + Get as_item_data from the database +} { + if {[empty_string_p $session_id]} { + db_1row last_session {} + } + + if {![empty_string_p $session_id] && [db_0or1row response {} -column_array response]} { + # response found in session + set item_data_id $response(item_data_id) + set response(choice_answer) [db_list mc_response {}] + return [array get response] + } else { + # no response given in that session + return "" + } +} Index: openacs-4/packages/assessment/tcl/as-item-data-procs.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/assessment/tcl/as-item-data-procs.xql,v diff -u -r1.2 -r1.3 --- openacs-4/packages/assessment/tcl/as-item-data-procs.xql 20 Dec 2004 13:47:50 -0000 1.2 +++ openacs-4/packages/assessment/tcl/as-item-data-procs.xql 24 Dec 2004 15:32:38 -0000 1.3 @@ -10,4 +10,39 @@ + + + + select max(session_id) as session_id + from as_item_data + where subject_id = :subject_id + and as_item_id = :as_item_id + + + + + + + + select item_data_id, boolean_answer, clob_answer, numeric_answer, + integer_answer, text_answer, timestamp_answer, content_answer, + points + from as_item_data + where session_id = :session_id + and subject_id = :subject_id + and as_item_id = :as_item_id + + + + + + + + select choice_id + from as_item_data_choices + where item_data_id = :item_data_id + + + + Index: openacs-4/packages/assessment/tcl/as-item-display-cb-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/assessment/tcl/as-item-display-cb-procs.tcl,v diff -u -r1.5 -r1.6 --- openacs-4/packages/assessment/tcl/as-item-display-cb-procs.tcl 10 Dec 2004 20:21:50 -0000 1.5 +++ openacs-4/packages/assessment/tcl/as-item-display-cb-procs.tcl 24 Dec 2004 15:32:38 -0000 1.6 @@ -116,10 +116,10 @@ # numerical alphabetical randomized order_of_entry switch -exact $sort_order_type { numerical { - set data [lsort -real -index 1 $data] + set data [lsort -real -index 0 $data] } alphabetical { - set data [lsort -dictionary -index 1 $data] + set data [lsort -dictionary -index 0 $data] } randomized { set data [util::randomize_list $data] Index: openacs-4/packages/assessment/tcl/as-item-display-rb-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/assessment/tcl/as-item-display-rb-procs.tcl,v diff -u -r1.5 -r1.6 --- openacs-4/packages/assessment/tcl/as-item-display-rb-procs.tcl 10 Dec 2004 20:21:50 -0000 1.5 +++ openacs-4/packages/assessment/tcl/as-item-display-rb-procs.tcl 24 Dec 2004 15:32:38 -0000 1.6 @@ -116,10 +116,10 @@ # numerical alphabetical randomized order_of_entry switch -exact $sort_order_type { numerical { - set data [lsort -real -index 1 $data] + set data [lsort -real -index 0 $data] } alphabetical { - set data [lsort -dictionary -index 1 $data] + set data [lsort -dictionary -index 0 $data] } randomized { set data [util::randomize_list $data] Index: openacs-4/packages/assessment/tcl/as-item-display-sb-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/assessment/tcl/as-item-display-sb-procs.tcl,v diff -u -r1.2 -r1.3 --- openacs-4/packages/assessment/tcl/as-item-display-sb-procs.tcl 10 Dec 2004 20:21:50 -0000 1.2 +++ openacs-4/packages/assessment/tcl/as-item-display-sb-procs.tcl 24 Dec 2004 15:32:38 -0000 1.3 @@ -120,10 +120,10 @@ # numerical alphabetical randomized order_of_entry switch -exact $sort_order_type { numerical { - set data [lsort -real -index 1 $data] + set data [lsort -real -index 0 $data] } alphabetical { - set data [lsort -dictionary -index 1 $data] + set data [lsort -dictionary -index 0 $data] } randomized { set data [util::randomize_list $data] Index: openacs-4/packages/assessment/tcl/as-item-form-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/assessment/tcl/as-item-form-procs.tcl,v diff -u -r1.10 -r1.11 --- openacs-4/packages/assessment/tcl/as-item-form-procs.tcl 22 Dec 2004 20:52:17 -0000 1.10 +++ openacs-4/packages/assessment/tcl/as-item-form-procs.tcl 24 Dec 2004 15:32:38 -0000 1.11 @@ -7,10 +7,11 @@ namespace eval as::item_form {} ad_proc -public as::item_form::add_item_to_form { - form - session_id - section_id - item_id + -name:required + -section_id:required + -item_id:required + {-session_id ""} + {-default_value ""} } { @author Timo Hentschel (timo@timohentschel.de) @modified-date 2004-12-10 @@ -23,10 +24,10 @@ set item_type [string range $item_type end-1 end] set display_type [string range $display_type end-1 end] - util_unlist [as::item_type_$item_type\::render -type_id $item_type_id -session_id $session_id -section_id $section_id -as_item_id $item_id] default_value data + util_unlist [as::item_type_$item_type\::render -type_id $item_type_id -session_id $session_id -section_id $section_id -as_item_id $item_id -default_value $default_value] default_value data as::item_display_$display_type\::render \ - -form $form \ + -form $name \ -element $element_name \ -type_id $display_type_id \ -datatype $data_type \ Index: openacs-4/packages/assessment/tcl/as-item-type-mc-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/assessment/tcl/as-item-type-mc-procs.tcl,v diff -u -r1.8 -r1.9 --- openacs-4/packages/assessment/tcl/as-item-type-mc-procs.tcl 22 Dec 2004 20:52:17 -0000 1.8 +++ openacs-4/packages/assessment/tcl/as-item-type-mc-procs.tcl 24 Dec 2004 15:32:38 -0000 1.9 @@ -134,7 +134,6 @@ -type_id:required -section_id:required -as_item_id:required - -default_provided:boolean {-default_value ""} {-session_id ""} } { @@ -143,6 +142,19 @@ Render a Multiple Choice Type } { + if {![empty_string_p $default_value]} { + array set values $default_value + set defaults $values(choice_answer) + } + + if {![empty_string_p $session_id]} { + set choice_list [db_list_of_lists get_sorted_choices {}] + + if {[llength $choice_list] > 0} { + return [list $defaults $choice_list] + } + } + db_1row item_type_data {} set defaults "" @@ -163,18 +175,6 @@ } } - if {$default_provided_p} { - set defaults $default_value - } - - if {![empty_string_p $session_id]} { - set choice_list [db_list get_sorted_choices {}] - - if {[llength $choice_list] > 0} { - return [list $defaults $choice_list] - } - } - if {![empty_string_p $num_answers] && $num_answers < $total} { # display fewer choices, select random set correct_choices [util::randomize_list $correct_choices] Index: openacs-4/packages/assessment/tcl/as-item-type-mc-procs.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/assessment/tcl/as-item-type-mc-procs.xql,v diff -u -r1.5 -r1.6 --- openacs-4/packages/assessment/tcl/as-item-type-mc-procs.xql 22 Dec 2004 20:52:17 -0000 1.5 +++ openacs-4/packages/assessment/tcl/as-item-type-mc-procs.xql 24 Dec 2004 15:32:38 -0000 1.6 @@ -55,6 +55,19 @@ + + + + select r.title, c.choice_id + from as_session_choices c, cr_revisions r + where c.session_id = :session_id + and c.section_id = :section_id + and c.as_item_id = :as_item_id + and r.revision_id = c.choice_id + + + + @@ -77,19 +90,6 @@ - - - - select r.title, c.choice_id - from as_session_choices c, cr_revisions r - where c.session_id = :session_id - and c.section_id = :section_id - and c.as_item_id = :as_item_id - and r.revision_id = c.choice_id - - - - Index: openacs-4/packages/assessment/tcl/as-item-type-oq-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/assessment/tcl/as-item-type-oq-procs.tcl,v diff -u -r1.7 -r1.8 --- openacs-4/packages/assessment/tcl/as-item-type-oq-procs.tcl 22 Dec 2004 20:52:17 -0000 1.7 +++ openacs-4/packages/assessment/tcl/as-item-type-oq-procs.tcl 24 Dec 2004 15:32:38 -0000 1.8 @@ -85,7 +85,6 @@ -type_id:required -section_id:required -as_item_id:required - -default_provided:boolean {-default_value ""} {-session_id ""} } { @@ -96,7 +95,14 @@ } { db_1row item_type_data {} - return [list $default_value ""] + if {![empty_string_p $default_value]} { + array set values $default_value + set default $values(clob_answer) + } else { + set default "" + } + + return [list $default ""] } ad_proc -public as::item_type_oq::process { Index: openacs-4/packages/assessment/tcl/as-item-type-sa-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/assessment/tcl/as-item-type-sa-procs.tcl,v diff -u -r1.7 -r1.8 --- openacs-4/packages/assessment/tcl/as-item-type-sa-procs.tcl 22 Dec 2004 20:52:17 -0000 1.7 +++ openacs-4/packages/assessment/tcl/as-item-type-sa-procs.tcl 24 Dec 2004 15:32:38 -0000 1.8 @@ -85,7 +85,6 @@ -type_id:required -section_id:required -as_item_id:required - -default_provided:boolean {-default_value ""} {-session_id ""} } { Index: openacs-4/packages/assessment/tcl/as-qti-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/assessment/tcl/as-qti-procs.tcl,v diff -u -r1.14 -r1.15 --- openacs-4/packages/assessment/tcl/as-qti-procs.tcl 16 Dec 2004 09:27:17 -0000 1.14 +++ openacs-4/packages/assessment/tcl/as-qti-procs.tcl 24 Dec 2004 15:32:38 -0000 1.15 @@ -118,220 +118,226 @@ } ad_proc -private as::qti::parse_item {qtiNode section_id basepath} { Parse items from a XML QTI file } { - set as_item_section_map__sort_order 0 - #get all elements - set itemNodes [$qtiNode selectNodes {item}] - foreach item $itemNodes { - # Order of the item_choices - set sort_order 0 - set as_items__title [$item getAttribute {title} {Item}] - array set as_item_choices__correct_answer_p {} - array set as_item_choices__score {} - set as_items__feedback_right {} - set as_items__feedback_wrong {} - set as_items__description {} - # - set objectivesNodes [$item selectNodes {objectives}] - foreach objectives $objectivesNodes { - set mattextNodes [$objectives selectNodes {material/mattext/text()}] - foreach mattext $mattextNodes { - set as_items__description [$mattext nodeValue] + set as_item_section_map__sort_order 0 + #get all elements + set itemNodes [$qtiNode selectNodes {item}] + foreach item $itemNodes { + # Order of the item_choices + set sort_order 0 + set as_items__title [$item getAttribute {title} {Item}] + array set as_item_choices__correct_answer_p {} + array set as_item_choices__score {} + set as_items__feedback_right {} + set as_items__feedback_wrong {} + set as_items__description {} + # + set objectivesNodes [$item selectNodes {objectives}] + foreach objectives $objectivesNodes { + set mattextNodes [$objectives selectNodes {material/mattext/text()}] + foreach mattext $mattextNodes { + set as_items__description [$mattext nodeValue] + } + } + + # + set resprocessingNodes [$item selectNodes {resprocessing}] + foreach resprocessing $resprocessingNodes { + # + set respconditionNodes [$resprocessing selectNodes {respcondition}] + foreach respcondition $respconditionNodes { + set title [$respcondition getAttribute {title} {Correct}] + if {$title == {Correct}} { + # get the correct answer + set correctNodes [$respcondition selectNodes {conditionvar/and/varequal/text()}] + foreach correct $correctNodes { + set as_item_choices__correct_answer_p([string trim [$correct nodeValue]]) {t} + } + } + if {$title == {adjustscore}} { + set choice {} + set score {} + set scoreNodes [$respcondition selectNodes {conditionvar/varequal/text()}] + foreach correct $scoreNodes { + set choice [string trim [$correct nodeValue]] + } + # get score + set scoreNodes [$respcondition selectNodes {setvar[@varname='SCORE']/text()}] + foreach scorenode $scoreNodes { + set score [string trim [$scorenode nodeValue]] + } + set as_item_choices__score($choice) $score + } + # + set displayfeedbackNodes [$respcondition selectNodes {displayfeedback}] + if {[llength $displayfeedbackNodes]>0} { + set displayfeedbackelement [lindex $displayfeedbackNodes 0] + set displayfeedback__ident [$displayfeedbackelement getAttribute {linkrefid}] + # + set itemfeedbackNodes [$item selectNodes {itemfeedback}] + foreach itemfeedback $itemfeedbackNodes { + # wrong feedback + if {[string compare [$itemfeedback getAttribute {ident}] $displayfeedback__ident] == 0} { + set feedback_textNodes [$itemfeedback selectNodes {.//mattext/text()}] + set as_items__feedback_wrong [[lindex $feedback_textNodes 0] nodeValue] + # right feedback + } else { + set feedback_textNodes [$itemfeedback selectNodes {.//mattext/text()}] + set as_items__feedback_right [[lindex $feedback_textNodes 0] nodeValue] } + } } + } + } - # - set resprocessingNodes [$item selectNodes {resprocessing}] - foreach resprocessing $resprocessingNodes { - # - set respconditionNodes [$resprocessing selectNodes {respcondition}] - foreach respcondition $respconditionNodes { - set title [$respcondition getAttribute {title} {Correct}] - if {$title == {Correct}} { - # get the correct answer - set correctNodes [$respcondition selectNodes {conditionvar/and/varequal/text()}] - foreach correct $correctNodes { - set as_item_choices__correct_answer_p([string trim [$correct nodeValue]]) {t} - } - } - if {$title == {adjustscore}} { - set choice {} - set score {} - set scoreNodes [$respcondition selectNodes {conditionvar/varequal/text()}] - foreach correct $scoreNodes { - set choice [string trim [$correct nodeValue]] - } - # get score - set scoreNodes [$respcondition selectNodes {setvar[@varname='SCORE']/text()}] - foreach scorenode $scoreNodes { - set score [string trim [$scorenode nodeValue]] - } - set as_item_choices__score($choice) $score - } - # - set displayfeedbackNodes [$respcondition selectNodes {displayfeedback}] - if {[llength $displayfeedbackNodes]>0} { - set displayfeedbackelement [lindex $displayfeedbackNodes 0] - set displayfeedback__ident [$displayfeedbackelement getAttribute {linkrefid}] - # - set itemfeedbackNodes [$item selectNodes {itemfeedback}] - foreach itemfeedback $itemfeedbackNodes { - # wrong feedback - if {[string compare [$itemfeedback getAttribute {ident}] $displayfeedback__ident] == 0} { - set feedback_textNodes [$itemfeedback selectNodes {.//mattext/text()}] - set as_items__feedback_wrong [[lindex $feedback_textNodes 0] nodeValue] - # right feedback - } else { - set feedback_textNodes [$itemfeedback selectNodes {.//mattext/text()}] - set as_items__feedback_right [[lindex $feedback_textNodes 0] nodeValue] - } - } - } + # element + set presentationNodes [$item selectNodes {presentation}] + foreach presentation $presentationNodes { + # or or (some presentation's children) + set presentationChildNodes [$presentation selectNodes {.//material|.//response_str|.//response_num}] + # + set materialNodes [$presentation selectNodes {.//material}] + set material [lindex $materialNodes 0] + # Initialize in case it doesn't exist + set as_items__title {} + if {[$material nodeName] == {material}} { + set mattextNodes [$material selectNodes {mattext/text()}] + set mattext [lindex $mattextNodes 0] + set as_items__title [$mattext nodeValue] + } + # + set render_fibNodes [$presentation selectNodes {.//render_fib}] + if {[llength $render_fibNodes] > 0} { + set as_items__title {} + # fillinblank or shortanswer + set render_fib [lindex $render_fibNodes 0] + # fillinblank (textbox) + # this is the default + set as_item_display_id {} + #if render_fib element has the attribute rows then we suppose it's a shortanswer item + if {[$render_fib hasAttribute {rows}]} { + # shortanswer (textarea) + set rows [$render_fib getAttribute {rows} {15}] + set cols [$render_fib getAttribute {columns} {55}] + # we need the size of textarea (values of rows and cols) + set html "rows $rows cols $cols" + # insert as_item_display_ta in the CR (and in the as_item_display_ta table) getting the revision_id (item_display_id) + set as_item_display_id [as::item_display_ta::new -html_display_options $html] + foreach node $presentationChildNodes { + # get the title of item + if {[$node nodeName] == {material}} { + set mattextNodes [$node selectNodes {mattext/text()}] + foreach mattext $mattextNodes { + append as_items__title [ad_quotehtml [$mattext nodeValue]] + append as_items__title " " + } } - } - # element - set presentationNodes [$item selectNodes {presentation}] - foreach presentation $presentationNodes { - # or or (some presentation's children) - set presentationChildNodes [$presentation selectNodes {.//material|.//response_str|.//response_num}] - # - set materialNodes [$presentation selectNodes {.//material}] - set material [lindex $materialNodes 0] - # Initialize in case it doesn't exist - set as_items__title {} - if {[$material nodeName] == {material}} { - set mattextNodes [$material selectNodes {mattext/text()}] - set mattext [lindex $mattextNodes 0] - set as_items__title [$mattext nodeValue] + } + # insert as_item_type_oq (shortanswer) + set as_item_type_id [as::item_type_oq::new] + # if render_fib element has not the attribute rows then it's a fill in blank item + } else { + # textbox + set as_item_display_id [as::item_display_tb::new] + + # multiple choice + set as_item_type_id [as::item_type_mc::new] + + foreach node $presentationChildNodes { + if {[$node nodeName] == {material}} { + set mattextNodes [$node selectNodes {mattext/text()}] + foreach mattext $mattextNodes { + append as_items__title [ad_quotehtml [$mattext nodeValue]] + append as_items__title " " + } + } elseif {[$node nodeName] == {response_str} || [$node nodeName] == {response_num} } { + set as_item_choices__ident [$node getAttribute {ident}] + # get the correct response + set as_item_choices__choice_text_nodes [$node selectNodes "//conditionvar/or/varequal\[@respident='$as_item_choices__ident'\]/text()"] + set as_item_choices__choice_text {} + # get the title of each choice + foreach respident $as_item_choices__choice_text_nodes { + lappend as_item_choices__choice_text [string trim [$respident nodeValue]] + } + # Insert as_item_choice + set as_item_choice_id [as::item_choice::new -mc_id $as_item_type_id -title $as_item_choices__choice_text -sort_order $sort_order] + # order of the item_choices + incr sort_order + append as_items__title " " } - # - set render_fibNodes [$presentation selectNodes {.//render_fib}] - if {[llength $render_fibNodes] > 0} { - set as_items__title {} - # fillinblank or shortanswer - set render_fib [lindex $render_fibNodes 0] - # fillinblank (textbox) - # this is the default - set as_item_display_id {} - #if render_fib element has the attribute rows then we suppose it's a shortanswer item - if {[$render_fib hasAttribute {rows}]} { - # shortanswer (textarea) - set rows [$render_fib getAttribute {rows} {15}] - set cols [$render_fib getAttribute {columns} {55}] - # we need the size of textarea (values of rows and cols) - set html "rows $rows cols $cols" - # insert as_item_display_ta in the CR (and in the as_item_display_ta table) getting the revision_id (item_display_id) - set as_item_display_id [as::item_display_ta::new -html_display_options $html] - foreach node $presentationChildNodes { - # get the title of item - if {[$node nodeName] == {material}} { - set mattextNodes [$node selectNodes {mattext/text()}] - foreach mattext $mattextNodes { - append as_items__title [ad_quotehtml [$mattext nodeValue]] - append as_items__title " " - } - } - } - # insert as_item_type_oq (shortanswer) in the CR (and in the as_item_type_oq table) getting the revision_id (item_type_id) - set as_item_type_id [as::item_type_oq::new] - # if render_fib element has not the attribute rows then it's a fill in blank item - } else { - # insert as_item_display_tb in the CR (and in the as_item_display_tb table) getting the revision_id (item_display_id) - set as_item_display_id [as::item_display_tb::new] - # insert as_item_type_mc (multiple choice and multiple response) in the CR (and in the as_item_type_mc table) getting the revision_id (item_type_id) - set as_item_type_id [as::item_type_mc::new] - foreach node $presentationChildNodes { - if {[$node nodeName] == {material}} { - set mattextNodes [$node selectNodes {mattext/text()}] - foreach mattext $mattextNodes { - append as_items__title [ad_quotehtml [$mattext nodeValue]] - append as_items__title " " - } - } elseif {[$node nodeName] == {response_str} || [$node nodeName] == {response_num} } { - set as_item_choices__ident [$node getAttribute {ident}] - # get the correct response - set as_item_choices__choice_text_nodes [$node selectNodes "//conditionvar/or/varequal\[@respident='$as_item_choices__ident'\]/text()"] - set as_item_choices__choice_text {} - # get the title of each choice - foreach respident $as_item_choices__choice_text_nodes { - lappend as_item_choices__choice_text [string trim [$respident nodeValue]] - } - # Insert as_item_choice in the CR (and as_item_choices table) getting the revision_id (choice_id) - set as_item_choice_id [as::item_choice::new -mc_id $as_item_type_id -title $as_item_choices__choice_text -sort_order $sort_order] - # order of the item_choices - incr sort_order - append as_items__title " " - } - } - } - # Insert as_item in the CR (and as_items table) getting the revision_id (as_item_id) - set as_item_id [as::item::new -title $as_items__title -feedback_right $as_items__feedback_right -feedback_wrong $as_items__feedback_wrong] - # set the relation between as_items and as_item_type tables - as::item_rels::new -item_rev_id $as_item_id -target_rev_id $as_item_type_id -type as_item_type_rel - # set the relation between as_items and as_item_display tables - as::item_rels::new -item_rev_id $as_item_id -target_rev_id $as_item_display_id -type as_item_display_rel - } else { - set response_lidNodes [$presentation selectNodes {.//response_lid}] - # The first node of the list. It may not be a good idea if it doesn't exist - set response_lid [lindex $response_lidNodes 0] - set as_items__rcardinality [$response_lid getAttribute {rcardinality} {Single}] - - # multiple choice either text (remember it can be internationalized or changed), images, sounds, videos - # this is the default - set as_item_display_id {} - if {$as_items__rcardinality == {Multiple}} { - # multiple response (checkbox) either text (remember it can be internationalized or changed), images, sounds, videos - # insert as_item_display_cb in the CR (and in the as_item_display_cb table) getting the revision_id (as_item_display) - set as_item_display_id [as::item_display_cb::new] - } else { - # multiple choice (radiobutton) - # insert as_item_display_rb in the CR (and in the as_item_display_rb table) getting the revision_id (as_item_display) - set as_item_display_id [as::item_display_rb::new] - } - # insert as_item_type_mc in the CR (and in the as_item_type_mc table) getting the revision_id (as_item_type) - set as_item_type_id [as::item_type_mc::new] - # Insert as_item in the CR (and as_items table) getting the revision_id (as_item_id) - set as_item_id [as::item::new -title $as_items__title -feedback_right $as_items__feedback_right -feedback_wrong $as_items__feedback_wrong] - # set the relation between as_items and as_item_type tables - as::item_rels::new -item_rev_id $as_item_id -target_rev_id $as_item_type_id -type as_item_type_rel - # set the relation between as_items and as_item_display tables - as::item_rels::new -item_rev_id $as_item_id -target_rev_id $as_item_display_id -type as_item_display_rel - # (each choice) - set response_labelNodes [$presentation selectNodes {.//response_label}] - foreach response_label $response_labelNodes { - set as_item_choices__ident [$response_label getAttribute {ident}] - set mattextNodes [$response_label selectNodes {material/mattext/text()}] - set as_item_choices__choice_text [db_null] - # get the title of each choice - foreach mattext $mattextNodes { - set as_item_choices__choice_text [$mattext nodeValue] - } - # for multimedia items - set matmediaNodes [$response_label selectNodes {material/matimage[@uri]}] - set as_item_choices__content_value [db_null] - foreach matmedia $matmediaNodes { - set mediabasepath $basepath - append mediabasepath {/} - append mediabasepath [$matmedia getAttribute {uri}] - # insert as_file in the CR (and in the as_file table) getting the content value - set as_item_choices__content_value [as::file::new -file_pathname $mediabasepath] - } - # Insert as_item_choice in the CR (and as_item_choices table) getting the revision_id (choice_id) - set as_item_choices__correct_answer_p($as_item_choices__ident) [expr [info exists as_item_choices__correct_answer_p($as_item_choices__ident)]?{t}:{f}] - if {![info exists as_item_choices__score($as_item_choices__ident)]} { - set as_item_choices__score($as_item_choices__ident) 0 - } - # insert as_item_choice in the CR (and as_item_choices table) - as::item_choice::new -mc_id $as_item_type_id -title $as_item_choices__choice_text -sort_order $sort_order -correct_answer_p $as_item_choices__correct_answer_p($as_item_choices__ident) -percent_score $as_item_choices__score($as_item_choices__ident) -content_value $as_item_choices__content_value - # order of the item_choices - incr sort_order - } - } + } } - # Relation between as_items and as_sections - if {$section_id != 0} { - db_dml as_item_section_map_insert {} - incr as_item_section_map__sort_order + # Insert as_item + set as_item_id [as::item::new -title $as_items__title -feedback_right $as_items__feedback_right -feedback_wrong $as_items__feedback_wrong] + # set the relation between as_items and as_item_type tables + as::item_rels::new -item_rev_id $as_item_id -target_rev_id $as_item_type_id -type as_item_type_rel + # set the relation between as_items and as_item_display tables + as::item_rels::new -item_rev_id $as_item_id -target_rev_id $as_item_display_id -type as_item_display_rel + } else { + set response_lidNodes [$presentation selectNodes {.//response_lid}] + # The first node of the list. It may not be a good idea if it doesn't exist + set response_lid [lindex $response_lidNodes 0] + set as_items__rcardinality [$response_lid getAttribute {rcardinality} {Single}] + + # multiple choice either text (remember it can be internationalized or changed), images, sounds, videos + # this is the default + set as_item_display_id {} + if {$as_items__rcardinality == {Multiple}} { + # multiple response (checkbox) either text (remember it can be internationalized or changed), images, sounds, videos + # insert as_item_display_cb + set as_item_display_id [as::item_display_cb::new] + } else { + # multiple choice (radiobutton) + # insert as_item_display_rb + set as_item_display_id [as::item_display_rb::new] } + + # insert as_item_type_mc + set as_item_type_id [as::item_type_mc::new] + + # Insert as_item + set as_item_id [as::item::new -title $as_items__title -feedback_right $as_items__feedback_right -feedback_wrong $as_items__feedback_wrong] + + # set the relation between as_items and as_item_type tables + as::item_rels::new -item_rev_id $as_item_id -target_rev_id $as_item_type_id -type as_item_type_rel + # set the relation between as_items and as_item_display tables + as::item_rels::new -item_rev_id $as_item_id -target_rev_id $as_item_display_id -type as_item_display_rel + # (each choice) + set response_labelNodes [$presentation selectNodes {.//response_label}] + foreach response_label $response_labelNodes { + set as_item_choices__ident [$response_label getAttribute {ident}] + set mattextNodes [$response_label selectNodes {material/mattext/text()}] + set as_item_choices__choice_text [db_null] + # get the title of each choice + foreach mattext $mattextNodes { + set as_item_choices__choice_text [$mattext nodeValue] + } + # for multimedia items + set matmediaNodes [$response_label selectNodes {material/matimage[@uri]}] + set as_item_choices__content_value [db_null] + foreach matmedia $matmediaNodes { + set mediabasepath $basepath + append mediabasepath {/} + append mediabasepath [$matmedia getAttribute {uri}] + # insert as_file in the CR (and in the as_file table) getting the content value + set as_item_choices__content_value [as::file::new -file_pathname $mediabasepath] + } + # Insert as_item_choice + set as_item_choices__correct_answer_p($as_item_choices__ident) [expr [info exists as_item_choices__correct_answer_p($as_item_choices__ident)]?{t}:{f}] + if {![info exists as_item_choices__score($as_item_choices__ident)]} { + set as_item_choices__score($as_item_choices__ident) 0 + } + # insert as_item_choice + as::item_choice::new -mc_id $as_item_type_id -title $as_item_choices__choice_text -sort_order $sort_order -correct_answer_p $as_item_choices__correct_answer_p($as_item_choices__ident) -percent_score $as_item_choices__score($as_item_choices__ident) -content_value $as_item_choices__content_value + # order of the item_choices + incr sort_order + } + } } - return 1 + # Relation between as_items and as_sections + if {$section_id != 0} { + db_dml as_item_section_map_insert {} + incr as_item_section_map__sort_order + } + } + return 1 } Index: openacs-4/packages/assessment/www/assessment.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/assessment/www/Attic/assessment.tcl,v diff -u -r1.14 -r1.15 --- openacs-4/packages/assessment/www/assessment.tcl 22 Dec 2004 20:52:17 -0000 1.14 +++ openacs-4/packages/assessment/www/assessment.tcl 24 Dec 2004 15:32:38 -0000 1.15 @@ -97,8 +97,15 @@ foreach one_item $item_list { util_unlist $one_item as_item_id name title description subtext required_p max_time_to_complete - # todo: pass required_p, reuse_responses, mode:edit/display - set presentation_type [as::item_form::add_item_to_form show_item_form $session_id $section_id $as_item_id] + if {$assessment_data(reuse_reponses_p) == "t"} { + set default_value [as::item_data::get -subject_id $user_id -as_item_id $as_item_id] + } else { + set default_value "" + } + + # todo: pass required_p + 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] + # Fill in the blank item. Replace all that appear in the title by an of type="text" if {$presentation_type == {tb}} { regsub -all -line -nocase -- { -#assessment.Review_Asessment# @assessment_data.title@ -#assessment.User_ID#: @session_user_name@ +#assessment.Review_Asessment# @assessment_data.title@ +#assessment.User_ID#: @first_names@ @last_name@ #assessment.Attempt#: @session_attempt@ / Unlimited -#assessment.Out_of#: @assessment_score@ +#assessment.Out_of#: @assessment_score@ #assessment.Started#: @session_start@ #assessment.Finished#: @session_finish@ @@ -16,43 +16,25 @@ +

- - - - -
#assessment.section#: @items.section_title@
@items.section_description@
+ - -
- - - - - - - - - - - - - - - - - - -
#assessment.Question# @items.rownum@   (@items.maxscore@ #assessment.points#)
- @items.title@ -
- @items.choice_html;noquote@
#assessment.This_question_will_be_corrected_by_the_teacher#.

- #assessment.Score#@items.score@ / @items.maxscore@ - (#assessment.Question_not_answered#.)
#assessment.Feedback#: @items.feedback_right@ - - #assessment.Feedback#: @items.feedback_wrong@

- + + + + +
@sections.rownum@. #assessment.section# @sections.title@ + (#assessment.max_time# @sections.max_time_to_complete@) +(0 / @sections.points@ #assessment.points#) +
@sections.description@
+ +

+ +
+ +
-#assessment.Total_score#: @session_score@ / @assessment_score@ +#assessment.Total_score#: @session_score@ / @assessment_score@ Index: openacs-4/packages/assessment/www/session.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/assessment/www/session.tcl,v diff -u -r1.26 -r1.27 --- openacs-4/packages/assessment/www/session.tcl 22 Dec 2004 20:52:17 -0000 1.26 +++ openacs-4/packages/assessment/www/session.tcl 24 Dec 2004 15:32:38 -0000 1.27 @@ -1,28 +1,17 @@ ad_page_contract { - Lists the results that an user obtains after answer an assessment. - In the results, users can view the started time and finished time - of assessment, the time spent in take the assessment, as well as - the number of attempts. The users also can view the obtained total - score, the obtained score by each item, their incorrect answers and - a right or wrong feedback. If an item isn't answered users are informed. + Show the result of a session. - @author Eduardo P�rez Ureta (eperez@it.uc3m.es) - @creation-date 2004-09-13 -} -query { - session_id:notnull -} -properties { - context:onevalue + @author timo@timohentschel.de + @date 2004-12-24 + @cvs-id $Id: +} { + session_id:integer } set context [list "[_ assessment.View_Results]"] -db_1row find_assessment { - select r.item_id as assessment_id - from as_sessions s, cr_revisions r - where s.session_id = :session_id - and r.revision_id = s.assessment_id -} +db_1row find_assessment {} # Get the assessment data as::assessment::data -assessment_id $assessment_id @@ -33,171 +22,30 @@ } set assessment_rev_id $assessment_data(assessment_rev_id) +set session_user_url [acs_community_member_url -user_id $subject_id] -if {[empty_string_p $assessment_data(show_feedback)]} { - set assessment_show_feedback "all" -} +# get start and end times +db_1row session_data {} -#get the user takes a session -db_1row session_user_id { - SELECT p.first_names, p.last_name, ss.assessment_id - FROM as_sessionsx ss, persons p - WHERE ss.subject_id = p.person_id - AND ss.session_id = :session_id -} +# get the number of attempts +set session_attempt [db_string session_attempt {}] -set assessment_url [export_vars -base "assessment" {assessment_id}] -set session_user_name "$first_names $last_name" - -#get information of assessment as subject that took it, the started time and finished time of assessment -db_1row session_data { - SELECT subject_id, creation_datetime AS session_start, - completed_datetime AS session_finish, - completed_datetime-creation_datetime AS session_time - FROM as_sessionsx ss - WHERE ss.session_id = :session_id +if {[empty_string_p $assessment_data(show_feedback)]} { + set assessment_data(show_feedback) "all" } -set session_user_url [acs_community_member_url -user_id $subject_id] -#get the number of attempts -set session_attempt [db_string session_attempt { - SELECT COUNT(*) - FROM as_sessionsx ss - WHERE ss.subject_id = :subject_id - AND ss.assessment_id = :assessment_rev_id -}] +# show_feedback: none, all, incorrect, correct -set assessment_score 100 ;# FIXME -#get the number of items of an assessment -set assessment_items [db_string assessment_items { - SELECT COUNT(*) - FROM as_sectionsx s, as_assessmentsx a, as_assessment_section_map asm, - as_itemsx i, as_item_section_map ism - WHERE a.assessment_id = asm.assessment_id - AND s.section_id = asm.section_id - AND i.as_item_id = ism.as_item_id - AND s.section_id = ism.section_id - AND a.assessment_id = :assessment_rev_id -}] -#set maximum score by each item -set itemmaxscore [expr $assessment_score/$assessment_items] ;# FIXME total_points/items_number - -set session_score 0 -db_multirow -extend [list choice_html score maxscore notanswered item_correct presentation_type] items query_all_items {} { - #reset variables - set rb__display_id {} - unset rb__display_id - set tb__display_id {} - unset tb__display_id - set ta__display_id {} - unset ta__display_id - set mc_id [as::item_rels::get_target -item_rev_id $as_item_id -type as_item_type_rel] - set item_display_id [as::item_rels::get_target -item_rev_id $as_item_id -type as_item_display_rel] - #set items_as_item_id [db_string items_items_as_item_id "SELECT item_id FROM cr_revisions WHERE revision_id = :as_item_id"] - set items_as_item_id [db_string items_items_as_item_id "SELECT as_itemsx.as_item_id FROM as_itemsx WHERE as_itemsx.item_id IN (select item_id from cr_revisions where revision_id=:as_item_id)"] - db_0or1row as_item_display_rbx "SELECT as_item_display_id AS rb__display_id FROM as_item_display_rb WHERE as_item_display_id=:item_display_id" - db_0or1row as_item_display_tbx "SELECT as_item_display_id AS tb__display_id FROM as_item_display_tb WHERE as_item_display_id=:item_display_id" - db_0or1row as_item_display_tax "SELECT as_item_display_id AS ta__display_id FROM as_item_display_ta WHERE as_item_display_id=:item_display_id" - set presentation_type "checkbox" ;# DEFAULT - #get the presentation type - if {[info exists rb__display_id]} {set presentation_type "radio"} - if {[info exists tb__display_id]} {set presentation_type "fitb"} - if {[info exists ta__display_id]} {set presentation_type "textarea"} - - set notanswered 1 - set maxscore $itemmaxscore - set score 0 - set item_correct 1 - set choice_html "" - - #for Short Answer item - if {[string compare $presentation_type "textarea"] == 0} { - set text_answer {} - #get rows and cols for painting a textarea (in abs_size is stored as "rows value cols value", we need to add the symbol =) - db_0or1row html_rows_cols "SELECT html_display_options FROM as_item_display_ta WHERE as_item_display_id=:item_display_id" - set html_options "[lindex $html_display_options 0]=[lindex $html_display_options 1] [lindex $html_display_options 2]=[lindex $html_display_options 3]" - #get the user response - db_0or1row shortanswer {} - #paint a disabled textarea with the user response - set choice_answer "" - set correct_answer {} - append choice_html "" - #item_correct=0 because this item has to be corrected by a teacher - set item_correct 0 - } - - db_foreach choices {} { - set choice_id_answer "" - set text_answer "" - db_0or1row answer_info { - select aid.text_answer, aidc.choice_id as choice_id_answer - from as_item_data aid, as_item_data_choices aidc - where aidc.choice_id=:choice_id - and aidc.item_data_id = aid.item_data_id - and (aid.session_id = :session_id or aid.session_id is null) +db_multirow sections sections {} { + if {[empty_string_p $points]} { + set points 0 } - if {[string length "$choice_id_answer"]} {set notanswered 0} - set choice_correct 0 - #for fill in the blank item - if {[info exists tb__display_id]} { - foreach text_value $choice_title { - if {[empty_string_p $text_answer]} { } else { - #if the user response is equal to stored answer (no case sensitive) the user response is correct - if {[string toupper $text_answer] == [string toupper $text_value]} { set choice_correct 1 } - } - } - #for multiple choice and multiple response items - } else { - if {$correct_answer_p == {t}} { set correct_answer_bool 1 } else { set correct_answer_bool 0 } - set choice_correct [expr $correct_answer_bool == ("$choice_id_answer" == $choice_id)] - } - set item_correct [expr $item_correct && $choice_correct] - if {$choice_correct} { - set correct_answer {} - } else { - #if the user response is wrong, the word "Error" will be displayed in red color - set correct_answer {Error} - } - - #if it's a survey we show the selected answer with out the word Error - if {$survey_p == {t} || $assessment_show_feedback == {none}} { - set correct_answer {} - } - - #for fill in the blank item - if {[info exists tb__display_id]} { - if {$choice_correct} { - #replace by readonly - regsub -all -line -nocase -- " by readonly and the text is written in red color because the user response is incorrect - regsub -all -line -nocase -- "" - } else { - set choice_answer "" - } - #if a item is a multiple choice or multiple response with multimedia (images, sounds, videos) - if {[empty_string_p $content_value]} { - append choice_html "" - #multiple choice or multiple response (text) - } elseif {[db_string mime_type {SELECT mime_type LIKE 'image%' FROM cr_revisions WHERE revision_id = :content_value}]} { - append choice_html "" - } else { - append choice_html "" - } - } - } - if {$item_correct} { set score $itemmaxscore } - # total points - set session_score [expr $session_score+$score] - if {[info exists tb__display_id]} { append choice_html $title } - append choice_html {
$correct_answer$choice_answer
$correct_answer$choice_answer [ad_quotehtml $choice_title]
$correct_answer$choice_answer [ad_quotehtml $choice_title]
$correct_answer$choice_answer [ad_quotehtml $choice_title]
} - db_dml session_percent_score {} + set max_time_to_complete [as::assessment::pretty_time -seconds $max_time_to_complete] } +# todo: calculate result +set session_score 0 +set assessment_score 0 + ad_return_template Index: openacs-4/packages/assessment/www/session.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/assessment/www/session.xql,v diff -u -r1.14 -r1.15 --- openacs-4/packages/assessment/www/session.xql 20 Dec 2004 13:58:50 -0000 1.14 +++ openacs-4/packages/assessment/www/session.xql 24 Dec 2004 15:32:38 -0000 1.15 @@ -1,50 +1,50 @@ - postgresql7.4 - - - SELECT i.as_item_id, i.name, i.title, i.feedback_right, i.feedback_wrong, - s.section_id, s.title as section_title, s.description as section_description - FROM as_assessmentsx a, as_sectionsx s, as_assessment_section_map asm, as_itemsx i, - as_item_section_map ism, as_sessionsx ss - WHERE a.assessment_id = asm.assessment_id - AND s.section_id = asm.section_id - AND i.as_item_id = ism.as_item_id - AND s.section_id = ism.section_id - AND a.assessment_id = ss.assessment_id - AND ss.session_id = :session_id - ORDER BY s.section_id, ism.sort_order - - + + + select r.item_id as assessment_id, s.subject_id, + p.first_names, p.last_name + from as_sessions s, cr_revisions r, persons p + where s.session_id = :session_id + and r.revision_id = s.assessment_id + and s.subject_id = p.person_id + + - - - SELECT - as_item_choicesx.choice_id, as_item_choicesx.title AS choice_title, as_item_choicesx.correct_answer_p, as_item_choicesx.percent_score, as_item_choicesx.text_value, as_item_choicesx.content_value - FROM as_item_choicesx - WHERE - as_item_choicesx.mc_id=:mc_id - ORDER BY - as_item_choicesx.sort_order - - - - - - SELECT as_item_datax.text_answer - FROM as_item_datax - WHERE as_item_datax.session_id = :session_id - AND as_item_datax.as_item_id = :items_as_item_id - - - - - - UPDATE as_sessions - SET percent_score = :session_score - WHERE session_id = :session_id - - + + + SELECT creation_datetime AS session_start, + completed_datetime AS session_finish, + completed_datetime-creation_datetime AS session_time + FROM as_sessions s + WHERE s.session_id = :session_id + + + + + SELECT COUNT(*) + FROM as_sessions s + WHERE s.subject_id = :subject_id + AND s.assessment_id = :assessment_rev_id + + + + + + select s.section_id, cr.title, cr.description, ci.name, s.instructions, + s.feedback_text, m.max_time_to_complete, m.points + from as_assessment_section_map m, as_session_sections ss, + as_sections s, cr_revisions cr, cr_items ci + where ci.item_id = cr.item_id + and cr.revision_id = s.section_id + and s.section_id = m.section_id + and m.assessment_id = :assessment_rev_id + and m.section_id = ss.section_id + and ss.session_id = :session_id + order by ss.sort_order + + +