Diff for /loncom/interface/lonnavmaps.pm between versions 1.536 and 1.541

version 1.536, 2017/09/13 23:35:07 version 1.541, 2018/01/31 14:05:12
Line 71  processed. Line 71  processed.
   
 Apache::lonnavmaps provides an object model for manipulating this  Apache::lonnavmaps provides an object model for manipulating this
 information in a higher-level fashion than directly manipulating   information in a higher-level fashion than directly manipulating 
 the hash. It also provides access to several auxilary functions   the hash. It also provides access to several auxiliary functions 
 that aren't necessarily stored in the Big Hash, but are a per-  that aren't necessarily stored in the Big Hash, but are a per-
 resource sort of value, like whether there is any feedback on   resource sort of value, like whether there is any feedback on 
 a given resource.  a given resource.
Line 92  graded for named user(s) or specific COD Line 92  graded for named user(s) or specific COD
 domain, or CODE can be passed as arguments when creating a new   domain, or CODE can be passed as arguments when creating a new 
 navmap object.  navmap object.
   
 Note if you want things like "due dates for another student,  Note if you want things like "due dates for another student",
 you would use the EXT function instead of lonnavmaps.  you would use the EXT function instead of lonnavmaps.
 That said, the lonnavmaps module can still help, because many  That said, the lonnavmaps module can still help, because many
 things, such as the course structure, are usually constant  things, such as the course structure, are usually constant
