--- loncom/homework/lonhomework.pm 2007/08/18 00:01:45 1.269 +++ loncom/homework/lonhomework.pm 2007/11/03 00:52:06 1.282 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # The LON-CAPA Homework handler # -# $Id: lonhomework.pm,v 1.269 2007/08/18 00:01:45 albertel Exp $ +# $Id: lonhomework.pm,v 1.282 2007/11/03 00:52:06 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'); @@ -188,7 +210,6 @@ sub proctor_checked_in { return 0; } -$Apache::lonxml::browse=''; sub check_ip_acc { my ($acc)=@_; &Apache::lonxml::debug("acc is $acc"); @@ -196,7 +217,8 @@ sub check_ip_acc { return 1; } my $allowed=0; - my $ip=$ENV{'REMOTE_ADDR'}; + my $ip=$env{'request.host'} || $ENV{'REMOTE_ADDR'}; + my $name; foreach my $pattern (split(',',$acc)) { $pattern =~ s/^\s*//; @@ -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'; @@ -724,11 +746,14 @@ sub analyze_header {
'. &Apache::structuretags::remember_problem_state().' +
-
+
+ -
+
+
'; &Apache::lonxml::add_messages(\$result); $request->print($result); @@ -788,12 +813,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 1, - 'only_body' => 1, + 'only_body' => $only_body, 'add_entries' => { 'onresize' => q[resize_textarea('LC_editxmltext','LC_aftertextarea')], 'onload' => q[resize_textarea('LC_editxmltext','LC_aftertextarea')], @@ -875,26 +939,35 @@ sub editxmlmode { $result.=$start_page. &renderpage($request,$file,['no_output_web'],1). - &Apache::lonxml::message_location().' -
'. &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); @@ -950,7 +1023,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') { @@ -981,52 +1054,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,'<>&"'); @@ -1034,9 +1109,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"); @@ -1049,16 +1121,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 {