--- loncom/homework/lonhomework.pm 2007/07/23 23:30:47 1.268
+++ loncom/homework/lonhomework.pm 2007/11/10 01:38:21 1.283
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# The LON-CAPA Homework handler
#
-# $Id: lonhomework.pm,v 1.268 2007/07/23 23:30:47 albertel Exp $
+# $Id: lonhomework.pm,v 1.283 2007/11/10 01:38:21 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';
@@ -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;
}
@@ -724,11 +747,14 @@ sub analyze_header {
';
&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 80) { $cols = 80; }
if ($cols < 70) { $cols = 70; }
if ($rows < 20) { $rows = 20; }
+ my $js =
+ &Apache::edit::js_change_detection().
+ &Apache::loncommon::resize_textarea_js();
+ my $only_body = ($env{'environment.remote'} eq 'off')? 0 : 1;
my $start_page =
- &Apache::loncommon::start_page(&mt("EditXML [_1]",$file),
- &Apache::edit::js_change_detection(),
- {'no_auto_mt_title' => 1,});
+ &Apache::loncommon::start_page(&mt("EditXML [_1]",$file),$js,
+ {'no_auto_mt_title' => 1,
+ 'only_body' => $only_body,
+ 'add_entries' => {
+ 'onresize' => q[resize_textarea('LC_editxmltext','LC_aftertextarea')],
+ 'onload' => q[resize_textarea('LC_editxmltext','LC_aftertextarea')],
+ }});
$result.=$start_page.
&renderpage($request,$file,['no_output_web'],1).
- &Apache::lonxml::message_location().'
- '.&Apache::loncommon::end_page();
&Apache::lonxml::add_messages(\$result);
$request->print($result);
@@ -939,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') {
@@ -970,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,'<>&"');
@@ -1023,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");
@@ -1038,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.")."