Diff for /loncom/interface/lonnavmaps.pm between versions 1.204 and 1.211

version 1.204, 2003/06/14 00:11:12 version 1.211, 2003/06/25 18:27:18
Line 92  my %colormap = Line 92  my %colormap =
       $resObj->TRIES_LEFT             => '',        $resObj->TRIES_LEFT             => '',
       $resObj->INCORRECT              => '',        $resObj->INCORRECT              => '',
       $resObj->OPEN                   => '',        $resObj->OPEN                   => '',
       $resObj->NOTHING_SET            => '' );        $resObj->NOTHING_SET            => '',
         $resObj->ATTEMPTED              => '',
         $resObj->ANSWER_SUBMITTED       => ''
         );
 # And a special case in the nav map; what to do when the assignment  # And a special case in the nav map; what to do when the assignment
 # is not yet done and due in less then 24 hours  # is not yet done and due in less then 24 hours
 my $hurryUpColor = "#FF0000";  my $hurryUpColor = "#FF0000";
Line 161  sub real_handler { Line 164  sub real_handler {
     # Now that we've displayed some stuff to the user, init the navmap      # Now that we've displayed some stuff to the user, init the navmap
     $navmap->init();      $navmap->init();
   
     $r->print('<br>&nbsp;');  
     $r->rflush();      $r->rflush();
   
     # Check that it's defined      # Check that it's defined
Line 244  sub real_handler { Line 246  sub real_handler {
         }          }
     } else {      } else {
         $r->print("<a href='navmaps?jumpToFirstHomework'>" .          $r->print("<a href='navmaps?jumpToFirstHomework'>" .
                   "Go To My First Homework Problem</a><br />");                    "Go To My First Homework Problem</a>&nbsp;&nbsp;&nbsp;&nbsp;");
     }      }
   
     my $suppressEmptySequences = 0;      my $suppressEmptySequences = 0;
Line 265  sub real_handler { Line 267  sub real_handler {
  $resource_no_folder_link = 1;   $resource_no_folder_link = 1;
     } else {      } else {
         $r->print("<a href='navmaps?showOnlyHomework'>" .          $r->print("<a href='navmaps?showOnlyHomework'>" .
                   "Show Only Uncompleted Homework</a><br />");                    "Show Only Uncompleted Homework</a>&nbsp;&nbsp;&nbsp;&nbsp;");
     }      }
   
     # renderer call      # renderer call
