--- loncom/homework/lonhomework.pm 2007/08/24 22:58:18 1.272 +++ loncom/homework/lonhomework.pm 2007/11/13 23:26:08 1.284 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # The LON-CAPA Homework handler # -# $Id: lonhomework.pm,v 1.272 2007/08/24 22:58:18 albertel Exp $ +# $Id: lonhomework.pm,v 1.284 2007/11/13 23:26:08 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -49,11 +49,11 @@ use Apache::matchresponse(); use Apache::chemresponse(); use Apache::drawimage(); use Apache::Constants qw(:common); -use HTML::Entities(); use Apache::loncommon(); use Apache::lonlocal; use Time::HiRes qw( gettimeofday tv_interval ); -use Apache::lonnet(); +use HTML::Entities(); +use File::Copy(); # FIXME - improve commenting @@ -63,6 +63,28 @@ BEGIN { } +=pod + +=item set_bubble_lines() + +Called at analysis time to set the bubble lines +hash for the problem.. This should be called in the +end_problemtype tag in analysis mode. + +We fetch the hash of part id counters from lonxml + and push them into analyze:{part_id.bubble_lines}. + +=cut + +sub set_bubble_lines { + my %bubble_counters = &Apache::lonxml::get_bubble_line_hash(); + + foreach my $key (keys(%bubble_counters)) { + $Apache::lonhomework::analyze{"$key.bubble_lines"} = + $bubble_counters{"$key"}; + } +} + # # Decides what targets to render for. # Implicit inputs: @@ -127,7 +149,7 @@ sub get_target { } elsif ( $env{'form.problemmode'} eq &mt('Edit') || $env{'form.problemmode'} eq 'Edit') { if ( $env{'form.submitted'} eq 'edit' ) { - if ( $env{'form.submit'} eq &mt('Submit Changes and View') ) { + if ( $env{'form.submit'} eq &mt('Save and View') ) { return ('modified','web','answer'); } else { return ('modified','no_output_web','edit'); @@ -376,8 +398,8 @@ sub check_access { if ($env{'request.state'} eq "construct") { if ($env{'form.problemstate'}) { if ($env{'form.problemstate'} =~ /^CANNOT_ANSWER/) { - if ( ! ($env{'form.problemstate'} eq 'CANNOT_ANSWER_correct' && - lc($Apache::lonhomework::problemstatus) eq 'no')) { + if ( ! ($env{'form.problemstate'} eq 'CANNOT_ANSWER_correct' + && &hide_problem_status())) { return ('CANNOT_ANSWER', &mt('is in this state due to author settings.')); } @@ -436,7 +458,7 @@ sub check_access { $date = &mt("an indeterminate date"); $passed = 0; } else { if (time < $date) { $passed = 0; } else { $passed = 1; } - $date = localtime $date; + $date = &Apache::lonlocal::locallocaltime($date); } if (!$passed) { $type=$temp; last; } } @@ -467,7 +489,7 @@ sub check_access { # if (correct and show prob status) or excused then CANNOT_ANSWER if(($Apache::lonhomework::history{"resource.$id.solved"}=~/^correct/ && - lc($Apache::lonhomework::problemstatus) ne 'no') + &show_problem_status()) || $Apache::lonhomework::history{"resource.$id.solved"}=~/^excused/) { $status = 'CANNOT_ANSWER'; @@ -521,7 +543,8 @@ sub due_date { &Apache::lonxml::debug("looking for first_access $first_access"); if (defined($first_access)) { $interval = $first_access+$interval; - $date = ($interval < $due_date)? $interval : $due_date; + $date = (!$due_date || $interval < $due_date) ? $interval + : $due_date; } else { $date = $due_date; } @@ -661,9 +684,9 @@ sub handle_save_or_undo { my $error=0; if ($env{'form.Undo'} eq &mt('undo')) { my $error=0; - if (!copy($file,$filetmp)) { $error=1; } - if ((!$error) && (!copy($filebak,$file))) { $error=1; } - if ((!$error) && (!move($filetmp,$filebak))) { $error=1; } + if (!&File::Copy::copy($file,$filetmp)) { $error=1; } + if ((!$error) && (!&File::Copy::copy($filebak,$file))) { $error=1; } + if ((!$error) && (!&File::Copy::move($filetmp,$filebak))) { $error=1; } if (!$error) { &Apache::lonxml::info("

". &mt("Undid changes, Switched [_1] and [_2]", @@ -724,11 +747,14 @@ sub analyze_header {

