--- loncom/homework/lonhomework.pm 2011/01/06 22:38:11 1.317.4.3
+++ loncom/homework/lonhomework.pm 2015/09/14 13:45:19 1.357
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# The LON-CAPA Homework handler
#
-# $Id: lonhomework.pm,v 1.317.4.3 2011/01/06 22:38:11 raeburn Exp $
+# $Id: lonhomework.pm,v 1.357 2015/09/14 13:45:19 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -49,8 +49,10 @@ use Apache::matchresponse();
use Apache::chemresponse();
use Apache::functionplotresponse();
use Apache::drawimage();
+use Apache::loncapamath();
use Apache::Constants qw(:common);
use Apache::loncommon();
+use Apache::lonparmset();
use Apache::lonlocal;
use Time::HiRes qw( gettimeofday tv_interval );
use HTML::Entities();
@@ -112,7 +114,7 @@ sub get_target {
} elsif ( $env{'form.grade_target'} eq 'webgrade'
&& ($Apache::lonhomework::queuegrade eq 'F' )) {
return ($env{'form.grade_target'});
- } elsif ($env{'form.grade_target'} eq 'answer') {
+ } elsif ($env{'form.grade_target'} eq 'answer') {
if ($env{'form.answer_output_mode'} eq 'tex') {
return ($env{'form.grade_target'});
}
@@ -129,43 +131,46 @@ sub get_target {
return ('web');
}
} elsif ($env{'request.state'} eq "construct") {
+#
+# We are in construction space, editing and testing problems
+#
if ( defined($env{'form.grade_target'}) ) {
return ($env{'form.grade_target'});
}
if ( defined($env{'form.preview'})) {
if ( defined($env{'form.submitted'})) {
+#
+# We are doing a problem preview
+#
return ('grade', 'web');
} else {
return ('web');
}
} else {
if ($env{'form.problemstate'} eq 'WEB_GRADE') {
- #$env{'form.webgrade'} = 'yes';
return ('grade','webgrade','answer');
- } elsif (($env{'form.problemmode'} eq 'view') ||
- ($env{'form.problemmode'} eq 'discard')) {
- if ( defined($env{'form.submitted'}) &&
- (!defined($env{'form.resetdata'})) &&
- (!defined($env{'form.newrandomization'}))) {
- return ('grade', 'web','answer');
- } else {
- return ('web','answer');
- }
- } elsif ($env{'form.problemmode'} eq 'edit') {
- if ( $env{'form.submitted'} eq 'edit' ) {
- if ( $env{'form.submitbutton'} eq &mt('Save and View') ) {
- return ('modified','web','answer');
- } else {
- return ('modified','no_output_web','edit');
- }
- } else {
- return ('no_output_web','edit');
- }
+ } elsif ($env{'form.problemmode'} eq 'view') {
+ return ('grade','web','answer');
+ } elsif ($env{'form.problemmode'} eq 'saveview') {
+ return ('modified','web','answer');
+ } elsif ($env{'form.problemmode'} eq 'discard') {
+ return ('web','answer');
+ } elsif (($env{'form.problemmode'} eq 'saveedit') ||
+ ($env{'form.problemmode'} eq 'undo')) {
+ return ('modified','no_output_web','edit');
+ } elsif ($env{'form.problemmode'} eq 'edit') {
+ return ('no_output_web','edit');
} else {
return ('web');
}
- }
+ }
+#
+# End of Authoring Space
+#
}
+#
+# Huh? We are nowhere, so do nothing.
+#
return ();
}
@@ -175,16 +180,6 @@ sub setup_vars {
# return ';$external::target='.$target.';';
}
-sub createmenu {
- my ($which,$request)=@_;
- if ($which eq 'grade') {
- $request->print('');
- }
-}
-
sub proctor_checked_in {
my ($slot_name,$slot,$type)=@_;
my @possible_proctors=split(",",$slot->{'proctor'});
@@ -215,12 +210,12 @@ sub proctor_checked_in {
}
sub check_slot_access {
- my ($id,$type)=@_;
+ my ($id,$type,$symb)=@_;
# does it pass normal muster
- my ($status,$datemsg)=&check_access($id);
+ my ($status,$datemsg)=&check_access($id,$symb);
- my $useslots = &Apache::lonnet::EXT("resource.0.useslots");
+ my $useslots = &Apache::lonnet::EXT("resource.0.useslots",$symb);
if ($useslots ne 'resource' && $useslots ne 'map'
&& $useslots ne 'map_map') {
return ($status,$datemsg);
@@ -244,8 +239,8 @@ sub check_slot_access {
}
}
- my $availablestudent = &Apache::lonnet::EXT("resource.0.availablestudent");
- my $available = &Apache::lonnet::EXT("resource.0.available");
+ my $availablestudent = &Apache::lonnet::EXT("resource.0.availablestudent",$symb);
+ my $available = &Apache::lonnet::EXT("resource.0.available",$symb);
my @slots= (split(':',$availablestudent),split(':',$available));
# if (!@slots) {
@@ -253,20 +248,24 @@ sub check_slot_access {
# }
my $slotstatus='NOT_IN_A_SLOT';
my ($returned_slot,$slot_name);
+ my $now = time;
+ my $num_usable_slots = 0;
foreach my $slot (@slots) {
$slot =~ s/(^\s*|\s*$)//g;
&Apache::lonxml::debug("getting $slot");
my %slot=&Apache::lonnet::get_slot($slot);
&Apache::lonhomework::showhash(%slot);
- if ($slot{'starttime'} < time &&
- $slot{'endtime'} > time &&
+ next if ($slot{'endtime'} < $now);
+ $num_usable_slots ++;
+ if ($slot{'starttime'} < $now &&
+ $slot{'endtime'} > $now &&
&Apache::loncommon::check_ip_acc($slot{'ip'})) {
&Apache::lonxml::debug("$slot is good");
$slotstatus='NEEDS_CHECKIN';
$returned_slot=\%slot;
$slot_name=$slot;
last;
- }
+ }
}
if ($slotstatus eq 'NEEDS_CHECKIN' &&
&proctor_checked_in($slot_name,$returned_slot,$type)) {
@@ -306,11 +305,38 @@ sub check_slot_access {
# 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)
- && $checkedin
- && $type eq 'problem') {
- return ($slotstatus);
+ # (which will be one of: NOT_IN_A_SLOT, RESERVABLE, RESERVABLE_LATER, or NOTRESERVABLE.
+ if (!defined($slot_name) && $type eq 'problem') {
+ if ($slotstatus eq 'NOT_IN_A_SLOT') {
+ if (!$num_usable_slots) {
+ if ($env{'request.course.id'}) {
+ my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+ unless ($symb) {
+ ($symb)=&Apache::lonnet::whichuser();
+ }
+ $slotstatus = 'NOTRESERVABLE';
+ my ($reservable_now_order,$reservable_now,$reservable_future_order,
+ $reservable_future) =
+ &Apache::loncommon::get_future_slots($cnum,$cdom,$now,$symb);
+ if ((ref($reservable_now_order) eq 'ARRAY') && (ref($reservable_now) eq 'HASH')) {
+ if (@{$reservable_now_order} > 0) {
+ $slotstatus = 'RESERVABLE';
+ $datemsg = $reservable_now->{$reservable_now_order->[-1]}{'endreserve'};
+ }
+ }
+ unless ($slotstatus eq 'RESERVABLE') {
+ if ((ref($reservable_future_order) eq 'ARRAY') && (ref($reservable_future) eq 'HASH')) {
+ if (@{$reservable_future_order} > 0) {
+ $slotstatus = 'RESERVABLE_LATER';
+ $datemsg = $reservable_future->{$reservable_future_order->[0]}{'startreserve'};
+ }
+ }
+ }
+ }
+ }
+ }
+ return ($slotstatus,$datemsg);
}
if ($slotstatus eq 'NOT_IN_A_SLOT'
@@ -342,7 +368,7 @@ sub check_slot_access {
# JB, 9/24/2002: Any changes in this function may require a change
# in lonnavmaps::resource::getDateStatus.
sub check_access {
- my ($id) = @_;
+ my ($id,$symb) = @_;
my $date ='';
my $status;
my $datemsg = '';
@@ -372,27 +398,34 @@ sub check_access {
&Apache::lonxml::debug("checking for part :$id:");
&Apache::lonxml::debug("time:".time);
- my ($symb)=&Apache::lonnet::whichuser();
+ unless ($symb) {
+ ($symb)=&Apache::lonnet::whichuser();
+ }
&Apache::lonxml::debug("symb:".$symb);
#if ($env{'request.state'} ne "construct" && $symb ne '') {
if ($env{'request.state'} ne "construct") {
- my $idacc = &Apache::lonnet::EXT("resource.$id.acc");
+ my $idacc = &Apache::lonnet::EXT("resource.$id.acc",$symb);
my $allowed=&Apache::loncommon::check_ip_acc($idacc);
if (!$allowed && ($Apache::lonhomework::browse ne 'F')) {
$status='INVALID_ACCESS';
$date=&mt("can not be accessed from your location.");
return($status,$date);
}
-
+ if ($env{'form.grade_imsexport'}) {
+ if (($env{'request.course.id'}) &&
+ (&Apache::lonnet::allowed('mdc',$env{'request.course.id'}))) {
+ return ('SHOW_ANSWER');
+ }
+ }
foreach my $temp ("opendate","duedate","answerdate") {
$lastdate = $date;
if ($temp eq 'duedate') {
- $date = &due_date($id);
+ $date = &due_date($id,$symb);
} else {
- $date = &Apache::lonnet::EXT("resource.$id.$temp");
+ $date = &Apache::lonnet::EXT("resource.$id.$temp",$symb);
}
- my $thistype = &Apache::lonnet::EXT("resource.$id.$temp.type");
+ my $thistype = &Apache::lonnet::EXT("resource.$id.$temp.type",$symb);
if ($thistype =~ /^(con_lost|no_such_host)/ ||
$date =~ /^(con_lost|no_such_host)/) {
$status='UNAVAILABLE';
@@ -401,10 +434,10 @@ sub check_access {
}
if ($thistype eq 'date_interval') {
if ($temp eq 'opendate') {
- $date=&Apache::lonnet::EXT("resource.$id.duedate")-$date;
+ $date=&Apache::lonnet::EXT("resource.$id.duedate",$symb)-$date;
}
if ($temp eq 'answerdate') {
- $date=&Apache::lonnet::EXT("resource.$id.duedate")+$date;
+ $date=&Apache::lonnet::EXT("resource.$id.duedate",$symb)+$date;
}
}
&Apache::lonxml::debug("found :$date: for :$temp:");
@@ -424,30 +457,33 @@ sub check_access {
$datemsg=$date;
} elsif ($type eq 'opendate') {
$status='CLOSED';
- $datemsg = &mt("will open on")." $date";
+ $datemsg = &mt('will open on [_1]',$date);
} elsif ($type eq 'duedate') {
$status='CAN_ANSWER';
- $datemsg = &mt("is due at")." $date";
+ $datemsg = &mt('is due at [_1]',$date);
} elsif ($type eq 'answerdate') {
$status='CLOSED';
- $datemsg = &mt("was due on")." $lastdate".&mt(", and answers will be available on")." $date";
+ $datemsg = &mt('was due on [_1], and answers will be available on [_2]',
+ $lastdate,$date);
}
}
if ($status eq 'CAN_ANSWER' ||
(($Apache::lonhomework::browse eq 'F') && ($status eq 'CLOSED'))) {
#check #tries, and if correct.
my $tries = $Apache::lonhomework::history{"resource.$id.tries"};
- my $maxtries = &Apache::lonnet::EXT("resource.$id.maxtries");
+ my $maxtries = &Apache::lonnet::EXT("resource.$id.maxtries",$symb);
if ( $tries eq '' ) { $tries = '0'; }
if ( $maxtries eq '' &&
$env{'request.state'} ne 'construct') { $maxtries = '2'; }
if ($maxtries && $tries >= $maxtries) { $status = 'CANNOT_ANSWER'; }
# if (correct and show prob status) or excused then CANNOT_ANSWER
- if(($Apache::lonhomework::history{"resource.$id.solved"}=~/^correct/
- &&
- &show_problem_status())
- ||
- $Apache::lonhomework::history{"resource.$id.solved"}=~/^excused/) {
+ if ( ($Apache::lonhomework::history{"resource.$id.solved"}=~/^correct/)
+ && (&show_problem_status()) ) {
+ if (($Apache::lonhomework::history{"resource.$id.awarded"} >= 1) ||
+ (&Apache::lonnet::EXT("resource.$id.retrypartial",$symb) !~/^1|on|yes$/i)) {
+ $status = 'CANNOT_ANSWER';
+ }
+ } elsif ($Apache::lonhomework::history{"resource.$id.solved"}=~/^excused/) {
$status = 'CANNOT_ANSWER';
}
if ($status eq 'CANNOT_ANSWER'
@@ -456,14 +492,14 @@ sub check_access {
}
}
if ($status eq 'CAN_ANSWER' || $status eq 'CANNOT_ANSWER') {
- my @interval=&Apache::lonnet::EXT("resource.$id.interval");
+ my @interval=&Apache::lonnet::EXT("resource.$id.interval",$symb);
&Apache::lonxml::debug("looking for interval @interval");
if ($interval[0]) {
- my $first_access=&Apache::lonnet::get_first_access($interval[1]);
+ my $first_access=&Apache::lonnet::get_first_access($interval[1],$symb);
&Apache::lonxml::debug("looking for accesstime $first_access");
if (!$first_access) {
$status='NOT_YET_VIEWED';
- my $due_date = &due_date($id);
+ my $due_date = &due_date($id,$symb);
my $seconds_left = $due_date - time;
if ($seconds_left > $interval[0] || $due_date eq '') {
$seconds_left = $interval[0];
@@ -478,7 +514,6 @@ sub check_access {
# return ('UNCHECKEDOUT','needs to be checked out');
#}
-
&Apache::lonxml::debug("sending back :$status:$datemsg:");
if (($Apache::lonhomework::browse eq 'F') && ($status eq 'CLOSED')) {
&Apache::lonxml::debug("should be allowed to browse a resource when closed");
@@ -511,7 +546,7 @@ sub due_date {
} else {
$date = $due_date;
}
- return $date
+ return $date;
}
sub seconds_to_human_length {
@@ -560,7 +595,7 @@ sub showarray {
sub showhashsubset {
my ($hash,$keyre) = @_;
my $resultkey;
- foreach $resultkey (sort keys %$hash) {
+ foreach $resultkey (sort(keys(%$hash))) {
if ($resultkey !~ /$keyre/) { next; }
if (ref($$hash{$resultkey}) eq 'ARRAY' ) {
&Apache::lonxml::debug("$resultkey ---- ".
@@ -578,6 +613,9 @@ sub showhashsubset {
sub setuppermissions {
$Apache::lonhomework::browse= &Apache::lonnet::allowed('bre',$env{'request.filename'});
+ unless ($Apache::lonhomework::browse eq 'F') {
+ $Apache::lonhomework::browse=&Apache::lonnet::allowed('bro',$env{'request.filename'});
+ }
my $viewgrades = &Apache::lonnet::allowed('vgr',$env{'request.course.id'});
if (! $viewgrades &&
exists($env{'request.course.sec'}) &&
@@ -637,12 +675,13 @@ sub setupheader {
}
sub handle_save_or_undo {
- my ($request,$problem,$result) = @_;
+ my ($request,$problem,$result,$getobjref) = @_;
+
my $file = &Apache::lonnet::filelocation("",$request->uri);
my $filebak =$file.".bak";
my $filetmp =$file.".tmp";
my $error=0;
- if ($env{'form.Undo'} eq &mt('undo')) {
+ if (($env{'form.problemmode'} eq 'undo') || ($env{'form.problemmode'} eq 'undoxml')) {
my $error=0;
if (!&File::Copy::copy($file,$filetmp)) { $error=1; }
if ((!$error) && (!&File::Copy::copy($filebak,$file))) { $error=1; }
@@ -665,6 +704,7 @@ sub handle_save_or_undo {
}
} else {
&Apache::lonnet::correct_line_ends($result);
+
my $fs=Apache::File->new(">$filebak");
if (defined($fs)) {
print $fs $$problem;
@@ -678,6 +718,30 @@ sub handle_save_or_undo {
my $fh=Apache::File->new(">$file");
if (defined($fh)) {
print $fh $$result;
+ if (ref($getobjref) eq 'SCALAR') {
+ if ($file =~ m{([^/]+)\.(html?)$}) {
+ my $fname = $1;
+ my $ext = $2;
+ my $path = $file;
+ $path =~ s/\Q$fname\E\.\Q$ext\E$//;
+ my (%allfiles,%codebase);
+ &Apache::lonnet::extract_embedded_items($file,\%allfiles,
+ \%codebase,$result);
+ if (keys(%allfiles) > 0) {
+ my $url = $request->uri;
+ my $state = <
".&mt("Completed upload of the file. This file contained references to other files.")."
". + "".&mt("Please select the locations from which the referenced files are to be uploaded.")."
". + &Apache::loncommon::ask_for_embedded_content($url,$state,\%allfiles,\%codebase, + {'error_on_invalid_names' => 1, + 'ignore_remote_references' => 1,}); + } + } + } } else { &Apache::lonxml::info(''. &mt("Unable to write to [_1]", @@ -695,8 +759,8 @@ sub analyze_header { my $js = &Apache::structuretags::setmode_javascript(); # Breadcrumbs - my $brcrum = [{'href' => &Apache::loncommon::authorspace(), - 'text' => 'Construction Space'}, + my $brcrum = [{'href' => &Apache::loncommon::authorspace($request->uri), + 'text' => 'Authoring Space'}, {'href' => '', 'text' => 'Problem Testing'}, {'href' => '', @@ -709,8 +773,7 @@ sub analyze_header { .&Apache::loncommon::head_subbox( &Apache::loncommon::CSTR_pageheader()); $result .= - &Apache::lonxml::message_location().' - '; + ' + .&Apache::lonxml::message_location(). + ''; &Apache::lonxml::add_messages(\$result); $request->print($result); $request->rflush(); @@ -747,13 +811,9 @@ sub analyze { my $rndseed=$env{'form.rndseed'}; &analyze_header($request); my %prog_state= - &Apache::lonhtmlcommon::Create_PrgWin($request,&mt('Analyze Progress'), - &mt('Getting Problem Variants'), - $env{'form.numtoanalyze'}, - 'inline',undef); + &Apache::lonhtmlcommon::Create_PrgWin($request,$env{'form.numtoanalyze'}); for(my $i=1;$i<$env{'form.numtoanalyze'}+1;$i++) { - &Apache::lonhtmlcommon::Increment_PrgWin($request,\%prog_state, - &mt('last problem')); + &Apache::lonhtmlcommon::Increment_PrgWin($request,\%prog_state,'last problem'); if (&Apache::loncommon::connection_aborted($request)) { return; } my $thisseed=$i+$rndseed; my $subresult=&Apache::lonnet::ssi($request->uri, @@ -762,7 +822,7 @@ sub analyze { (my $garbage,$subresult)=split(/_HASH_REF__/,$subresult,2); my %analyze=&Apache::lonnet::str2hash($subresult); my @parts; - if (defined(@{ $analyze{'parts'} })) { + if (ref($analyze{'parts'}) eq 'ARRAY') { @parts=@{ $analyze{'parts'} }; } foreach my $part (@parts) { @@ -795,15 +855,15 @@ sub analyze { } } } - &Apache::lonhtmlcommon::Update_PrgWin($request,\%prog_state, - &mt('Analyzing Results')); + &Apache::lonhtmlcommon::Update_PrgWin($request,\%prog_state,&mt('Analyzing Results')); $request->print('' .&mt('Unable to find [_1]', ''.$file.'') - .''); + .'
'); $problem=''; } - if (defined($env{'form.editxmltext'}) || defined($env{'form.Undo'})) { + if (($env{'form.problemmode'} eq 'saveeditxml') || + ($env{'form.problemmode'} eq 'saveviewxml') || + ($env{'form.problemmode'} eq 'undoxml')) { my $error=&handle_save_or_undo($request,\$problem, \$env{'form.editxmltext'}); if (!$error) { $problem=&Apache::lonnet::getfile($file); } } &Apache::lonhomework::showhashsubset(\%env,'^form'); - if ( $env{'form.submitbutton'} eq &mt('Save and View') ) { + if ($env{'form.problemmode'} eq 'saveviewxml') { &Apache::lonhomework::showhashsubset(\%env,'^form'); $env{'form.problemmode'}='view'; &renderpage($request,$file); @@ -928,26 +990,23 @@ sub editxmlmode { &Apache::loncommon::resize_textarea_js(). &Apache::structuretags::setmode_javascript(). &Apache::lonhtmlcommon::dragmath_js("EditMathPopup"); - my $only_body = ($env{'environment.remote'} eq 'off')? 0 : 1; - my $dragmath_button = - &Apache::lonhtmlcommon::dragmath_button("LC_editxmltext",1); # Breadcrumbs - my $brcrum = [{'href' => &Apache::loncommon::authorspace(), - 'text' => 'Construction Space'}, + my $brcrum = [{'href' => &Apache::loncommon::authorspace($request->uri), + 'text' => 'Authoring Space'}, {'href' => '', 'text' => 'Problem Editing'}]; my $start_page = &Apache::loncommon::start_page(&mt("EditXML [_1]",$file),$js, {'no_auto_mt_title' => 1, - 'only_body' => $only_body, + 'only_body' => 0, 'add_entries' => { 'onresize' => q[resize_textarea('LC_editxmltext','LC_aftertextarea')], 'onload' => q[resize_textarea('LC_editxmltext','LC_aftertextarea')], - }, + }, 'bread_crumbs' => $brcrum, -}); + }); $result=$start_page .&Apache::loncommon::head_subbox( @@ -956,39 +1015,88 @@ sub editxmlmode { ''.&Apache::loncommon::end_page(); - &Apache::lonxml::add_messages(\$result); - $request->print($result); +' + .&mt('Unable to find [_1]', ''.$filename.'') - .""; + ."
"; $result.= &Apache::loncommon::simple_error_page($request,'Not available', - $error); + $error,{'no_auto_mt_msg' => 1}); return; } @@ -1076,7 +1185,25 @@ sub finished_parsing { undef($Apache::lonhomework::parsing_a_task); } -sub get_template_list { +# function extracted from get_template_html +# returns "key" -> list +# key: path of template +# value 1: title +# value 2: category +# value 3: name of help topic ??? +sub get_template_list{ + my ($extension) = @_; + + my @files = glob($Apache::lonnet::perlvar{'lonIncludes'}. + '/templates/*.'.$extension); + @files = map {[$_,&mt(&Apache::lonnet::metadata($_, 'title')), + (&Apache::lonnet::metadata($_, 'category')?&mt(&Apache::lonnet::metadata($_, 'category')):&mt('Miscellaneous')), + &mt(&Apache::lonnet::metadata($_, 'help'))]} (@files); + @files = sort {$a->[2].$a->[1] cmp $b->[2].$b->[1]} (@files); + return @files; +} + +sub get_template_html { my ($extension) = @_; my $result; my @allnames; @@ -1085,13 +1212,9 @@ sub get_template_list { 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')), - (&Apache::lonnet::metadata($_, 'category')?&mt(&Apache::lonnet::metadata($_, 'category')):&mt('Miscellaneous')), - &mt(&Apache::lonnet::metadata($_, 'help'))]} (@files); - @files = sort {$a->[2].$a->[1] cmp $b->[2].$b->[1]} (@files); + my @files = &get_template_list($extension); my ($midpoint,$seconddiv,$numfiles); + my @noexamplelink = ('blank.problem','blank.library','script.library'); $numfiles = 0; foreach my $file (@files) { next if ($file->[1] !~ /\S/); @@ -1107,6 +1230,7 @@ sub get_template_list { my $count = 0; my $currentcategory=''; my $first = 1; + my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'}; foreach my $file (@files) { next if ($file->[1] !~ /\S/); if ($file->[2] ne $currentcategory) { @@ -1129,11 +1253,16 @@ sub get_template_list { if ($file->[3]) { $result.=&Apache::loncommon::help_open_topic($file->[3]); } + # Provide example link my $filename=$file->[0]; - $filename=~s/^\/home\/httpd\/html//; - $result.=' ' - .''.&mt('Example').'' - .'
'.&mt("To create a new $extension, select a template from the".
" list below. Then click on the \"Create $extension\" button.").'
@@ -1219,10 +1352,47 @@ sub update_construct_style {
}
}
+#
+# Sets interval for current user so time left will be zero, either for the entire folder
+# containing the current resource, or just the resource, depending on value of first item
+# in interval array retrieved from EXT("resource.0.interval");
+#
+sub zero_timer {
+ my ($symb) = @_;
+ my ($hastimeleft,$first_access,$now);
+ my @interval=&Apache::lonnet::EXT("resource.0.interval",$symb);
+ if (@interval > 1) {
+ if ($interval[1] eq 'course') {
+ return;
+ } else {
+ my $now = time;
+ my $first_access=&Apache::lonnet::get_first_access($interval[1],$symb);
+ if ($first_access > 0) {
+ my ($timelimit) = split(/_/,$interval[0]);
+ if ($first_access+$timelimit > $now) {
+ my $done_time = $now - $first_access;
+ my $snum = 1;
+ if ($interval[1] eq 'map') {
+ $snum = 2;
+ }
+ my $result =
+ &Apache::lonparmset::storeparm_by_symb_inner($symb,'0_interval',
+ $snum,$done_time,
+ 'date_interval',
+ $env{'user.name'},
+ $env{'user.domain'});
+ return $result;
+ }
+ }
+ }
+ }
+ return;
+}
sub handler {
#my $t0 = [&gettimeofday()];
my $request=$_[0];
+
$Apache::lonxml::request=$request;
$Apache::lonxml::debug=$env{'user.debug'};
$env{'request.uri'}=$request->uri;
@@ -1231,7 +1401,7 @@ sub handler {
my $file=&Apache::lonnet::filelocation("",$request->uri);
#check if we know where we are
- if ($env{'request.course.fn'} && !&Apache::lonnet::symbread()) {
+ if ($env{'request.course.fn'} && !&Apache::lonnet::symbread('','',1,1)) {
# if we are browsing we might not be able to know where we are
if ($Apache::lonhomework::browse ne 'F' &&
$env{'request.state'} ne "construct") {
@@ -1245,6 +1415,7 @@ sub handler {
&unset_permissions();
return OK;
}
+
&Apache::lonxml::debug("Permissions:$Apache::lonhomework::browse:$Apache::lonhomework::viewgrades:$Apache::lonhomework::modifygrades:$Apache::lonhomework::queuegrade");
&Apache::lonxml::debug("Problem Mode ".$env{'form.problemmode'});
my ($symb) = &Apache::lonnet::whichuser();
@@ -1257,7 +1428,10 @@ sub handler {
#first visit to problem in construction space
$env{'form.problemmode'}= 'view';
&renderpage($request,$file);
- } elsif ($env{'form.problemmode'} eq 'editxml') {
+ } elsif (($env{'form.problemmode'} eq 'editxml') ||
+ ($env{'form.problemmode'} eq 'saveeditxml') ||
+ ($env{'form.problemmode'} eq 'saveviewxml') ||
+ ($env{'form.problemmode'} eq 'undoxml')) {
&editxmlmode($request,$file);
} elsif ($env{'form.problemmode'} eq 'calcanswers') {
&analyze($request,$file);
@@ -1266,10 +1440,18 @@ sub handler {
&renderpage($request,$file);
}
} else {
+ &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
+ ['mode']);
# requested file doesn't exist in contruction space
&newproblem($request);
}
} else {
+ # Set the event timer to zero if the "done button" was clicked. The button is
+ # part of the doneButton form created in lonmenu.pm
+ if ($symb && $env{'form.LC_interval_done'} eq 'true') {
+ &zero_timer($symb);
+ undef($env{'form.LC_interval_done'});
+ }
# just render the page normally outside of construction space
&Apache::lonxml::debug("not construct");
&renderpage($request,$file);
@@ -1283,5 +1465,175 @@ sub handler {
}
+sub template_dropdown_datastructure {
+ # gathering the all templates and their path, title, category and help topic
+ my @templates = get_template_list('problem');
+ # template category => title
+ my %tmplthash = ();
+ # template title => path
+ my %tmpltcontent = ();
+
+ foreach my $template (@templates){
+ # put in hash if the template is not empty
+ unless ($template->[1] eq ''){
+ push(@{$tmplthash{$template->[2]}}, $template->[1]);
+ push(@{$tmpltcontent{$template->[1]}},$template->[0]);
+ }
+ }
+
+ my $catList = [];
+ foreach my $cat (sort keys %tmplthash) {
+ my $catItems = [];
+ foreach my $title (sort @{$tmplthash{$cat}}) {
+ my $path = $tmpltcontent{$title}->[0];
+ my $code;
+ open(FH, "<$path");
+ while(