--- loncom/homework/structuretags.pm 2015/04/10 08:22:21 1.533
+++ loncom/homework/structuretags.pm 2015/12/07 08:11:55 1.542
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# definition of tags that give a structure to a document
#
-# $Id: structuretags.pm,v 1.533 2015/04/10 08:22:21 droeschl Exp $
+# $Id: structuretags.pm,v 1.542 2015/12/07 08:11:55 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -490,7 +490,9 @@ sub page_start {
}
}
if ($needs_upload) {
- $extra_head .= &Apache::lonhtmlcommon::file_submissionchk_js();
+ $extra_head .= &Apache::lonhtmlcommon::file_submissionchk_js()
+ .'';
}
}
@@ -521,23 +523,25 @@ sub page_start {
} elsif (!defined($found{'body'})
&& $env{'request.state'} eq 'construct') {
if ($target eq 'web' || $target eq 'edit') {
- # 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
+ 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
# 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,
@@ -752,8 +756,18 @@ sub problem_edit_action_button {
sub problem_edit_buttons {
my ($mode)=@_;
+# Buttons that save
+ my $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";
# Buttons that do not save
- my $result=''.
+ $result .= '
'.
&problem_edit_action_button('subdiscview','discard','d','Discard Edits and View',1);
if ($mode eq 'editxml') {
$result.=&problem_edit_action_button('subedit','edit','e','Edit',1);
@@ -764,224 +778,9 @@ sub problem_edit_buttons {
$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 = ''.
@@ -993,9 +792,7 @@ sub problem_edit_header {
''.
&problem_edit_buttons();
- $return.='
- '
- .&Apache::lonxml::message_location();
+ $return .= '' . &Apache::lonxml::message_location();
$return .= '
';
@@ -1008,7 +805,8 @@ sub problem_edit_header {
$(\'.LC_edit_actionbar\').scrollToFixed(
{
fixed: function(){
- $(this).find(\'.LC_edit_actionbar\').css(\'height\', \'31px\');
+ //$(this).find(\'.LC_edit_actionbar\').css(\'height\', \'31px\');
+ $(this).find(\'.LC_edit_actionbar\');
}
}
);
@@ -1180,6 +978,13 @@ $show_all
'onclick="javascript:setmode(this.form,'."'edit'".')" />';
$result .= '';
+ if ($env{'browser.type'} ne 'explorer' || $env{'browser.version'} > 9) {
+ my $uri = $env{'request.uri'};
+ my $daxeurl = '/adm/daxe/daxe.html?config=config/loncapa_config.xml&file=/daxeopen'.$uri.
+ '&save=/daxesave';
+ $result .= '';
+ }
$result.='
@@ -1482,8 +1287,8 @@ sub store_aggregates {
} else {
$anoncounter{$symb."\0".$part} = 1;
}
- my $needsrelease = $Apache::lonnet::needsrelease{'parameter:type:'.$Apache::lonhomework::results{'resource.'.$part.'.type'}};
- if ($needsrelease) {
+ 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 '') {
&Apache::lonnet::update_released_required($needsrelease);
@@ -1594,6 +1399,7 @@ sub init_problem_globals {
@Apache::inputtags::importlist = ();
@Apache::inputtags::previous=();
@Apache::inputtags::previous_version=();
+ $Apache::inputtags::leniency='';
$Apache::structuretags::printanswer='No';
@Apache::structuretags::whileconds=();
@Apache::structuretags::whilebody=();
@@ -1609,6 +1415,7 @@ sub reset_problem_globals {
undef(%Apache::lonhomework::history);
undef(%Apache::lonhomework::results);
undef($Apache::inputtags::part);
+ undef($Apache::inputtags::leniency);
if ($type eq 'Task') {
undef($Apache::inputtags::slot_name);
} elsif ($type eq 'problem') {
@@ -1712,6 +1519,7 @@ sub start_problem {
my $status;
my $accessmsg;
my $resource_due;
+ my $ipused;
my $name= &get_resource_name($parstack,$safeeval);
my ($result,$form_tag_start,$slot_name,$slot,$probpartlist);
@@ -1720,10 +1528,11 @@ sub start_problem {
$target eq 'tex') {
if ($env{'form.markaccess'}) {
my @interval=&Apache::lonnet::EXT("resource.0.interval");
- &Apache::lonnet::set_first_access($interval[1],$interval[0]);
+ my ($timelimit) = split(/_/,$interval[0]);
+ &Apache::lonnet::set_first_access($interval[1],$timelimit);
}
- ($status,$accessmsg,$slot_name,$slot) =
+ ($status,$accessmsg,$slot_name,$slot,$ipused) =
&Apache::lonhomework::check_slot_access('0','problem');
push (@Apache::inputtags::status,$status);
}
@@ -1814,7 +1623,8 @@ sub start_problem {
( $status eq 'NOTRESERVABLE') ||
( $status eq 'RESERVABLE') ||
( $status eq 'RESERVABLE_LATER') ||
- ( $status eq 'INVALID_ACCESS')) {
+ ( $status eq 'INVALID_ACCESS') ||
+ ( $status eq 'NEED_DIFFERENT_IP')) {
my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser,
$style);
if ( $target eq "web" ) {
@@ -1847,7 +1657,14 @@ sub start_problem {
&Apache::lonnavmaps::timeToHumanString($accessmsg,'start'));
} elsif ($status eq 'NOTRESERVABLE') {
$msg.=&mt('Not available to make a reservation.');
- }
+ } elsif ($status eq 'NEED_DIFFERENT_IP') {
+ if ($ipused) {
+ $msg.=&mt('You must use the same computer ([_1]) you used when you first accessed this resource using your time/place-based reservation.',"IP: $ipused");
+ } else {
+ $msg.=&mt('Each student must use a different computer to access this resource at this time and/or place.').'
'.
+ &mt('Somebody else has already used this particular computer for that purpose.');
+ }
+ }
$result.=$msg.'
';
} elsif ($target eq 'tex') {
my $startminipage = ($env{'form.problem_split'}=~/yes/i)? ''
@@ -1867,8 +1684,11 @@ sub start_problem {
$result .=
&Apache::bridgetask::proctor_validation_screen($slot);
} elsif ($target eq 'grade') {
- &Apache::bridgetask::proctor_check_auth($slot_name,$slot,
- 'problem');
+ my $checkinresult = &Apache::bridgetask::proctor_check_auth($slot_name,$slot,
+ 'problem');
+ if ($checkinresult = /^error:/) {
+ $result .= 'error';
+ }
}
} elsif ($target eq 'web') {
if ($status eq 'CAN_ANSWER') {
@@ -1878,10 +1698,18 @@ sub start_problem {
$Apache::lonhomework::history{'resource.0.checkedin'};
if ($checked_in eq '') {
# unproctored slot access, self checkin
- &Apache::bridgetask::check_in('problem',undef,undef,
- $slot_name);
- $checked_in =
- $Apache::lonhomework::results{"resource.0.checkedin"};
+ my $needsiptied;
+ if (ref($slot)) {
+ $needsiptied = $slot->{'iptied'};
+ }
+ my $check = &Apache::bridgetask::check_in('problem',undef,undef,
+ $slot_name,$needsiptied);
+ if ($check =~ /^error: /) {
+ &Apache::lonnet::logthis("Error during self-checkin of problem (symb: $env{'request.symb'}) using slot: $slot_name");
+ } else {
+ $checked_in =
+ $Apache::lonhomework::results{"resource.0.checkedin"};
+ }
}
if ((ref($slot) eq 'HASH') && ($checked_in ne '')) {
if ($slot->{'starttime'} < time()) {
@@ -1904,7 +1732,9 @@ sub start_problem {
'';
# create a page header and exit
if ($env{'request.state'} eq "construct") {
- $result.= &problem_web_to_edit_header($env{'form.rndseed'});
+ unless ($env{'form.inhibitmenu'} eq 'yes') {
+ $result.= &problem_web_to_edit_header($env{'form.rndseed'});
+ }
if ($Apache::lonhomework::type eq 'practice') {
$result.= ''.
@@ -2812,6 +2642,7 @@ sub start_part {
my $id= &Apache::lonxml::get_id($parstack,$safeeval);
$Apache::inputtags::part=$id;
push(@Apache::inputtags::partlist,$id);
+ $Apache::inputtags::leniency='';
@Apache::inputtags::response=();
@Apache::inputtags::previous=();
@Apache::inputtags::previous_version=();
@@ -2977,6 +2808,7 @@ sub end_part {
}
pop @Apache::inputtags::status;
$Apache::inputtags::part='';
+ $Apache::inputtags::leniency='';
$Apache::lonhomework::type = $Apache::lonhomework::default_type;
return $result;
}