--- loncom/homework/lonhomework.pm 2023/09/07 16:35:29 1.344.2.10.4.3 +++ loncom/homework/lonhomework.pm 2015/07/17 19:11:09 1.356 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # The LON-CAPA Homework handler # -# $Id: lonhomework.pm,v 1.344.2.10.4.3 2023/09/07 16:35:29 raeburn Exp $ +# $Id: lonhomework.pm,v 1.356 2015/07/17 19:11:09 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -49,22 +49,17 @@ use Apache::matchresponse(); use Apache::chemresponse(); use Apache::functionplotresponse(); use Apache::drawimage(); -use Apache::loncourseuser(); -use Apache::grades(); +use Apache::loncapamath(); use Apache::Constants qw(:common); use Apache::loncommon(); use Apache::lonparmset(); -use Apache::lonnavmaps(); use Apache::lonlocal; -use LONCAPA qw(:DEFAULT :match); -use LONCAPA::ltiutils(); use Time::HiRes qw( gettimeofday tv_interval ); use HTML::Entities(); use File::Copy(); # FIXME - improve commenting -my $registered_cleanup; BEGIN { &Apache::lonxml::register_insert(); @@ -195,7 +190,7 @@ sub proctor_checked_in { if ($type eq 'Task') { my $version=$Apache::lonhomework::history{'resource.0.version'}; $key ="resource.$version.0.checkedin"; - } elsif (($type eq 'problem') || ($type eq 'tool')) { + } elsif ($type eq 'problem') { $key ='resource.0.checkedin'; } # backward compatability, used to be username@domain, @@ -210,15 +205,16 @@ sub proctor_checked_in { return 1; } } + return 0; } sub check_slot_access { - my ($id,$type,$symb,$partlist)=@_; + my ($id,$type,$symb)=@_; # does it pass normal muster my ($status,$datemsg)=&check_access($id,$symb); - + my $useslots = &Apache::lonnet::EXT("resource.0.useslots",$symb); if ($useslots ne 'resource' && $useslots ne 'map' && $useslots ne 'map_map') { @@ -241,12 +237,6 @@ 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); @@ -260,9 +250,6 @@ sub check_slot_access { my ($returned_slot,$slot_name); my $now = time; my $num_usable_slots = 0; - unless ($symb) { - ($symb) = &Apache::lonnet::whichuser(); - } foreach my $slot (@slots) { $slot =~ s/(^\s*|\s*$)//g; &Apache::lonxml::debug("getting $slot"); @@ -286,10 +273,9 @@ sub check_slot_access { $slotstatus=$status; } - my ($is_correct,$got_grade,$checkin,$checkinslot,$checkedin,$consumed_uniq); + my ($is_correct,$got_grade,$checkedin); if ($type eq 'Task') { my $version=$Apache::lonhomework::history{'resource.0.version'}; - $checkin = "resource.$version.0.checkedin"; $got_grade = ($Apache::lonhomework::history{"resource.$version.0.status"} =~ /^(?:pass|fail)$/); @@ -298,58 +284,11 @@ sub check_slot_access { || $Apache::lonhomework::history{"resource.0.solved"} =~ /^correct_/ ); $checkedin = $Apache::lonhomework::history{"resource.$version.0.checkedin"}; - } elsif (($type eq 'problem') || ($type eq 'tool')) { - $checkin = 'resource.0.checkedin'; - $checkedin = $Apache::lonhomework::history{$checkin}; - } - if ($checkedin) { - $checkinslot = $Apache::lonhomework::history{"$checkin.slot"}; - my %slot=&Apache::lonnet::get_slot($checkinslot); - $consumed_uniq = $slot{'uniqueperiod'}; - } - if (($type eq 'problem') || ($type eq 'tool')) { - if ((ref($partlist) eq 'ARRAY') && (@{$partlist} > 0)) { - my ($numcorrect,$numgraded) = (0,0); - foreach my $part (@{$partlist}) { - my $currtries = $Apache::lonhomework::history{"resource.$part.tries"}; - my $maxtries = &Apache::lonnet::EXT("resource.$part.maxtries",$symb); - my $probstatus = &Apache::structuretags::get_problem_status($part); - my $earlyout; - unless (($probstatus eq 'no') || - ($probstatus eq 'no_feedback_ever')) { - if ($Apache::lonhomework::history{"resource.$part.solved"} =~/^correct_/) { - $numcorrect ++; - } else { - $earlyout = 1; - } - } - if ($currtries == $maxtries) { - $earlyout = 1; - } else { - $numgraded ++; - } - last if ($earlyout); - } - my $numparts = scalar(@{$partlist}); - if ($numparts == $numcorrect) { - $is_correct = 1; - } - if ($numparts == $numgraded) { - $got_grade = 1; - } - } else { - my $currtries = $Apache::lonhomework::history{"resource.0.tries"}; - my $maxtries = &Apache::lonnet::EXT("resource.0.maxtries",$symb); - my $probstatus = &Apache::structuretags::get_problem_status('0'); - unless (($probstatus eq 'no') || - ($probstatus eq 'no_feedback_ever')) { - $is_correct = - ($Apache::lonhomework::history{"resource.0.solved"} =~/^correct_/); - } - unless (($currtries == $maxtries) || ($is_correct)) { - $got_grade = 1; - } - } + } elsif ($type eq 'problem') { + $got_grade = 1; + $checkedin = $Apache::lonhomework::history{"resource.0.checkedin"}; + $is_correct = + ($Apache::lonhomework::history{"resource.0.solved"} =~/^correct_/); } &Apache::lonxml::debug(" slot is $slotstatus checkedin ($checkedin) got_grade ($got_grade) is_correct ($is_correct)"); @@ -366,71 +305,31 @@ sub check_slot_access { # However, the problem is not closed, and potentially, another slot might be # used to gain access to it to work on it, until the due date is reached, and the # problem then becomes CLOSED. Therefore return the slotstatus - - # (which will be one of: NOT_IN_A_SLOT, RESERVABLE, RESERVABLE_LATER, or NOTRESERVABLE). - - if (!defined($slot_name) && (($type eq 'problem') || ($type eq 'tool'))) { + # (which will be one of: NOT_IN_A_SLOT, RESERVABLE, RESERVABLE_LATER, or NOTRESERVABLE. + if (!defined($slot_name) && $type eq 'problem') { if ($slotstatus eq 'NOT_IN_A_SLOT') { if (!$num_usable_slots) { if ($env{'request.course.id'}) { my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + unless ($symb) { + ($symb)=&Apache::lonnet::whichuser(); + } $slotstatus = 'NOTRESERVABLE'; my ($reservable_now_order,$reservable_now,$reservable_future_order, $reservable_future) = &Apache::loncommon::get_future_slots($cnum,$cdom,$now,$symb); if ((ref($reservable_now_order) eq 'ARRAY') && (ref($reservable_now) eq 'HASH')) { if (@{$reservable_now_order} > 0) { - if ((!$checkedin) || (ref($consumed_uniq) ne 'ARRAY')) { - $slotstatus = 'RESERVABLE'; - $datemsg = $reservable_now->{$reservable_now_order->[-1]}{'endreserve'}; - } else { - my ($uniqstart,$uniqend,$useslot); - if (ref($consumed_uniq) eq 'ARRAY') { - ($uniqstart,$uniqend)=@{$consumed_uniq}; - } - foreach my $slot (reverse(@{$reservable_now_order})) { - if ($reservable_now->{$slot}{'uniqueperiod'} =~ /^(\d+)\,(\d+)$/) { - my ($new_uniq_start,$new_uniq_end) = ($1,$2); - next if (! - ($uniqstart < $new_uniq_start && $uniqend < $new_uniq_start) || - ($uniqstart > $new_uniq_end && $uniqend > $new_uniq_end )); - } - $useslot = $slot; - last; - } - if ($useslot) { - $slotstatus = 'RESERVABLE'; - $datemsg = $reservable_now->{$useslot}{'endreserve'}; - } - } + $slotstatus = 'RESERVABLE'; + $datemsg = $reservable_now->{$reservable_now_order->[-1]}{'endreserve'}; } } unless ($slotstatus eq 'RESERVABLE') { if ((ref($reservable_future_order) eq 'ARRAY') && (ref($reservable_future) eq 'HASH')) { if (@{$reservable_future_order} > 0) { - if ((!$checkedin) || (ref($consumed_uniq) ne 'ARRAY')) { - $slotstatus = 'RESERVABLE_LATER'; - $datemsg = $reservable_future->{$reservable_future_order->[0]}{'startreserve'}; - } else { - my ($uniqstart,$uniqend,$useslot); - if (ref($consumed_uniq) eq 'ARRAY') { - ($uniqstart,$uniqend)=@{$consumed_uniq}; - } - foreach my $slot (@{$reservable_future_order}) { - if ($reservable_future->{$slot}{'uniqueperiod'} =~ /^(\d+),(\d+)$/) { - my ($new_uniq_start,$new_uniq_end) = ($1,$2); - next if (! - ($uniqstart < $new_uniq_start && $uniqend < $new_uniq_start) || - ($uniqstart > $new_uniq_end && $uniqend > $new_uniq_end )); - } - $useslot = $slot; - last; - } - if ($useslot) { - $slotstatus = 'RESERVABLE_LATER'; - $datemsg = $reservable_future->{$useslot}{'startreserve'}; - } - } + $slotstatus = 'RESERVABLE_LATER'; + $datemsg = $reservable_future->{$reservable_future_order->[0]}{'startreserve'}; } } } @@ -452,7 +351,7 @@ sub check_slot_access { } if ( $is_correct) { - if (($type eq 'problem') || ($type eq 'tool')) { + if ($type eq 'problem') { return ($status); } return ('SHOW_ANSWER'); @@ -723,9 +622,6 @@ sub setuppermissions { $env{'request.course.sec'} !~ /^\s*$/) { $viewgrades = &Apache::lonnet::allowed('vgr',$env{'request.course.id'}. '/'.$env{'request.course.sec'}); - if ($viewgrades) { - $Apache::lonhomework::viewgradessec = $env{'request.course.sec'}; - } } $Apache::lonhomework::viewgrades = $viewgrades; @@ -743,9 +639,6 @@ sub setuppermissions { $modifygrades = &Apache::lonnet::allowed('mgr',$env{'request.course.id'}. '/'.$env{'request.course.sec'}); - if ($modifygrades) { - $Apache::lonhomework::modifygradessec = $env{'request.course.sec'}; - } } $Apache::lonhomework::modifygrades = $modifygrades; @@ -764,9 +657,7 @@ sub setuppermissions { sub unset_permissions { undef($Apache::lonhomework::queuegrade); undef($Apache::lonhomework::modifygrades); - undef($Apache::lonhomework::modifygradessec); undef($Apache::lonhomework::viewgrades); - undef($Apache::lonhomework::viewgradessec); undef($Apache::lonhomework::browse); } @@ -882,7 +773,7 @@ sub analyze_header { .&Apache::loncommon::head_subbox( &Apache::loncommon::CSTR_pageheader()); $result .= - '
'. ''. @@ -897,8 +788,8 @@ sub analyze_header { 'onclick="javascript:setmode(this.form,'."'view'".')" />
' - .&Apache::lonxml::message_location().' -
'; + .&Apache::lonxml::message_location(). + ''; &Apache::lonxml::add_messages(\$result); $request->print($result); $request->rflush(); @@ -1127,7 +1018,7 @@ sub editxmlmode {
'. &mt('Problem Editing').' '.&Apache::loncommon::help_open_topic('Problem_Editor_XML_Index'). - '
'; + '
'; $result.=''. &Apache::structuretags::problem_edit_buttons('editxml'); @@ -1137,27 +1028,27 @@ sub editxmlmode { unless ($env{'environment.nocodemirror'}) { # dropdown menus - $result .= Apache::lonmenu::create_submenu("#", "", + $result .= Apache::lonmenu::create_submenu("#", "", &mt("Problem Templates"), template_dropdown_datastructure()); - $result .= Apache::lonmenu::create_submenu("#", "", + $result .= Apache::lonmenu::create_submenu("#", "", &mt("Response Types"), responseblock_dropdown_datastructure()); - $result .= Apache::lonmenu::create_submenu("#", "", + $result .= Apache::lonmenu::create_submenu("#", "", &mt("Conditional Blocks"), conditional_scripting_datastructure()); - $result .= Apache::lonmenu::create_submenu("#", "", + $result .= Apache::lonmenu::create_submenu("#", "", &mt("Miscellaneous"), misc_datastructure()); } - $result .= Apache::lonmenu::create_submenu("#", "", + $result .= Apache::lonmenu::create_submenu("#", "", &mt("Help") . ' ' . &mt(', + '" style="vertical-align:text-bottom; height: auto; margin:0; "/>', helpmenu_datastructure(),""); $result.="
"; - - $result .= '
' . + + $result .= '' . &Apache::lonxml::message_location() . &Apache::loncommon::xmleditor_js() . '