Line 658  sub getDescription { Line 658  sub getDescription {
             } elsif ($slot_status == $res->RESERVABLE) {              } elsif ($slot_status == $res->RESERVABLE) {
                 $slotmsg = &mt('Reservable, reservations close [_1]',                  $slotmsg = &mt('Reservable, reservations close [_1]',
                            timeToHumanString($slot_time,'end'));                             timeToHumanString($slot_time,'end'));
               } elsif ($slot_status == $res->NEEDS_CHECKIN) {
                   $slotmsg = &mt('Reserved, check-in needed - ends [_1]',
                              timeToHumanString($slot_time,'end'));
             } elsif ($slot_status == $res->RESERVABLE_LATER) {              } elsif ($slot_status == $res->RESERVABLE_LATER) {
                 $slotmsg = &mt('Reservable, reservations open [_1]',                  $slotmsg = &mt('Reservable, reservations open [_1]',
                            timeToHumanString($slot_time,'start'));                             timeToHumanString($slot_time,'start'));
Line 699  sub getDescription { Line 702  sub getDescription {
     }      }
     if (($status == $res->ANSWER_OPEN || $status == $res->PARTIALLY_CORRECT)      if (($status == $res->ANSWER_OPEN || $status == $res->PARTIALLY_CORRECT)
  && $res->handgrade($part) ne 'yes') {   && $res->handgrade($part) ne 'yes') {
         return &Apache::lonhtmlcommon::direct_parm_link(&mt("Answer available"),$res->symb(),'answerdate,duedate',$part);          my $msg = &mt('Answer available');
           my $parmlist = 'answerdate,duedate';
           if (($res->is_tool) && ($res->is_gradable())) {
               if (($status == $res->PARTIALLY_CORRECT) && ($res->parmval('retrypartial',$part))) {
                   $msg = &mt('Grade received');
                   $parmlist = 'retrypartial';
               } else {
                   $msg = &mt('Grade available');
               }
           }
           return &Apache::lonhtmlcommon::direct_parm_link($msg,$res->symb(),$parmlist,$part);
     }      }
     if ($status == $res->EXCUSED) {      if ($status == $res->EXCUSED) {
         return &mt("Excused by instructor");          return &mt("Excused by instructor");
Line 953  sub render_resource { Line 966  sub render_resource {
     # links to open and close the folder      # links to open and close the folder
   
     my $whitespace = $location.'/whitespace_21.gif';      my $whitespace = $location.'/whitespace_21.gif';
     my $linkopen = "<img src='$whitespace' alt='' />"."<a href=\"$link\">";      my $linkopen = "<img src='$whitespace' alt='' />";
       my $nomodal;
       if (($params->{'modalLink'}) && (!$resource->is_sequence())) {
           if ($link =~m{^(?:|/adm/wrapper)/ext/([^#]+)}) {
               my $exturl = $1;
               if (($ENV{'SERVER_PORT'} == 443) && ($exturl !~ /^https:/)) {
                   $nomodal = 1;
               }
           } elsif (($link eq "/public/$LONCAPA::match_domain/$LONCAPA::match_courseid/syllabus") &&
                    ($env{'request.course.id'}) && ($ENV{'SERVER_PORT'} == 443) &&
                    ($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://})) {
                $nomodal = 1;
           }
           my $esclink = &js_escape($link);
           if ($nomodal) {
               $linkopen .= "<a href=\"#\" onclick=\"javascript:window.open('$esclink','resourcepreview','height=400,width=500,scrollbars=1,resizable=1,menubar=0,location=1'); return false;\" />";
           } else {
               $linkopen .= "<a href=\"$link\" onclick=\"javascript:openMyModal('$esclink',600,500,'yes','true'); return false;\">";
           }
       } else {
           $linkopen .= "<a href=\"$link\">";
       }
     my $linkclose = "</a>";      my $linkclose = "</a>";
   
     # Default icon: unknown page      # Default icon: unknown page
Line 1081  sub render_resource { Line 1115  sub render_resource {
     }      }
   
     if (!$params->{'resource_nolink'} && !$resource->is_sequence() && !$resource->is_empty_sequence) {      if (!$params->{'resource_nolink'} && !$resource->is_sequence() && !$resource->is_empty_sequence) {
         $result .= "$curMarkerBegin<a href=\"$link\">$title$partLabel</a>$curMarkerEnd$editmapLink$nonLinkedText</td>";          $linkclose = '</a>';
     } else {          if ($params->{'modalLink'}) {
         $result .= "$curMarkerBegin$linkopen$title$partLabel</a>$curMarkerEnd$editmapLink$nonLinkedText</td>";              my $esclink = &js_escape($link);
               if ($nomodal) {
                   $linkopen = "<a href=\"#\" onclick=\"javascript:window.open('$esclink','resourcepreview','height=400,width=500,scrollbars=1,resizable=1,menubar=0,location=1'); return false;\" />";
               } else {
                   $linkopen = "<a href=\"$link\" onclick=\"javascript:openMyModal('$esclink',600,500,'yes','true'); return false;\">";
               }
           } else {
               $linkopen = "<a href=\"$link\">";
           }
     }      }
       $result .= "$curMarkerBegin$linkopen$title$partLabel$linkclose$curMarkerEnd$editmapLink$nonLinkedText</td>";
   
     return $result;      return $result;
 }  }
Line 1146  sub render_quick_status { Line 1189  sub render_quick_status {
     my $linkclose = "</a>";      my $linkclose = "</a>";
   
  $result .= '<td class="LC_middle">';   $result .= '<td class="LC_middle">';
     if ($resource->is_problem() &&      if ($resource->is_gradable() &&
         !$firstDisplayed) {          !$firstDisplayed) {
         my $icon = $statusIconMap{$resource->simpleStatus($part)};          my $icon = $statusIconMap{$resource->simpleStatus($part)};
         my $alt = $iconAltTags{$icon};          my $alt = $iconAltTags{$icon};
Line 1171  sub render_long_status { Line 1214  sub render_long_status {
                                   
     my $color;      my $color;
     my $info = '';      my $info = '';
     if ($resource->is_problem() || $resource->is_practice()) {      if ($resource->is_gradable() || $resource->is_practice()) {
         $color = $colormap{$resource->status};          $color = $colormap{$resource->status};
   
         if (dueInLessThan24Hours($resource, $part)) {          if (dueInLessThan24Hours($resource, $part)) {
Line 1185  sub render_long_status { Line 1228  sub render_long_status {
             }              }
          }           }
     }      }
       
     if ($resource->kind() eq "res" &&      if (($resource->kind() eq "res") &&
         $resource->is_raw_problem() &&          ($resource->is_raw_problem() || $resource->is_gradable()) &&
         !$firstDisplayed) {          !$firstDisplayed) {
         if ($color) {$result .= '<span style="color:'.$color.'"'.$info.'><b>'; }          if ($color) {$result .= '<span style="color:'.$color.'"'.$info.'><b>'; }
         $result .= getDescription($resource, $part);          $result .= getDescription($resource, $part);
Line 1234  my @statuses = ($resObj->CORRECT, $resOb Line 1277  my @statuses = ($resObj->CORRECT, $resOb
   
 sub render_parts_summary_status {  sub render_parts_summary_status {
     my ($resource, $part, $params) = @_;      my ($resource, $part, $params) = @_;
     if (!$resource->is_problem() && !$resource->contains_problem) { return '<td></td>'; }      if (!$resource->is_gradable() && !$resource->contains_problem) { return '<td></td>'; }
     if ($params->{showParts}) {       if ($params->{showParts}) { 
  return '<td></td>';   return '<td></td>';
     }      }
Line 1722  END Line 1765  END
         $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};          $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
     }      }
   
       my $inhibitmenu;
       if ($args->{'modalLink'}) {
           $inhibitmenu = '&amp;inhibitmenu=yes';
       }
   
     while (1) {      while (1) {
  if ($args->{'sort'}) {   if ($args->{'sort'}) {
     $curRes = shift(@resources);      $curRes = shift(@resources);
Line 1875  END Line 1923  END
     } else {      } else {
         $args->{"resourceLink"} = $src.          $args->{"resourceLink"} = $src.
     ($srcHasQuestion?'&amp;':'?') .      ($srcHasQuestion?'&amp;':'?') .
     'symb=' . &escape($symb).$anchor;      'symb=' . &escape($symb).$inhibitmenu.$anchor;
     }      }
  }   }
         # Now, we've decided what parts to show. Loop through them and          # Now, we've decided what parts to show. Loop through them and
Line 2696  sub parmval_real { Line 2744  sub parmval_real {
   
     my ($mapname,$id,$fn)=&Apache::lonnet::decode_symb($symb);      my ($mapname,$id,$fn)=&Apache::lonnet::decode_symb($symb);
     $mapname = &Apache::lonnet::deversion($mapname);      $mapname = &Apache::lonnet::deversion($mapname);
       my $toolsymb = '';
       if ($fn =~ /ext\.tool$/) {
           $toolsymb = $symb;
       }
     my ($recursed,@recurseup);       my ($recursed,@recurseup); 
           
 # ----------------------------------------------------- Cascading lookup scheme  # ----------------------------------------------------- Cascading lookup scheme
Line 2816  sub parmval_real { Line 2868  sub parmval_real {
   
     my $meta_rwhat=$rwhat;      my $meta_rwhat=$rwhat;
     $meta_rwhat=~s/\./_/g;      $meta_rwhat=~s/\./_/g;
     my $default=&Apache::lonnet::metadata($fn,$meta_rwhat);      my $default=&Apache::lonnet::metadata($fn,$meta_rwhat,$toolsymb);
     if (defined($default)) { return [$default,'resource']}      if (defined($default)) { return [$default,'resource']}
     $default=&Apache::lonnet::metadata($fn,'parameter_'.$meta_rwhat);      $default=&Apache::lonnet::metadata($fn,'parameter_'.$meta_rwhat,$toolsymb);
     if (defined($default)) { return [$default,'resource']}      if (defined($default)) { return [$default,'resource']}
 # --------------------------------------------------- fifth, check more course  # --------------------------------------------------- fifth, check more course
     if (defined($courseopt)) {      if (defined($courseopt)) {
Line 2860  sub parmval_real { Line 2912  sub parmval_real {
        if (defined($partgeneral[0])) { return \@partgeneral; }         if (defined($partgeneral[0])) { return \@partgeneral; }
     }      }
     if ($recurse) { return []; }      if ($recurse) { return []; }
     my $pack_def=&Apache::lonnet::packages_tab_default($fn,'resource.'.$rwhat);      my $pack_def=&Apache::lonnet::packages_tab_default($fn,'resource.'.$rwhat,$toolsymb);
     if (defined($pack_def)) { return [$pack_def,'resource']; }      if (defined($pack_def)) { return [$pack_def,'resource']; }
     return [''];      return [''];
 }  }
Line 4475  sub is_problem { Line 4527  sub is_problem {
     }      }
     return 0;      return 0;
 }  }
   sub is_tool {
       my $self=shift;
       my $src = $self->src();
       return ($src =~ /ext\.tool$/);
   }
   sub is_gradable {
       my $self=shift;
       my $src = $self->src();
       if (($src =~ /$LONCAPA::assess_re/) ||
           (($self->is_tool()) && ($self->parmval('gradable',0) =~ /^yes$/i))) {
           return !($self->is_practice());
       }
   }
 #  #
 #  The has below is the set of status that are considered 'incomplete'  #  The has below is the set of status that are considered 'incomplete'
 #  #
Line 5136  sub parts { Line 5201  sub parts {
     my $self = shift;      my $self = shift;
   
     if ($self->ext) { return []; }      if ($self->ext) { return []; }
       if (($self->is_tool()) &&
           ($self->is_gradable())) { return ['0']; }
   
     $self->extractParts();      $self->extractParts();
     return $self->{PARTS};      return $self->{PARTS};
Line 5510  Attempted, and not yet graded. Line 5577  Attempted, and not yet graded.
   
 Attempted, and credit received for attempt (survey and anonymous survey only).  Attempted, and credit received for attempt (survey and anonymous survey only).
   
   =item * B<INCORRECT_BY_PASSBACK>:
   
   Attempted, but wrong for LTI Tool Provider by passback of grade
   
   =item * B<CORRECT_BY_PASSBACK>:
   
   Correct for LTI Tool Provider by passback of grade
   
 =back  =back
   
 =cut  =cut
Line 5522  sub CORRECT_BY_OVERRIDE   { return 14; } Line 5597  sub CORRECT_BY_OVERRIDE   { return 14; }
 sub EXCUSED               { return 15; }  sub EXCUSED               { return 15; }
 sub ATTEMPTED             { return 16; }  sub ATTEMPTED             { return 16; }
 sub CREDIT_ATTEMPTED      { return 17; }  sub CREDIT_ATTEMPTED      { return 17; }
   sub INCORRECT_BY_PASSBACK { return 18; }
   sub CORRECT_BY_PASSBACK   { return 19; }
   
 sub getCompletionStatus {  sub getCompletionStatus {
     my $self = shift;      my $self = shift;
Line 5536  sub getCompletionStatus { Line 5613  sub getCompletionStatus {
     if ($status eq 'correct_by_override') {      if ($status eq 'correct_by_override') {
  return $self->CORRECT_BY_OVERRIDE;   return $self->CORRECT_BY_OVERRIDE;
     }      }
       if ($status eq 'correct_by_passback') {
           return $self->CORRECT_BY_PASSBACK;
       }
     if ($status eq 'incorrect_attempted') {return $self->INCORRECT; }      if ($status eq 'incorrect_attempted') {return $self->INCORRECT; }
     if ($status eq 'incorrect_by_override') {return $self->INCORRECT_BY_OVERRIDE; }      if ($status eq 'incorrect_by_override') {return $self->INCORRECT_BY_OVERRIDE; }
       if ($status eq 'incorrect_by_passback') {return $self->INCORRECT_BY_PASSBACK; }
     if ($status eq 'excused') {return $self->EXCUSED; }      if ($status eq 'excused') {return $self->EXCUSED; }
     if ($status eq 'ungraded_attempted') {return $self->ATTEMPTED; }      if ($status eq 'ungraded_attempted') {return $self->ATTEMPTED; }
     if ($status eq 'credit_attempted') {      if ($status eq 'credit_attempted') {
Line 5691  sub status { Line 5772  sub status {
   
     # There are a few whole rows we can dispose of:      # There are a few whole rows we can dispose of:
     if ($completionStatus == CORRECT ||      if ($completionStatus == CORRECT ||
         $completionStatus == CORRECT_BY_OVERRIDE ) {          $completionStatus == CORRECT_BY_OVERRIDE ||
           $completionStatus == CORRECT_BY_PASSBACK ) {
  if ( $suppressFeedback ) { return ANSWER_SUBMITTED }   if ( $suppressFeedback ) { return ANSWER_SUBMITTED }
  my $awarded=$self->awarded($part);   my $awarded=$self->awarded($part);
  if ($awarded < 1 && $awarded > 0) {   if ($awarded < 1 && $awarded > 0) {
Line 5704  sub status { Line 5786  sub status {
   
     # If it's WRONG... and not open      # If it's WRONG... and not open
     if ( ($completionStatus == INCORRECT ||       if ( ($completionStatus == INCORRECT || 
   $completionStatus == INCORRECT_BY_OVERRIDE)    $completionStatus == INCORRECT_BY_OVERRIDE ||
     $completionStatus == INCORRECT_BY_PASSBACK)
  && (!$self->opendate($part) ||  $self->opendate($part) > time()) ) {   && (!$self->opendate($part) ||  $self->opendate($part) > time()) ) {
  return INCORRECT;   return INCORRECT;
     }      }
Line 5746  sub status { Line 5829  sub status {
     }      }
   
     # If it's WRONG...      # If it's WRONG...
     if ($completionStatus == INCORRECT || $completionStatus == INCORRECT_BY_OVERRIDE) {      if ($completionStatus == INCORRECT || $completionStatus == INCORRECT_BY_OVERRIDE ||
           $completionStatus == INCORRECT_BY_PASSBACK) {
         # and there are TRIES LEFT:          # and there are TRIES LEFT:
         if ($self->tries($part) < $self->maxtries($part) || !$self->maxtries($part)) {          if ($self->tries($part) < $self->maxtries($part) || !$self->maxtries($part)) {
             return $suppressFeedback ? ANSWER_SUBMITTED : TRIES_LEFT;              return $suppressFeedback ? ANSWER_SUBMITTED : TRIES_LEFT;
Line 5800  sub check_for_slot { Line 5884  sub check_for_slot {
                                 ($checkedin,$checkedinslot) = $self->checkedin();                                  ($checkedin,$checkedinslot) = $self->checkedin();
                                 unless ((grep(/^\Q$checkedin\E/,@proctors)) &&                                  unless ((grep(/^\Q$checkedin\E/,@proctors)) &&
                                         ($checkedinslot eq $slot_name)) {                                          ($checkedinslot eq $slot_name)) {
                                     return (NEEDS_CHECKIN,undef,$slot_name);                                       return (NEEDS_CHECKIN,$end,$slot_name); 
                                 }                                  }
                             }                              }
                             return (RESERVED,$end,$slot_name);                              return (RESERVED,$end,$slot_name);

Removed from v.1.536  
changed lines
  Added in v.1.541


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>