'. &Apache::structuretags::remember_problem_state().' +
-
+
+ -
+
+
'; &Apache::lonxml::add_messages(\$result); $request->print($result); @@ -788,12 +814,20 @@ sub analyze { $i++; } } + if (!keys(%{ $analyze{$part.'.answer'} })) { + my $answer_part = + [''.&mt('Error').'']; + $seedexample{join("\0",$part,0,@{$answer_part})}= + $thisseed; + push( @{ $overall{$part.'.answer'}[0] }, + $answer_part); + } } } } &Apache::lonhtmlcommon::Update_PrgWin($request,\%prog_state, &mt('Analyzing Results')); - $request->print('
'.&mt('List of possible answers').': '); + $request->print('
'.&mt('List of possible answers').': '); foreach my $part (sort(keys(%allparts))) { if (defined(@{ $overall{$part.'.answer'} })) { for (my $i=0;$i'. &Apache::structuretags::remember_problem_state().' - - - - -
- - -
- ' . $xml_help . ' +
+ +
+ '.&mt('Problem Editing').&Apache::loncommon::help_open_topic('Problem_Editor_XML_Index').' + + '.&Apache::loncommon::helpLatexCheatsheet().' +
+
+ + + + +
+
+ + +
+
+ '.&Apache::lonxml::message_location().' +
+ ' . '
- -
'.&Apache::loncommon::end_page(); &Apache::lonxml::add_messages(\$result); @@ -951,7 +1024,7 @@ sub renderpage { &Apache::lonxml::debug("Should be parsing now"); $result .= &Apache::lonxml::xmlparse($request, $target, $problem, &setup_vars($target),%mystyle); - undef($Apache::lonhomework::parsing_a_problem); + &finished_parsing(); if (!$output) { $result = ''; } #$request->print("Result follows:"); if ($target eq 'modified') { @@ -982,52 +1055,54 @@ sub renderpage { } } -# with no arg it returns a HTML \n'; + my $glob_extension = $extension; + if ($extension eq 'survey' || $extension eq 'exam') { + $glob_extension = 'problem'; + } + my @files = glob($Apache::lonnet::perlvar{'lonIncludes'}. + '/templates/*.'.$glob_extension); + @files = map {[$_,&mt(&Apache::lonnet::metadata($_, 'title'))]} (@files); + @files = sort {$a->[1] cmp $b->[1]} (@files); + foreach my $file (@files) { + next if ($file->[1] !~ /\S/); + $result .= + '
'; } return $result; } sub newproblem { my ($request) = @_; - my $extension=$request->uri; - $extension=~s:^.*\.([\w]+)$:$1:; - &Apache::lonxml::debug("Looking for :$extension:"); - my $templatelist=&get_template_list('',$extension); - if ($env{'form.template'} && - $env{'form.template'} ne "Select a $extension template") { - use File::Copy; - my $file = &get_template_list($env{'form.template'},$extension); + + if ($env{'form.template'}) { + my $file = $env{'form.template'}; my $dest = &Apache::lonnet::filelocation("",$request->uri); - copy($file,$dest); + &File::Copy::copy($file,$dest); &renderpage($request,$dest); - } elsif($env{'form.newfile'} && !$templatelist) { - # I don't like hard-coded filenames but for now, this will work. - use File::Copy; + return; + } + + my ($extension) = ($request->uri =~ m/\.(\w+)$/); + &Apache::lonxml::debug("Looking for :$extension:"); + my $templatelist=&get_template_list($extension); + if ($env{'form.newfile'} && !$templatelist) { + # no templates found my $templatefilename = $request->dir_config('lonIncludes').'/templates/blank.'.$extension; &Apache::lonxml::debug("$templatefilename"); my $dest = &Apache::lonnet::filelocation("",$request->uri); - copy($templatefilename,$dest); + &File::Copy::copy($templatefilename,$dest); &renderpage($request,$dest); } else { my $url=&HTML::Entities::encode($request->uri,'<>&"'); @@ -1035,9 +1110,6 @@ sub newproblem { $shownurl=~s-^/~-/priv/-; my $dest = &Apache::lonnet::filelocation("",$request->uri); my $errormsg; - if ($env{'form.newfile'}) { - $errormsg='

'.&mt('You did not select a template.').'

'."\n"; - } my $instructions; my $start_page = &Apache::loncommon::start_page("Create New $extension"); @@ -1050,16 +1122,17 @@ $errormsg

".&mt("To create a new $extension, select a template from the". - "pull-down menu below. Then click on the \"Create $extension\" button.")." + " list below. Then click on the \"Create $extension\" button.")."

"); if (defined($templatelist)) { - $request->print(""); + $request->print($templatelist); } - $request->print("
"); + $request->print('
'); $request->print("

".&Apache::loncommon::end_page()); } - return ''; + return; } sub update_construct_style {