--- loncom/homework/structuretags.pm 2011/12/10 17:53:45 1.498
+++ loncom/homework/structuretags.pm 2015/03/11 14:50:10 1.512.2.9
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# definition of tags that give a structure to a document
#
-# $Id: structuretags.pm,v 1.498 2011/12/10 17:53:45 raeburn Exp $
+# $Id: structuretags.pm,v 1.512.2.9 2015/03/11 14:50:10 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -61,6 +61,7 @@ use Apache::lonlocal;
use Apache::lonxml;
use Apache::londefdef;
use Apache::lonenc();
+use Apache::loncommon();
use Time::HiRes qw( gettimeofday tv_interval );
use lib '/home/httpd/lib/perl/';
use LONCAPA;
@@ -69,6 +70,105 @@ BEGIN {
&Apache::lonxml::register('Apache::structuretags',('block','languageblock','translated','instructorcomment','while','randomlist','problem','library','web','tex','part','preduedate','postanswerdate','solved','notsolved','problemtype','startpartmarker','startouttext','endpartmarker','endouttext','simpleeditbutton','definetag'));
}
+
+#---------------------------------------------------------------------------------
+#
+# This section of code deals with hyphenation management.
+# We must do three things:
+# - keep track fo the desired languages to alter the header.
+# - provide hyphenation selection as needed by each language that appears in the
+# text.
+# - Provide the header text needed to make available the desired hyphenations.
+#
+#
+
+# Hash whose keys are the languages encountered in the document/resource.
+#
+
+my %languages_required;
+##
+# Given a language selection as input returns a chunk of LaTeX that
+# selects the required hyphenator.
+#
+# @param language - the language being selected.
+# @return string
+# @retval The LaTeX needed to select the hyphenation appropriate to the language.
+#
+sub select_hyphenation {
+ my $language = shift;
+
+ $language = &Apache::loncommon::latexlanguage($language); # Translate -> latex language.
+
+ # If there is no latex language there's not much we can do:
+
+ if ($language) {
+ &require_language($language);
+ my $babel_hyphenation = "\\selectlanguage{$language}";
+
+ return $babel_hyphenation;
+ } else {
+ return '';
+ }
+}
+##
+# Selects hyphenation based on the current problem metadata.
+# This requires that
+# - There is a language metadata item set for the problem.
+# - The language has a latex/babel hyphenation.
+#
+# @note: Uses &Apache::lonxml::request to locate the Uri associated with
+# this problem.
+# @return string (possibly empty).
+# @retval If not empty an appropriate \selectlanguage{} directive.
+#
+sub select_metadata_hyphenation {
+ my $uri = $Apache::lonxml::request->uri;
+ my $language = &Apache::lonnet::metadata($uri, 'language');
+ my $latex_language = &Apache::loncommon::latexhyphenation($language);
+ if ($latex_language) {
+ return '\selectlanguage{'.$latex_language."}\n";
+ }
+ return ''; # no latex hyphenation or no lang metadata.
+}
+
+
+##
+# Clears the set of languages required by the document being rendered.
+#
+sub clear_required_languages {
+ %languages_required = ();
+}
+##
+# Allows an external client of this module to register a need for a language:
+#
+# @param LaTeX language required:
+#
+sub require_language {
+ my $language = shift;
+ $languages_required{$language} = 1;
+}
+
+##
+# Provides the header for babel that indicates the languages
+# the document requires.
+# @return string
+# @retval \usepackage[lang1,lang2...]{babel}
+# @retval '' if there are no languages_required.
+sub languages_header {
+ my $header ='';
+ my @languages = (keys(%languages_required));
+
+ # Only generate the header if there are languages:
+
+ if (scalar @languages) {
+ my $language_list = join(',', (@languages));
+ $header = '\usepackage['.$language_list."]{babel}\n";
+ }
+ return $header;
+}
+
+#----------------------------------------------------------------------------------
+
sub start_web {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
if ($target ne 'edit' && $target ne 'modified') {
@@ -124,9 +224,54 @@ sub end_tex {
}
sub homework_js {
+ my ($postsubmit,$timeout);
+ if (($env{'request.course.id'}) && ($env{'request.state'} ne 'construct')) {
+ my $crstype;
+ if (&Apache::loncommon::course_type() eq 'Community') {
+ $crstype = 'community';
+ } else {
+ if ($env{'course.'.$env{'request.course.id'}.'.internal.coursecode'}) {
+ $crstype = 'official';
+ } elsif ($env{'course.'.$env{'request.course.id'}.'.internal.textbook'}) {
+ $crstype = 'textbook';
+ } else {
+ $crstype = 'unofficial';
+ }
+ }
+ $postsubmit = $env{'course.'.$env{'request.course.id'}.'.internal.postsubmit'};
+ if ($postsubmit eq '') {
+ my %domdefs = &Apache::lonnet::get_domain_defaults($env{'course.'.$env{'request.course.id'}.'.domain'});
+ $postsubmit = $domdefs{'postsubmit'};
+ unless ($postsubmit eq 'off') {
+ $timeout = $domdefs{$crstype.'postsubtimeout'};
+ }
+ } elsif ($postsubmit eq '0') {
+ $postsubmit = 'off';
+ } elsif ($postsubmit eq '1') {
+ $postsubmit = 'on';
+ $timeout = $env{'course.'.$env{'request.course.id'}.'.internal.postsubtimeout'};
+ if ($timeout eq '') {
+ my %domdefs = &Apache::lonnet::get_domain_defaults($env{'course.'.$env{'request.course.id'}.'.domain'});
+ $timeout = $domdefs{$crstype.'postsubtimeout'};
+ }
+ }
+ if ($timeout eq '') {
+ $timeout = 60;
+ }
+ } else {
+ my %domdefs = &Apache::lonnet::get_domain_defaults($env{'request.role.domain'});
+ $postsubmit = $domdefs{'postsubmit'};
+ unless ($postsubmit eq 'off') {
+ $timeout = 60;
+ }
+ }
+ my $jstimeout = 0;
+ if ($timeout) {
+ $jstimeout = 1000 * $timeout;
+ }
return &Apache::loncommon::resize_textarea_js().
&setmode_javascript().
- <<'JS';
+ <<"JS";
JS
@@ -197,7 +422,7 @@ sub page_start {
$extra_head .= &Apache::lonhtmlcommon::htmlareaselectactive(\%textarea_args);
}
my $is_task = ($env{'request.uri'} =~ /\.task$/);
- my $needs_upload;
+ my ($needs_upload,$partlist);
my ($symb)= &Apache::lonnet::whichuser();
my ($map,$resid,$resurl)=&Apache::lonnet::decode_symb($symb);
if ($is_task) {
@@ -215,6 +440,12 @@ sub page_start {
unless ($is_page) {
$needs_upload = 1;
}
+ if ((ref($tagstack) eq 'ARRAY') && ($tagstack->[-1] eq 'problem')) {
+ my $res = $navmap->getBySymb($symb);
+ if (ref($res)) {
+ $partlist = $res->parts();
+ }
+ }
}
}
} else {
@@ -226,10 +457,17 @@ sub page_start {
if (ref($mapres)) {
$is_page = $mapres->is_page();
}
- unless ($is_page) {
+ if ($is_page) {
+ if ((ref($tagstack) eq 'ARRAY') && ($tagstack->[-1] eq 'problem')) {
+ my $res = $navmap->getBySymb($symb);
+ if (ref($res)) {
+ $partlist = $res->parts();
+ }
+ }
+ } else {
my $res = $navmap->getBySymb($symb);
if (ref($res)) {
- my $partlist = $res->parts();
+ $partlist = $res->parts();
if (ref($partlist) eq 'ARRAY') {
foreach my $part (@{$partlist}) {
my @types = $res->responseType($part);
@@ -270,6 +508,9 @@ sub page_start {
"if (typeof swmenu != 'undefined') {swmenu.currentURL=null;}\n".
&Apache::loncommon::browser_and_searcher_javascript().
"\n\n";
+ if ($target eq 'edit') {
+ $extra_head .= &Apache::edit::js_update_linknum();
+ }
}
}
@@ -279,10 +520,10 @@ sub page_start {
} elsif (!defined($found{'body'})
&& $env{'request.state'} eq 'construct') {
if ($target eq 'web' || $target eq 'edit') {
- # Breadcrumbs for Construction Space
+ # Breadcrumbs for Authoring Space
&Apache::lonhtmlcommon::clear_breadcrumbs();
&Apache::lonhtmlcommon::add_breadcrumb({
- 'text' => 'Construction Space',
+ 'text' => 'Authoring Space',
'href' => &Apache::loncommon::authorspace($env{'request.uri'}),
});
# breadcrumbs (and tools) will be created
@@ -314,6 +555,8 @@ sub page_start {
$body_args{'add_entries'} = \%add_entries;
if ( $env{'request.state'} eq 'construct') {
$body_args{'only_body'} = 1;
+ } elsif ($target eq 'web') {
+ $body_args{'print_suppress'} = 1;
}
}
$body_args{'no_auto_mt_title'} = 1;
@@ -353,7 +596,6 @@ sub page_start {
}
$form_tag_start.='>'."\n";
- my $symb=&Apache::lonnet::symbread();
if ($symb =~ /\S/) {
$symb=
&HTML::Entities::encode(&Apache::lonenc::check_encrypt($symb));
@@ -361,7 +603,7 @@ sub page_start {
"\t".''."\n";
}
}
- return ($page_start,$form_tag_start);
+ return ($page_start,$form_tag_start,$partlist);
}
#use Time::HiRes();
@@ -392,7 +634,7 @@ sub get_resource_name {
}
sub setup_rndseed {
- my ($safeeval,$target)=@_;
+ my ($safeeval,$target,$probpartlist)=@_;
my ($symb)=&Apache::lonnet::whichuser();
my ($questiontype,$set_safespace,$rndseed);
if ($target eq 'analyze') {
@@ -453,7 +695,13 @@ sub setup_rndseed {
}
unless (($target eq 'analyze') && (defined($rndseed))) {
$rndseed=&Apache::lonnet::rndseed();
- my $curr_try = $Apache::lonhomework::history{"resource.$Apache::inputtags::part.tries"};
+ my $partfortries = $Apache::inputtags::part;
+ if (ref($probpartlist) eq 'ARRAY') {
+ if ((@{$probpartlist} == 1) && ($probpartlist->[0] ne $Apache::inputtags::part)) {
+ $partfortries = $probpartlist->[0];
+ }
+ }
+ my $curr_try = $Apache::lonhomework::history{"resource.$partfortries.tries"};
if ($Apache::inputtags::status[-1] eq 'CAN_ANSWER') {
$curr_try ++;
}
@@ -461,7 +709,7 @@ sub setup_rndseed {
$rndseed = $1;
}
if ($curr_try) {
- my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries");
+ my $reqtries = &Apache::lonnet::EXT("resource.$partfortries.randomizeontries");
if (($reqtries =~ /^\d+$/) && ($reqtries > 1)) {
my $inc = int(($curr_try-1)/$reqtries);
$rndseed += $inc;
@@ -471,6 +719,9 @@ sub setup_rndseed {
}
}
$set_safespace = 1;
+ if ($target eq 'grade') {
+ $Apache::lonhomework::rawrndseed = $rndseed;
+ }
}
if ($set_safespace) {
if ($safeeval) {
@@ -538,7 +789,7 @@ sub problem_edit_header {
'.&Apache::lonxml::message_location().'
'.
- '
';
+ '
';
}
sub problem_edit_footer {
@@ -629,7 +880,7 @@ $show_all
@@ -731,7 +982,7 @@ sub initialize_storage {
}
%Apache::lonhomework::history=
&Apache::lonnet::tmprestore($namespace,'',$domain,$name);
- my ($temp)=keys %Apache::lonhomework::history ;
+ my ($temp)=keys(%Apache::lonhomework::history);
&Apache::lonxml::debug("Return message of $temp");
} else {
%Apache::lonhomework::history=
@@ -739,7 +990,7 @@ sub initialize_storage {
}
#ignore error conditions
- my ($temp)=keys %Apache::lonhomework::history ;
+ my ($temp)=keys(%Apache::lonhomework::history);
if ($temp =~ m/^error:.*/) { %Apache::lonhomework::history=(); }
}
@@ -747,11 +998,36 @@ sub initialize_storage {
=item finalize_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.
+ Stores away the result hash to a student's environment;
+ checks form.grade_ for specific values, otherwise stores
+ to the running user's environment.
+
+ &check_correctness_changes() is called in two circumstances
+ in which the results hash is to be stored permanently, for
+ grading triggered by a student's submission, where feedback on
+ correctness is to be provided to the student.
+
+ 1. Immediately prior to storing the results hash
+
+ To handle the case where a student's submission (and award) were
+ stored after history was retrieved in &initialize_storage(), e.g.,
+ if a student submitted answers in quick succession (e.g., from
+ multiple tabs). &Apache::inputtags::hidealldata() is called for
+ any parts with out-of-order storage (i.e., correct then incorrect,
+ where awarded >= 1 when correct).
+
+ 2. Immediately after storing the results hash
+
+ To handle the case where lond on the student's homeserver returns
+ delay:N -- where N is the number of transactions between the last
+ retrieved in &initialize_storage() and the last stored immediately
+ before permanent storage of the current transaction via
+ lond::store_handler(). &Apache::grades::makehidden() is called
+ for any parts with out-of-order storage (i.e., correct then incorrect,
+ where awarded >= 1 when correct).
+
+ Will call &store_aggregates() to increment totals for attempts,
+ students, and corrects, if running user has student role.
=cut
@@ -773,8 +1049,92 @@ sub finalize_storage {
$namespace,'',$domain,$name);
&Apache::lonxml::debug('Construct Store return message:'.$result);
} else {
+ my ($laststore,$checkedparts,@parts,%postcorrect);
+ if (($env{'user.name'} eq $name) && ($env{'user.domain'} eq $domain) &&
+ (!$Apache::lonhomework::scantronmode) && (!defined($env{'form.grade_symb'})) &&
+ (!defined($env{'form.grade_courseid'}))) {
+ if ($Apache::lonhomework::history{'version'}) {
+ $laststore = $Apache::lonhomework::history{'version'}.'='.
+ $Apache::lonhomework::history{'timestamp'};
+ } else {
+ $laststore = '0=0';
+ }
+ my %record = &Apache::lonnet::restore($symb,$courseid,$domain,$name);
+ if ($record{'version'}) {
+ my ($newversion,$oldversion,$oldtimestamp);
+ if ($Apache::lonhomework::history{'version'}) {
+ $oldversion = $Apache::lonhomework::history{'version'};
+ $oldtimestamp = $Apache::lonhomework::history{'timestamp'};
+ } else {
+ $oldversion = 0;
+ $oldtimestamp = 0;
+ }
+ if ($record{'version'} > $oldversion) {
+ if ($record{'timestamp'} >= $oldtimestamp) {
+ $laststore = $record{'version'}.'='.$record{'timestamp'};
+ $newversion = $record{'version'} + 1;
+ $checkedparts = 1;
+ foreach my $key (keys(%Apache::lonhomework::results)) {
+ if ($key =~ /^resource\.([^\.]+)\.solved$/) {
+ my $part = $1;
+ if ($Apache::lonhomework::results{$key} eq 'incorrect_attempted') {
+ push(@parts,$part);
+ }
+ }
+ }
+ if (@parts) {
+ my @parts_to_hide = &check_correctness_changes($symb,$courseid,$domain,$name,
+ \%record,\@parts,$newversion,
+ $oldversion);
+ if (@parts_to_hide) {
+ foreach my $part (@parts_to_hide) {
+ $postcorrect{$part} = 1;
+ &Apache::inputtags::hidealldata($part);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
$result=&Apache::lonnet::cstore(\%Apache::lonhomework::results,
- $symb,$courseid,$domain,$name);
+ $symb,$courseid,$domain,$name,$laststore);
+ if ($result =~ /^delay\:(\d+)$/) {
+ my $numtrans = $1;
+ my ($oldversion) = split(/=/,$laststore);
+ if ($numtrans) {
+ my $newversion = $oldversion + 1 + $numtrans;
+ my @possparts;
+ if ($checkedparts) {
+ foreach my $part (@parts) {
+ unless ($postcorrect{$part}) {
+ push(@possparts,$part);
+ }
+ }
+ } else {
+ foreach my $key (keys(%Apache::lonhomework::results)) {
+ if ($key =~ /^resource\.([^\.]+)\.solved$/) {
+ my $part = $1;
+ unless ($postcorrect{$part}) {
+ if ($Apache::lonhomework::results{$key} eq 'incorrect_attempted') {
+ push(@possparts,$part);
+ }
+ }
+ }
+ }
+ }
+ if (@possparts) {
+ my %newrecord = &Apache::lonnet::restore($symb,$courseid,$domain,$name);
+ my @parts_to_hide = &check_correctness_changes($symb,$courseid,$domain,$name,
+ \%newrecord,\@possparts,$newversion,
+ $oldversion);
+ if (@parts_to_hide) {
+ my $partslist = join(',',@parts_to_hide);
+ &Apache::grades::makehidden($newversion,$partslist,\%newrecord,$symb,$domain,$name,1);
+ }
+ }
+ }
+ }
&Apache::lonxml::debug('Store return message:'.$result);
&store_aggregates($symb,$courseid);
}
@@ -786,6 +1146,62 @@ sub finalize_storage {
=pod
+=item check_correctness_changes()
+
+ For all parts for which current results contain a solved status
+ of "incorrect_attempted", check if there was a transaction in which
+ solved was set to "correct_by_student" in the time since the last
+ transaction (retrieved when &initialize_storage() was called i.e.,
+ when &start_problem() was called), unless:
+ (a) questiontype parameter is set to survey or anonymous survey (+/- credit)
+ (b) problemstatus is set to no or no_feedback_ever
+ If such a transaction exists, and did not occur after "reset status"
+ by a user with grading privileges, then the current transaction is an
+ example of an out-of-order transaction (i.e., incorrect occurring after
+ correct). Accordingly, the current transaction should be hidden.
+
+=cut
+
+
+sub check_correctness_changes {
+ my ($symb,$courseid,$domain,$name,$record,$parts,$newversion,$oldversion) = @_;
+ my @parts_to_hide;
+ unless ((ref($record) eq 'HASH') && (ref($parts) eq 'ARRAY')) {
+ return @parts_to_hide;
+ }
+ if (@{$parts}) {
+ my $usec;
+ if (($env{'user.name'} eq $name) && ($env{'user.domain'} eq $domain) &&
+ ($env{'request.course.id'} eq $courseid)) {
+ $usec = $env{'request.course.sec'};
+ } else {
+ $usec = &Apache::lonnet::getsection($domain,$name,$courseid);
+ }
+ foreach my $id (@{$parts}) {
+ next if (($Apache::lonhomework::results{'resource.'.$id.'.type'} =~ /survey/) ||
+ (&Apache::lonnet::EXT("resource.$id.problemstatus",$symb,
+ $domain,$name,$usec,undef,$courseid) =~ /^no/));
+ my $reset;
+ for (my $i=$newversion-1; $i>=$oldversion; $i--) {
+ if (($record->{$i.':resource.'.$id.'.regrader'}) &&
+ ($record->{$i.':resource.'.$id.'.tries'} eq '') &&
+ ($record->{$i.':resource.'.$id.'.award'} eq '')) {
+ $reset = 1;
+ } elsif (($record->{$i.":resource.$id.solved"} eq 'correct_by_student') &&
+ ($record->{$i.":resource.$id.awarded"} >= 1)) {
+ unless ($reset) {
+ push(@parts_to_hide,$id);
+ last;
+ }
+ }
+ }
+ }
+ }
+ return @parts_to_hide;
+}
+
+=pod
+
item store_aggregates()
Sends hash of values to be incremented in nohist_resourcetracker.db
@@ -848,7 +1264,7 @@ sub store_aggregates {
}
}
}
- if (keys (%aggregate) > 0) {
+ if (keys(%aggregate) > 0) {
&Apache::lonnet::cinc('nohist_resourcetracker',\%aggregate,
$cdomain,$cname);
}
@@ -876,7 +1292,7 @@ sub checkout_msg {
$lt{'warning'}
ENDCHECKOUT
}
@@ -890,19 +1306,19 @@ sub firstaccess_msg {
my $foldertitle=&Apache::lonnet::gettitle($map);
&Apache::lonxml::debug("map is $map title is $foldertitle");
- $result .= "
".&mt('The resources in "[_1]" are open for a limited time.'
- .' Once you click the "Show Resource" button below you have [_2] to complete all resources "[_1]".'
- ,$foldertitle,$time)."
";
+ $result .= "
".&mt('The resources in "[_1]" are open for a limited time.',$foldertitle)."
"
+ .'
'.&mt('Once you click the "Show Resource" button below you have [_2] to complete all resources "[_1]".'
+ ,$foldertitle,$time)."
".&mt('The resources in "[_1]" are open for a limited time.'
- .' Once you click the "Show Resource" button below you have [_2] to complete all resources "[_1]".'
- ,$course,$time)."
";
+ $result .= "
".&mt('The resources in "[_1]" are open for a limited time.',$course)."
"
+ .'
'.&mt('Once you click the "Show Resource" button below you have [_2] to complete all resources "[_1]".'
+ ,$course,$time)."
";
} else {
my $title=&Apache::lonnet::gettitle($symb);
- $result .= "
".&mt('This resource "[_1]" is open for a limited time.'
- .' Once you click the "Show Resource" button below you have [_2] to complete this resource "[_1]".'
- ,$title,$time)."
";
+ $result .= "
".&mt('This resource "[_1]" is open for a limited time.',$title)."
"
+ .'
'.&mt('Once you click the "Show Resource" button below you have [_2] to complete this resource "[_1]".'
+ ,$title,$time)."
";
}
my $uri = &Apache::lonenc::check_encrypt($env{'request.uri'});
my $buttontext = &mt('Show Resource');
@@ -910,7 +1326,7 @@ sub firstaccess_msg {
$result .= (<
-
+
ENDCHECKOUT
return $result;
@@ -962,6 +1378,8 @@ sub reset_problem_globals {
undef($Apache::inputtags::part);
if ($type eq 'Task') {
undef($Apache::inputtags::slot_name);
+ } elsif ($type eq 'problem') {
+ undef($Apache::lonhomework::rawrndseed);
}
#don't undef this, lonhomework.pm takes care of this, we use this to
#detect if we try to do 2 problems in one file
@@ -1060,14 +1478,37 @@ sub start_problem {
&Apache::run::run($expression,$safeeval);
my $status;
my $accessmsg;
+ my $resource_due;
my $name= &get_resource_name($parstack,$safeeval);
- my ($result,$form_tag_start);
+ my ($result,$form_tag_start,$slot_name,$slot,$probpartlist);
+
+ if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
+ $target eq 'tex') {
+ if ($env{'form.markaccess'}) {
+ my @interval=&Apache::lonnet::EXT("resource.0.interval");
+ &Apache::lonnet::set_first_access($interval[1],$interval[0]);
+ }
+
+ ($status,$accessmsg,$slot_name,$slot) =
+ &Apache::lonhomework::check_slot_access('0','problem');
+ push (@Apache::inputtags::status,$status);
+ }
+
if ($target eq 'web' || $target eq 'webgrade' || $target eq 'tex'
|| $target eq 'edit') {
- ($result,$form_tag_start) =
+ ($result,$form_tag_start,$probpartlist) =
&page_start($target,$token,$tagstack,$parstack,$parser,$safeeval,
$name);
+ } elsif (($target eq 'grade') && ($Apache::lonhomework::type eq 'randomizetry')) {
+ my ($symb)= &Apache::lonnet::whichuser();
+ my $navmap = Apache::lonnavmaps::navmap->new();
+ if (ref($navmap)) {
+ my $res = $navmap->getBySymb($symb);
+ if (ref($res)) {
+ $probpartlist = $res->parts();
+ }
+ }
}
if ($target eq 'tex' and $env{'request.symb'} =~ m/\.page_/) {$result='';}
@@ -1075,17 +1516,22 @@ sub start_problem {
if ($target eq 'analyze') { my $rndseed=&setup_rndseed($safeeval,$target); }
if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
$target eq 'tex') {
- if ($env{'form.markaccess'}) {
- my @interval=&Apache::lonnet::EXT("resource.0.interval");
- &Apache::lonnet::set_first_access($interval[1]);
- }
-
- ($status,$accessmsg,my $slot_name,my $slot) =
- &Apache::lonhomework::check_slot_access('0','problem');
- push (@Apache::inputtags::status,$status);
#handle rand seed in construction space
- my $rndseed=&setup_rndseed($safeeval,$target);
+ my $rndseed=&setup_rndseed($safeeval,$target,$probpartlist);
+ if (($target eq 'grade') && &Apache::response::submitted()) {
+ if ($Apache::lonhomework::type eq 'randomizetry') {
+ $Apache::lonhomework::results{'resource.0.rndseed'}=$rndseed;
+ } else {
+ my @parts;
+ if (ref($probpartlist) eq 'ARRAY') {
+ @parts = @{$probpartlist};
+ }
+ unless (@parts) {
+ $Apache::lonhomework::results{'resource.0.rndseed'}=$Apache::lonhomework::rawrndseed;
+ }
+ }
+ }
my ($symb)=&Apache::lonnet::whichuser();
if ($env{'request.state'} ne "construct" &&
@@ -1132,18 +1578,24 @@ sub start_problem {
( $status eq 'BANNED') ||
( $status eq 'UNAVAILABLE') ||
( $status eq 'NOT_IN_A_SLOT') ||
+ ( $status eq 'NOTRESERVABLE') ||
+ ( $status eq 'RESERVABLE') ||
+ ( $status eq 'RESERVABLE_LATER') ||
( $status eq 'INVALID_ACCESS')) {
my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser,
$style);
if ( $target eq "web" ) {
my $msg;
if ($status eq 'UNAVAILABLE') {
- $msg.='
'.&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'
';
+ $msg.='
'.&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'