Line 414  sub dueInLessThen24Hours { Line 416  sub dueInLessThen24Hours {
     my $part = shift;      my $part = shift;
     my $status = $res->status($part);      my $status = $res->status($part);
   
     return ($status == $res->OPEN() || $status == $res->ATTEMPTED() ||      return ($status == $res->OPEN() ||
             $status == $res->TRIES_LEFT()) &&              $status == $res->TRIES_LEFT()) &&
            $res->duedate() && $res->duedate() < time()+(24*60*60) &&             $res->duedate() && $res->duedate() < time()+(24*60*60) &&
            $res->duedate() > time();             $res->duedate() > time();
Line 556  Apache::lonnavmap - Subroutines to handl Line 558  Apache::lonnavmap - Subroutines to handl
   
 The main handler generates the navigational listing for the course,  The main handler generates the navigational listing for the course,
 the other objects export this information in a usable fashion for  the other objects export this information in a usable fashion for
 other modules  other modules.
   
 =head1 Object: render  =head1 Subroutine: render
   
 The navmap renderer package provides a sophisticated rendering of the  The navmap renderer package provides a sophisticated rendering of the
 standard navigation maps interface into HTML. The provided nav map  standard navigation maps interface into HTML. The provided nav map
Line 572  understand then "undef, undef, undef, 1, Line 574  understand then "undef, undef, undef, 1,
 undef, 0" when you mostly want default behaviors.  undef, 0" when you mostly want default behaviors.
   
 The package provides a function called 'render', called as  The package provides a function called 'render', called as
 Apache::lonnavmaps::renderer->render({}).  Apache::lonnavmaps::render({}).
   
 =head2 Overview of Columns  =head2 Overview of Columns
   
Line 580  The renderer will build an HTML table fo Line 582  The renderer will build an HTML table fo
 it. The table is consists of several columns, and a row for each  it. The table is consists of several columns, and a row for each
 resource (or possibly each part). You tell the renderer how many  resource (or possibly each part). You tell the renderer how many
 columns to create and what to place in each column, optionally using  columns to create and what to place in each column, optionally using
 one or more of the preparent columns, and the renderer will assemble  one or more of the prepared columns, and the renderer will assemble
 the table.  the table.
   
 Any additional generally useful column types should be placed in the  Any additional generally useful column types should be placed in the
Line 598  argument hash passed to the renderer, an Line 600  argument hash passed to the renderer, an
 be inserted into the HTML representation as it.  be inserted into the HTML representation as it.
   
 The pre-packaged column names are refered to by constants in the  The pre-packaged column names are refered to by constants in the
 Apache::lonnavmaps::renderer namespace. The following currently exist:  Apache::lonnavmaps namespace. The following currently exist:
   
 =over 4  =over 4
   
Line 606  Apache::lonnavmaps::renderer namespace. Line 608  Apache::lonnavmaps::renderer namespace.
   
 The general info about the resource: Link, icon for the type, etc. The  The general info about the resource: Link, icon for the type, etc. The
 first column in the standard nav map display. This column also accepts  first column in the standard nav map display. This column also accepts
 the following parameter in the renderer hash:  the following parameters in the renderer hash:
   
 =over 4  =over 4
   
Line 865  sub render_resource { Line 867  sub render_resource {
             $nowOpen = !$nowOpen;              $nowOpen = !$nowOpen;
         }          }
   
    my $folderType = $resource->is_sequence() ? 'folder' : 'page';
   
         if (!$params->{'resource_no_folder_link'}) {          if (!$params->{'resource_no_folder_link'}) {
             $icon = 'navmap.folder.' . ($nowOpen ? 'closed' : 'open') . '.gif';              $icon = "navmap.$folderType." . ($nowOpen ? 'closed' : 'open') . '.gif';
             $icon = "<img src='/adm/lonIcons/$icon' alt='' border='0' />";              $icon = "<img src='/adm/lonIcons/$icon' alt='' border='0' />";
   
             $linkopen = "<a href='" . $params->{'url'} . '?' .               $linkopen = "<a href='" . $params->{'url'} . '?' . 
Line 882  sub render_resource { Line 886  sub render_resource {
                 "&folderManip=1'>";                  "&folderManip=1'>";
         } else {          } else {
             # Don't allow users to manipulate folder              # Don't allow users to manipulate folder
             $icon = 'navmap.folder.' . ($nowOpen ? 'closed' : 'open') .              $icon = "navmap.$folderType." . ($nowOpen ? 'closed' : 'open') .
                 '.nomanip.gif';                  '.nomanip.gif';
             $icon = "<img src='/adm/lonIcons/$icon' alt='' border='0' />";              $icon = "<img src='/adm/lonIcons/$icon' alt='' border='0' />";
   
Line 931  sub render_resource { Line 935  sub render_resource {
     }      }
   
     if (!$params->{'resource_nolink'} && $src !~ /^\/uploaded\// &&      if (!$params->{'resource_nolink'} && $src !~ /^\/uploaded\// &&
  !$resource->is_map()) {   !$resource->is_sequence()) {
         $result .= "  $curMarkerBegin<a href='$link'>$title$partLabel</a>$curMarkerEnd $nonLinkedText</td>";          $result .= "  $curMarkerBegin<a href='$link'>$title$partLabel</a>$curMarkerEnd $nonLinkedText</td>";
     } else {      } else {
         $result .= "  $curMarkerBegin$title$partLabel$curMarkerEnd $nonLinkedText</td>";          $result .= "  $curMarkerBegin$title$partLabel$curMarkerEnd $nonLinkedText</td>";
Line 1017  sub render_long_status { Line 1021  sub render_long_status {
         $params->{'multipart'} && $part eq "0";          $params->{'multipart'} && $part eq "0";
                                   
     my $color;      my $color;
     if ($resource->is_problem() && ($resource->countParts() <= 1 || $part ne '') ) {      if ($resource->is_problem() && ($resource->countParts() <= 1) ) {
         $color = $colormap{$resource->status};          $color = $colormap{$resource->status};
                   
         if (dueInLessThen24Hours($resource, $part) ||          if (dueInLessThen24Hours($resource, $part) ||
Line 1036  sub render_long_status { Line 1040  sub render_long_status {
     if ($resource->is_map() && advancedUser() && $resource->randompick()) {      if ($resource->is_map() && advancedUser() && $resource->randompick()) {
         $result .= '(randomly select ' . $resource->randompick() .')';          $result .= '(randomly select ' . $resource->randompick() .')';
     }      }
   
       $result .= "</td>\n";
           
     return $result;      return $result;
 }  }
Line 1495  sub render { Line 1501  sub render {
         }          }
     } continue {      } continue {
         $curRes = $it->next();          $curRes = $it->next();
   
    if ($r) {
       # If we have the connection, make sure the user is still connected
       my $c = $r->connection;
       if ($c->aborted()) {
    Apache::lonnet::logthis("navmaps aborted");
    # Who cares what we do, nobody will see it anyhow.
    return '';
       }
    }
     }      }
           
     # Print out the part that jumps to #curloc if it exists      # Print out the part that jumps to #curloc if it exists
Line 1550  You must obtain resource objects through Line 1566  You must obtain resource objects through
 =over 4  =over 4
   
 =item * B<new>(navHashFile, parmHashFile, genCourseAndUserOptions,  =item * B<new>(navHashFile, parmHashFile, genCourseAndUserOptions,
   genMailDiscussStatus):    genMailDiscussStatus, getUserData):
   
 Binds a new navmap object to the compiled nav map hash and parm hash  Binds a new navmap object to the compiled nav map hash and parm hash
 given as filenames. genCourseAndUserOptions is a flag saying whether  given as filenames. genCourseAndUserOptions is a flag saying whether
Line 1561  documentation. genMailDiscussStatus caus Line 1577  documentation. genMailDiscussStatus caus
 information about the email and discussion status of  information about the email and discussion status of
 resources. Returns the navmap object if this is successful, or  resources. Returns the navmap object if this is successful, or
 B<undef> if not. You must check for undef; errors will occur when you  B<undef> if not. You must check for undef; errors will occur when you
 try to use the other methods otherwise.  try to use the other methods otherwise. getUserData, if true, will 
   retreive the user's performance data for various problems.
   
 =item * B<getIterator>(first, finish, filter, condition):  =item * B<getIterator>(first, finish, filter, condition):
   
Line 1582  sub new { Line 1599  sub new {
     $self->{PARM_HASH_FILE} = shift;      $self->{PARM_HASH_FILE} = shift;
     $self->{GENERATE_COURSE_USER_OPT} = shift;      $self->{GENERATE_COURSE_USER_OPT} = shift;
     $self->{GENERATE_EMAIL_DISCUSS_STATUS} = shift;      $self->{GENERATE_EMAIL_DISCUSS_STATUS} = shift;
       $self->{GET_USER_DATA} = shift;
   
     # Resource cache stores navmap resources as we reference them. We generate      # Resource cache stores navmap resources as we reference them. We generate
     # them on-demand so we don't pay for creating resources unless we use them.      # them on-demand so we don't pay for creating resources unless we use them.
Line 1719  sub init { Line 1737  sub init {
         $self->{DISCUSSION_TIME} = \%discussiontime;          $self->{DISCUSSION_TIME} = \%discussiontime;
         $self->{EMAIL_STATUS} = \%emailstatus;          $self->{EMAIL_STATUS} = \%emailstatus;
                   
     }          }
   
       if ($self->{GET_USER_DATA}) {
    # Retreive performance data on problems
    my %student_data = Apache::lonnet::currentdump($ENV{'request.course.id'},
          $ENV{'user.domain'},
          $ENV{'user.name'});
    $self->{STUDENT_DATA} = \%student_data;
       }
   
     $self->{PARM_CACHE} = {};      $self->{PARM_CACHE} = {};
     $self->{INITED} = 1;      $self->{INITED} = 1;
Line 2140  corresponds to where you want the iterat Line 2166  corresponds to where you want the iterat
 navmap->finishResource(). filterHash is a hash used as a set  navmap->finishResource(). filterHash is a hash used as a set
 containing strings representing the resource IDs, defaulting to  containing strings representing the resource IDs, defaulting to
 empty. Condition is a 1 or 0 that sets what to do with the filter  empty. Condition is a 1 or 0 that sets what to do with the filter
 hash: If a 0, then only resource that exist IN the filterHash will be  hash: If a 0, then only resources that exist IN the filterHash will be
 recursed on. If it is a 1, only resources NOT in the filterHash will  recursed on. If it is a 1, only resources NOT in the filterHash will
 be recursed on. Defaults to 0. forceTop is a boolean value. If it is  be recursed on. Defaults to 0. forceTop is a boolean value. If it is
 false (default), the iterator will only return the first level of map  false (default), the iterator will only return the first level of map
Line 2212  sub min { Line 2238  sub min {
     if ($a < $b) { return $a; } else { return $b; }      if ($a < $b) { return $a; } else { return $b; }
 }  }
   
 # In the CVS repository, documentation of this algorithm is included   
 # in /doc/lonnavdocs, as a PDF and .tex source. Markers like **1**  
 # will reference the same location in the text as the part of the  
 # algorithm is running through.  
   
 sub new {  sub new {
     # magic invocation to create a class instance      # magic invocation to create a class instance
     my $proto = shift;      my $proto = shift;
Line 2272  sub new { Line 2293  sub new {
     # that isn't just a redirector.      # that isn't just a redirector.
     my $resource; my $resourceCount = 0;      my $resource; my $resourceCount = 0;
   
       # Documentation on this algorithm can be found in the CVS repository at 
       # /docs/lonnavdocs; these "**#**" markers correspond to documentation
       # in that file.
     # **1**      # **1**
   
     foreach my $pass (@iterations) {      foreach my $pass (@iterations) {
Line 2950  sub is_map { my $self=shift; return defi Line 2974  sub is_map { my $self=shift; return defi
 sub is_page {  sub is_page {
     my $self=shift;      my $self=shift;
     my $src = $self->src();      my $src = $self->src();
     return ($src =~ /page$/);      return $self->navHash("is_map_", 1) && 
    $self->navHash("map_type_" . $self->map_pc()) eq 'page';
 }  }
 sub is_problem {  sub is_problem {
     my $self=shift;      my $self=shift;
Line 2960  sub is_problem { Line 2985  sub is_problem {
 sub is_sequence {  sub is_sequence {
     my $self=shift;      my $self=shift;
     my $src = $self->src();      my $src = $self->src();
     return ($src =~ /sequence$/);      return $self->navHash("is_map_", 1) && 
    $self->navHash("map_type_" . $self->map_pc()) eq 'sequence';
 }  }
   
 # Private method: Shells out to the parmval in the nav map, handler parts.  # Private method: Shells out to the parmval in the nav map, handler parts.
Line 3035  sub map_type { Line 3061  sub map_type {
     return $self->navHash("map_type_$pc", 0);      return $self->navHash("map_type_$pc", 0);
 }  }
   
   
   
 #####  #####
 # Property queries  # Property queries
 #####  #####
Line 3074  Get the Client IP/Name Access Control in Line 3098  Get the Client IP/Name Access Control in
   
 Get the answer-reveal date for the problem.  Get the answer-reveal date for the problem.
   
   =item * B<awarded>: 
   
   Gets the awarded value for the problem part. Requires genUserData set to
   true when the navmap object was created.
   
 =item * B<duedate>:  =item * B<duedate>:
   
 Get the due date for the problem.  Get the due date for the problem.
Line 3127  sub answerdate { Line 3156  sub answerdate {
     }      }
     return $self->parmval("answerdate", $part);      return $self->parmval("answerdate", $part);
 }  }
 sub awarded { my $self = shift; return $self->queryRestoreHash('awarded', shift); }  sub awarded { 
       my $self = shift; my $part = shift;
       if (!defined($part)) { $part = '0'; }
       return $self->{NAV_MAP}->{STUDENT_DATA}->{$self->symb()}->{'resource.'.$part.'.awarded'};
   }
 sub duedate {  sub duedate {
     (my $self, my $part) = @_;      (my $self, my $part) = @_;
     return $self->parmval("duedate", $part);      return $self->parmval("duedate", $part);
Line 3168  sub type { Line 3201  sub type {
 }  }
 sub weight {   sub weight { 
     my $self = shift; my $part = shift;      my $self = shift; my $part = shift;
     return $self->parmval("weight", $part);      if (!defined($part)) { $part = '0'; }
       return &Apache::lonnet::EXT('resource.'.$part.'.weight',
    $self->symb(), $ENV{'user.domain'},
    $ENV{'user.name'}, 
    $ENV{'request.course.sec'});
   
 }  }
   
 # Multiple things need this  # Multiple things need this

Removed from v.1.204  
changed lines
  Added in v.1.211


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