- ';
+
+
+
+
+ '.
+ &Apache::loncommon::help_open_menu('','Problem Editing Help','Problem_Editor_XML_Index','',5,'Authoring',undef,undef,undef,'Problem Editing Help')
+ .' | '.
+ '';
}
sub problem_edit_footer {
return ' |
- ';
+ '.
+ &Apache::lonhtmlcommon::htmlareaselectactive(@Apache::lonxml::htmlareafields).
+ "\n\n".&Apache::loncommon::endbodytag()."\n";
+}
+
+sub option {
+ my ($value,$name) = @_;
+ my $result ="
+ ".&option('CAN_ANSWER' ,'problemstate').&mt("Answerable")."
+ ".&option('CANNOT_ANSWER_tries' ,'problemstate').&mt("Open with full tries")."
+ ".&option('CANNOT_ANSWER_correct','problemstate').&mt("Open and correct")."
+ ".&option('SHOW_ANSWER' ,'problemstate').&mt("Show Answer")."
+
+
+
+Problem Type:
+
+
+
+Feedback Mode:
+
+
+
+ ";
+ my $numtoanalyze=$env{'form.numtoanalyze'};
if (!$numtoanalyze) { $numtoanalyze=20; }
$result.= ' for
@@ -226,9 +299,9 @@ sub initialize_storage {
%Apache::lonhomework::results=();
%Apache::lonhomework::history=();
my ($symb,$courseid,$domain,$name) = &Apache::lonxml::whichuser();
- if ($ENV{'request.state'} eq 'construct' || $symb eq '') {
+ if ($env{'request.state'} eq 'construct' || $symb eq '') {
%Apache::lonhomework::history=
- &Apache::lonnet::tmprestore($ENV{'request.uri'},'',$domain,$name);
+ &Apache::lonnet::tmprestore($env{'request.uri'},'',$domain,$name);
my ($temp)=keys %Apache::lonhomework::history ;
&Apache::lonxml::debug("Return message of $temp");
} else {
@@ -244,25 +317,60 @@ sub initialize_storage {
# Stores away the result has to a student's environment
# checks form.grade_ for specific values, other wises stores
# to the running users environment
+# Will increment totals for attempts, students, and corrects
+# if running user has student role.
sub finalize_storage {
my $result;
my ($temp) = keys %Apache::lonhomework::results;
if ( $temp ne '' ) {
my ($symb,$courseid,$domain,$name) = &Apache::lonxml::whichuser();
- if ($ENV{'request.state'} eq 'construct' || $symb eq '') {
- $Apache::lonhomework::results{'rndseed'}=$ENV{'form.rndseed'};
+ if ($env{'request.state'} eq 'construct' || $symb eq '') {
+ $Apache::lonhomework::results{'rndseed'}=$env{'form.rndseed'};
$result=&Apache::lonnet::tmpstore(\%Apache::lonhomework::results,
- $ENV{'request.uri'},'',$domain,$name);
+ $env{'request.uri'},'',$domain,$name);
&Apache::lonxml::debug('Construct Store return message:'.$result);
} else {
$result=&Apache::lonnet::cstore(\%Apache::lonhomework::results,
$symb,$courseid,$domain,$name);
&Apache::lonxml::debug('Store return message:'.$result);
+ if ($env{'request.role'} =~/^st/) {
+ &store_aggregates($symb,$courseid);
+ }
}
}
return $result;
}
+# -------------------------------------------------------------store_aggregates
+# Sends hash of values to be incremented in nohist_resourcetracker.db
+# for the course. Increments total number of attempts, unique students
+# and corrects for each part for an instance of a problem, as appropriate.
+sub store_aggregates {
+ my ($symb,$courseid) = @_;
+ my %aggregate;
+ my @parts;
+ my ($cdomain,$cname) = split(/_/,$courseid);
+ foreach my $key (keys(%Apache::lonhomework::results)) {
+ if ($key =~ /resource\.([^\.]+)\.tries/) {
+ push(@parts, $1);
+ }
+ }
+ foreach my $part (@parts) {
+ if ($Apache::lonhomework::results{'resource.'.$part.'.award'}
+ eq 'APPROX_ANS' ||
+ $Apache::lonhomework::results{'resource.'.$part.'.award'}
+ eq 'EXACT_ANS') {
+ $aggregate{$symb."\0".$part."\0correct"} = 1;
+ }
+ if ($Apache::lonhomework::results{'resource.'.$part.'.tries'} == 1) {
+ $aggregate{$symb."\0".$part."\0users"} = 1;
+ }
+ $aggregate{$symb."\0".$part."\0attempts"} = 1;
+ }
+ &Apache::lonnet::cinc('nohist_resourcetracker',\%aggregate,
+ $cdomain,$cname);
+}
+
sub checkout_msg {
my %lt=&Apache::lonlocal::texthash(
'resource'=>'The resource needs to be checked out',
@@ -276,25 +384,40 @@ sub checkout_msg {
$lt{'warning'}
-
ENDCHECKOUT
}
+sub firstaccess_msg {
+ my ($time,$symb)=@_;
+ my ($map)=&Apache::lonnet::decode_symb($symb);
+ my $foldertitle=&Apache::lonnet::gettitle($map);
+ &Apache::lonxml::debug("map is $map title is $foldertitle");
+ return (<The resources in "$foldertitle" are open for a limited time. Once you click the 'Show Resource' button below you have $time to complete all resources "$foldertitle".
+
+ENDCHECKOUT
+}
+
sub init_problem_globals {
my ($type)=@_;
#initialize globals
if ($type eq 'problem') {
$Apache::inputtags::part='0';
@Apache::inputtags::partlist=('0');
- $Apache::lonhomework::problemstatus=
- &Apache::lonnet::EXT('resource.0.problemstatus');
- } else {
+ $Apache::lonhomework::problemstatus=&get_problem_status('0');
+ $Apache::lonhomework::ignore_response_errors=0;
+ } elsif ($type eq 'library') {
$Apache::inputtags::part='';
@Apache::inputtags::partlist=();
$Apache::lonhomework::problemstatus='';
+ $Apache::lonhomework::ignore_response_errors=1;
}
@Apache::inputtags::responselist = ();
@Apache::inputtags::importlist = ();
@@ -320,6 +443,28 @@ sub reset_problem_globals {
undef($Apache::lonhomework::name);
}
+sub set_problem_state {
+ my ($part)=@_;
+ if ($env{'form.problemstate'} eq 'CANNOT_ANSWER_correct') {
+ $Apache::lonhomework::history{"resource.$part.solved"}=
+ 'correct_by_student';
+ }
+}
+
+sub get_problem_status {
+ my ($part)=@_;
+ my $problem_status;
+ if ($env{'request.state'} eq 'construct' &&
+ defined($env{'form.problemstatus'})) {
+ $problem_status=$env{'form.problemstatus'};
+ } else {
+ $problem_status=&Apache::lonnet::EXT("resource.$part.problemstatus");
+ &Apache::lonxml::debug("problem status for $part is $problem_status");
+ &Apache::lonxml::debug("env probstat is ".$env{'form.problemstatus'});
+ }
+ return $problem_status;
+}
+
sub start_problem {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
@@ -333,20 +478,25 @@ sub start_problem {
$Apache::lonhomework::parsing_a_problem=1;
&init_problem_globals('problem');
- if (defined($ENV{'scantron.maxquest'})) {
+ if (defined($env{'scantron.maxquest'})) {
$Apache::lonhomework::scantronmode=1;
}
+ &initialize_storage();
if ($target ne 'analyze') {
- &initialize_storage();
if ($target eq 'web') {
&Apache::lonhomework::showhash(%Apache::lonhomework::history);
}
+ if ($env{'request.state'} eq 'construct') { &set_problem_state('0'); }
$Apache::lonhomework::type=&Apache::lonnet::EXT('resource.0.type');
- &Apache::lonxml::debug("Found this to be of type :$Apache::lonhomework::type:");
+ if (($env{'request.state'} eq 'construct') &&
+ defined($env{'form.problemtype'})) {
+ $Apache::lonhomework::type=$env{'form.problemtype'};
+ }
+ &Apache::lonxml::debug("Found this to be of type :$Apache::ltonhomework::type:");
}
if ($Apache::lonhomework::type eq '' ) {
- my $uri=$ENV{'request.uri'};
+ my $uri=$env{'request.uri'};
if ($uri=~/\.(\w+)$/) {
$Apache::lonhomework::type=$1;
&Apache::lonxml::debug("Using type of $1");
@@ -358,6 +508,7 @@ sub start_problem {
#added vars to the scripting enviroment
my $expression='$external::part=\''.$Apache::inputtags::part.'\';';
+ $expression.='$external::type=\''.$Apache::lonhomework::type.'\';';
&Apache::run::run($expression,$safeeval);
my $status;
my $accessmsg;
@@ -365,7 +516,7 @@ sub start_problem {
#should get back a or the neccesary stuff to start XML/MathML
my ($result,$head_tag_start,$body_tag_start,$form_tag_start)=
&page_start($target,$token,$tagstack,$parstack,$parser,$safeeval);
- if ($target eq 'tex' and $ENV{'request.symb'} =~ m/\.page_/) {$result='';}
+ if ($target eq 'tex' and $env{'request.symb'} =~ m/\.page_/) {$result='';}
if ($target eq 'analyze') { my $rndseed=&setup_rndseed($safeeval); }
if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
@@ -374,24 +525,35 @@ sub start_problem {
if ($Apache::lonhomework::type eq 'exam') {
my $token=
$Apache::lonhomework::history{"resource.0.outtoken"};
- if (($ENV{'form.doescheckout'}) && (!$token)) {
+ if (($env{'form.doescheckout'}) && (!$token)) {
$token=&Apache::lonxml::maketoken();
$Apache::lonhomework::history{"resource.0.outtoken"}=
$token;
}
$body_tag_start.=&Apache::lonxml::printtokenheader($target,$token);
}
-
+ if ($env{'form.markaccess'}) {
+ &Apache::lonnet::set_first_access('map');
+ }
#handle rand seed in construction space
my $rndseed=&setup_rndseed($safeeval);
my ($symb)=&Apache::lonxml::whichuser();
- if ($ENV{'request.state'} ne "construct" && $symb eq '') {
+ if ($env{'request.state'} ne "construct" && $symb eq '') {
$form_tag_start.=''.
''.
' ';
+ value="'.$env{'form.username'}.'" />';
+ if ($env{'user.adv'}) {
+ $form_tag_start.=
+ ' '.&mt(' Show All Foils');
+ }
+ $form_tag_start.=' ';
}
($status,$accessmsg) = &Apache::lonhomework::check_access('0');
push (@Apache::inputtags::status,$status);
@@ -401,6 +563,7 @@ sub start_problem {
&Apache::lonxml::debug("Got $status");
if (( $status eq 'CLOSED' ) ||
( $status eq 'UNCHECKEDOUT') ||
+ ( $status eq 'NOT_YET_VIEWED') ||
( $status eq 'BANNED') ||
( $status eq 'UNAVAILABLE') ||
( $status eq 'INVALID_ACCESS')) {
@@ -409,14 +572,16 @@ sub start_problem {
$result.= $head_tag_start.'';
my $msg=$body_tag_start;
if ($status eq 'UNAVAILABLE') {
- $result.=''.&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'';
- } else {
- $result.=''.&mt('Not open to be viewed').'';
+ $msg.=''.&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'';
+ } elsif ($status ne 'NOT_YET_VIEWED') {
+ $msg.=''.&mt('Not open to be viewed').'';
}
if ($status eq 'CLOSED' || $status eq 'INVALID_ACCESS') {
$msg.='The problem '.$accessmsg;
} elsif ($status eq 'UNCHECKEDOUT') {
$msg.=&checkout_msg;
+ } elsif ($status eq 'NOT_YET_VIEWED') {
+ $msg.=&firstaccess_msg($accessmsg,$symb);
}
$result.=$msg.' ';
} elsif ($target eq 'tex') {
@@ -429,46 +594,41 @@ sub start_problem {
}
} elsif ($target eq 'web') {
my $name= &get_resource_name($parstack,$safeeval);
- if ($status eq 'CAN_ANSWER') {
- # create a page header and exit
- $result.="$head_tag_start$name
+ $result.="$head_tag_start$name
$body_tag_start \n $form_tag_start".
- '';
- if ($ENV{'request.state'} eq "construct") {
- $result.= &problem_web_to_edit_header($ENV{'form.rndseed'});
- }
- # if we are viewing someone else preserve that info
- if (defined $ENV{'form.grade_symb'}) {
- foreach my $field ('symb','courseid','domain','username') {
- $result .= ''."\n";
- }
+ '';
+ # create a page header and exit
+ if ($env{'request.state'} eq "construct") {
+ $result.= &problem_web_to_edit_header($env{'form.rndseed'});
+ }
+ # if we are viewing someone else preserve that info
+ if (defined $env{'form.grade_symb'}) {
+ foreach my $field ('symb','courseid','domain','username') {
+ $result .= ''."\n";
}
- } elsif ($status eq 'SHOW_ANSWER' || $status eq 'CANNOT_ANSWER'
- || $status eq 'CLOSED' || $status eq 'UNAVALAILABLE' ||
- $status eq 'INVALID_ACCESS') {
- $result.=$head_tag_start.
- "$name\n$body_tag_start\n";
}
} elsif ($target eq 'tex') {
my $startminipage = '';
- if (not $ENV{'form.problem_split'}=~/yes/) {
+ if (not $env{'form.problem_split'}=~/yes/) {
$startminipage = '\begin{minipage}{\textwidth}';
}
my $id = $Apache::inputtags::part;
my $weight = &Apache::lonnet::EXT("resource.$id.weight");
- my $packages=&Apache::lonnet::metadata($ENV{'request.uri'},'packages');
+ my $packages=&Apache::lonnet::metadata($env{'request.uri'},'packages');
my @packages = split /,/,$packages;
my $allow_print_points = 0;
foreach my $partial_key (@packages) {
- if ($partial_key=~m/part_0/) {
+ if ($partial_key=~m/^part_0$/) {
$allow_print_points=1;
}
}
+ my $maxtries = &Apache::lonnet::EXT("resource.$id.maxtries");
+ if (defined($maxtries) && $maxtries < 0) { $allow_print_points=0; }
my $duedate = &Apache::lonnet::EXT("resource.$id.duedate");
$duedate = POSIX::strftime("%c",localtime($duedate));
my $temp_file;
- my $filename = "/home/httpd/prtspool/$ENV{'user.name'}_$ENV{'user.domain'}_printout.due";
+ my $filename = "/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.due";
if (-e $filename) {
$temp_file = Apache::File->new($filename);
} else {
@@ -477,23 +637,23 @@ sub start_problem {
my @due_file_content = <$temp_file>;
my $due_file_content = $due_file_content[$#due_file_content];
chomp $due_file_content;
- my $name_of_resourse= &get_resource_name($parstack,$safeeval);
+ my $name_of_resourse= &Apache::lonxml::latex_special_symbols(&get_resource_name($parstack,$safeeval),'header');
if ($due_file_content ne $duedate) {
$temp_file = Apache::File->new('>'.$filename);
print $temp_file "$duedate\n";
- if (not $ENV{'request.symb'} =~ m/\.page_/) {
+ if (not $env{'request.symb'} =~ m/\.page_/) {
if(not $duedate=~m/1969/ and $Apache::lonhomework::type ne 'exam') {
- $result .= '\begin{document} \typeout{STAMPOFPASSEDRESOURCESTART Resource "'.$name_of_resourse.'" located in '.$ENV{'request.uri'}.' STAMPOFPASSEDRESOURCEEND} \noindent\textit{Due date: '.$duedate.'} \vskip 1 mm\noindent '.$startminipage.'\addcontentsline{toc}{subsection}{'.$name_of_resourse.'}';
+ $result .= '\begin{document} \typeout{STAMPOFPASSEDRESOURCESTART Resource "'.$name_of_resourse.'" located in '.$env{'request.uri'}.' STAMPOFPASSEDRESOURCEEND} \noindent\textit{Due date: '.$duedate.'} \vskip 1 mm\noindent '.$startminipage.'\addcontentsline{toc}{subsection}{'.$name_of_resourse.'}';
} else {
- $result .= '\begin{document} \typeout{STAMPOFPASSEDRESOURCESTART Resource "'.$name_of_resourse.'" located in '.$ENV{'request.uri'}.' STAMPOFPASSEDRESOURCEEND} \noindent \vskip 1 mm \noindent'.$startminipage.'\addcontentsline{toc}{subsection}{'.$name_of_resourse.'}';
+ $result .= '\begin{document} \typeout{STAMPOFPASSEDRESOURCESTART Resource "'.$name_of_resourse.'" located in '.$env{'request.uri'}.' STAMPOFPASSEDRESOURCEEND} \noindent \vskip 1 mm \noindent'.$startminipage.'\addcontentsline{toc}{subsection}{'.$name_of_resourse.'}';
if ($Apache::lonhomework::type eq 'exam' and $allow_print_points==1) { $result .= '\fbox{\textit{'.$weight.' pt}}';}
}
} else {
$result .= '\vskip 1mm\textit{Due date: '.$duedate.'} \\\\\\\\';
}
} else {
- if (not $ENV{'request.symb'} =~ m/\.page_/) {
- $result .= '\begin{document} \typeout{STAMPOFPASSEDRESOURCESTART Resource "'.$name_of_resourse.'" located in '.$ENV{'request.uri'}.' STAMPOFPASSEDRESOURCEEND} \noindent \vskip 1 mm\noindent'.$startminipage.'\addcontentsline{toc}{subsection}{'.$name_of_resourse.'}';
+ if (not $env{'request.symb'} =~ m/\.page_/) {
+ $result .= '\begin{document} \typeout{STAMPOFPASSEDRESOURCESTART Resource "'.$name_of_resourse.'" located in '.$env{'request.uri'}.' STAMPOFPASSEDRESOURCEEND} \noindent \vskip 1 mm\noindent'.$startminipage.'\addcontentsline{toc}{subsection}{'.$name_of_resourse.'}';
if (($Apache::lonhomework::type eq 'exam') and ($allow_print_points==1)) { $result .= '\fbox{\textit{'.$weight.' pt}}';}
} else {
$result .= '\vskip 1mm \\\\\\\\';
@@ -503,6 +663,8 @@ sub start_problem {
} elsif ($target eq 'edit') {
$result.=$head_tag_start."".$body_tag_start.$form_tag_start.
&problem_edit_header();
+ $Apache::lonxml::warnings_error_header=
+ &mt("Editor Errors - these errors might not effect the running of the problem, but they will likely cause problems with further use of the Edit mode. Please use the EditXML mode to fix these errors.")." ";
my $temp=&Apache::edit::insertlist($target,$token);
$result.=$temp;
} elsif ($target eq 'modified') {
@@ -521,46 +683,48 @@ sub end_problem {
my $status=$Apache::inputtags::status['-1'];
if ($target eq 'grade' || $target eq 'web' || $target eq 'answer' ||
$target eq 'tex') {
- if ( $target eq 'grade' && $Apache::inputtags::part eq '0' &&
- $status eq 'CAN_ANSWER' ) {
+ if ( $target eq 'grade' && $Apache::inputtags::part eq '0') {
# if part is zero, no s existed, so we need to the grading
- &Apache::inputtags::grade;
+ if ($status eq 'CAN_ANSWER' ||$Apache::lonhomework::scantronmode) {
+ &Apache::inputtags::grade;
+ } else {
+ # move any submission data to .hidden
+ &Apache::inputtags::hidealldata($Apache::inputtags::part);
+ }
} elsif ( ($target eq 'web' || $target eq 'tex') &&
$Apache::inputtags::part eq '0' &&
- $status ne 'UNCHECKEDOUT') {
+ $status ne 'UNCHECKEDOUT' && $status ne 'NOT_YET_VIEWED') {
# if part is zero, no s existed, so we need show the current
# grading status
my $gradestatus = &Apache::inputtags::gradestatus($Apache::inputtags::part,$target);
$result.= $gradestatus;
}
if (
- (($target eq 'web') && ($ENV{'request.state'} ne 'construct')) ||
+ (($target eq 'web') && ($env{'request.state'} ne 'construct')) ||
($target eq 'answer') || ($target eq 'tex')
) {
- if ($status eq 'CAN_ANSWER') {
- if ($target ne 'tex' &&
- $ENV{'form.answer_output_mode'} ne 'tex') {
- $result.=" |