# The LearningOnline Network # Simple Problem Parameter Setting "Editor" # # $Id: lonsimpleproblemedit.pm,v 1.30 2009/12/02 18:33:20 bisitz Exp $ # # Copyright Michigan State University Board of Trustees # # This file is part of the LearningOnline Network with CAPA (LON-CAPA). # # LON-CAPA is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # LON-CAPA is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with LON-CAPA; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # /home/httpd/html/adm/gpl.txt # # http://www.lon-capa.org/ # package Apache::lonsimpleproblemedit; use strict; use Apache::Constants qw(:common :http); use Apache::loncommon; use Apache::lonnet; use Apache::lonlocal; use Apache::lonnavmaps; use lib '/home/httpd/lib/perl/'; use LONCAPA; my %qparms; my $prefix; my $qtype; sub evaloptionhash { my $options=shift; $options=~s/^\(\'//; $options=~s/\'\)$//; my %returnhash=(); foreach (split(/\'\,\'/,$options)) { $returnhash{$_}=$_; } return %returnhash; } sub rawrendering { my ($symb)=@_; my %data=('show_errors'=>'on', 'simple_edit_button' => 'off', 'devalidatecourseresdata'=>'on'); return &Apache::loncommon::get_student_view($symb,time,time, $env{'request.course.id'}, 'web',\%data); } sub questiontext { my $text=$qparms{$prefix.'questiontext'}; my $qt=&mt('Question Text'); my $spell_link= &Apache::lonhtmlcommon::spelllink('simpleedit','questiontext'); return (< $qt

