--- loncom/homework/lonhomework.pm 2011/12/21 21:25:36 1.335
+++ loncom/homework/lonhomework.pm 2015/05/26 13:25:52 1.349.2.3
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# The LON-CAPA Homework handler
#
-# $Id: lonhomework.pm,v 1.335 2011/12/21 21:25:36 www Exp $
+# $Id: lonhomework.pm,v 1.349.2.3 2015/05/26 13:25:52 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -51,6 +51,7 @@ use Apache::functionplotresponse();
use Apache::drawimage();
use Apache::Constants qw(:common);
use Apache::loncommon();
+use Apace::lonparmset();
use Apache::lonlocal;
use Time::HiRes qw( gettimeofday tv_interval );
use HTML::Entities();
@@ -163,7 +164,7 @@ sub get_target {
}
}
#
-# End of Construction Space
+# End of Authoring Space
#
}
#
@@ -451,13 +452,14 @@ 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' ||
@@ -468,7 +470,6 @@ sub check_access {
if ( $tries eq '' ) { $tries = '0'; }
if ( $maxtries eq '' &&
$env{'request.state'} ne 'construct') { $maxtries = '2'; }
- $Apache::lonhomework::results{'resource.'.$id.'.maxtries'}=$maxtries;
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/)
@@ -508,7 +509,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");
@@ -541,7 +541,7 @@ sub due_date {
} else {
$date = $due_date;
}
- return $date
+ return $date;
}
sub seconds_to_human_length {
@@ -590,7 +590,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 ---- ".
@@ -608,6 +608,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'}) &&
@@ -667,7 +670,7 @@ 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";
@@ -710,6 +713,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 = <
+
+STATE
+ $$getobjref = "
".&mt("Reference Warning")."
".
+ "".&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]",
@@ -728,7 +755,7 @@ sub analyze_header {
# Breadcrumbs
my $brcrum = [{'href' => &Apache::loncommon::authorspace($request->uri),
- 'text' => 'Construction Space'},
+ 'text' => 'Authoring Space'},
{'href' => '',
'text' => 'Problem Testing'},
{'href' => '',
@@ -741,8 +768,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();
@@ -790,7 +817,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) {
@@ -830,7 +857,8 @@ sub analyze {
.''
);
foreach my $part (sort(keys(%allparts))) {
- if (defined(@{ $overall{$part.'.answer'} })) {
+ if ((ref($overall{$part.'.answer'}) eq 'ARRAY') &&
+ (@{$overall{$part.'.answer'}} > 0)) {
for (my $i=0;$iprint(&Apache::loncommon::start_data_table()
@@ -935,9 +963,8 @@ sub editxmlmode {
$problem='';
}
-
if (($env{'form.problemmode'} eq 'saveeditxml') ||
- ($env{'form.problemmode'} eq 'saveviewxml') ||
+ ($env{'form.problemmode'} eq 'saveviewxml') ||
($env{'form.problemmode'} eq 'undoxml')) {
my $error=&handle_save_or_undo($request,\$problem,
\$env{'form.editxmltext'});
@@ -961,7 +988,7 @@ sub editxmlmode {
# Breadcrumbs
my $brcrum = [{'href' => &Apache::loncommon::authorspace($request->uri),
- 'text' => 'Construction Space'},
+ 'text' => 'Authoring Space'},
{'href' => '',
'text' => 'Problem Editing'}];
@@ -983,27 +1010,73 @@ sub editxmlmode {
''.&Apache::loncommon::end_page();
- &Apache::lonxml::add_messages(\$result);
- $request->print($result);
+ ';
+ my $resource = $env{'request.ambiguous'};
+ unless($env{'environment.nocodemirror'}){
+
+ $result .= '
+
+ ",
+ mode: CodeMirror.getMode(config, "perl"),
+ delimStyle: "tag",
+ }
+ );
+ });
+ var cm = CodeMirror.fromTextArea(document.getElementById("LC_editxmltext"),
+ {
+ mode: "mixedmode",
+ lineWrapping: true,
+ lineNumbers: true,
+ tabSize: 4,
+ indentUnit: 4,
+
+ autoCloseTags: true,
+ autoCloseBrackets: true,
+ height: "auto",
+ styleActiveLine: true,
+
+ extraKeys: {
+ "Tab": "indentMore",
+ "Shift-Tab": "indentLess",
+ }
+ });
+ restoreScrollPosition("'.$resource.'");
+ ';
+ }
+ $result .= &Apache::loncommon::end_page();
+ &Apache::lonxml::add_messages(\$result);
+ $request->print($result);
}
return '';
}
@@ -1044,7 +1117,7 @@ sub renderpage {
."";
$result.=
&Apache::loncommon::simple_error_page($request,'Not available',
- $error);
+ $error,{'no_auto_mt_msg' => 1});
return;
}
@@ -1092,7 +1165,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;
@@ -1101,13 +1192,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/);
@@ -1146,11 +1233,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{^\Q$londocroot\E}{};
- $result.=' '
- .&Apache::loncommon::modal_link($filename.'?inhibitmenu=yes',&mt('Example'),600,420,'sample')
- .'
'."\n";
+ if (!(grep($filename =~ /\Q$_\E$/,@noexamplelink))) {
+ $result .= ' '
+ .&Apache::loncommon::modal_link(
+ $filename.'?inhibitmenu=yes',&mt('Example'),600,420,'sample')
+ .'';
+ }
+ $result .= '
'."\n";
$count ++;
}
if ($numfiles > 0) {
@@ -1162,6 +1254,12 @@ sub get_template_list {
sub newproblem {
my ($request) = @_;
+ if ($env{'form.mode'} eq 'blank'){
+ my $dest = &Apache::lonnet::filelocation("",$request->uri);
+ &File::Copy::copy('/home/httpd/html/res/adm/includes/templates/blank.problem',$dest);
+ &renderpage($request,$dest);
+ return;
+ }
if ($env{'form.template'}) {
my $file = $env{'form.template'};
my $dest = &Apache::lonnet::filelocation("",$request->uri);
@@ -1172,7 +1270,7 @@ sub newproblem {
my ($extension) = ($request->uri =~ m/\.(\w+)$/);
&Apache::lonxml::debug("Looking for :$extension:");
- my $templatelist=&get_template_list($extension);
+ my $templatelist=&get_template_html($extension);
if ($env{'form.newfile'} && !$templatelist) {
# no templates found
my $templatefilename =
@@ -1187,7 +1285,7 @@ sub newproblem {
my $errormsg;
my $instructions;
my $brcrum = [{'href' => &Apache::loncommon::authorspace($request->uri),
- 'text' => 'Construction Space'},
+ 'text' => 'Authoring Space'},
{'href' => '',
'text' => "Create New $extension"}];
my $start_page =
@@ -1234,10 +1332,46 @@ 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");
+ 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) {
+ if ($first_access+$interval[0] > $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;
@@ -1260,6 +1394,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();
@@ -1284,10 +1419,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);