--- loncom/homework/structuretags.pm 2010/07/29 18:00:06 1.470
+++ loncom/homework/structuretags.pm 2011/12/10 17:53:45 1.498
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# definition of tags that give a structure to a document
#
-# $Id: structuretags.pm,v 1.470 2010/07/29 18:00:06 raeburn Exp $
+# $Id: structuretags.pm,v 1.498 2011/12/10 17:53:45 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -128,8 +128,17 @@ sub homework_js {
&setmode_javascript().
<<'JS';
JS
}
@@ -153,10 +162,12 @@ JS
sub setmode_javascript {
return <<"ENDSCRIPT";
ENDSCRIPT
}
@@ -177,12 +188,71 @@ sub page_start {
$parstack,$parser,$safeeval);
}
- $extra_head .= &homework_js();
-
- if ($env{'environment.wysiwygeditor'} eq 'on') {
- $extra_head .= &Apache::lonhtmlcommon::dragmath_js("FCKEditMathPopup");
+ $extra_head .= &homework_js().
+ &Apache::lonhtmlcommon::dragmath_js("EditMathPopup");
+ if (&Apache::lonhtmlcommon::htmlareabrowser()) {
+ my %textarea_args = (
+ dragmath => 'math',
+ );
+ $extra_head .= &Apache::lonhtmlcommon::htmlareaselectactive(\%textarea_args);
+ }
+ my $is_task = ($env{'request.uri'} =~ /\.task$/);
+ my $needs_upload;
+ my ($symb)= &Apache::lonnet::whichuser();
+ my ($map,$resid,$resurl)=&Apache::lonnet::decode_symb($symb);
+ if ($is_task) {
+ $extra_head .= &Apache::lonhtmlcommon::file_submissionchk_js();
} else {
- $extra_head .= &Apache::lonhtmlcommon::dragmath_js("EditMathPopup");
+ if (&Apache::lonnet::EXT("resource.$Apache::inputtags::part.uploadedfiletypes") ne '') {
+ unless ($env{'request.state'} eq 'construct') {
+ my $navmap = Apache::lonnavmaps::navmap->new();
+ if (ref($navmap)) {
+ my $mapres = $navmap->getResourceByUrl($map);
+ my $is_page;
+ if (ref($mapres)) {
+ $is_page = $mapres->is_page();
+ }
+ unless ($is_page) {
+ $needs_upload = 1;
+ }
+ }
+ }
+ } else {
+ unless ($env{'request.state'} eq 'construct') {
+ my $navmap = Apache::lonnavmaps::navmap->new();
+ if (ref($navmap)) {
+ my $mapres = $navmap->getResourceByUrl($map);
+ my $is_page;
+ if (ref($mapres)) {
+ $is_page = $mapres->is_page();
+ }
+ unless ($is_page) {
+ my $res = $navmap->getBySymb($symb);
+ if (ref($res)) {
+ my $partlist = $res->parts();
+ if (ref($partlist) eq 'ARRAY') {
+ foreach my $part (@{$partlist}) {
+ my @types = $res->responseType($part);
+ my @ids = $res->responseIds($part);
+ for (my $i=0; $i < scalar(@ids); $i++) {
+ if ($types[$i] eq 'essay') {
+ my $partid = $part.'_'.$ids[$i];
+ if (&Apache::lonnet::EXT("resource.$partid.uploadedfiletypes") ne '') {
+ $needs_upload = 1;
+ last;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ if ($needs_upload) {
+ $extra_head .= &Apache::lonhtmlcommon::file_submissionchk_js();
+ }
}
my %body_args;
@@ -213,7 +283,7 @@ sub page_start {
&Apache::lonhtmlcommon::clear_breadcrumbs();
&Apache::lonhtmlcommon::add_breadcrumb({
'text' => 'Construction Space',
- 'href' => &Apache::loncommon::authorspace(),
+ 'href' => &Apache::loncommon::authorspace($env{'request.uri'}),
});
# breadcrumbs (and tools) will be created
# in start_page->bodytag->innerregister
@@ -265,7 +335,6 @@ sub page_start {
if (!defined($found{'body'}) && $env{'request.state'} ne 'construct') {
$page_start .= &Apache::lonxml::message_location();
}
-
my $form_tag_start;
if (!defined($found{'form'})) {
$form_tag_start='
\n".&Apache::loncommon::end_page();
}
@@ -472,6 +618,7 @@ sub problem_web_to_edit_header {
".&option('anonsurvey' ,'problemtype').&mt("Anonymous Survey Question")."
".&option('anonsurveycred' ,'problemtype').&mt("Anonymous Survey Question (with credit)")."
".&option('practice' ,'problemtype').&mt("Practice Problem")."
+ ".&option('randomizetry' ,'problemtype').&mt("New Randomization Each Try")."
$show_all
@@ -522,7 +669,7 @@ $show_all
-
';
@@ -649,7 +796,7 @@ item store_aggregates()
sub store_aggregates {
my ($symb,$courseid) = @_;
- my %aggregate;
+ my (%aggregate,%anoncounter,%randtrycounter);
my @parts;
my $cdomain = $env{'course.'.$env{'request.course.id'}.'.domain'};
my $cname = $env{'course.'.$env{'request.course.id'}.'.num'};
@@ -679,18 +826,23 @@ sub store_aggregates {
$aggregate{$symb."\0".$part."\0attempts"} = 1;
}
if (($Apache::lonhomework::results{'resource.'.$part.'.type'} eq 'anonsurvey') ||
- ($Apache::lonhomework::results{'resource.'.$part.'.type'} eq 'anonsurveycred')) {
- $aggregate{$symb."\0".$part."\0anonymous"} = 1;
+ ($Apache::lonhomework::results{'resource.'.$part.'.type'} eq 'anonsurveycred') ||
+ ($Apache::lonhomework::results{'resource.'.$part.'.type'} eq 'randomizetry')) {
+ if ($Apache::lonhomework::results{'resource.'.$part.'.type'} eq 'randomizetry') {
+ $randtrycounter{$symb."\0".$part} = 1;
+ } else {
+ $anoncounter{$symb."\0".$part} = 1;
+ }
my $needsrelease = $Apache::lonnet::needsrelease{'parameter:type:'.$Apache::lonhomework::results{'resource.'.$part.'.type'}};
if ($needsrelease) {
my $curr_required = $env{'course.'.$env{'request.course.id'}.'.internal.releaserequired'};
if ($curr_required eq '') {
- &update_courseenv($needsrelease,$cdomain,$cname);
+ &Apache::lonnet::update_released_required($needsrelease);
} else {
my ($currmajor,$currminor) = split(/\./,$curr_required);
my ($needsmajor,$needsminor) = split(/\./,$needsrelease);
if (($currmajor < $needsmajor) || ($currmajor == $needsmajor && $currminor < $needsminor)) {
- &update_courseenv($needsrelease,$cdomain,$cname);
+ &Apache::lonnet::update_released_required($needsrelease);
}
}
}
@@ -700,23 +852,13 @@ sub store_aggregates {
&Apache::lonnet::cinc('nohist_resourcetracker',\%aggregate,
$cdomain,$cname);
}
-}
-
-sub update_courseenv {
- my ($needsrelease,$cdom,$cnum) = @_;
- my $chome = $env{'course.'.$env{'request.course.id'}.'.home'};
- my %needshash = (
- 'internal.releaserequired' => $needsrelease,
- );
- my $putresult = &put('environment',\%needshash,$cdom,$cnum);
- if ($putresult eq 'ok') {
- &appenv({'course.'.$env{'request.course.id'}.'.internal.releaserequired' => $needsrelease});
- my %crsinfo =
- &Apache::lonnet::courseiddump($cdom,'.',1,'.','.',$cnum,undef,undef,'.');
- if (ref($crsinfo{$env{'request.course.id'}}) eq 'HASH') {
- $crsinfo{$env{'request.course.id'}}{'releaserequired'} = $needsrelease;
- }
- &Apache::lonnet::courseidput($cdom,\%crsinfo,$chome,'notime');
+ if (keys(%anoncounter) > 0) {
+ &Apache::lonnet::cput('nohist_anonsurveys',\%anoncounter,
+ $cdomain,$cname);
+ }
+ if (keys(%randtrycounter) > 0) {
+ &Apache::lonnet::cput('nohist_randomizetry',\%randtrycounter,
+ $cdomain,$cname);
}
}
@@ -798,6 +940,7 @@ sub init_problem_globals {
&Apache::lonhomework::reset_show_problem_status();
$Apache::lonhomework::ignore_response_errors=1;
}
+ @Apache::functionplotresponse::callscripts=();
@Apache::inputtags::responselist = ();
@Apache::inputtags::importlist = ();
@Apache::inputtags::previous=();
@@ -817,6 +960,9 @@ sub reset_problem_globals {
undef(%Apache::lonhomework::history);
undef(%Apache::lonhomework::results);
undef($Apache::inputtags::part);
+ if ($type eq 'Task') {
+ undef($Apache::inputtags::slot_name);
+ }
#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
# undef($Apache::lonhomework::parsing_a_problem);
@@ -825,6 +971,7 @@ sub reset_problem_globals {
undef($Apache::lonhomework::type);
undef($Apache::lonhomework::scantronmode);
undef($Apache::lonhomework::ignore_response_errors);
+ undef(@Apache::functionplotresponse::callscripts);
&Apache::lonhomework::reset_show_problem_status();
}
@@ -925,16 +1072,22 @@ sub start_problem {
if ($target eq 'tex' and $env{'request.symb'} =~ m/\.page_/) {$result='';}
- if ($target eq 'analyze') { my $rndseed=&setup_rndseed($safeeval); }
+ 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);
+ my $rndseed=&setup_rndseed($safeeval,$target);
my ($symb)=&Apache::lonnet::whichuser();
+
if ($env{'request.state'} ne "construct" &&
($symb eq '' || $Apache::lonhomework::type eq 'practice')) {
$form_tag_start.='
'."\n";
}
+ foreach my $field ('trial','questiontype') {
+ if ($env{"form.grade_$field"} ne '') {
+ $result .= '
'."\n";
+ }
+ }
}
+ if ($env{'form.grade_imsexport'}) {
+ $result = '';
+ }
} elsif ($target eq 'tex') {
$result .= 'INSERTTEXFRONTMATTERHERE';
@@ -1150,7 +1314,7 @@ sub end_problem {
} else {
$frontmatter.= $begin_doc.$toc_line;
if ($Apache::lonhomework::type eq 'exam' and $allow_print_points==1) {
- $frontmatter .= '\fbox{\textit{'.$weight.' pt}}';
+ $frontmatter .= '\fbox{\textit{'.&mt('[quant,_1,pt,pt]',$weight ).'}}';
}
}
} else {
@@ -1160,7 +1324,7 @@ sub end_problem {
if (not $env{'request.symb'} =~ m/\.page_/) {
$frontmatter .= $begin_doc.$toc_line;
if (($Apache::lonhomework::type eq 'exam') and ($allow_print_points==1)) {
- $frontmatter .= '\fbox{\textit{'.$weight.' pt}}';
+ $frontmatter .= '\fbox{\textit{'.&mt('[quant,_1,pt,pt]',$weight ).'}}';
}
} else {
$frontmatter .= '\vskip 1mm \\\\\\\\'.$startminipage;
@@ -1184,7 +1348,8 @@ sub end_problem {
}
} elsif ( ($target eq 'web' || $target eq 'tex') &&
$Apache::inputtags::part eq '0' &&
- $status ne 'UNCHECKEDOUT' && $status ne 'NOT_YET_VIEWED') {
+ $status ne 'UNCHECKEDOUT' && $status ne 'NOT_YET_VIEWED'
+ && !$env{'form.grade_imsexport'}) {
# if part is zero, no
s existed, so we need show the current
# grading status
my $gradestatus = &Apache::inputtags::gradestatus($Apache::inputtags::part,$target);
@@ -1194,10 +1359,10 @@ sub end_problem {
(($target eq 'web') && ($env{'request.state'} ne 'construct')) ||
($target eq 'answer') || ($target eq 'tex')
) {
- if ($target ne 'tex' &&
- $env{'form.answer_output_mode'} ne 'tex') {
+ if (($target ne 'tex') &&
+ ($env{'form.answer_output_mode'} ne 'tex') &&
+ (!$env{'form.grade_imsexport'})) {
$result.="";
- $result.= &Apache::lonhtmlcommon::htmlareaselectactive(&Apache::lonhtmlcommon::get_htmlareafields());
}
if ($target eq 'web') {
$result.= &Apache::loncommon::end_page({'discussion' => 1});
@@ -1218,6 +1383,9 @@ sub end_problem {
}
}
}
+ if ($target eq 'web') {
+ $result.=&Apache::functionplotresponse::init_script();
+ }
if ($target eq 'grade') {
&Apache::lonhomework::showhash(%Apache::lonhomework::results);
&finalize_storage();
@@ -1275,7 +1443,7 @@ sub start_library {
($result,$form_tag_start)=
&page_start($target,$token,$tagstack,$parstack,$parser,$safeeval,
$name);
- my $rndseed=&setup_rndseed($safeeval);
+ my $rndseed=&setup_rndseed($safeeval,$target);
$result.=" \n $form_tag_start".
' ';
$result.=&problem_web_to_edit_header($rndseed);
@@ -1847,11 +2015,30 @@ sub start_part {
$allow_print_points=0;
}
if (($Apache::lonhomework::type eq 'exam') && ($allow_print_points)) {
- $result .= '\vskip 10mm\fbox{\textit{'.$weight.' pt}}';
+ $result .= '\vskip 10mm\fbox{\textit{'.&mt('[quant,_1,pt,pt]',$weight ).'}}';
}
} elsif ($target eq 'web') {
- $result.=' ';
+ if ($status eq 'CAN_ANSWER') {
+ my $problemstatus = &get_problem_status($Apache::inputtags::part);
+ my $probrandomize = &Apache::lonnet::EXT("resource.$Apache::inputtags::partlist[0].type");
+ my $probrandtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::partlist[0].randomizeontries");
+ my $num = scalar(@Apache::inputtags::partlist)-1;
+ if ($probrandomize eq 'randomizetry') {
+ if (&Apache::lonnet::EXT("resource.$Apache::inputtags::part.type") ne 'randomizetry') {
+ $result .= &randomizetry_part_header($problemstatus,'none',$num);
+ } else {
+ my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries");
+ if ($probrandtries ne $reqtries) {
+ $result .= &randomizetry_part_header($problemstatus,$reqtries,$num);
+ }
+ }
+ } elsif (&Apache::lonnet::EXT("resource.$Apache::inputtags::part.type") eq 'randomizetry') {
+ my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries");
+ $result .= &randomizetry_part_header($problemstatus,$reqtries,$num);
+ }
+ }
+ $result.=' ';
}
}
}
@@ -1897,7 +2084,8 @@ sub end_part {
!$hidden && $in_order_show) {
my $gradestatus=&Apache::inputtags::gradestatus($Apache::inputtags::part,
$target);
- if ($Apache::lonhomework::type eq 'exam' && $target eq 'tex') {
+ if (($Apache::lonhomework::type eq 'exam' && $target eq 'tex') ||
+ ($env{'form.grade_imsexport'})) {
$gradestatus='';
}
$result.=$gradestatus;
@@ -2022,7 +2210,8 @@ sub start_problemtype {
['anonsurvey','Anonymous Survey'],
['anonsurveycred','Anonymous Survey (with credit)'],
['problem','Homework Problem'],
- ['practice','Practice Problem'] ]
+ ['practice','Practice Problem'],
+ ['randomizetry','New Randomization Each Try'] ]
,$token);
$result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
} elsif ($target eq 'modified') {
@@ -2061,17 +2250,15 @@ sub end_startouttext {
$result.=&Apache::edit::start_table($token)."".&mt('Text Block')." "
.''.&mt('Delete?').' '
.&Apache::edit::deletelist($target,$token)
- .' ';
- unless ($env{'environment.wysiwygeditor'} eq 'on') {
- $result .= ''
- .&Apache::lonhtmlcommon::dragmath_button($areaid,1)
- .' '
- .''
- .&Apache::edit::insertlist($target,$token)
- .' ';
- }
- $result.='' .
- &Apache::loncommon::helpLatexCheatsheet().
+ .' '
+ .' '
+ .&Apache::lonhtmlcommon::dragmath_button($areaid,1)
+ .' '
+ .''
+ .&Apache::edit::insertlist($target,$token)
+ .' '
+ .'' .
+ &Apache::loncommon::helpLatexCheatsheet().
&Apache::edit::end_row().
&Apache::edit::start_spanning_row()."\n".
&Apache::edit::editfield($token->[1],$text,"",80,8,1);
@@ -2139,11 +2326,12 @@ sub start_simpleeditbutton {
# .&mt('Note: it can take up to 10 minutes for changes to take effect for all users.')
# .&Apache::loncommon::help_open_topic('Caching')
# .'';
- $result.=&Apache::lonhtmlcommon::start_funclist()
+ $result.=&Apache::loncommon::head_subbox(
+ &Apache::lonhtmlcommon::start_funclist()
.&Apache::lonhtmlcommon::add_item_funclist(
''
.&mt('Edit').' ')
- .&Apache::lonhtmlcommon::end_funclist();
+ .&Apache::lonhtmlcommon::end_funclist());
}
return $result;
@@ -2159,6 +2347,63 @@ sub practice_problem_header {
'';
}
+sub randomizetry_problem_header {
+ my ($problemstatus,$reqtries) = @_;
+ my ($header,$text);
+ if ($reqtries > 1) {
+ $header = &mt('New Problem Variation After Every [quant,_1,Try,Tries]',$reqtries);
+ if (($problemstatus eq 'no') ||
+ ($problemstatus eq 'no_feedback_ever')) {
+ $text = &mt('A new variation will be generated after every [quant,_1,try,tries], until the tries limit is reached.',$reqtries);
+ } else {
+ $text = &mt('A new variation will be generated after every [quant,_1,try,tries], until correct or tries limit is reached.',$reqtries);
+ }
+ } else {
+ $header = &mt('New Problem Variation Each Try');
+ if (($problemstatus eq 'no') ||
+ ($problemstatus eq 'no_feedback_ever')) {
+ $text = &mt('A new variation will be generated after each try until the tries limit is reached.');
+
+ } else {
+ $text = &mt('A new variation will be generated after each try until correct or tries limit is reached.');
+ }
+ }
+ return ''.$header.' '.
+ ''.$text.' ';
+}
+
+sub randomizetry_part_header {
+ my ($problemstatus,$reqtries,$num) = @_;
+ my ($header,$text);
+ if ($reqtries eq 'none') {
+ $header = &mt('No Question Variation');
+ $text = &mt('For this question there will no new variation after a try.');
+ } elsif ($reqtries > 1) {
+ $header = &mt('New Question Variation After Every [quant,_1,Try,Tries]',$reqtries);
+ if (($problemstatus eq 'no') ||
+ ($problemstatus eq 'no_feedback_ever')) {
+ $text = &mt('For this question a new variation will be generated after every [quant,_1,try,tries], until the tries limit is reached.',$reqtries);
+ } else {
+ $text = &mt('For this question a new variation will be generated after every [quant,_1,try,tries], until correct or tries limit is reached.',$reqtries);
+ }
+ } else {
+ $header = &mt('New Question Variation For Each Try');
+ if (($problemstatus eq 'no') ||
+ ($problemstatus eq 'no_feedback_ever')) {
+ $text = &mt('For this question a new variation will be generated after each try until the tries limit is reached.');
+ } else {
+ $text = &mt('For this question a new variation will be generated after each try until correct or tries limit is reached.');
+ }
+ }
+ my $output;
+ if ($num > 1) {
+ $output .= ' ';
+ }
+ $output .= ''.$header.' '.
+ ''.$text.' ';
+ return $output;
+}
+
1;
__END__