Index: openacs-4/packages/xowf/xowf.info =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowf/xowf.info,v diff -u -r1.12.2.106 -r1.12.2.107 --- openacs-4/packages/xowf/xowf.info 18 Oct 2023 09:34:00 -0000 1.12.2.106 +++ openacs-4/packages/xowf/xowf.info 24 Nov 2023 13:49:48 -0000 1.12.2.107 @@ -10,15 +10,15 @@ t xowf - + Gustaf Neumann XoWiki Content Flow - an XoWiki based workflow system implementing state-based behavior of wiki pages and forms 2023-07-11 WU Vienna BSD-Style 2 - + Index: openacs-4/packages/xowf/catalog/xowf.de_DE.ISO-8859-1.xml =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowf/catalog/xowf.de_DE.ISO-8859-1.xml,v diff -u -r1.2.2.88 -r1.2.2.89 --- openacs-4/packages/xowf/catalog/xowf.de_DE.ISO-8859-1.xml 17 Oct 2023 09:52:30 -0000 1.2.2.88 +++ openacs-4/packages/xowf/catalog/xowf.de_DE.ISO-8859-1.xml 24 Nov 2023 13:49:48 -0000 1.2.2.89 @@ -112,6 +112,7 @@ Abgabe Quiz beenden Warte auf n�chste Frage ... + Filterbegriff eingeben (z.B.: text1 text2 ...) Erlaube Zugriff f�r folgende IP-Adressen Erlaube Zugriff auf dieses Pr�fung nur f�r ausgew�hlte IP-Adressen. Nur Benutzer mit zugelassenen IP-Adressen k�nnen die Pr�fung ablegen. @@ -180,6 +181,7 @@ Schlie�e Pr�fung Einsicht �ffnen �ffne Einsicht f�r Studierende + Sortieren nach aus %achievedPoints% von m�glichen %totalPoints% Punkten, %percentage%% %achievedPoints% von m�glichen %totalPoints% Punkten, %percentage%%, Note: %grade% @@ -230,6 +232,7 @@ nach Prozenten nach Punkten Single-Choice-Frage + Inhalte durchsuchen Sekunde Sekunden Sicherheitseinstellungen @@ -256,6 +259,7 @@ Die Rechtschreibpr�fung in mehrzeiligen Textfeldern ist erlaubt Die Rechtschreibpr�fung in mehrzeiligen Textfeldern ist nicht erlaubt Status + Kennung Teilfrage Teilfragen Sind Sie sicher, dass Sie abgeben Index: openacs-4/packages/xowf/catalog/xowf.en_US.ISO-8859-1.xml =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowf/catalog/xowf.en_US.ISO-8859-1.xml,v diff -u -r1.2.2.93 -r1.2.2.94 --- openacs-4/packages/xowf/catalog/xowf.en_US.ISO-8859-1.xml 27 Sep 2023 11:46:45 -0000 1.2.2.93 +++ openacs-4/packages/xowf/catalog/xowf.en_US.ISO-8859-1.xml 24 Nov 2023 13:49:48 -0000 1.2.2.94 @@ -118,6 +118,7 @@ Submit Close quiz Waiting for next question ... + Insert keywords for filtering (eg. text1 text2 ...) Allow Access for the following IP Addresses Allow access to this exam only for certain IP addresses. Only those users who are on approved IP addresses can fill out the exam. Restricted access: You are not allowed to work on this exam from your IP address: %ip% @@ -186,6 +187,7 @@ Close Exam Open student submission review Open submission review for students + Order by of %achievedPoints% of possible %totalPoints% points, %percentage%% %achievedPoints% of possible %totalPoints% points, %percentage%%, grade: %grade% @@ -236,6 +238,7 @@ by percentage by points Single Choice Question + Search in content Second Seconds Security Configuration @@ -262,6 +265,7 @@ Spellcheck is activated in multi-line text fields Spellcheck is deactivated in multi-line text fields State + Username Sub-Question Sub-Questions Are you sure you want to submit? This step cannot be undone. Index: openacs-4/packages/xowf/tcl/test-item-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowf/tcl/test-item-procs.tcl,v diff -u -r1.7.2.283 -r1.7.2.284 --- openacs-4/packages/xowf/tcl/test-item-procs.tcl 4 Oct 2023 13:22:21 -0000 1.7.2.283 +++ openacs-4/packages/xowf/tcl/test-item-procs.tcl 24 Nov 2023 13:49:48 -0000 1.7.2.284 @@ -1535,6 +1535,80 @@ } return 1 } + + #---------------------------------------------------------------------- + # Class: AssessmentInterface + # Method: render_export_links + #---------------------------------------------------------------------- + :method export_links { + {-examWf:object} + {-filter_form_ids:integer,0..n ""} + {-b_aggregate:boolean false} + } { + # + # Creates export links and markup + # + # @return HTML + # + + set export_formats { + cvs + } + if {[::namespace which ::ooxml::xl_write] ne ""} { + lappend export_formats xls + } + + #case: specific question + if {$filter_form_ids ne "" && [string is integer $filter_form_ids]} { + #check if this id has entries + set results [::xowf::test_item::answer_manager get_exam_results -obj $examWf results] + set fos_exists 0 + foreach {user answers} $results { + foreach {qn attributes} $answers { + if {[dict exists $attributes question_id] && + [dict get $attributes question_id] eq $filter_form_ids} { + set fos_exists 1 + } + } + } + if {!$fos_exists} {return} + foreach format $export_formats { + set href [$examWf pretty_link -query [export_vars { + {m exam-results} {onlygrades 0} {format $format} {per-question 1} {fos $filter_form_ids} + }]] + append HTML [subst { +

