version 1.344.2.5, 2016/09/14 16:36:49
|
version 1.344.2.10.4.1, 2023/07/05 16:51:49
|
Line 235 sub check_slot_access {
|
Line 235 sub check_slot_access {
|
$Apache::lonhomework::history{"resource.$version.0.status"} eq 'pass') { |
$Apache::lonhomework::history{"resource.$version.0.status"} eq 'pass') { |
return ('SHOW_ANSWER'); |
return ('SHOW_ANSWER'); |
} |
} |
|
} elsif (($type eq 'problem') && |
|
($Apache::lonhomework::browse eq 'F') && |
|
($ENV{'REMOTE_ADDR'} eq '127.0.0.1') && |
|
($env{'form.grade_courseid'} eq $env{'request.course.id'}) && |
|
(&Apache::lonnet::allowed('mgr',$env{'request.course.id'}))) { |
|
return ($status,$datemsg); |
} |
} |
|
|
my $availablestudent = &Apache::lonnet::EXT("resource.0.availablestudent",$symb); |
my $availablestudent = &Apache::lonnet::EXT("resource.0.availablestudent",$symb); |
Line 311 sub check_slot_access {
|
Line 317 sub check_slot_access {
|
$earlyout = 1; |
$earlyout = 1; |
} |
} |
} |
} |
if (($currtries == $maxtries) || ($is_correct)) { |
if ($currtries == $maxtries) { |
$earlyout = 1; |
$earlyout = 1; |
} else { |
} else { |
$numgraded ++; |
$numgraded ++; |
Line 1107 sub editxmlmode {
|
Line 1113 sub editxmlmode {
|
<div class="LC_edit_problem_header"> |
<div class="LC_edit_problem_header"> |
<div class="LC_edit_problem_header_title">'. |
<div class="LC_edit_problem_header_title">'. |
&mt('Problem Editing').' '.&Apache::loncommon::help_open_topic('Problem_Editor_XML_Index'). |
&mt('Problem Editing').' '.&Apache::loncommon::help_open_topic('Problem_Editor_XML_Index'). |
</div><div class="LC_edit_actionbar" id="actionbar">'; |
'</div><div class="LC_edit_actionbar" id="actionbar">'; |
|
|
$result.='<input type="hidden" name="problemmode" value="saveedit" />'. |
$result.='<input type="hidden" name="problemmode" value="saveedit" />'. |
&Apache::structuretags::problem_edit_buttons('editxml'); |
&Apache::structuretags::problem_edit_buttons('editxml'); |
Line 1130 sub editxmlmode {
|
Line 1136 sub editxmlmode {
|
&mt("Miscellaneous"), misc_datastructure()); |
&mt("Miscellaneous"), misc_datastructure()); |
} |
} |
|
|
$result .= Apache::lonmenu::create_submenu("#", "", |
$result .= Apache::lonmenu::create_submenu("#", "", |
&mt("Help") . ' <img src="/adm/help/help.png" alt="' . &mt("Help") . |
&mt("Help") . ' <img src="/adm/help/help.png" alt="' . &mt("Help") . |
'" style="vertical-align:text-bottom; height: auto; margin:0; "/>', |
'" style="vertical-align:text-bottom; height: auto; margin:0; "/>', |
helpmenu_datastructure(),""); |
helpmenu_datastructure(),""); |
Line 1194 sub editxmlmode {
|
Line 1200 sub editxmlmode {
|
# Render the page in whatever target desired. |
# Render the page in whatever target desired. |
# |
# |
sub renderpage { |
sub renderpage { |
my ($request,$file,$targets,$return_string) = @_; |
my ($request,$file,$targets,$return_string,$donebuttonmsg) = @_; |
|
|
my @targets = @{$targets || [&get_target()]}; |
my @targets = @{$targets || [&get_target()]}; |
&Apache::lonhomework::showhashsubset(\%env,'form.'); |
&Apache::lonhomework::showhashsubset(\%env,'form.'); |
Line 1245 sub renderpage {
|
Line 1251 sub renderpage {
|
if ($target eq 'analyze') { |
if ($target eq 'analyze') { |
$result=&Apache::lonnet::hashref2str(\%Apache::lonhomework::analyze); |
$result=&Apache::lonnet::hashref2str(\%Apache::lonhomework::analyze); |
undef(%Apache::lonhomework::analyze); |
undef(%Apache::lonhomework::analyze); |
|
} elsif ($target eq 'web') { |
|
if ($donebuttonmsg) { |
|
$result =~ s{</body>}{}; |
|
$result.= &Apache::loncommon::confirmwrapper(&Apache::lonhtmlcommon::confirm_success($donebuttonmsg,1))."\n</body>"; |
|
} |
} |
} |
#my $td=&tv_interval($t0); |
#my $td=&tv_interval($t0); |
#if ( $Apache::lonxml::debug) { |
#if ( $Apache::lonxml::debug) { |
Line 1369 sub newproblem {
|
Line 1380 sub newproblem {
|
&File::Copy::copy($templatefilename,$dest); |
&File::Copy::copy($templatefilename,$dest); |
&renderpage($request,$dest); |
&renderpage($request,$dest); |
return; |
return; |
|
} |
|
my $errormsg; |
if ($env{'form.template'}) { |
if ($env{'form.template'}) { |
my $file = $env{'form.template'}; |
my $file; |
my $dest = &Apache::lonnet::filelocation("",$request->uri); |
my ($extension) = ($env{'form.template'} =~ /\.(\w+)$/); |
&File::Copy::copy($file,$dest); |
if ($extension) { |
&renderpage($request,$dest); |
my @files = &get_template_list($extension); |
return; |
foreach my $poss (@files) { |
|
if (ref($poss) eq 'ARRAY') { |
|
if ($env{'form.template'} eq $poss->[0]) { |
|
$file = $env{'form.template'}; |
|
last; |
|
} |
|
} |
|
} |
|
if ($file) { |
|
my $dest = &Apache::lonnet::filelocation("",$request->uri); |
|
&File::Copy::copy($file,$dest); |
|
&renderpage($request,$dest); |
|
return; |
|
} else { |
|
$errormsg = '<p class="LC_error">'.&mt('Invalid template file.').'</p>'; |
|
} |
|
} else { |
|
$errormsg = '<p class="LC_error">'.&mt('Invalid template file; template needs to be a .problem, .library, or .task file.').'</p>'; |
|
} |
} |
} |
|
|
my ($extension) = ($request->uri =~ m/\.(\w+)$/); |
my ($extension) = ($request->uri =~ m/\.(\w+)$/); |
Line 1392 sub newproblem {
|
Line 1422 sub newproblem {
|
} else { |
} else { |
my $url=&HTML::Entities::encode($request->uri,'<>&"'); |
my $url=&HTML::Entities::encode($request->uri,'<>&"'); |
my $dest = &Apache::lonnet::filelocation("",$request->uri); |
my $dest = &Apache::lonnet::filelocation("",$request->uri); |
my $errormsg; |
|
my $instructions; |
my $instructions; |
my $brcrum = [{'href' => &Apache::loncommon::authorspace($request->uri), |
my $brcrum = [{'href' => &Apache::loncommon::authorspace($request->uri), |
'text' => 'Authoring Space'}, |
'text' => 'Authoring Space'}, |
Line 1442 sub update_construct_style {
|
Line 1471 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 ('fail',&mt('Ending of timed events not supported for intervals set course-wide')); |
|
} else { |
|
my $now = time; |
|
my $first_access=&Apache::lonnet::get_first_access($interval[1],$symb); |
|
if ($first_access > 0) { |
|
my ($timelimit,$donesuffix) = split(/_/,$interval[0],2); |
|
if ($donesuffix =~ /^done(?:|\:[^\:]+\:)(.*)$/) { |
|
my ($dummy,$proctor,$secret) = split(/_/,$1); |
|
if (($proctor) && ($secret ne '')) { |
|
my $key = $env{'form.LC_interval_done_proctorpass'}; |
|
$key =~ s/^\s+//; |
|
$key =~ s/\s+$//; |
|
if ($env{'form.LC_interval_done_proctorpass'} ne $secret) { |
|
return ('fail', |
|
&mt('Incorrect key entered by proctor')); |
|
} |
|
} |
|
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'}); |
|
if ($result eq '') { |
|
# Record action in "User Notes" |
|
&Apache::lonmsg::store_instructor_comment( |
|
'Pressed Done button for symb:<br />'.$symb, |
|
$env{'user.name'}, $env{'user.domain'}); |
|
return ('ok'); |
|
} else { |
|
return ('fail',&mt('Error ending timed event: [_1]',$result)); |
|
} |
|
} else { |
|
return ('fail',&mt('Timed event already ended')); |
|
} |
|
} else { |
|
return ('fail',&mt('Timed event can not be ended before the time limit')); |
|
} |
|
} else { |
|
return ('fail',&mt('Timer not yet started for this timed event')); |
|
} |
|
} |
|
} else { |
|
return ('fail',&mt('No timer in use')); |
|
} |
|
return(); |
|
} |
|
|
sub handler { |
sub handler { |
#my $t0 = [&gettimeofday()]; |
#my $t0 = [&gettimeofday()]; |
Line 1498 sub handler {
|
Line 1591 sub handler {
|
&newproblem($request); |
&newproblem($request); |
} |
} |
} else { |
} 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 |
|
my ($donebuttonresult,$donemsg); |
|
if ($symb && $env{'form.LC_interval_done'} eq 'true') { |
|
($donebuttonresult,$donemsg) = &zero_timer($symb); |
|
undef($env{'form.LC_interval_done'}); |
|
undef($env{'form.LC_interval_done_proctorpass'}); |
|
} |
# just render the page normally outside of construction space |
# just render the page normally outside of construction space |
&Apache::lonxml::debug("not construct"); |
&Apache::lonxml::debug("not construct"); |
&renderpage($request,$file); |
&renderpage($request,$file,undef,undef,$donemsg); |
} |
} |
#my $td=&tv_interval($t0); |
#my $td=&tv_interval($t0); |
#&Apache::lonxml::debug("Spent $td seconds processing"); |
#&Apache::lonxml::debug("Spent $td seconds processing"); |
Line 1553 sub template_dropdown_datastructure {
|
Line 1654 sub template_dropdown_datastructure {
|
|
|
sub responseblock_dropdown_datastructure { |
sub responseblock_dropdown_datastructure { |
|
|
my $mathCat = [ |
my $mathCat = [ |
[ |
[ |
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_formularesponse())) . "\')", &mt("Formula Response"), undef], |
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_formularesponse())) . "\')", &mt("Formula Response"), undef], |
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_functionplotresponse())) . "\')", &mt("Function Plot Response"), undef], |
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_functionplotresponse())) . "\')", &mt("Function Plot Response"), undef], |
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_mathresponse())) . "\')", &mt("Math Response"), undef], |
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_mathresponse())) . "\')", &mt("Math Response"), undef], |
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_numericalresponse())) . "\')", &mt("Numerical Response"), undef] |
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_numericalresponse())) . "\')", &mt("Numerical Response"), undef] |
], |
], |
&mt("Math"), |
&mt("Math"), |
undef |
undef |
]; |
]; |
|
|
my $miscCat = [ |
my $miscCat = [ |
[ |
[ |
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_imageresponse())) . "\')", &mt("Click on Image"), undef], |
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_imageresponse())) . "\')", &mt("Click on Image"), undef], |
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_customresponse())) . "\')", &mt("Custom Response"), undef], |
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_customresponse())) . "\')", &mt("Custom Response"), undef], |
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_externalresponse())) . "\')", &mt("External Response"), undef], |
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_externalresponse())) . "\')", &mt("External Response"), undef], |
Line 1578 sub responseblock_dropdown_datastructure
|
Line 1679 sub responseblock_dropdown_datastructure
|
undef |
undef |
]; |
]; |
|
|
my $chemCat = [ |
my $chemCat = [ |
[ |
[ |
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_reactionresponse())) . "\')", &mt("Chemical Reaction"), undef], |
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_reactionresponse())) . "\')", &mt("Chemical Reaction"), undef], |
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_organicresponse())) . "\')", &mt("Organic Chemical Structure"), undef] |
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_organicresponse())) . "\')", &mt("Organic Chemical Structure"), undef] |
], |
], |
&mt("Chemistry"), |
&mt("Chemistry"), |
undef |
undef |
]; |
]; |
|
|
my $textCat = [ |
my $textCat = [ |
[ |
[ |
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_stringresponse())) . "\')", &mt("String Response"), undef], |
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_stringresponse())) . "\')", &mt("String Response"), undef], |
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_essayresponse())) . "\')", &mt("Essay"), undef] |
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_essayresponse())) . "\')", &mt("Essay"), undef] |
], |
], |
&mt("Text"), |
&mt("Text"), |
undef |
undef |
]; |
]; |
|
|
return [$mathCat, $miscCat, $chemCat, $textCat]; |
return [$mathCat, $miscCat, $chemCat, $textCat]; |
} |
} |
Line 1609 sub conditional_scripting_datastructure
|
Line 1710 sub conditional_scripting_datastructure
|
#TODO translated is currently temporarily here, another solution should be found where the |
#TODO translated is currently temporarily here, another solution should be found where the |
# needed string can be retrieved |
# needed string can be retrieved |
|
|
my $translatedTag = ' |
my $translatedTag = ' |
<translated> |
<translated> |
<lang which="en"></lang> |
<lang which="en"></lang> |
<lang which="default"></lang> |
<lang which="default"></lang> |
</translated>'; |
</translated>'; |
return [ |
return [ |
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode($translatedTag)) . "\')", &mt("Translated Block"), undef], |
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode($translatedTag)) . "\')", &mt("Translated Block"), undef], |
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("block"))) . "\')", &mt("Conditional Block"), undef], |
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("block"))) . "\')", &mt("Conditional Block"), undef], |
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("postanswerdate"))) . "\')", &mt("After Answer Date Block"), undef], |
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("postanswerdate"))) . "\')", &mt("After Answer Date Block"), undef], |
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("preduedate"))) . "\')", &mt("Before Due Date Block"), undef], |
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("preduedate"))) . "\')", &mt("Before Due Date Block"), undef], |
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("solved"))) . "\')", &mt("Block For After Solved"), undef], |
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("solved"))) . "\')", &mt("Block For After Solved"), undef], |
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("notsolved"))) . "\')", &mt("Block For When Not Solved"), undef] |
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("notsolved"))) . "\')", &mt("Block For When Not Solved"), undef] |
]; |
]; |
} |
} |
|
|
Line 1639 sub misc_datastructure {
|
Line 1740 sub misc_datastructure {
|
|
|
# helper routine for the datastructure building subroutines |
# helper routine for the datastructure building subroutines |
sub default_xml_tag { |
sub default_xml_tag { |
my ($tag) = @_; |
my ($tag) = @_; |
return "\n<$tag></$tag>"; |
return "\n<$tag></$tag>"; |
} |
} |
|
|
|
|
sub helpmenu_datastructure { |
sub helpmenu_datastructure { |
|
|
my $width = 500; |
# filename, title, width, height |
my $height = 600; |
my $helpers = [ |
|
['Problem_LON-CAPA_Functions.hlp', &mt('Script Functions'), 800, 600], |
my $helpers = [ |
['Greek_Symbols.hlp', &mt('Greek Symbols'), 500, 600], |
['Problem_LON-CAPA_Functions', &mt('Script Functions')], |
['Other_Symbols.hlp', &mt('Other Symbols'), 500, 600], |
['Greek_Symbols', &mt('Greek Symbols')], |
['Authoring_Output_Tags.hlp', &mt('Output Tags'), 800, 600], |
['Other_Symbols', &mt('Other Symbols')], |
['Authoring_Multilingual_Problems.hlp', &mt('Languages'), 800, 600], |
['Authoring_Output_Tags', &mt('Output Tags')], |
]; |
['Authoring_Multilingual_Problems', &mt('Languages')], |
|
]; |
my $help_structure = []; |
|
|
my $help_structure = []; |
foreach my $count (0..(scalar(@{$helpers})-1)) { |
|
my $filename = $helpers->[$count]->[0]; |
foreach my $count (0..(scalar(@{$helpers})-1)) { |
my $title = $helpers->[$count]->[1]; |
my $filename = $helpers->[$count]->[0]; |
my $width = $helpers->[$count]->[2]; |
my $title = $helpers->[$count]->[1]; |
my $height = $helpers->[$count]->[3]; |
my $href = &HTML::Entities::encode("javascript:openMyModal('/adm/help/$filename.hlp',$width,$height,'yes');"); |
if ($width eq '') { |
push @{$help_structure}, [$href, $title, undef]; |
$width = 500; |
} |
} |
|
if ($height eq '') { |
|
$height = 600; |
|
} |
|
my $href = &HTML::Entities::encode("javascript:openMyModal('/adm/help/$filename',$width,$height,'yes');"); |
|
push @{$help_structure}, [$href, $title, undef]; |
|
} |
|
|
return $help_structure; |
return $help_structure; |
} |
} |
|
|
# we need substitution to not break javascript code |
# we need substitution to not break javascript code |
sub convert_for_js { |
sub convert_for_js { |
my $return = shift; |
my $return = shift; |
$return =~ s|script|ESCAPEDSCRIPT|g; |
$return =~ s|script|ESCAPEDSCRIPT|g; |
$return =~ s|\\|\\\\|g; |
$return =~ s|\\|\\\\|g; |
$return =~ s|\n|\\r\\n|g; |
$return =~ s|\n|\\r\\n|g; |
$return =~ s|'|\\'|g; |
$return =~ s|'|\\'|g; |
$return =~ s|'|\\'|g; |
$return =~ s|'|\\'|g; |
return $return; |
return $return; |
} |
} |
|
|