$spell_link
ENDQUESTION } sub hint { my $text=$qparms{$prefix.'hinttext'}; my $ht=&mt('Hint Text'); my $spell_link= &Apache::lonhtmlcommon::spelllink('simpleedit','hinttext'); return (< $ht

$spell_link
ENDHINT } sub script { my $text=$qparms{$prefix.'numericalscript'}; my $ht=&mt('Scripting (optional)'); return (< $ht

ENDSCRIPT } sub foil { my $number=shift; my %values=''; if ($qtype eq 'radio') { %values=('true' => 'True', 'false' => 'False'); } elsif ($qtype eq 'option') { %values=&evaloptionhash($qparms{$prefix.'options'}); } $values{'unused'}='Not shown, not used'; my $value=$qparms{$prefix.'value'.$number}; unless (defined($value)) { $value='unused'; } unless ($values{$value}) { $value='unused'; } my $position=$qparms{$prefix.'position'.$number}; my %positions=('random' => 'Random position', 'top' => 'Show always at top position', 'bottom' => 'Show always at bottom position'); unless (defined($position)) { $position='random'; } unless ($positions{$position}) { $position='random'; } my $selectvalue=&Apache::loncommon::select_form( $value, 'value'.$number, &Apache::lonlocal::texthash(%values)); my $selectposition=&Apache::loncommon::select_form( $position, 'position'.$number, &Apache::lonlocal::texthash(%positions)); my $text=$qparms{$prefix.'text'.$number}; my %lt=&Apache::lonlocal::texthash('foil' => 'Foil', 'value' => 'Value', 'pos' => 'Position', 'text' => 'Text'); my $spell_link= &Apache::lonhtmlcommon::spelllink('simpleedit',"text$number"); return (< $lt{'foil'} $lt{'value'}: $selectvalue$lt{'pos'}: $selectposition $lt{'text'}:

$spell_link
ENDFOIL } sub get_parent_uri { my ($cur_symb)=@_; my $navmap = Apache::lonnavmaps::navmap->new(); if (defined($navmap)) { my $it = $navmap->getIterator(undef, undef, undef, 1); while ( my $res=$it->next()) { if (ref($res) && $res->symb() eq $cur_symb) { last; } } my ($src,$symb,$anchor)=&Apache::lonnavmaps::getLinkForResource($it->getStack()); if (defined($anchor)) { $anchor='#'.$anchor; } return $src.'?symb='.&escape($symb).$anchor; } return; } sub handler { my $r = shift; if ($r->header_only) { &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; return OK; } # -------------------------------------------------------------------- Allowed? unless (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) { return HTTP_NOT_ACCEPTABLE; } # ----------------------------------------------------------------- Send header &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; # ----------------------------------------------------- Figure out where we are my $uri=$r->uri; $uri=~s/\/smpedit$//; my $symb=&Apache::lonnet::symbread(); # ------------------------------------------------ Prefix for everything stored $prefix=$env{'request.course.id'}.'.'.$symb.'.0.'; #------------------------------------------------- Prefix for storing weight of Problem Parts my $weightprefix=$env{'request.course.id'}.'.'.$symb.'.'; # ---------------------------------------------------------- Anything to store? if (($symb) && (defined($env{'form.questiontype'}))) { my %storecontent=(); undef %storecontent; if ($env{'form.questiontype'} eq 'option') { my %curoptions=&evaloptionhash($env{'form.options'}); if ($env{'form.delopt'}) { delete $curoptions{$env{'form.delopt'}}; } if ($env{'form.newopt'}) { $env{'form.newopt'}=~s/\'/\\\'/g; $curoptions{$env{'form.newopt'}}=$env{'form.newopt'}; } $env{'form.options'}="('".join("','",keys %curoptions)."')"; } $env{'form.hiddenparts'}='!'.$env{'form.questiontype'}; foreach (keys %env) { if ($_=~/^form\.(\w+)$/) { my $parm=$1; $storecontent{$prefix.$parm}=$env{'form.'.$parm}; $storecontent{$prefix.$parm}=~s/^\s+//s; $storecontent{$prefix.$parm}=~s/\s+$//s; } } # ---------------------------------------------------- Set weights of hidden parts to zero # ------------------------------------------------------ and used part to 1 $storecontent{$weightprefix.'essay.weight'}=0; $storecontent{$weightprefix.'numerical.weight'}=0; $storecontent{$weightprefix.'option.weight'}=0; $storecontent{$weightprefix.'radio.weight'}=0; $storecontent{$weightprefix.'string.weight'}=0; $storecontent{$weightprefix.$env{'form.questiontype'}.'.weight'}=1; my $reply=&Apache::lonnet::cput ('resourcedata',\%storecontent, $env{'course.'.$env{'request.course.id'}.'.domain'}, $env{'course.'.$env{'request.course.id'}.'.num'}); &Apache::lonnet::devalidatecourseresdata( $env{'course.'.$env{'request.course.id'}.'.num'}, $env{'course.'.$env{'request.course.id'}.'.domain'}); } # ------------------------------------------------------------------- Read Data %qparms=&Apache::lonnet::dump('resourcedata', $env{'course.'.$env{'request.course.id'}.'.domain'}, $env{'course.'.$env{'request.course.id'}.'.num'}, $env{'request.course.id'}.'.'.$symb); # ------------------------------------------------------------ Print the screen my $spell_header=&Apache::lonhtmlcommon::spellheader(); $r->print(&Apache::loncommon::start_page('Simple Problem Editor', $spell_header)); if ($symb) { my $title='

'.&Apache::lonnet::gettitle($symb).'

'; my $displaylink = &get_parent_uri($symb); if ($displaylink ne '') { my $functions=&Apache::lonhtmlcommon::start_funclist() .&Apache::lonhtmlcommon::add_item_funclist( '' .&mt('Student View').'') .&Apache::lonhtmlcommon::end_funclist(); $r->print(&Apache::loncommon::head_subbox($functions) .$title); } else { $r->print($title .'

' .&mt('An error occurred retrieving the link to this problem.') .'
' .&mt('You may need to [_1]re-select the course[_2] and then return to this resource to view it.' ,'','') .'

' ); } $r->print('

' .&mt('Note: it can take up to 10 minutes for changes to take effect for all users.') .&Apache::loncommon::help_open_topic('Caching') .'

' ); $r->print( '
' .&rawrendering($symb) .'
' ); $r->print('
'); # Question Type my %questiontypes=( 'radio' => '1 out of N multiple choice (radio button)', 'option' => 'Option Response', 'string' => 'Short string response', 'essay' => 'Essay, open end', 'numerical' => 'Numerical Response'); $qtype=$qparms{$prefix.'questiontype'}; unless (defined($qtype)) { $qtype='radio'; } unless ($questiontypes{$qtype}) { $qtype='radio'; } $r->print( '
' .''.&mt('Question Type').'' .&Apache::loncommon::select_form( $qtype, 'questiontype', &Apache::lonlocal::texthash(%questiontypes)) .'
' ); $r->print( '

' .'' .'

' ); # Script if ($qtype eq 'numerical') { $r->print(&script()); } # Question Text $r->print(&questiontext()); # Radio, Option === if (($qtype eq 'radio') || ($qtype eq 'option')) { # Response my $maxfoils=$qparms{$prefix.'maxfoils'}; unless (defined($maxfoils)) { $maxfoils=10; } unless ($maxfoils=~/^\d+$/) { $maxfoils=10; } if ($maxfoils<=0) { $maxfoils=10; } my %randomizes=( 'yes' => 'Display foils in random order', 'no' => 'Display foils in order given'); my $randomize=$qparms{$prefix.'randomize'}; unless (defined($randomize)) { $randomize='yes'; } unless ($randomizes{$randomize}) { $randomize='yes'; } $r->print( ''. '
'.&mt('Max number of foils displayed'). ':   '. &Apache::loncommon::select_form( $randomize, 'randomize', &Apache::lonlocal::texthash(%randomizes)). '
'); # Option Response: Options if ($qtype eq 'option') { my $options=$qparms{$prefix.'options'}; unless (defined($options)) { $options="('true','false')"; } my %optionshash=&evaloptionhash($options); $r->print( ''. '
'.&mt('Add new option').': '. ''. &mt('Delete an option').': '. &Apache::loncommon::select_form('','delopt',('' => '',%optionshash)). '
'); } # Foils for (my $i=1;$i<=10;$i++) { $r->print(&foil($i)); } # End Options if ($qtype eq 'option') { $r->print('
'); } # End Response $r->print('

'); # Hint $r->print(&hint()); } if ($qtype eq 'string') { my %stringtypes=( 'cs' => 'Case sensitive', 'ci' => 'Case Insensitive', 'mc' => 'Multiple Choice, Order of characters unchecked'); my $stringanswer=$qparms{$prefix.'stringanswer'}; unless (defined($stringanswer)) { $stringanswer=''; } my $stringtype=$qparms{$prefix.'stringtype'}; unless (defined($stringtype)) { $stringtype='cs'; } unless ($stringtypes{$stringtype}) { $stringtype='cs'; } $r->print( ''. '
  '. &Apache::loncommon::select_form( $stringtype, 'stringtype', &Apache::lonlocal::texthash(%stringtypes)). '

'); # Hint $r->print(&hint()); } if ($qtype eq 'numerical') { my $numericalanswer=$qparms{$prefix.'numericalanswer'}; unless (defined($numericalanswer)) { $numericalanswer=''; } my $numericaltolerance=$qparms{$prefix.'numericaltolerance'}; unless (defined($numericaltolerance)) { $numericaltolerance='5%'; } my $numericalsigfigs=$qparms{$prefix.'numericalsigfigs'}; unless (defined($numericalsigfigs)) { $numericalsigfigs='1,15'; } $r->print( ''. '
  '. '  '. '  '. '  '. ''. '

'); $r->print(&hint()); } # Store Button $r->print( '
'); } else { $r->print(&mt('Could not identify problem.')); } $r->print(&Apache::loncommon::end_page()); return OK; } 1; __END__