#xowf.export_results_title#: + [string toupper $format] + }] + } + return [template::adp_parse_tags $HTML] + } + #case: aggregated view + if {$b_aggregate} { + foreach format $export_formats { + set href [$examWf pretty_link -query [export_vars { + {m exam-results} {onlygrades 0} {format $format} {per-question 0} + }]] + append HTML [subst { +

#xowf.export_results#: + [string toupper $format] + }] + } + return [template::adp_parse_tags $HTML] + } + #default case: all questions + foreach format $export_formats { + set href_export [$examWf pretty_link -query [export_vars { + {m exam-results} {onlygrades 0} {format $format} {per-question 1} + }]] + append HTML [subst { +

#xowf.export_results_title#: + [string toupper $format] +

}] + } + return [template::adp_parse_tags $HTML] + } + } } @@ -3260,6 +3334,65 @@ #---------------------------------------------------------------------- # Class: Answer_manager + # Method: render_filter_bar + #---------------------------------------------------------------------- + :method render_filter_bar { + {-examWf:object} + {-filter_form_ids:integer,0..n ""} + {-revision_id:integer,0..1 ""} + {-filter_submission_id:integer,0..1 ""} + {-orderby:token "online-exam-userName"} + } { + # + # Render a bar to filter, sort and export exam submissions. + # + # @return HTML + # + template::add_event_listener \ + -id search-question \ + -event submit \ + -preventdefault=true \ + -script "handleSearch();" + + template::add_event_listener \ + -id search-content \ + -event change \ + -preventdefault=true \ + -script "handleSearch();" + + template::head::add_javascript -order 100 -src "/resources/xowf/inclass-exam.js" + + set HTML [subst { +
+ Filter: + #xowf.Search_in_content# +
+ + [template::collect_body_scripts] + }] + + set sort_baseurl [$examWf pretty_link]?m=print-answers&fos=$filter_form_ids&rid=$revision_id&id=$filter_submission_id + + append HTML [subst { +
+ +
+ }] + append HTML [:export_links -examWf $examWf -filter_form_ids $filter_form_ids -b_aggregate true] + + return $HTML + } + + #---------------------------------------------------------------------- + # Class: Answer_manager # Method: render_full_submission_form #---------------------------------------------------------------------- :method render_full_submission_form { @@ -4033,6 +4166,20 @@ set do_stream [expr {[llength [$items children]] > 100}] set HTML [:render_print_button] + + if {!$as_student} { + # + # When rendering for teachers, we offer the possibility for to + # sort, filter and export submissions. + # + append HTML [:render_filter_bar \ + -examWf $examWf \ + -filter_form_ids $filter_form_ids \ + -revision_id $revision_id \ + -filter_submission_id $filter_submission_id \ + -orderby $orderby] + } + ::xo::cc set_parameter template_file view-plain-master ::xo::cc set_parameter MenuBar 0 @@ -4535,12 +4682,66 @@ -type [ad_decode $att achieved real achievable real grade integer dictionary] \ $att + # + # XLS export requires OOXML + # + # See https://fossil.sowaswie.de/ooxml/index + # + if {$format eq "xls" && + [::namespace which ::ooxml::xl_write] eq ""} { + set format csv + } + if {$reply} { switch $format { html { ns_return 200 "text/html; charset=utf-8" [$t asHTML] ad_script_abort } + xls { + set s [::ooxml::xl_write new] + set sheet [$s worksheet {1}] + set decimal [lc_get "decimal_point"] + set doublestyle [$s style -numfmt [$s numberformat -decimal -format "#${decimal}##"]] + set stringstyle [$s style -numfmt [$s numberformat -string]] + set datestyle [$s style -numfmt [$s numberformat -date]] + set cellformat {} + + #iterate cols of table + $s row $sheet + set displayColumns [lmap column [${t}::__columns children] { + if {[$column exists no_csv]} continue + if {[$column istype ::xo::Table::BulkAction]} continue + if {[$column istype ::xo::Table::HiddenField]} continue + set column + }] + foreach column $displayColumns { + if {[$column name] in {"achieved" "achievable" "percentage"}} { + lappend cellformat double + } else { + lappend cellformat string + } + set label [$column label] + if {[regexp {^#([a-zA-Z0-9_:-]+\.[a-zA-Z0-9_:-]+)#$} $label _ message_key]} { + set label [_ $message_key] + } + set value [string map {\" \\\" \n \r} $label] + $s cell $sheet $value + } + #iterate row content + foreach row [$t children] { + $s row $sheet + set i 0 + foreach column $displayColumns { + set value [string map {\" \\\" \n \r} [$row set [$column set name]]] + set format [lindex $cellformat $i] + $s cell $sheet $value -style [set [set format]style] + incr i + } + } + $s write results.xlsx + ad_script_abort + } default {set result [$t write_csv]} } } else {