--- loncom/homework/lonhomework.pm 2016/08/08 12:07:20 1.344.2.4 +++ loncom/homework/lonhomework.pm 2024/07/08 01:13:59 1.344.2.11 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # The LON-CAPA Homework handler # -# $Id: lonhomework.pm,v 1.344.2.4 2016/08/08 12:07:20 raeburn Exp $ +# $Id: lonhomework.pm,v 1.344.2.11 2024/07/08 01:13:59 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -235,6 +235,12 @@ sub check_slot_access { $Apache::lonhomework::history{"resource.$version.0.status"} eq 'pass') { 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); @@ -311,7 +317,7 @@ sub check_slot_access { $earlyout = 1; } } - if (($currtries == $maxtries) || ($is_correct)) { + if ($currtries == $maxtries) { $earlyout = 1; } else { $numgraded ++; @@ -844,7 +850,7 @@ STATE sub analyze_header { my ($request) = @_; - my $js = &Apache::structuretags::setmode_javascript(); + my $js = &Apache::lonxml::setmode_javascript(); # Breadcrumbs my $brcrum = [{'href' => &Apache::loncommon::authorspace($request->uri), @@ -861,8 +867,7 @@ sub analyze_header { .&Apache::loncommon::head_subbox( &Apache::loncommon::CSTR_pageheader()); $result .= - &Apache::lonxml::message_location().' -
'; &Apache::lonxml::add_messages(\$result); $request->print($result); @@ -1077,7 +1083,7 @@ sub editxmlmode { my $js = &Apache::edit::js_change_detection(). &Apache::loncommon::resize_textarea_js(). - &Apache::structuretags::setmode_javascript(). + &Apache::lonxml::setmode_javascript(). &Apache::lonhtmlcommon::dragmath_js("EditMathPopup"); # Breadcrumbs @@ -1104,27 +1110,88 @@ sub editxmlmode { ''; + + 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 ''; } @@ -1211,21 +1278,35 @@ sub finished_parsing { undef($Apache::lonhomework::parsing_a_task); } + +# 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; &Apache::lonxml::debug("Looking for :$extension:"); my $glob_extension = $extension; if ($extension eq 'survey' || $extension eq 'exam') { - $glob_extension = 'problem'; + $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')), - &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; @@ -1287,17 +1368,44 @@ sub get_template_list { sub newproblem { my ($request) = @_; + if ($env{'form.mode'} eq 'blank'){ + my $dest = &Apache::lonnet::filelocation("",$request->uri); + my $templatefilename = + $request->dir_config('lonIncludes').'/templates/blank.problem'; + &File::Copy::copy($templatefilename,$dest); + &renderpage($request,$dest); + return; + } + my $errormsg; if ($env{'form.template'}) { - my $file = $env{'form.template'}; - my $dest = &Apache::lonnet::filelocation("",$request->uri); - &File::Copy::copy($file,$dest); - &renderpage($request,$dest); - return; + my $file; + my ($extension) = ($env{'form.template'} =~ /\.(\w+)$/); + if ($extension) { + my @files = &get_template_list($extension); + 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 = ''.&mt('Invalid template file.').'
'; + } + } else { + $errormsg = ''.&mt('Invalid template file; template needs to be a .problem, .library, or .task file.').'
'; + } } 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 = @@ -1309,7 +1417,6 @@ sub newproblem { } else { my $url=&HTML::Entities::encode($request->uri,'<>&"'); my $dest = &Apache::lonnet::filelocation("",$request->uri); - my $errormsg; my $instructions; my $brcrum = [{'href' => &Apache::loncommon::authorspace($request->uri), 'text' => 'Authoring Space'}, @@ -1409,6 +1516,8 @@ 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); } @@ -1426,5 +1535,179 @@ sub handler { } +sub template_dropdown_datastructure { + # gathering the all templates and their path, title, category and help topic + my @templates = 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, "<$path"); + while(