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.47 -r1.2.2.48 --- openacs-4/packages/xowf/catalog/xowf.de_DE.ISO-8859-1.xml 5 Apr 2021 18:02:55 -0000 1.2.2.47 +++ openacs-4/packages/xowf/catalog/xowf.de_DE.ISO-8859-1.xml 23 Apr 2021 17:56:16 -0000 1.2.2.48 @@ -197,8 +197,9 @@ automatische Einsicht nicht m�glich Randomisierung f�r Pr�fung geeignet Randomisierung f�r Pr�fung nicht geeignet (keine Zufallsauswahl "immer" verwenden) - %achievedPoints% (gerundet %rounded%) von m�glichen %totalPoints% Punkten, %percentage%%, Note: %grade% - %achievedPoints% von m�glichen %totalPoints% Punkten, %percentage%%, Note: %grade% + %achievedPoints% (gerundet %achievedPointsRounded%) von m�glichen %achievablePoints% Punkten, %percentage%%, Note: %grade% + %achievedPoints% von m�glichen %achievablePoints% Punkten, %percentage%% (gerundet %percentageRounded%%), Note: %grade% + %achievedPoints% von m�glichen %achievablePoints% Punkten, %percentage%%, Note: %grade% Name enth�lt zumindest ein ung�ltiges Zeichen 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.47 -r1.2.2.48 --- openacs-4/packages/xowf/catalog/xowf.en_US.ISO-8859-1.xml 5 Apr 2021 18:02:55 -0000 1.2.2.47 +++ openacs-4/packages/xowf/catalog/xowf.en_US.ISO-8859-1.xml 23 Apr 2021 17:56:16 -0000 1.2.2.48 @@ -217,8 +217,9 @@ randomization for exam ok randomization for exam NOT ok ("always" should not be used) - %achievedPoints% (rounded%rounded%) of possible %totalPoints% points, %percentage%%, grade: %grade% - %achievedPoints% of possible %totalPoints% points, %percentage%%, grade: %grade% + %achievedPoints% (rounded %achievedPointsRounded%) of possible %achievablePoints% points, %percentage%%, grade: %grade% + %achievedPoints% of possible %achievablePoints% points, %percentage%% (rounded %percentageRounded%%), grade: %grade% + %achievedPoints% of possible %achievablePoints% points, %percentage%%, grade: %grade% Name contains at least one invalid character Detailed Configuration Index: openacs-4/packages/xowf/lib/edit-interaction.wf =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowf/lib/edit-interaction.wf,v diff -u -r1.1.2.9 -r1.1.2.10 --- openacs-4/packages/xowf/lib/edit-interaction.wf 5 Mar 2021 08:53:00 -0000 1.1.2.9 +++ openacs-4/packages/xowf/lib/edit-interaction.wf 23 Apr 2021 17:56:16 -0000 1.1.2.10 @@ -10,6 +10,8 @@ # {entry -name New.Item.TextInteraction -form en:edit-interaction.wf -query p.item_type=Text} # +set :policy ::xowf::test_item::test-item-policy-edit + Action initialize -proc activate {obj} { set name [$obj name] if {[$obj is_new_entry $name]} { 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.121 -r1.7.2.122 --- openacs-4/packages/xowf/tcl/test-item-procs.tcl 5 Apr 2021 18:02:55 -0000 1.7.2.121 +++ openacs-4/packages/xowf/tcl/test-item-procs.tcl 23 Apr 2021 17:56:16 -0000 1.7.2.122 @@ -2179,15 +2179,15 @@ } } - if {0 && $autograde} { - lappend form_field_objs \ - [$wf create_raw_form_field \ - -name _online-exam-total-score \ - -spec number,label=#xowf.Total-Score#] \ - [$wf create_raw_form_field \ - -name _online-exam-grade \ - -spec number,label=#xowf.Grade#] - } + # if {0 && $autograde} { + # lappend form_field_objs \ + # [$wf create_raw_form_field \ + # -name _online-exam-total-score \ + # -spec number,label=#xowf.Total-Score#] \ + # [$wf create_raw_form_field \ + # -name _online-exam-grade \ + # -spec number,label=#xowf.Grade#] + # } lappend form_field_objs \ [$wf create_raw_form_field \ @@ -2284,15 +2284,15 @@ $p set_property -new 1 _online-exam-seconds \ [expr {[dict get $duration toClock] - [dict get $duration fromClock]}] - if {0 && $autograde && $total_points > 0} { - set final_score [expr {$total_score/$total_points}] - $p set_property -new 1 _online-exam-total-score $final_score - - set d [list achievedPoints $total_score achievablePoints $total_score totalPoints $total_point] - set grade [$grading_scheme grade -achieved_points $d] - dict incr grade_count $grade - $p set_property -new 1 _online-exam-grade $grade - } + # if {0 && $autograde && $total_points > 0} { + # set final_score [expr {$total_score/$total_points}] + # $p set_property -new 1 _online-exam-total-score $final_score + # + # set d [list achievedPoints $total_score achievablePoints $total_points totalPoints $total_points] + # set grade [$grading_scheme grade -achieved_points $d] + # dict incr grade_count $grade + # $p set_property -new 1 _online-exam-grade $grade + # } } if {$state eq "done"} { @@ -3669,19 +3669,30 @@ nx::Class create Grading { :property {percentage_boundaries {50.0 60.0 70.0 80.0}} - :method calc_grade {-points -achieved_points} { + :method calc_grade {-percentage -points -achieved_points} { # # Return a numeric grade based on achieved_points dict and # percentage_mapping. On invalid data, return 0. # # achieved_points: {achievedPoints 4.0 achievablePoints 4 totalPoints 4} # percentage_mapping: {50.0 60.0 70.0 80.0} # - if {[dict exists $achieved_points totalPoints] && [dict get $achieved_points totalPoints] > 0} { - set percentage [format %.2f [expr { - ($points*100/ - [dict get $achieved_points totalPoints]) + 0.00001 - }]] + if {![dict exists $achieved_points achievablePoints] && [dict exists $achieved_points totalPoints]} { + ns_log warning "test_item::grading legacy call, use 'achievablePoints' instead of 'totalPoints'" + dict set achieved_points achievablePoints [dict get $achieved_points totalPoints] + } + if {![info exists percentage]} { + if {[dict exists $achieved_points achievablePoints] && [dict get $achieved_points achievablePoints] > 0} { + set percentage \ + [format %.2f [expr { + ($points*100/ + [dict get $achieved_points achievablePoints]) + 0.00001 + }]] + } + } else { + ns_log notice "USE PROVIDED percentage '$percentage'" + } + if {[info exists percentage]} { set grade 1 set gradePos 0 foreach boundary ${:percentage_boundaries} { @@ -3705,47 +3716,98 @@ return [dict get $achieved_points achievedPoints] } } + + :method complete_dict {achieved_points} { + # + # This is a transitional method, just for defensive programming + # to make sure, nobody elese uses the legacy field... should + # disappear soon. + # + if {![dict exists $achieved_points achievablePoints] && [dict exists $achieved_points totalPoints]} { + ns_log warning "test_item::grading legacy call, use 'achievablePoints' instead of 'totalPoints'" + dict set achieved_points achievablePoints [dict get $achieved_points totalPoints] + } + foreach key { + achievedPoints + achievablePoints + } { + if {![dict exists $achieved_points $key]} { + ns_log warning "test_item::grading dict without $key: $achieved_points" + ::xo::show_stack + dict set achieved_points $key 0 + } + } + dict with achieved_points { + dict set achieved_points achievedPointsRounded [format %.0f $achievedPoints] + set achievablePoints [format %.2f $achievablePoints] + set achievedPoints [format %.2f $achievedPoints] + set percentage [format %.2f [expr {$achievablePoints > 0 ? ($achievedPoints*100.0/$achievablePoints) : 0}]] + dict set achieved_points percentage $percentage + dict set achieved_points percentageRounded [format %.0f $percentage] + } + #ns_log notice "R=$achieved_points" + return $achieved_points + } + } Grading create ::xowf::test_item::grading::wi1 -percentage_boundaries {50.0 60.0 70.0 80.0} { :public object method print {-achieved_points:required} { + set achieved_points [:complete_dict $achieved_points] + set grade [:grade -achieved_points $achieved_points] + dict with achieved_points { + set panelHTML [_ xowf.panel_achievied_points_wi1] + return [list panel $panelHTML csv [subst {$achievedPoints\t$achievedPointsRounded\t$percentage%\t$grade}]] + } + } + :public object method grade {-achieved_points:required} { + set achieved_points [:complete_dict $achieved_points] if {[dict exists $achieved_points achievedPoints]} { - set totalPoints [format %.2f [dict get $achieved_points totalPoints]] - set achievedPoints [format %.2f [dict get $achieved_points achievedPoints]] - set rounded [dict get $achieved_points achievedPointsRounded] - set percentage [format %.2f [expr {$totalPoints > 0 ? ($achievedPoints*100.0/$totalPoints) : 0}]] - set grade [:grade -achieved_points $achieved_points] - set panelHTML [_ xowf.panel_achievied_points_wi1] - return [list panel $panelHTML csv [subst {$achievedPoints\t$rounded\t$percentage%\t$grade}]] + dict with achieved_points { + return [:calc_grade -points $achievedPointsRounded -achieved_points $achieved_points] + } } } + } + + Grading create ::xowf::test_item::grading::wi1p -percentage_boundaries {50.0 60.0 70.0 80.0} { + + :public object method print {-achieved_points:required} { + set achieved_points [:complete_dict $achieved_points] + set grade [:grade -achieved_points $achieved_points] + dict with achieved_points { + set panelHTML [_ xowf.panel_achievied_points_wi1p] + return [list panel $panelHTML csv [subst {$achievedPoints\t$percentage%\t$percentageRounded%\t$grade}]] + } + } :public object method grade {-achieved_points:required} { + set achieved_points [:complete_dict $achieved_points] if {[dict exists $achieved_points achievedPoints]} { - set achieved [dict get $achieved_points achievedPoints] - set rounded [dict get $achieved_points achievedPointsRounded] - return [:calc_grade -points $rounded -achieved_points $achieved_points] + dict with achieved_points { + return [:calc_grade -percentage $percentageRounded -achieved_points $achieved_points] + } } } } + Grading create ::xowf::test_item::grading::wi1_noround -percentage_boundaries {50.0 60.0 70.0 80.0} { :public object method print {-achieved_points:required} { if {[dict exists $achieved_points achievedPoints]} { - set totalPoints [format %.2f [dict get $achieved_points totalPoints]] - set achievedPoints [format %.2f [dict get $achieved_points achievedPoints]] - set percentage [format %.2f [expr {$totalPoints > 0 ? ($achievedPoints*100.0/$totalPoints) : 0}]] - set grade [:grade -achieved_points $achieved_points] - set panelHTML [_ xowf.panel_achievied_points_wi1_noround] - return [list panel $panelHTML csv [subst {$achievedPoints\t$percentage%\t$grade}]] + set achieved_points [:complete_dict $achieved_points] + set grade [:grade -achieved_points $achieved_points] + dict with achieved_points { + set panelHTML [_ xowf.panel_achievied_points_wi1_noround] + return [list panel $panelHTML csv [subst {$achievedPoints\t$percentage%\t$grade}]] + } } } :public object method grade {-achieved_points:required} { if {[dict exists $achieved_points achievedPoints]} { - set achieved [format %.2f [dict get $achieved_points achievedPoints]] - #ns_log notice "XXXX $achieved_points -> [list calc_grade -points $achieved -achieved_points $achieved_points]" - return [:calc_grade -points $achieved -achieved_points $achieved_points] + set achieved_points [:complete_dict $achieved_points] + return [:calc_grade -points $achievedPoints -achieved_points $achieved_points] } } } @@ -3826,6 +3888,7 @@ # ::xowiki::policy1 copy ::xowf::test_item::test-item-policy-publish ::xowiki::policy1 copy ::xowf::test_item::test-item-policy-answer + ::xowiki::policy1 copy ::xowf::test_item::test-item-policy-edit # # Add policy rules as used in two demo workflows. We are permissive @@ -3857,6 +3920,12 @@ message-dismiss {{item_id read}} } } + test-item-policy-edit contains { + Class create FormPage -array set require_permission { + revisions admin + diff admin + } + } #ns_log notice [::xowf::test_item::test-item-policy1 serialize] #ns_log notice ===================================