--- loncom/homework/structuretags.pm 2003/11/04 20:09:18 1.223
+++ loncom/homework/structuretags.pm 2004/12/11 18:10:49 1.277
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# definition of tags that give a structure to a document
#
-# $Id: structuretags.pm,v 1.223 2003/11/04 20:09:18 sakharuk Exp $
+# $Id: structuretags.pm,v 1.277 2004/12/11 18:10:49 banghart Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -25,9 +25,7 @@
#
# http://www.lon-capa.org/
#
-# 2/19 Guy
-# 6/26/2001 fixed extra web display at end of
The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.
More information about this error may be available in the server error log.
\n"; - } - } elsif ($status eq 'SHOW_ANSWER' || $status eq 'CANNOT_ANSWER' || - $status eq 'UNCHECKEDOUT' || $status eq 'INVALID_ACCESS') { - if ($target ne 'tex' && - $ENV{'form.answer_output_mode'} ne 'tex') { - $result.="\n"; - } + if ($target ne 'tex' && + $ENV{'form.answer_output_mode'} ne 'tex') { + $result.=""; + $result.=&Apache::lonhtmlcommon::htmlareaselectactive(@Apache::lonxml::htmlareafields); + $result.="\n"; } if ($target eq 'web') { $result.=&Apache::lonxml::xmlend(); @@ -556,11 +674,16 @@ sub end_problem { if (not $ENV{'form.problem_split'}=~/yes/) { $endminipage = '\end{minipage}'; } - $result .= '\keephidden{ENDOFPROBLEM}\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}'; - if (not $ENV{'request.symb'} =~ m/\.page_/) { - $result .= $endminipage.'\end{document} '; + if ($ENV{'form.print_discussions'} eq 'yes') { + $result.=&Apache::lonxml::xmlend($target,$parser); + $result=~s/<\/html>//; } else { - $result .= ''; + $result .= '\keephidden{ENDOFPROBLEM}\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}'; + if (not $ENV{'request.symb'} =~ m/\.page_/) { + $result .= $endminipage.'\end{document} '; + } else { + $result .= ''; + } } } } @@ -579,6 +702,7 @@ sub end_problem { $result=&Apache::response::mandatory_part_meta; } $result.=&Apache::response::meta_part_order(); + $result.=&Apache::response::meta_response_order(); } elsif ($target eq 'edit') { &Apache::lonxml::debug("in end_problem with $target, edit"); $result = &problem_edit_footer(); @@ -597,7 +721,10 @@ sub end_problem { sub start_library { my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; my ($result,$head_tag_start,$body_tag_start,$form_tag_start); - if ($$tagstack[0] eq 'library') { &init_problem_globals('library') }; + if ($$tagstack[0] eq 'library') { + &init_problem_globals('library'); + $Apache::lonhomework::type='problem'; + } if ($target eq 'edit') { ($result,$head_tag_start,$body_tag_start,$form_tag_start)= &page_start($target,$token,$tagstack,$parstack,$parser,$safeeval); @@ -764,7 +891,7 @@ sub start_instructorcomment { if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' || $target eq 'tex' || $target eq 'analyze') { $result=($ENV{'request.role'}=~/^(in|cc|au|ca|li)/); - if ( ! $result ) { + if ( (! $result) or ($ENV{'form.instructor_comments'} eq 'hide')) { my $skip=&Apache::lonxml::get_all_text("/instructorcomment", $parser,$style); &Apache::lonxml::debug("skipping ahead :$skip: $$parser[-1]"); @@ -834,13 +961,13 @@ sub end_while { while ($return) { if (time-$starttime > $Apache::lonnet::perlvar{'lonScriptTimeout'}) { - $return = 0; $error=1; next; + #$return = 0; $error=1; next; } $result.=&Apache::scripttag::xmlparse($bodytext); $return = &Apache::run::run($code,$safeeval); } if ($error) { - &Apache::lonxml::error('
'.&mt('Code ran too long. It ran for more than').' '.$Apache::lonnet::perlvar{'lonScriptTimeout'}.' '.&mt('seconds occured while running <while$gt; on line').' '.$line.'
'); + &Apache::lonxml::error('
'.&mt('Code ran too long. It ran for more than').' '.$Apache::lonnet::perlvar{'lonScriptTimeout'}.' '.&mt('seconds occured while running <while> on line').' '.$line.'
');
}
} elsif ($target eq "edit") {
$result.= &Apache::edit::tag_end($target,$token,'');
@@ -912,12 +1039,13 @@ sub shuffle {
my $a=shift;
my $i;
if (defined(@$a)) {
- &Apache::response::setrandomnumber();
+ &Apache::response::pushrandomnumber();
for($i=@$a;--$i;) {
my $j=int(&Math::Random::random_uniform() * ($i+1));
next if $i == $j;
@$a[$i,$j] = @$a[$j,$i];
}
+ &Apache::response::poprandomnumber();
}
}
@@ -941,14 +1069,19 @@ sub start_part {
@Apache::inputtags::response=();
@Apache::inputtags::previous=();
@Apache::inputtags::previous_version=();
- $Apache::lonhomework::problemstatus=
- &Apache::lonnet::EXT("resource.$id.problemstatus");
+ $Apache::lonhomework::problemstatus=&get_problem_status($id);
my $hidden=&Apache::loncommon::check_if_partid_hidden($Apache::inputtags::part);
+ my $newtype=&Apache::lonnet::EXT("resource.$id.type");
+ if ($newtype) { $Apache::lonhomework::type=$newtype; }
+
my $expression='$external::part=\''.$Apache::inputtags::part.'\';';
+ $expression.='$external::type=\''.$Apache::lonhomework::type.'\';';
&Apache::run::run($expression,$safeeval);
if ($target eq 'meta') {
- return &Apache::response::mandatory_part_meta;
+ my $display=&Apache::lonxml::get_param('display',$parstack,$safeeval);
+ return &Apache::response::mandatory_part_meta.
+ &Apache::response::meta_parameter_write('display','string',$display,'Part Description');
} elsif ($target eq 'web' || $target eq 'grade' ||
$target eq 'answer' || $target eq 'tex') {
if ($hidden) {
@@ -959,8 +1092,12 @@ sub start_part {
my $expression='$external::datestatus="'.$status.'";';
$expression.='$external::gradestatus="'.$Apache::lonhomework::history{"resource.$id.solved"}.'";';
&Apache::run::run($expression,$safeeval);
+ if ($ENV{'request.state'} eq 'construct') {
+ &set_problem_state($Apache::inputtags::part);
+ }
if (( $status eq 'CLOSED' ) ||
( $status eq 'UNCHECKEDOUT') ||
+ ( $status eq 'NOT_YET_VIEWED') ||
( $status eq 'BANNED') ||
( $status eq 'UNAVAILABLE') ||
( $status eq 'INVALID_ACCESS')) {
@@ -977,18 +1114,28 @@ sub start_part {
} else {
if ($target eq 'tex') {
if (not $ENV{'form.problem_split'}=~/yes/) {
- $result.='\noindent \end{minipage}\vskip 0 mm \noindent \begin{minipage}{\textwidth}\noindent';
+ if ($$tagstack[-2] eq 'td') {
+ $result.='\vskip 0 mm \noindent \begin{minipage}{\textwidth}\noindent';
+ } else {
+ $result.='\noindent \end{minipage}\vskip 0 mm \noindent \begin{minipage}{\textwidth}\noindent';
+ }
}
my $weight = &Apache::lonnet::EXT("resource.$id.weight");
- my $allkeys=&Apache::lonnet::metadata($ENV{'request.uri'},'keys');
+ my $allkeys=&Apache::lonnet::metadata($ENV{'request.uri'},'packages');
my @allkeys = split /,/,$allkeys;
my $allow_print_points = 0;
foreach my $partial_key (@allkeys) {
- if ($partial_key=~m/\_(\d*)\_weight/) {
+ if ($partial_key=~m/^part_(.*)$/) {
if ($1 ne '0') {$allow_print_points=1;}
}
}
+ my $maxtries = &Apache::lonnet::EXT("resource.$id.maxtries");
+ if (defined($maxtries) && $maxtries < 0) {
+ $allow_print_points=0;
+ }
if (($Apache::lonhomework::type eq 'exam') && ($allow_print_points)) { $result .= '\fbox{\textit{'.$weight.' pt}}';}
+ } elsif ($target eq 'web') {
+ $result.='';
}
}
}
@@ -996,11 +1143,15 @@ sub start_part {
$result.=&Apache::edit::tag_start($target,$token);
$result.=&Apache::edit::text_arg('Part ID:','id',$token).
&Apache::loncommon::help_open_topic("Part_Tag_Edit_Help").
+ ' '.
+&Apache::edit::text_arg('Displayed Part Description:','display',$token).
&Apache::edit::end_row().&Apache::edit::start_spanning_row();
} elsif ($target eq 'modified') {
my $constructtag=&Apache::edit::get_new_args($token,$parstack,
- $safeeval,'id');
+ $safeeval,'id','display');
if ($constructtag) {
+ #limiting ids to only letters numbers, and space
+ $token->[2]->{'id'}=~s/[^A-Za-z0-9 ]//gs;
$result = &Apache::edit::rebuild_tag($token);
$result.=&Apache::edit::handle_insert();
}
@@ -1016,8 +1167,14 @@ sub end_part {
my $result='';
if ( $target eq 'meta' ) {
$result='';
- } elsif ( $target eq 'grade' && $status eq 'CAN_ANSWER' && !$hidden) {
- $result=&Apache::inputtags::grade;
+ } elsif ($target eq 'grade') {
+ if (($status eq 'CAN_ANSWER' || $Apache::lonhomework::scantronmode) &&
+ !$hidden) {
+ $result=&Apache::inputtags::grade;
+ } else {
+ # move any submission data to .hidden
+ &Apache::inputtags::hidealldata($Apache::inputtags::part);
+ }
} elsif (($target eq 'web' || $target eq 'tex') && !$hidden ) {
my $gradestatus=&Apache::inputtags::gradestatus($Apache::inputtags::part,
$target);
@@ -1025,6 +1182,7 @@ sub end_part {
$gradestatus='';
}
$result=$gradestatus;
+ if ($$tagstack[-2] eq 'td' and $target eq 'tex') {$result.='\end{minipage}';}
} elsif ($target eq 'edit') {
$result=&Apache::edit::end_table();
}
@@ -1036,9 +1194,10 @@ sub end_part {
sub start_preduedate {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' || $target eq 'tex') {
+ &Apache::lonxml::debug("State in preduedate is ". $Apache::inputtags::status['-1']);
if ($Apache::inputtags::status['-1'] ne 'CAN_ANSWER' &&
- $Apache::inputtags::status['-1'] ne 'CANNOT_ANSWER' &&
- $Apache::inputtags::status['-1'] ne 'SHOW_ANSWER') {
+ $Apache::inputtags::status['-1'] ne 'CANNOT_ANSWER') {
+ &Apache::lonxml::debug("Wha? ". ($Apache::inputtags::status['-1'] ne 'SHOW_ANSWER'));
&Apache::lonxml::get_all_text("/preduedate",$parser);
}
}
@@ -1051,12 +1210,12 @@ sub end_preduedate {
sub start_postanswerdate {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
- if ($target eq 'web' || $target eq 'grade' || $target eq 'tex') {
+ if ($target eq 'web' || $target eq 'grade') {
if ($Apache::inputtags::status['-1'] ne 'SHOW_ANSWER') {
&Apache::lonxml::get_all_text("/postanswerdate",$parser);
}
} elsif ($target eq 'tex') {
- return '\vskip 0 mm \noindent';
+ &Apache::lonxml::get_all_text("/postanswerdate",$parser);
}
return '';
}
@@ -1071,7 +1230,8 @@ sub start_notsolved {
$target eq 'tex') {
my $gradestatus=$Apache::lonhomework::history{"resource.$Apache::inputtags::part.solved"};
&Apache::lonxml::debug("not solved has :$gradestatus:");
- if ($gradestatus =~ /^correct/) {
+ if ($gradestatus =~ /^correct/ &&
+ &Apache::response::show_answer()) {
&Apache::lonxml::debug("skipping");
&Apache::lonxml::get_all_text("/notsolved",$parser);
}
@@ -1088,7 +1248,8 @@ sub start_solved {
if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
$target eq 'tex') {
my $gradestatus=$Apache::lonhomework::history{"resource.$Apache::inputtags::part.solved"};
- if ($gradestatus !~ /^correct/) {
+ if ($gradestatus !~ /^correct/ ||
+ !&Apache::response::show_answer()) {
&Apache::lonxml::get_all_text("/solved",$parser);
}
}
@@ -1099,6 +1260,48 @@ sub end_solved {
return '';
}
+sub start_problemtype {
+ my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
+ my $result;
+ if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
+ $target eq 'tex' || $target eq 'analyze') {
+ my $mode=lc(&Apache::lonxml::get_param('mode',$parstack,$safeeval));
+ if (!defined($mode)) { $mode='show'; }
+ my $for=&Apache::lonxml::get_param('for',$parstack,$safeeval);
+ my $found=0;
+ foreach my $type (split(',',$for)) {
+ if ($Apache::lonhomework::type eq lc($type)) { $found=1; }
+ }
+ if ($mode eq 'show' && !$found) {
+ &Apache::lonxml::get_all_text("/problemtype",$parser);
+ }
+ if ($mode eq 'hide' && $found) {
+ &Apache::lonxml::get_all_text("/problemtype",$parser);
+ }
+ } elsif ($target eq 'edit') {
+ $result .=&Apache::edit::tag_start($target,$token);
+ $result.=&Apache::edit::select_arg('Mode:','mode',
+ [['show','Show'],
+ ['hide','Hide']]
+ ,$token);
+ $result .=&Apache::edit::checked_arg('When used as type(s):','for',
+ [ ['exam','Exam/Quiz Problem'],
+ ['survey','Survey'],
+ ['problem','Homework Problem'] ]
+ ,$token);
+ $result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
+ } elsif ($target eq 'modified') {
+ my $constructtag=&Apache::edit::get_new_args($token,$parstack,
+ $safeeval,'mode','for');
+ if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
+ }
+ return $result;
+}
+
+sub end_problemtype {
+ return '';
+}
+
sub start_startouttext {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
my @result=(''.'');
@@ -1122,7 +1325,7 @@ sub end_startouttext {
&Apache::edit::end_row().
&Apache::edit::start_spanning_row()."\n"
. &Apache::loncommon::helpLatexCheatsheet () .
- &Apache::edit::editfield($token->[1],$text,"",80,4);
+ &Apache::edit::editfield($token->[1],$text,"",80,8,1);
}
if ($target eq 'modified') {
$result='
'. - ''.&mt('Simple Problem Editor').' - '.&mt('Note: it can take up to 10 minutes for changes to take effect for all users.'). + ''.&mt('Edit').' - '.&mt('Note: it can take up to 10 minutes for changes to take effect for all users.'). &Apache::loncommon::help_open_topic('Caching').' |
'; } return $result;