# The LearningOnline Network # Simple Problem Parameter Setting "Editor" # # $Id: lonsimpleproblemedit.pm,v 1.10 2003/12/11 21:23:58 www 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; 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 ($request,$uri)=@_; my $problem=&Apache::lonnet::getfile (&Apache::lonnet::filelocation('',$uri)); &Apache::lonnet::devalidatecourseresdata( $ENV{'course.'.$ENV{'request.course.id'}.'.num'}, $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}); my $uname=$ENV{'user.name'}; my $udom=$ENV{'user.domain'}; $ENV{'user.name'}=time; $ENV{'user.domain'}=time; my $result = &Apache::lonxml::xmlparse($request,'web', $problem); undef($Apache::lonhomework::parsing_a_problem); $ENV{'user.name'}=$uname; $ENV{'user.domain'}=$udom; $result=~s/^.*\]*\>//si; $result=~s/\<\/body[^\>]*\>.*$//si; return $result; } sub questiontext { my $text=$qparms{$prefix.'questiontext'}; my $qt=&mt('Question Text'); return (< $qt

ENDQUESTION } sub hint { my $text=$qparms{$prefix.'hinttext'}; my $ht=&mt('Hint Text'); return (< $ht

ENDHINT } 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,%values); my $selectposition=&Apache::loncommon::select_form ($position,'position'.$number,%positions); my $text=$qparms{$prefix.'text'.$number}; my %lt=&Apache::lonlocal::texthash('foil' => 'Foil', 'value' => 'Value', 'pos' => 'Position', 'text' => 'Text'); return (< $lt{'foil'} $lt{'value'}: $selectvalue$lt{'pos'}: $selectposition $lt{'text'}:

ENDFOIL } 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($uri); # ------------------------------------------------ Prefix for everything stored $prefix=$ENV{'request.course.id'}.'.'.$symb.'.0.'; # ---------------------------------------------------------- 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; } } my $reply=&Apache::lonnet::cput ('resourcedata',\%storecontent, $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}, $ENV{'course.'.$ENV{'request.course.id'}.'.num'}); } # ------------------------------------------------------------------- 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 $r->print(< The LearningOnline Network with CAPA ENDDOCUMENT $r->print(&Apache::loncommon::bodytag('Simple Problem Editor')); if ($symb) { $r->print('

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

'); $r->print('
'. &rawrendering($r,$uri). '

'); $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'); $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',%questiontypes). '

 

'); # 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',%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( ''. '
'.&mt('Correct answer').':   '. &Apache::loncommon::select_form ($stringtype,'stringtype',%stringtypes). '

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