--- modules/gci/londocsgci.pm 2009/12/20 04:32:03 1.5 +++ modules/gci/londocsgci.pm 2009/12/21 15:51:29 1.6 @@ -2,7 +2,7 @@ # Custom Edit Course Routines for Assembly of Valid Concept Tests from # Geoscience Concept Inventory. # -# $Id: londocsgci.pm,v 1.5 2009/12/20 04:32:03 gci Exp $ +# $Id: londocsgci.pm,v 1.6 2009/12/21 15:51:29 gci Exp $ # # Copyright Michigan State University Board of Trustees # @@ -44,10 +44,13 @@ use LONCAPA qw(:DEFAULT :match); my $path; my $version; my $reqnum; +my @mandcats; +my @bincats; my @categories; my @allprobs; my %probcat; my %prereqs; +my %revreqs; my @defchosen; my @chosen; my @mandprobs; @@ -90,10 +93,10 @@ sub setdefaults { ['63','64','65'], ['66','67','68','69','70','71']); @optional = ('05','11','29','31'); - - @categories=('M1','M2','M3','M4', - 'A','B','C','D','E','F','G','H','I','J','K'); - %probcat =('01' => 'M1' ,'02' => 'M2' ,'37' => 'M3' ,'2004_73' => 'M4' , + @mandcats = ('M1','M2','M3','M4'); + @bincats = ('A','B','C','D','E','F','G','H','I','J','K'); + @categories=(@mandcats,@bincats); + %probcat =('01' => 'M1' ,'02' => 'M2' ,'37' => 'M3' ,'2004_73' => 'M4' , '03' => 'A' ,'04' => 'A','05' => '' ,'06' => 'A' ,'07' => 'B' , '08' => 'B' ,'09' => 'B' ,'10' => 'C' ,'11' => '' ,'12' => 'C' , '13' => 'C' ,'14' => 'C' ,'15' => 'C' ,'16' => 'C' ,'17' => 'C' ,'18' => 'D' ,'19' => 'D' ,'20' => 'D' , @@ -106,12 +109,15 @@ sub setdefaults { '60' => 'I' , '61' => 'I' ,'62' => 'I' ,'63' => 'J' ,'64' => 'J' ,'65' => 'J' ,'66' => 'K' ,'67' => 'K' ,'68' => 'K' ,'69' => 'K' ,'70' => 'K' , '71' => 'K'); - %mandatory=('01' => 1 ,'02' => 1,'37' => 1, '2004_73' => 1); - @mandprobs = ('01','02','37','2004_73'); - %prereqs=('10' => '08', '57' => '52', '69' => '18'); - @defchosen=('01','02','03','07','12','18','26','32','37','38','47','54','63','66','2004_73'); - @development = ('100','101','102'); - %developmentitems = ('100' => 1, '101' => '1', '102' => '1'); + %mandatory=('01' => 1 ,'02' => 1,'37' => 1, '2004_73' => 1); + @mandprobs = ('01','02','37','2004_73'); + %prereqs=('10' => '08', '57' => '52', '69' => '18'); + foreach my $item (keys(%prereqs)) { + $revreqs{$prereqs{$item}} = $item; + } + @defchosen=('01','02','03','07','12','18','26','32','37','38','47','54','63','66','2004_73'); + @development = ('100','101','102'); + %developmentitems = ('100' => 1, '101' => '1', '102' => '1'); } sub checkvalid { @@ -134,7 +140,11 @@ sub checkvalid { foreach my $item (@chosen) { if ($prereqs{$item}) { unless ($chosenproblems{$prereqs{$item}}) { - push(@errors,&mt('Problem [_1] requires problem [_2].',$item,$prereqs{$item})); + my $url = &fullurl($item); + my $title = &Apache::lonnet::metadata($url,'title'); + my $prerequrl = &fullurl($prereqs{$item}); + my $prereqtitle = &Apache::lonnet::metadata($prerequrl,'title'); + push(@errors,&mt('[_1] requires [_2].',"'$title'","'$prereqtitle'")); } } } @@ -143,10 +153,17 @@ sub checkvalid { sub fullurl { my ($item)=@_; - unless ($item=~/\_/) { $item='_'.$item; } + unless ($item=~/^\_/) { $item='_'.$item; } return $path.'/'.$version.'/GCI'.$item.'.problem'; } +sub item_from_url { + my ($url)=@_; + if ($url =~ m{\Q$path\E/\Q$version\E/GCI_([^.]+)\.problem$}) { + return $1; + } +} + sub validcheck { my ($r)=@_; my @errors=&checkvalid(); @@ -207,7 +224,7 @@ sub listresources { &Apache::lonhtmlcommon::start_pick_box(). &Apache::lonhtmlcommon::row_title(&mt('Open date')). $startform. - &Apache::lonhtmlcommon::row_closure(). + &Apache::lonhtmlcommon::row_closure(1). &Apache::lonhtmlcommon::row_title(&mt('Close date')). $endform. &Apache::lonhtmlcommon::end_pick_box().'
'. @@ -300,7 +317,26 @@ sub display_questions { } else { $output .= '{$item}) { $output .= ' checked="checked"'; } - $output .= 'onclick="javascript:countChecked('."'$catname'".');" />'. + $output .= ' onclick="countChecked('."'$catname'".');'; + my $binname; + if ($prereqs{$item}) { + for (my $i=0; $i<@bincats; $i++) { + if ($bincats[$i] eq $probcat{$prereqs{$item}}) { + $binname = 'bin'.$i; + last; + } + } + $output .= 'checkPrereqs('."'dep','$item','$prereqs{$item}','$binname'".');'; + } elsif ($revreqs{$item}) { + for (my $i=0; $i<@bincats; $i++) { + if ($bincats[$i] eq $probcat{$item}) { + $binname = 'bin'.$i; + last; + } + } + $output .= 'checkPrereqs('."'pre','$revreqs{$item}','$item','$binname'".');'; + } + $output .= '" />'. ''; } @@ -369,9 +405,16 @@ sub chosen_to_map { for (my $idx=0;$idx<=$#allprobs;$idx++) { my $residx=$idx+1; if ($chosenproblems{$allprobs[$idx]}) { + my $url = &LONCAPA::map::qtunescape(&fullurl($allprobs[$idx])); + if (($revreqs{$allprobs[$idx]}) && + ($chosenproblems{$revreqs{$allprobs[$idx]}})) { + my $probnum = $allprobs[$idx].'_'.$revreqs{$allprobs[$idx]}; + $url = &LONCAPA::map::qtunescape(&fullurl($probnum)); + } elsif ($prereqs{$allprobs[$idx]}) { + next; + } push(@LONCAPA::map::order,$residx); $counter ++; - my $url = &LONCAPA::map::qtunescape(&fullurl($allprobs[$idx])); my $name = &LONCAPA::map::qtunescape('Problem '.$counter); $LONCAPA::map::resources[$residx]=join(':', ($name, $url, 'false', 'normal', 'res')); } @@ -381,9 +424,15 @@ sub chosen_to_map { sub map_to_chosen { @chosen=(); foreach my $idx (@LONCAPA::map::order) { - my ($title,$url)=split(':',$LONCAPA::map::resources[$LONCAPA::map::order[$idx]]); + my ($title,$url)=split(':',$LONCAPA::map::resources[$idx]); + my $item; unless ($url eq '') { - push(@chosen,$allprobs[$idx-1]); + $item = &item_from_url($url); + if (($item =~ /^(\d+)_(\d+)$/) && ($prereqs{$2} eq $1)) { + push(@chosen,($1,$2)); + } else { + push(@chosen,$item); + } } } if (($env{'form.concepttest'} eq 'defchosen') || @@ -400,9 +449,16 @@ sub store { my @errors=&checkvalid(); if (@errors > 0) { if (($caller eq 'requestcrs') && ($env{'form.concepttest'} eq 'defchosen')) { - return 'Invalid concept test.'; + return &mt('Invalid concept test.'); } else { - return; + my $errormsg = ''.&mt('Invalid concept test:'); + if (@errors > 1) { + $errormsg .= ''; + } else { + $errormsg .= '
'.$errors[0]; + } + $errormsg .= '
'; + return $errormsg; } } &chosen_to_map(); @@ -518,6 +574,58 @@ sub builder_javascript { show => 'Show', hide => 'Hide', ); + my $prereqjs = " +function checkPrereqs(caller,item,prereq,binname) { + var changedPrereq = 0; + if (document.selecteditems.elements['item'+item].checked == false) { + return; + } else { + if (!document.selecteditems.elements['item'+prereq].checked) { + document.selecteditems.elements['item'+prereq].checked = true; + changedPrereq = 1; + countChecked(binname); + } + } +"; + + my ($hasdep,$prereq,$hasdeptitle,$prereqtitle) = ('','','',''); + foreach my $item (sort(keys(%prereqs))) { + $hasdep .= "'$item',"; + $prereq .= "'$prereqs{$item}',"; + my $url = &fullurl($item); + $hasdeptitle .= "'".&Apache::lonnet::metadata($url,'title')."',"; + my $purl = &fullurl($prereqs{$item}); + $prereqtitle .= "'".&Apache::lonnet::metadata($purl,'title')."',"; + } + $hasdep =~ s/,$//; + $prereq =~ s/,$//; + $hasdeptitle =~ s/,$//; + $prereqtitle =~ s/,$//; + + $prereqjs .= <<"ENDFN"; + + var hasDeps = Array($hasdep); + var preReqs = Array($prereq); + var hasDepTitles = Array($hasdeptitle); + var preReqTitles = Array($prereqtitle); + for (var i=0; i