--- loncom/homework/structuretags.pm 2024/03/01 17:05:45 1.512.2.24.2.14
+++ loncom/homework/structuretags.pm 2015/04/10 08:22:21 1.533
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# definition of tags that give a structure to a document
#
-# $Id: structuretags.pm,v 1.512.2.24.2.14 2024/03/01 17:05:45 raeburn Exp $
+# $Id: structuretags.pm,v 1.533 2015/04/10 08:22:21 droeschl Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -62,9 +62,7 @@ use Apache::lonxml;
use Apache::londefdef;
use Apache::lonenc();
use Apache::loncommon();
-use Apache::lonnavmaps;
use Time::HiRes qw( gettimeofday tv_interval );
-use HTML::Entities();
use lib '/home/httpd/lib/perl/';
use LONCAPA;
@@ -272,8 +270,8 @@ sub homework_js {
$jstimeout = 1000 * $timeout;
}
return &Apache::loncommon::resize_textarea_js().
- &Apache::loncommon::colorfuleditor_js().
- &Apache::lonxml::setmode_javascript().
+ &Apache::loncommon::colorfuleditor_js().
+ &setmode_javascript().
<<"JS";
+ENDSCRIPT
+}
+
sub page_start {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$name,
$extra_head)=@_;
@@ -404,13 +417,9 @@ sub page_start {
$extra_head .= &homework_js().
&Apache::lonhtmlcommon::dragmath_js("EditMathPopup");
if (&Apache::lonhtmlcommon::htmlareabrowser()) {
- my %textarea_args;
- if (($env{'request.state'} ne 'construct') ||
- (&Apache::loncommon::nocodemirror())) {
- %textarea_args = (
+ my %textarea_args = (
dragmath => 'math',
);
- }
$extra_head .= &Apache::lonhtmlcommon::htmlareaselectactive(\%textarea_args);
}
my $is_task = ($env{'request.uri'} =~ /\.task$/);
@@ -481,9 +490,7 @@ sub page_start {
}
}
if ($needs_upload) {
- $extra_head .= &Apache::lonhtmlcommon::file_submissionchk_js().
- '';
+ $extra_head .= &Apache::lonhtmlcommon::file_submissionchk_js();
}
}
@@ -514,25 +521,23 @@ sub page_start {
} elsif (!defined($found{'body'})
&& $env{'request.state'} eq 'construct') {
if ($target eq 'web' || $target eq 'edit') {
- unless ($env{'form.inhibitmenu'} eq 'yes') {
- # Breadcrumbs for Authoring Space
- &Apache::lonhtmlcommon::clear_breadcrumbs();
- &Apache::lonhtmlcommon::add_breadcrumb({
- 'text' => 'Authoring Space',
- 'href' => &Apache::loncommon::authorspace($env{'request.uri'}),
- });
- # breadcrumbs (and tools) will be created
- # in start_page->bodytag->innerregister
+ # Breadcrumbs for Authoring Space
+ &Apache::lonhtmlcommon::clear_breadcrumbs();
+ &Apache::lonhtmlcommon::add_breadcrumb({
+ 'text' => 'Authoring Space',
+ 'href' => &Apache::loncommon::authorspace($env{'request.uri'}),
+ });
+ # breadcrumbs (and tools) will be created
+ # in start_page->bodytag->innerregister
# FIXME Where are we?
-# &Apache::lonhtmlcommon::add_breadcrumb({
-# 'text' => 'Problem Editing', # 'Problem Testing'
-# 'href' => '',
-# });
- $pageheader = &Apache::loncommon::head_subbox(
- &Apache::loncommon::CSTR_pageheader());
- }
- }
+# &Apache::lonhtmlcommon::add_breadcrumb({
+# 'text' => 'Problem Editing', # 'Problem Testing'
+# 'href' => '',
+# });
+ $pageheader =&Apache::loncommon::head_subbox(
+ &Apache::loncommon::CSTR_pageheader());
+ }
} elsif (!defined($found{'body'})) {
my %add_entries;
my $background=&Apache::lonxml::get_param('background',$parstack,
@@ -587,9 +592,7 @@ sub page_start {
my ($symb,$courseid,$udom,$uname)=&Apache::lonnet::whichuser();
my ($path,$multiresp) =
&Apache::loncommon::get_turnedin_filepath($symb,$uname,$udom);
- if ($env{'request.user_in_effect'}) {
- $form_tag_start .= ' onsubmit="preventDefault();"';
- } elsif (($is_task) || ($needs_upload)) {
+ if (($is_task) || ($needs_upload)) {
$form_tag_start .= ' onsubmit="return file_submission_check(this,'."'$path','$multiresp'".');"';
}
$form_tag_start.='>'."\n";
@@ -634,43 +637,17 @@ sub get_resource_name {
sub setup_rndseed {
my ($safeeval,$target,$probpartlist)=@_;
my ($symb)=&Apache::lonnet::whichuser();
- my ($questiontype,$set_safespace,$rndseed,$numtries,$reqtries);
+ my ($questiontype,$set_safespace,$rndseed);
if ($target eq 'analyze') {
$questiontype = $env{'form.grade_questiontype'};
}
unless (defined($questiontype)) {
$questiontype = $Apache::lonhomework::type;
}
- if ($Apache::lonhomework::type eq 'randomizetry') {
- my $partfortries = $Apache::inputtags::part;
-#
-# Where question type is "randomizetry" for a problem containing
-# a single part (and unless type is explicitly set to not be
-# "randomizetry" for that part), the number of tries used to
-# determine randomization will be for that part, and randomization
-# from calls to &random() in a perl script block before the part tag,
-# will change based on the number of tries, and value of the
-# "randomizeontries" parameter in effect for the single part.
-#
- if (ref($probpartlist) eq 'ARRAY') {
- if ((@{$probpartlist} == 1) && ($probpartlist->[0] ne $partfortries)) {
- if (&Apache::lonnet::EXT('resource.'.$probpartlist->[0].'.type') eq 'randomizetry') {
- $partfortries = $probpartlist->[0];
- } else {
- $partfortries = '';
- }
- }
- }
- if ($partfortries ne '') {
- $numtries = $Apache::lonhomework::history{"resource.$partfortries.tries"};
- $reqtries = &Apache::lonnet::EXT("resource.$partfortries.randomizeontries");
- }
- }
- if (($env{'request.state'} eq "construct")
- || ($symb eq '')
- || ($Apache::lonhomework::type eq 'practice')
- || ($Apache::lonhomework::history{'resource.CODE'})
- || (($env{'form.code_for_randomlist'}) && ($target eq 'analyze'))) {
+ if ($env{'request.state'} eq "construct"
+ || $symb eq ''
+ || $Apache::lonhomework::type eq 'practice'
+ || $Apache::lonhomework::history{'resource.CODE'}) {
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
['rndseed']);
$rndseed=$env{'form.rndseed'};
@@ -679,23 +656,17 @@ sub setup_rndseed {
if (!$rndseed) {
$rndseed=time;
}
- unless ($env{'form.code_for_randomlist'}) {
- $env{'form.rndseed'}=$rndseed;
- }
+ $env{'form.rndseed'}=$rndseed;
}
- if ((($env{'request.state'} eq "construct") || ($symb eq '')) &&
+ if (($env{'request.state'} eq "construct") &&
($Apache::lonhomework::type eq 'randomizetry')) {
- if ($numtries) {
- if (($reqtries =~ /^\d+$/) && ($reqtries > 1)) {
- my $inc = int($numtries/$reqtries);
- $rndseed += $inc;
- } else {
- $rndseed += $numtries;
- }
+ my $tries = $Apache::lonhomework::history{"resource.$Apache::inputtags::part.tries"};
+ if ($tries) {
+ $rndseed += $tries;
}
$env{'form.'.$Apache::inputtags::part.'.rndseed'}=$rndseed;
}
- if ( ($env{'form.resetdata'} eq 'new_problem_variation'
+ if ( ($env{'form.resetdata'} eq &mt('New Problem Variation')
&& $env{'form.submitted'} eq 'yes') ||
$env{'form.newrandomization'} eq &mt('New Randomization')) {
srand(time);
@@ -713,11 +684,7 @@ sub setup_rndseed {
$rndseed=join(':',&Apache::lonnet::digest($rndseed));
}
}
- if (($env{'form.code_for_randomlist'}) && ($target eq 'analyze')) {
- $env{'form.CODE'} = $env{'form.code_for_randomlist'};
- $rndseed=&Apache::lonnet::rndseed();
- undef($env{'form.CODE'});
- } elsif ($Apache::lonhomework::history{'resource.CODE'}) {
+ if ($Apache::lonhomework::history{'resource.CODE'}) {
$rndseed=&Apache::lonnet::rndseed();
}
$set_safespace = 1;
@@ -729,7 +696,13 @@ sub setup_rndseed {
}
unless (($target eq 'analyze') && (defined($rndseed))) {
$rndseed=&Apache::lonnet::rndseed();
- my $curr_try = $numtries;
+ 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 ++;
}
@@ -737,6 +710,7 @@ sub setup_rndseed {
$rndseed = $1;
}
if ($curr_try) {
+ my $reqtries = &Apache::lonnet::EXT("resource.$partfortries.randomizeontries");
if (($reqtries =~ /^\d+$/) && ($reqtries > 1)) {
my $inc = int(($curr_try-1)/$reqtries);
$rndseed += $inc;
@@ -778,48 +752,236 @@ sub problem_edit_action_button {
sub problem_edit_buttons {
my ($mode)=@_;
- my %editors = &Apache::loncommon::permitted_editors();
-# Buttons that save
- my $result = '
';
- if ($mode eq 'editxml') {
- if ($editors{'xml'}) {
- $result.=&problem_edit_action_button('subsaveedit','saveeditxml','s','Save and EditXML');
- }
- $result.=&problem_edit_action_button('subsaveview','saveviewxml','v','Save and View');
- } else {
- if ($editors{'edit'}) {
- $result.=&problem_edit_action_button('subsaveedit','saveedit','s','Save and Edit');
- }
- $result.=&problem_edit_action_button('subsaveview','saveview','v','Save and View');
- }
- $result.="\n
\n";
# Buttons that do not save
- $result .= '
'.
+ my $result='
'.
&problem_edit_action_button('subdiscview','discard','d','Discard Edits and View',1);
if ($mode eq 'editxml') {
- if ($editors{'edit'}) {
- $result.=&problem_edit_action_button('subedit','edit','e','Edit',1);
- }
- if ($editors{'daxe'}) {
- $result.=&problem_edit_action_button('subdaxe','daxe','w','Edit with Daxe',1);
- }
+ $result.=&problem_edit_action_button('subedit','edit','e','Edit',1);
$result.=&problem_edit_action_button('subundo','undoxml','u','Undo',1);
- if (&Apache::loncommon::nocodemirror()) {
- $result.=&Apache::lonhtmlcommon::dragmath_button("LC_editxmltext",1);
- }
+ $result.=&Apache::lonhtmlcommon::dragmath_button("LC_editxmltext",1);
} else {
- if ($editors{'xml'}) {
- $result.=&problem_edit_action_button('subeditxml','editxml','x','EditXML',1);
- }
- if ($editors{'daxe'}) {
- $result.=&problem_edit_action_button('subdaxe','daxe','w','Edit with Daxe',1);
- }
+ $result.=&problem_edit_action_button('subeditxml','editxml','x','EditXML',1);
$result.=&problem_edit_action_button('subundo','undo','u','Undo',1);
}
$result.="\n
";
+# Buttons that save
+ $result.='
';
+ if ($mode eq 'editxml') {
+ $result.=&problem_edit_action_button('subsaveedit','saveeditxml','s','Save and EditXML');
+ $result.=&problem_edit_action_button('subsaveview','saveviewxml','v','Save and View');
+ } else {
+ $result.=&problem_edit_action_button('subsaveedit','saveedit','s','Save and Edit');
+ $result.=&problem_edit_action_button('subsaveview','saveview','v','Save and View');
+ }
+ $result.="\n
\n";
return $result;
}
+sub insert_menu_datastructure {
+
+ my $template_menu = &template_dropdown_datastructure();
+ my $responseblock_menu = &responseblock_dropdown_datastructure();
+ my $conditional_scripting = &conditional_scripting_datastructure();
+ my $misc = &misc_datastructure();
+
+ my @menu = ($template_menu, $responseblock_menu, $conditional_scripting, $misc);
+ return \@menu;
+
+}
+
+sub template_dropdown_datastructure {
+ # gathering the all templates and their path, title, category and help topic
+ my @templates = &Apache::lonhomework::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, "<:encoding(UTF-8)", $path);
+ while(){
+ $code.= $_ unless $_ =~ /()|(<\/problem>)/;
+ }
+ close(FH);
+
+ if ($code ne '') {
+ my $href = 'javascript:insertText(\'' . &convert_for_js(&HTML::Entities::encode($code)) . '\')';
+ my $currItem = [$href, $title, undef];
+ push @{$catItems}, $currItem;
+ }
+ }
+ push @{$catList}, [$catItems, $cat, undef];
+ }
+
+ my $templDropdown = [$catList, &mt("Complete Problem Templates"), undef];
+ return $templDropdown;
+}
+
+sub responseblock_dropdown_datastructure {
+
+ 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_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_numericalresponse())) . "\')", &mt("Numerical Response"), undef]
+ ],
+ &mt("Math"),
+ undef
+ ];
+
+ 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_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_matchresponse())) . "\')", &mt("Match Response"), undef],
+ ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_radiobuttonresponse())) . "\')", &mt("One out of N Statement"), undef],
+ ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_optionresponse())) . "\')", &mt("Optionresponse"), undef],
+ ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_rankresponse())) . "\')", &mt("Rank Values"), undef]
+ ],
+ &mt("Misc"),
+ undef
+ ];
+
+ 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_organicresponse())) . "\')", &mt("Organic Structure"), undef]
+ ],
+ &mt("Chemical"),
+ undef
+ ];
+
+ 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_essayresponse())) . "\')", &mt("Essay"), undef]
+ ],
+ &mt("Text"),
+ undef
+ ];
+
+ my $cats = [[$mathCat, $miscCat, $chemCat, $textCat], &mt("Response Types"), undef];
+ return $cats;
+}
+
+
+sub conditional_scripting_datastructure {
+# TODO: corresponding routines should be used for the javascript:insertText parts
+# instead of the placeholder routine default_xml_tag with the tags
+# e.g. &default_xml_tag("postanswerdate") should be replaced with a routine which
+# returns the corresponding content for this case
+
+#TODO translated is currently temporarily here, another solution should be found where the
+# needed string can be retrieved
+
+ my $translatedTag = '
+
+
+
+';
+
+ my $cat = [
+ [
+ ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode($translatedTag)) . "\')", &mt("Translated Tag"), 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 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("notsolved"))) . "\')", &mt("Block For When Not Solved"), undef]
+ ],
+ &mt("Contitional Scripting"),
+ undef
+ ];
+
+ return $cat;
+}
+
+sub misc_datastructure {
+
+ my $graphicalCat = [
+ [
+ ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_img())) . "\')", &mt("Image"), undef],
+ ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::lonplot::insert_gnuplot())) . "\')", &mt("GNU Plot"), undef],
+ ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_organicstructure())) . "\')", &mt("Organic Structure"), undef]
+ ],
+ "Graphical",
+ undef
+ ];
+
+ my $advancedCat = [
+ [
+ ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_script())) . "\')", &mt("Script Block"), undef],
+ ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("allow"))) . "\')", &mt("File Dependencies"), undef],
+ ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("import"))) . "\')", &mt("Import a File"), undef],
+ ["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::londefdef::insert_meta())) . "\')", &mt("Custom Metadata"), undef]
+ ],
+ "advanced",
+ undef
+ ];
+
+ my $cats = [[$graphicalCat, $advancedCat], &mt("misc"), undef];
+ return $cats;
+}
+
+# helper routine for the datastructure building subroutines
+sub default_xml_tag {
+ my ($tag) = @_;
+ return "\n<$tag>$tag>";
+}
+
+
+sub helpmenu_datastructure {
+
+ my $width = 500;
+ my $height = 600;
+
+ my $helpers = [
+ ['Problem_LON-CAPA_Functions', &mt('Script Functions')],
+ ['Greek_Symbols', &mt('Greek Symbols')],
+ ['Other_Symbols', &mt('Other Symbols')],
+ ['Authoring_Output_Tags', &mt('Output Tags')],
+ ['Authoring_Multilingual_Problems',
+ &mt('How to create problems in different languages')]
+ ];
+
+ my $help_structure = [];
+
+ foreach my $count (0..(scalar(@{$helpers})-1)) {
+ my $filename = $helpers->[$count]->[0];
+ my $title = $helpers->[$count]->[1];
+ my $href = &HTML::Entities::encode("javascript:openMyModal('/adm/help/$filename.hlp',$width,$height,'yes');");
+ push @{$help_structure}, [$href, $title, undef];
+ }
+
+ return $help_structure;
+}
+
+# we need substitution to not break javascript code
+sub convert_for_js {
+ my $return = shift;
+ $return =~ s|script|ESCAPEDSCRIPT|g;
+ $return =~ s|\\|\\\\|g;
+ $return =~ s|\n|\\r\\n|g;
+ $return =~ s|'|\\'|g;
+ $return =~ s|'|\\'|g;
+ return $return;
+}
+
sub problem_edit_header {
my ($mode)=@_;
my $return = ''.
@@ -831,7 +993,9 @@ sub problem_edit_header {
''.
&problem_edit_buttons();
- $return .= '
' . &Apache::lonxml::message_location();
+ $return.='
+ '
+ .&Apache::lonxml::message_location();
$return .= '
';
@@ -844,8 +1008,7 @@ sub problem_edit_header {
$(\'.LC_edit_actionbar\').scrollToFixed(
{
fixed: function(){
- //$(this).find(\'.LC_edit_actionbar\').css(\'height\', \'31px\');
- $(this).find(\'.LC_edit_actionbar\');
+ $(this).find(\'.LC_edit_actionbar\').css(\'height\', \'31px\');
}
}
);
@@ -857,7 +1020,6 @@ sub problem_edit_header {
return $return;
}
-
sub problem_edit_footer {
my $resource = $env{'request.ambiguous'};
return '
@@ -886,7 +1048,6 @@ sub option {
sub problem_web_to_edit_header {
my ($rndseed)=@_;
- my %editors = &Apache::loncommon::permitted_editors();
my $result .= '
';
if (!$Apache::lonhomework::parsing_a_task) {
@@ -934,7 +1095,7 @@ sub problem_web_to_edit_header {
".&mt("Problem Type:")."
-
+
@@ -1016,21 +1176,10 @@ $show_all
';
$result.='';
- if ($editors{'edit'}) {
- $result .= '';
- }
- if ($editors{'xml'}) {
- $result .= '';
- }
- if (($editors{'daxe'}) &&
- ($env{'browser.type'} ne 'explorer' || $env{'browser.version'} > 9)) {
- my $uri = $env{'request.uri'};
- my $daxeurl = '/daxepage'.$uri;
- $result .= '';
- }
+ $result .= '';
+ $result .= '';
$result.='
@@ -1057,8 +1206,8 @@ sub initialize_storage {
|| $Apache::lonhomework::type eq 'practice') {
my $namespace = $symb || $env{'request.uri'};
- if ($env{'form.resetdata'} eq 'reset_submissions' ||
- ($env{'form.resetdata'} eq 'new_problem_variation'
+ if ($env{'form.resetdata'} eq &mt('Reset Submissions') ||
+ ($env{'form.resetdata'} eq &mt('New Problem Variation')
&& $env{'form.submitted'} eq 'yes') ||
$env{'form.newrandomization'} eq &mt('New Randomization')) {
&Apache::lonnet::tmpreset($namespace,'',$domain,$name);
@@ -1066,7 +1215,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=
@@ -1089,13 +1238,13 @@ sub initialize_storage {
&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.
+ 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
+ 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
+ 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).
@@ -1105,13 +1254,13 @@ sub initialize_storage {
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
+ 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.
+ Will call &store_aggregates() to increment totals for attempts,
+ students, and corrects, if running user has student role.
=cut
@@ -1124,8 +1273,6 @@ sub finalize_storage {
delete(@Apache::lonhomework::results{@remove});
my ($symb,$courseid,$domain,$name) =
&Apache::lonnet::whichuser($given_symb);
- my ($passback,$pbscope,$pbmap,$pbsymb,$pbtype,$crsdef,$ltinum,
- $ltiref,$total,$possible,$dopassback);
if ($env{'request.state'} eq 'construct'
|| $symb eq ''
|| $Apache::lonhomework::type eq 'practice') {
@@ -1135,28 +1282,17 @@ sub finalize_storage {
$namespace,'',$domain,$name);
&Apache::lonxml::debug('Construct Store return message:'.$result);
} else {
- my ($laststore,$checkedparts,@parts,%postcorrect,%record);
+ 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 (($env{'request.lti.login'}) || ($env{'request.deeplink.login'})) {
- my ($map)=&Apache::lonnet::decode_symb($symb);
- $map = &Apache::lonnet::clutter($map);
- if ($env{'request.lti.login'}) {
- ($passback,$pbscope,$pbmap,$pbsymb,$ltinum,$ltiref) =
- &needs_lti_passback($courseid,$symb,$map);
- } elsif ($env{'request.deeplink.login'}) {
- ($passback,$pbscope,$pbmap,$pbsymb,$crsdef,$ltinum,$ltiref) =
- &needs_linkprot_passback($courseid,$symb,$map);
- }
- }
if ($Apache::lonhomework::history{'version'}) {
$laststore = $Apache::lonhomework::history{'version'}.'='.
$Apache::lonhomework::history{'timestamp'};
} else {
$laststore = '0=0';
}
- %record = &Apache::lonnet::restore($symb,$courseid,$domain,$name);
+ my %record = &Apache::lonnet::restore($symb,$courseid,$domain,$name);
if ($record{'version'}) {
my ($newversion,$oldversion,$oldtimestamp);
if ($Apache::lonhomework::history{'version'}) {
@@ -1232,98 +1368,8 @@ sub finalize_storage {
}
}
}
- if ($passback) {
- foreach my $key (keys(%Apache::lonhomework::results)) {
- if ($key =~ /^resource\.([^\.]+)\.solved$/) {
- my $part = $1;
- if ((($Apache::lonhomework::results{$key} =~ /^correct_/) ||
- ($Apache::lonhomework::results{$key} eq 'incorrect_attempted')) &&
- ($Apache::lonhomework::results{"resource.$part.tries"})) {
- $dopassback = 1;
- last;
- }
- }
- }
- }
- if (($dopassback) && ($pbscope eq 'resource') && ($pbsymb eq $symb)) {
- $total = 0;
- $possible = 0;
- my $navmap = Apache::lonnavmaps::navmap->new();
- if (ref($navmap)) {
- my $res = $navmap->getBySymb($symb);
- if (ref($res)) {
- my $partlist = $res->parts();
- if (ref($partlist) eq 'ARRAY') {
- foreach my $part (@{$partlist}) {
- unless (exists($Apache::lonhomework::results{"resource.$part.solved"})) {
- next if ($Apache::lonhomework::record{"resource.$part.solved"} =~/^excused/);
- my $weight = &Apache::lonnet::EXT("resource.$part.weight",$symb);
- $possible += $weight;
- if (($record{'version'}) && (exists($record{"resource.$part.awarded"}))) {
- my $awarded = $record{"resource.$part.awarded"};
- if ($awarded) {
- $total += $weight * $awarded;
- }
- }
- }
- }
- }
- }
- }
- foreach my $key (keys(%Apache::lonhomework::results)) {
- if ($key =~ /^resource\.([^\.]+)\.awarded$/) {
- my $part = $1;
- my $weight = &Apache::lonnet::EXT("resource.$part.weight",$symb);
- $possible += $weight;
- my $awarded = $Apache::lonhomework::results{$key};
- if ($awarded) {
- $total += $weight * $awarded;
- }
- }
- }
- }
&Apache::lonxml::debug('Store return message:'.$result);
&store_aggregates($symb,$courseid);
- if ($dopassback) {
- my $scoreformat = 'decimal';
- if (($env{'request.lti.login'}) || ($env{'request.deeplink.login'})) {
- if (ref($ltiref) eq 'HASH') {
- if ($ltiref->{'scoreformat'} =~ /^(decimal|ratio|percentage)$/) {
- $scoreformat = $1;
- }
- }
- }
- my ($pbid,$pburl,$pbtype);
- if ($env{'request.lti.login'}) {
- $pbid = $env{'request.lti.passbackid'};
- $pburl = $env{'request.lti.passbackurl'};
- $pbtype = 'lti';
- } elsif ($env{'request.deeplink.login'}) {
- $pbid = $env{'request.linkprotpbid'};
- $pburl = $env{'request.linkprotpburl'};
- $pbtype = 'linkprot';
- }
- my $ltigrade = {
- 'ltinum' => $ltinum,
- 'lti' => $ltiref,
- 'crsdef' => $crsdef,
- 'cid' => $courseid,
- 'uname' => $env{'user.name'},
- 'udom' => $env{'user.domain'},
- 'pbid' => $pbid,
- 'pburl' => $pburl,
- 'pbtype' => $pbtype,
- 'scope' => $pbscope,
- 'pbmap' => $pbmap,
- 'pbsymb' => $pbsymb,
- 'format' => $scoreformat,
- };
- if ($pbscope eq 'resource') {
- $ltigrade->{'total'} = $total;
- $ltigrade->{'possible'} = $possible;
- }
- push(@Apache::lonhomework::ltipassback,$ltigrade);
- }
}
} else {
&Apache::lonxml::debug('Nothing to store');
@@ -1331,116 +1377,18 @@ sub finalize_storage {
return $result;
}
-sub needs_lti_passback {
- my ($courseid,$symb,$map) = @_;
- if (($env{'request.lti.passbackid'}) && ($env{'request.lti.passbackurl'})) {
- if ($courseid =~ /^($LONCAPA::match_domain)_($LONCAPA::match_courseid)$/) {
- my ($cdom,$cnum) = ($1,$2);
- my %lti = &Apache::lonnet::get_domain_lti($cdom,'provider');
- if (ref($lti{$env{'request.lti.login'}}) eq 'HASH') {
- if ($lti{$env{'request.lti.login'}}{'passback'}) {
- my $itemnum = $env{'request.lti.login'};
- my ($ltiscope,$ltiuri,$ltisymb) =
- &LONCAPA::ltiutils::lti_provider_scope($env{'request.lti.uri'},
- $cdom,$cnum,1);
- my ($passback,$ltimap);
- if ($ltiscope eq 'resource') {
- if ($ltisymb eq $symb) {
- $passback = 1;
- }
- } elsif ($ltiscope eq 'map') {
- if ($ltiuri eq $map) {
- $passback = 1;
- $ltimap = $map;
- }
- } elsif ($ltiscope eq 'course') {
- if (($env{'request.lti.uri'} eq "/$cdom/$cnum") || ($env{'request.lti.uri'} eq '')) {
- $passback = 1;
- }
- }
- return ($passback,$ltiscope,$ltimap,$ltisymb,$itemnum,$lti{$itemnum});
- }
- }
- }
- }
- return;
-}
-
-sub needs_linkprot_passback {
- my ($courseid,$symb,$map) = @_;
- if (($env{'request.linkprotpbid'}) && ($env{'request.linkprotpburl'})) {
- if ($courseid =~ /^($LONCAPA::match_domain)_($LONCAPA::match_courseid)$/) {
- my ($cdom,$cnum) = ($1,$2);
- my ($deeplink_symb,$deeplink_map,$deeplink,$passback);
- $deeplink_symb = &Apache::loncommon::deeplink_login_symb($cnum,$cdom);
- if ($deeplink_symb) {
- if ($deeplink_symb =~ /\.(page|sequence)$/) {
- $deeplink_map = &Apache::lonnet::deversion((&Apache::lonnet::decode_symb($deeplink_symb))[2]);
- my $navmap = Apache::lonnavmaps::navmap->new();
- if (ref($navmap)) {
- $deeplink = $navmap->get_mapparam(undef,$deeplink_map,'0.deeplink');
- }
- } else {
- $deeplink = &Apache::lonnet::EXT('resource.0.deeplink',$deeplink_symb);
- $deeplink_map = &Apache::lonnet::deversion((&Apache::lonnet::decode_symb($deeplink_symb))[0]);
- }
- if (($deeplink ne '') && ($env{'request.linkprot'} ne '')) {
- my ($itemid,$tinyurl) = split(/:/,$env{'request.linkprot'});
- if ($itemid =~ /^(\d+)(c|d)$/) {
- my ($itemnum,$itemtype) = ($1,$2);
- my ($crsdef,$lti_in_use);
- if ($itemtype eq 'c') {
- $crsdef = 1;
- my %crslti = &Apache::lonnet::get_course_lti($cnum,$cdom,'provider');
- $lti_in_use = $crslti{$itemnum};
- } else {
- my %domlti = &Apache::lonnet::get_domain_lti($cdom,'linkprot');
- $lti_in_use = $domlti{$itemnum};
- }
- my ($state,$others,$listed,$scope,$protect,$display,$target,$exit) = split(/,/,$deeplink);
- my ($passback,$pbscope);
- if ($scope eq 'res') {
- if ($deeplink_symb eq $symb) {
- $passback = 1;
- $pbscope = 'resource';
- }
- } elsif ($scope eq 'map') {
- if (&Apache::lonnet::clutter($deeplink_map) eq $map) {
- $passback = 1;
- $pbscope = 'nonrec';
- }
- } elsif ($scope eq 'rec') {
- if (&Apache::lonnet::clutter($deeplink_map) eq $map) {
- $passback = 1;
- $pbscope = 'map';
- } else {
- my @recurseup = &Apache::lonnet::get_map_hierarchy($map,$env{'request.course.id'});
- if (grep(/^\Q$deeplink_map\E$/,@recurseup)) {
- $passback = 1;
- $pbscope = 'map';
- }
- }
- }
- return ($passback,$pbscope,$deeplink_map,$deeplink_symb,$crsdef,$itemnum,$lti_in_use);
- }
- }
- }
- }
- }
-}
-
=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.,
+ 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"
+ 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.
@@ -1563,106 +1511,13 @@ sub store_aggregates {
}
}
-sub access_status_msg {
- my ($mode,$status,$symb,$target,$ipused,$accessmsg) = @_;
- my $msg;
- if ($target eq 'web') {
- if ($status eq 'UNAVAILABLE') {
- $msg.='
'.&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'
'
@@ -3396,7 +3229,7 @@ sub practice_problem_header {
}
sub randomizetry_problem_header {
- my ($problemstatus,$reqtries,$symb) = @_;
+ my ($problemstatus,$reqtries) = @_;
my ($header,$text);
if ($reqtries > 1) {
$header = &mt('New Problem Variation After Every [quant,_1,Try,Tries]',$reqtries);
@@ -3416,13 +3249,8 @@ sub randomizetry_problem_header {
$text = &mt('A new variation will be generated after each try until correct or tries limit is reached.');
}
}
- if (($env{'request.state'} eq "construct") || ($symb eq '')) {
- return '
'.
- '
'.$header.'
'.$text.'
';
- } else {
- return '
'.$header.'
'.
- ''.$text.'';
- }
+ return '
'.$header.'
'.
+ ''.$text.'';
}
sub randomizetry_part_header {
@@ -3430,7 +3258,7 @@ sub randomizetry_part_header {
my ($header,$text);
if ($reqtries eq 'none') {
$header = &mt('No Question Variation');
- $text = &mt('For this question there will be no new variation after a try.');
+ $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') ||