version 1.300, 2008/11/25 13:16:17
|
version 1.309, 2009/03/30 04:49:35
|
Line 25
|
Line 25
|
# |
# |
# http://www.lon-capa.org/ |
# http://www.lon-capa.org/ |
|
|
=pod |
|
|
|
=head1 NAME |
|
|
|
Apache::lonhomework.pm |
|
|
|
=head1 SYNOPSIS |
|
|
|
handles requests for output, evaluation, and |
|
alteration of a homework resource |
|
|
|
This is part of the LearningOnline Network with CAPA project |
|
described at http://www.lon-capa.org. |
|
|
|
|
|
=head1 NOTABLE SUBROUTINES |
|
|
|
=cut |
|
|
|
|
|
package Apache::lonhomework; |
package Apache::lonhomework; |
use strict; |
use strict; |
Line 104 sub set_bubble_lines {
|
Line 85 sub set_bubble_lines {
|
} |
} |
} |
} |
|
|
=pod |
# |
|
# Decides what targets to render for. |
=item get_target() |
# Implicit inputs: |
|
# Various session environment variables: |
Decides what targets to render for. |
# request.state - published - is a /res/ resource |
Implicit inputs: |
# uploaded - is a /uploaded/ resource |
Various session environment variables: |
# contruct - is a /priv/ resource |
request.state - published - is a /res/ resource |
# form.grade_target - a form parameter requesting a specific target |
uploaded - is a /uploaded/ resource |
|
contruct - is a /priv/ resource |
|
form.grade_target - a form parameter requesting a specific target |
|
|
|
=cut |
|
|
|
sub get_target { |
sub get_target { |
&Apache::lonxml::debug("request.state = $env{'request.state'}"); |
&Apache::lonxml::debug("request.state = $env{'request.state'}"); |
if( defined($env{'form.grade_target'})) { |
if( defined($env{'form.grade_target'})) { |
Line 198 sub setup_vars {
|
Line 173 sub setup_vars {
|
sub createmenu { |
sub createmenu { |
my ($which,$request)=@_; |
my ($which,$request)=@_; |
if ($which eq 'grade') { |
if ($which eq 'grade') { |
$request->print('<script language="JavaScript"> |
$request->print('<script type="text/javascript" language="JavaScript"> |
hwkmenu=window.open("/res/adm/pages/homeworkmenu.html","homeworkremote", |
hwkmenu=window.open("/res/adm/pages/homeworkmenu.html","homeworkremote", |
"height=350,width=150,menubar=no"); |
"height=350,width=150,menubar=no"); |
</script>'); |
</script>'); |
Line 322 sub check_slot_access {
|
Line 297 sub check_slot_access {
|
return ('WAITING_FOR_GRADE'); |
return ('WAITING_FOR_GRADE'); |
} |
} |
|
|
# no slot is currently open, and has been checked in for this version |
# Previously used slot is no longer open, and has been checked in for this version. |
# previous slot is therefore CLOSED, so therefore the problem is |
# However, the problem is not closed, and potentially, another slot might be |
|
# used to gain access to it to work on it, until the due date is reached, and the |
|
# problem then becomes CLOSED. Therefore return the slotstatus - |
|
# (which will be NOT_IN_SLOT). |
if (!defined($slot_name) |
if (!defined($slot_name) |
&& $checkedin |
&& $checkedin |
&& $type eq 'problem') { |
&& $type eq 'problem') { |
return ('CLOSED',$datemsg); |
return ($slotstatus); |
} |
} |
|
|
if ($slotstatus eq 'NOT_IN_A_SLOT' |
if ($slotstatus eq 'NOT_IN_A_SLOT' |
Line 356 sub check_slot_access {
|
Line 334 sub check_slot_access {
|
return ($slotstatus,$datemsg,$slot_name,$returned_slot); |
return ($slotstatus,$datemsg,$slot_name,$returned_slot); |
} |
} |
|
|
|
# JB, 9/24/2002: Any changes in this function may require a change |
=pod |
# in lonnavmaps::resource::getDateStatus. |
|
|
=item check_access() |
|
|
|
JB, 9/24/2002: Any changes in this function may require a change |
|
in lonnavmaps::resource::getDateStatus. |
|
|
|
=cut |
|
|
|
sub check_access { |
sub check_access { |
my ($id) = @_; |
my ($id) = @_; |
my $date =''; |
my $date =''; |
Line 513 sub check_access {
|
Line 483 sub check_access {
|
|
|
return ($status,$datemsg); |
return ($status,$datemsg); |
} |
} |
|
# this should work exactly like the copy in lonnavmaps.pm |
|
|
=pod |
|
|
|
=item due_date() |
|
|
|
this should work exactly like the copy in lonnavmaps.pm |
|
|
|
=cut |
|
|
|
sub due_date { |
sub due_date { |
my ($part_id,$symb,$udom,$uname)=@_; |
my ($part_id,$symb,$udom,$uname)=@_; |
my $date; |
my $date; |
Line 819 sub analyze {
|
Line 780 sub analyze {
|
} |
} |
&Apache::lonhtmlcommon::Update_PrgWin($request,\%prog_state, |
&Apache::lonhtmlcommon::Update_PrgWin($request,\%prog_state, |
&mt('Analyzing Results')); |
&mt('Analyzing Results')); |
$request->print('<hr class="LC_edit_problem_divide" />'.&mt('List of possible answers').': '); |
$request->print('<hr class="LC_edit_problem_divide" />' |
|
.'<h3>' |
|
.&mt('List of possible answers') |
|
.'</h3>' |
|
); |
foreach my $part (sort(keys(%allparts))) { |
foreach my $part (sort(keys(%allparts))) { |
if (defined(@{ $overall{$part.'.answer'} })) { |
if (defined(@{ $overall{$part.'.answer'} })) { |
for (my $i=0;$i<scalar(@{ $overall{$part.'.answer'} });$i++) { |
for (my $i=0;$i<scalar(@{ $overall{$part.'.answer'} });$i++) { |
my $num_cols=scalar(@{ $overall{$part.'.answer'}[$i][0] }); |
my $num_cols=scalar(@{ $overall{$part.'.answer'}[$i][0] }); |
$request->print('<table class="thinborder"><tr><th colspan="'.($num_cols+1).'">'.&mt('Part').' '.$part); |
$request->print(&Apache::loncommon::start_data_table() |
|
.&Apache::loncommon::start_data_table_header_row() |
|
.'<th colspan="'.($num_cols+1).'">' |
|
.&mt('Part').' '.$part |
|
); |
if (scalar(@{ $overall{$part.'.answer'} }) > 1) { |
if (scalar(@{ $overall{$part.'.answer'} }) > 1) { |
$request->print(&mt(' Answer [_1]',$i+1)); |
$request->print(' '.&mt('Answer [_1]',$i+1)); |
} |
} |
$request->print('</th></tr>'); |
$request->print('</th>' |
|
.&Apache::loncommon::end_data_table_header_row() |
|
); |
my %frequency; |
my %frequency; |
foreach my $answer (sort {$a->[0] <=> $b->[0]} (@{ $overall{$part.'.answer'}[$i] })) { |
foreach my $answer (sort {$a->[0] <=> $b->[0]} (@{ $overall{$part.'.answer'}[$i] })) { |
$frequency{join("\0",@{ $answer })}++; |
$frequency{join("\0",@{ $answer })}++; |
} |
} |
$request->print('<tr><th colspan="'.($num_cols).'">'.&mt('Answer').'</th><th>'.&mt('Frequency').'<br />(' |
$request->print(&Apache::loncommon::start_data_table_header_row() |
.&mt('click for example').')</th></tr>'); |
.'<th colspan="'.($num_cols).'">'.&mt('Answer').'</th>' |
|
.'<th>'.&mt('Frequency').'<br />' |
|
.'('.&mt('click for example').')</th>' |
|
.&Apache::loncommon::end_data_table_header_row() |
|
); |
foreach my $answer (sort {(split("\0",$a))[0] <=> (split("\0",$b))[0]} (keys(%frequency))) { |
foreach my $answer (sort {(split("\0",$a))[0] <=> (split("\0",$b))[0]} (keys(%frequency))) { |
$request->print('<tr><td class="center">'. |
$request->print(&Apache::loncommon::start_data_table_row() |
join('</td><td class="center">',split("\0",$answer)). |
.'<td>' |
'</td><td class="center"><a href="'.$request->uri.'?rndseed='.$seedexample{join("\0",$part,$i,$answer)}.'">'.$frequency{$answer}. |
.join('</td><td>',split("\0",$answer)) |
'</a></td></tr>'); |
.'</td>' |
|
.'<td>' |
|
.'<a href="'.$request->uri.'?rndseed='.$seedexample{join("\0",$part,$i,$answer)}.'">'.$frequency{$answer}.'</a>' |
|
.'</td>' |
|
.&Apache::loncommon::end_data_table_row() |
|
); |
} |
} |
$request->print('</table>'); |
$request->print(&Apache::loncommon::end_data_table()); |
} |
} |
} else { |
} else { |
$request->print('<p>'.&mt('Response').' '.$part.' '. |
$request->print('<p class="LC_warning">' |
&mt('is not analyzable at this time').'</p>'); |
.&mt('Response [_1] is not analyzable at this time.',$part) |
|
.'</p>' |
|
); |
} |
} |
} |
} |
if (scalar(keys(%allparts)) == 0 ) { |
if (scalar(keys(%allparts)) == 0 ) { |
$request->print('<p>'.&mt('Found no analyzable responses in this problem, currently only Numerical, Formula and String response styles are supported.').'</p>'); |
$request->print('<p class="LC_warning">' |
|
.&mt('Found no analyzable responses in this problem.' |
|
.' Currently only Numerical, Formula and String response styles are supported.') |
|
.'</p>' |
|
); |
} |
} |
&Apache::lonhtmlcommon::Close_PrgWin($request,\%prog_state); |
&Apache::lonhtmlcommon::Close_PrgWin($request,\%prog_state); |
&analyze_footer($request); |
&analyze_footer($request); |
Line 897 sub editxmlmode {
|
Line 883 sub editxmlmode {
|
my $result; |
my $result; |
my $problem=&Apache::lonnet::getfile($file); |
my $problem=&Apache::lonnet::getfile($file); |
if ($problem eq -1) { |
if ($problem eq -1) { |
&Apache::lonxml::error("<b> ".&mt('Unable to find'). |
&Apache::lonxml::error( |
" <i>$file</i></b>"); |
'<b> ' |
|
.&mt('Unable to find [_1]', |
|
'<span class="LC_filename">'.$file.'</span>') |
|
.'</b>'); |
|
|
$problem=''; |
$problem=''; |
} |
} |
if (defined($env{'form.editxmltext'}) || defined($env{'form.Undo'})) { |
if (defined($env{'form.editxmltext'}) || defined($env{'form.Undo'})) { |
Line 913 sub editxmlmode {
|
Line 903 sub editxmlmode {
|
&renderpage($request,$file); |
&renderpage($request,$file); |
} else { |
} else { |
my ($rows,$cols) = &Apache::edit::textarea_sizes(\$problem); |
my ($rows,$cols) = &Apache::edit::textarea_sizes(\$problem); |
my $xml_help = '<table><tr><td>'. |
|
&Apache::loncommon::helpLatexCheatsheet("Problem_Editor_XML_Index", |
|
"Problem Editing Help"). |
|
'</td><td>'. |
|
&Apache::loncommon::help_open_menu(undef,undef,5,'Authoring'). |
|
'</td></tr></table>'; |
|
if ($cols > 80) { $cols = 80; } |
if ($cols > 80) { $cols = 80; } |
if ($cols < 70) { $cols = 70; } |
if ($cols < 70) { $cols = 70; } |
if ($rows < 20) { $rows = 20; } |
if ($rows < 20) { $rows = 20; } |
Line 947 sub editxmlmode {
|
Line 931 sub editxmlmode {
|
<table class="LC_edit_problem_header_title"><tr><td> |
<table class="LC_edit_problem_header_title"><tr><td> |
'.&mt('Problem Editing').&Apache::loncommon::help_open_topic('Problem_Editor_XML_Index').' |
'.&mt('Problem Editing').&Apache::loncommon::help_open_topic('Problem_Editor_XML_Index').' |
</td><td align="right"> |
</td><td align="right"> |
'.&Apache::loncommon::helpLatexCheatsheet().' |
'.&Apache::loncommon::helpLatexCheatsheet('Problem_LON-CAPA_Functions','Script Functions').' |
</td></tr> |
</td></tr> |
</table> |
</table> |
<div class="LC_edit_problem_discards"> |
<div class="LC_edit_problem_discards"> |
Line 980 sub editxmlmode {
|
Line 964 sub editxmlmode {
|
return ''; |
return ''; |
} |
} |
|
|
=pod |
# |
|
# Render the page in whatever target desired. |
=item renderpage() |
# |
|
|
Render the page in whatever target desired. |
|
|
|
=cut |
|
|
|
sub renderpage { |
sub renderpage { |
my ($request,$file,$targets,$return_string) = @_; |
my ($request,$file,$targets,$return_string) = @_; |
|
|
Line 1016 sub renderpage {
|
Line 995 sub renderpage {
|
my $filename=(split('/',$file))[-1]; |
my $filename=(split('/',$file))[-1]; |
my $error = |
my $error = |
"<b> ".&mt('Unable to find [_1]', |
"<b> ".&mt('Unable to find [_1]', |
' <span class="LC_filename">'.$filename.'</span>') |
'<span class="LC_filename">'.$filename.'</span>') |
."</b>"; |
."</b>"; |
$result.= |
$result.= |
&Apache::loncommon::simple_error_page($request,'Not available', |
&Apache::loncommon::simple_error_page($request,'Not available', |
Line 1162 $start_page
|
Line 1141 $start_page
|
<h1>".&mt("Creating a new $extension resource.")."</h1> |
<h1>".&mt("Creating a new $extension resource.")."</h1> |
$errormsg |
$errormsg |
".&mt("The requested file [_1] currently does not exist.", |
".&mt("The requested file [_1] currently does not exist.", |
"<tt>$shownurl</tt>")." |
'<span class="LC_filename">'.$shownurl.'</span>')." |
<p> |
<p> |
<b> |
<b> |
".&mt("To create a new $extension, select a template from the". |
".&mt("To create a new $extension, select a template from the". |
Line 1187 sub update_construct_style {
|
Line 1166 sub update_construct_style {
|
&& !defined($env{'form.newrandomization'})) { |
&& !defined($env{'form.newrandomization'})) { |
if ((!$env{'form.style_file'} && $env{'construct.style'}) |
if ((!$env{'form.style_file'} && $env{'construct.style'}) |
||$env{'form.clear_style_file'}) { |
||$env{'form.clear_style_file'}) { |
&Apache::lonnet::delenv('construct\\.style'); |
&Apache::lonnet::delenv('construct.style'); |
} elsif ($env{'form.style_file'} |
} elsif ($env{'form.style_file'} |
&& $env{'construct.style'} ne $env{'form.style_file'}) { |
&& $env{'construct.style'} ne $env{'form.style_file'}) { |
&Apache::lonnet::appenv({'construct.style' => |
&Apache::lonnet::appenv({'construct.style' => |