Diff for /loncom/interface/loncommon.pm between versions 1.373 and 1.405

version 1.373, 2006/05/17 23:13:47 version 1.405, 2006/06/28 20:15:37
Line 386  sub selectstudent_link { Line 386  sub selectstudent_link {
   
 sub coursebrowser_javascript {  sub coursebrowser_javascript {
     my ($domainfilter)=@_;      my ($domainfilter)=@_;
       my $crs_or_grp_alert = &mt('Please select the type of LON-CAPA entity - Course or Group - for which you wish to add/modify a user role');
    return (<<ENDSTDBRW);     return (<<ENDSTDBRW);
 <script type="text/javascript" language="Javascript" >  <script type="text/javascript" language="Javascript" >
     var stdeditbrowser;      var stdeditbrowser;
     function opencrsbrowser(formname,uname,udom,desc,extra_element,multflag) {      function opencrsbrowser(formname,uname,udom,desc,extra_element,multflag,crstype) {
         var url = '/adm/pickcourse?';          var url = '/adm/pickcourse?';
         var filter;          var filter;
         if (filter != null) {          if (filter != null) {
Line 415  sub coursebrowser_javascript { Line 416  sub coursebrowser_javascript {
         if (multflag !=null && multflag != '') {          if (multflag !=null && multflag != '') {
             url += '&multiple='+multflag;              url += '&multiple='+multflag;
         }          }
           if (crstype == 'Course/Group') {
               if (formname == 'cu') {
                   crstype = document.cu.crstype.options[document.cu.crstype.selectedIndex].value; 
                   if (crstype == "") {
                       alert("$crs_or_grp_alert");
                       return;
                   }
               }
           }
           if (crstype !=null && crstype != '') {
               url += '&type='+crstype;
           }
         var title = 'Course_Browser';          var title = 'Course_Browser';
         var options = 'scrollbars=1,resizable=1,menubar=0';          var options = 'scrollbars=1,resizable=1,menubar=0';
         options += ',width=700,height=600';          options += ',width=700,height=600';
Line 426  ENDSTDBRW Line 439  ENDSTDBRW
 }  }
   
 sub selectcourse_link {  sub selectcourse_link {
    my ($form,$unameele,$udomele,$desc,$extra_element,$multflag)=@_;     my ($form,$unameele,$udomele,$desc,$extra_element,$multflag,$selecttype)=@_;
     return "<a href='".'javascript:opencrsbrowser("'.$form.'","'.$unameele.      return "<a href='".'javascript:opencrsbrowser("'.$form.'","'.$unameele.
         '","'.$udomele.'","'.$desc.'","'.$extra_element.'","'.$multflag.'");'."'>".&mt('Select Course')."</a>";          '","'.$udomele.'","'.$desc.'","'.$extra_element.'","'.$multflag.'","'.$selecttype.'");'."'>".&mt('Select [_1]',$selecttype)."</a>";
 }  }
   
 sub check_uncheck_jscript {  sub check_uncheck_jscript {
Line 694  sub helpLatexCheatsheet { Line 707  sub helpLatexCheatsheet {
 }  }
   
 sub help_open_menu {  sub help_open_menu {
     my ($color,$topic,$component_help,$function,$faq,$bug,$stayOnPage,$width,$height,$text) = @_;      my ($topic,$component_help,$faq,$bug,$stayOnPage,$width,$height,$text) = @_;
     $text = "" if (not defined $text);      $text = "" if (not defined $text);
     $stayOnPage = 0 if (not defined $stayOnPage);      $stayOnPage = 0 if (not defined $stayOnPage);
     if ($env{'browser.interface'} eq 'textual' ||      if ($env{'browser.interface'} eq 'textual' ||
Line 708  sub help_open_menu { Line 721  sub help_open_menu {
     my $origurl = $ENV{'REQUEST_URI'};      my $origurl = $ENV{'REQUEST_URI'};
     $origurl=~s|^/~|/priv/|;      $origurl=~s|^/~|/priv/|;
     my $timestamp = time;      my $timestamp = time;
     foreach my $datum (\$color,\$function,\$topic,\$component_help,\$faq,      foreach my $datum (\$topic,\$component_help,\$faq,\$bug,\$origurl) {
        \$bug,\$origurl) {  
         $$datum = &escape($$datum);          $$datum = &escape($$datum);
     }      }
     if (!$stayOnPage) {      if (!$stayOnPage) {
Line 717  sub help_open_menu { Line 729  sub help_open_menu {
     } else {      } else {
         $link = "javascript:helpMenu('display')";          $link = "javascript:helpMenu('display')";
     }      }
     my $banner_link = "/adm/helpmenu?page=banner&color=$color&function=$function&topic=$topic&component_help=$component_help&faq=$faq&bug=$bug&origurl=$origurl&stamp=$timestamp&stayonpage=$stayOnPage";      my $banner_link = "/adm/helpmenu?page=banner&amp;topic=$topic&amp;component_help=$component_help&amp;faq=$faq&amp;bug=$bug&amp;origurl=$origurl&amp;stamp=$timestamp&amp;stayonpage=$stayOnPage";
     my $details_link = "/adm/helpmenu?page=body&color=$color&function=$function&topic=$topic&component_help=$component_help&faq=$faq&bug=$bug&origurl=$origurl&stamp=$timestamp";      my $details_link = "/adm/helpmenu?page=body&amp;topic=$topic&amp;component_help=$component_help&amp;faq=$faq&amp;bug=$bug&amp;origurl=$origurl&amp;stamp=$timestamp";
     my $template;      my $template;
     if ($text ne "") {      if ($text ne "") {
  $template .=    $template .= 
Line 803  sub help_open_bug { Line 815  sub help_open_bug {
     $topic=~s/\W+/\+/g;      $topic=~s/\W+/\+/g;
     my $link='';      my $link='';
     my $template='';      my $template='';
     my $url=$Apache::lonnet::perlvar{'BugzillaHost'}.'enter_bug.cgi?product=LON-CAPA&bug_file_loc='.      my $url=$Apache::lonnet::perlvar{'BugzillaHost'}.'enter_bug.cgi?product=LON-CAPA&amp;bug_file_loc='.
  &escape($ENV{'REQUEST_URI'}).'&component='.$topic;   &escape($ENV{'REQUEST_URI'}).'&amp;component='.$topic;
     if (!$stayOnPage)      if (!$stayOnPage)
     {      {
  $link = "javascript:void(open('$url', 'Bugzilla', 'menubar=0,toolbar=1,scrollbars=1,width=$width,height=$height,resizable=yes'))";   $link = "javascript:void(open('$url', 'Bugzilla', 'menubar=0,toolbar=1,scrollbars=1,width=$width,height=$height,resizable=yes'))";
Line 2712  Returns: value of designparamter $which Line 2724  Returns: value of designparamter $which
   
 =cut  =cut
   
   
 ##############################################  ##############################################
 sub designparm {  sub designparm {
     my ($which,$domain)=@_;      my ($which,$domain)=@_;
Line 2726  sub designparm { Line 2739  sub designparm {
     return '#CCCCCC';      return '#CCCCCC';
  }   }
     }      }
     if ($env{'environment.color.'.$which}) {      if (exists($env{'environment.color.'.$which})) {
  return $env{'environment.color.'.$which};   return $env{'environment.color.'.$which};
     }      }
     $domain=&determinedomain($domain);      $domain=&determinedomain($domain);
     if ($designhash{$domain.'.'.$which}) {      if (exists($designhash{$domain.'.'.$which})) {
  return $designhash{$domain.'.'.$which};   return $designhash{$domain.'.'.$which};
     } else {      } else {
         return $designhash{'default.'.$which};          return $designhash{'default.'.$which};
Line 2783  Inputs: Line 2796  Inputs:
 =item * $no_inline_link, if true and in remote mode, don't show the   =item * $no_inline_link, if true and in remote mode, don't show the 
          'Switch To Inline Menu' link           'Switch To Inline Menu' link
   
   
 =back  =back
   
 Returns: A uniform header for LON-CAPA web pages.    Returns: A uniform header for LON-CAPA web pages.  
Line 2813  sub bodytag { Line 2825  sub bodytag {
     @$addentries{keys(%design)} = @design{keys(%design)};      @$addentries{keys(%design)} = @design{keys(%design)};
   
  # role and realm   # role and realm
     my ($role,$realm) =      my ($role,$realm) = split(/\./,$env{'request.role'},2);
  &Apache::lonnet::plaintext((split(/\./,$env{'request.role'}))[0]);      if ($role  eq 'ca') {
           my ($rdom,$rname) = ($realm =~ m-^/(\w+)/(\w+)$-);
           $realm = &plainname($rname,$rdom).':'.$rdom;
       } 
 # realm  # realm
     if ($env{'request.course.id'}) {      if ($env{'request.course.id'}) {
           if ($env{'request.role'} !~ /^cr/) {
               $role = &Apache::lonnet::plaintext($role,&course_type());
           }
  $realm = $env{'course.'.$env{'request.course.id'}.'.description'};   $realm = $env{'course.'.$env{'request.course.id'}.'.description'};
       } else {
           $role = &Apache::lonnet::plaintext($role);
     }      }
     if (!$realm) { $realm='&nbsp;'; }      if (!$realm) { $realm='&nbsp;'; }
 # Set messages  # Set messages
Line 2878  ENDROLE Line 2898  ENDROLE
                                  '.domain'}.'/'})) {                                   '.domain'}.'/'})) {
         my $cid = $env{'request.course.id'};          my $cid = $env{'request.course.id'};
         $dc_info.= $cid.' '.$env{'course.'.$cid.'.internal.coursecode'};          $dc_info.= $cid.' '.$env{'course.'.$cid.'.internal.coursecode'};
           $dc_info =~ s/\s+$//;
         $dc_info = '('.$dc_info.')';          $dc_info = '('.$dc_info.')';
     }      }
   
Line 2904  ENDROLE Line 2925  ENDROLE
  $lastitem = $thisdisfn;   $lastitem = $thisdisfn;
     }      }
     $titleinfo =       $titleinfo = 
  &Apache::loncommon::help_open_menu('','','','',3,'Authoring').   &Apache::loncommon::help_open_menu('','',3,'Authoring').
  '<b>Construction Space</b>:&nbsp;'.    '<b>Construction Space</b>:&nbsp;'. 
  '<form name="dirs" method="post" action="'.$formaction   '<form name="dirs" method="post" action="'.$formaction
  .'" target="_top"><tt><b>'   .'" target="_top"><tt><b>'
Line 3076  sub standard_css { Line 3097  sub standard_css {
     my $tabbg  = &designparm($function.'.tabbg', $domain);      my $tabbg  = &designparm($function.'.tabbg', $domain);
     my $font   = &designparm($function.'.font',  $domain);      my $font   = &designparm($function.'.font',  $domain);
     my $sidebg = &designparm($function.'.sidebg',$domain);      my $sidebg = &designparm($function.'.sidebg',$domain);
     my $pgbg   = $bgcolor ||      my $pgbg_or_bgcolor =
            $bgcolor ||
          &designparm($function.'.pgbg',  $domain);           &designparm($function.'.pgbg',  $domain);
       my $pgbg   = &designparm($function.'.pgbg',  $domain);
     my $alink  = &designparm($function.'.alink', $domain);      my $alink  = &designparm($function.'.alink', $domain);
     my $vlink  = &designparm($function.'.vlink', $domain);      my $vlink  = &designparm($function.'.vlink', $domain);
     my $link   = &designparm($function.'.link',  $domain);      my $link   = &designparm($function.'.link',  $domain);
   
     my $sans                 = 'Arial,Helvetica,sans-serif';      my $sans                 = 'Arial,Helvetica,sans-serif';
       my $mono                 = 'monospace';
     my $data_table_head      = $tabbg;      my $data_table_head      = $tabbg;
     my $data_table_light     = '#EEEEEE';      my $data_table_light     = '#EEEEEE';
     my $data_table_dark      = '#DDD';      my $data_table_dark      = '#DDD';
Line 3095  sub standard_css { Line 3119  sub standard_css {
     my $mail_replied_hover   = '#888855';      my $mail_replied_hover   = '#888855';
     my $mail_other           = '#99BBBB';      my $mail_other           = '#99BBBB';
     my $mail_other_hover     = '#669999';      my $mail_other_hover     = '#669999';
       my $table_header         = '#DDDDDD';
   
       my $border = ($env{'browser.type'} eq 'explorer') ? '0px 2px 0px 2px'
                                                 : '0px 3px 0px 4px';
     return <<END;      return <<END;
 h1, h2, h3, th { font-family: $sans }  h1, h2, h3, th { font-family: $sans }
 a:focus { color: red; background: yellow }   a:focus { color: red; background: yellow } 
Line 3103  table.thinborder { border-collapse: coll Line 3130  table.thinborder { border-collapse: coll
 table.thinborder tr th, table.thinborder tr td { border-style: solid; border-width: 1px}  table.thinborder tr th, table.thinborder tr td { border-style: solid; border-width: 1px}
 form, .inline { display: inline; }  form, .inline { display: inline; }
 .center { text-align: center; }  .center { text-align: center; }
 .filename {font-family: monospace;}  .LC_filename {font-family: $mono;}
 .LC_error {  .LC_error {
   color: red;    color: red;
   font-size: larger;    font-size: larger;
 }  }
   .LC_warning {
     color: red;
   }
 .LC_success {  .LC_success {
   color: green;    color: green;
 }  }
   
 table#LC_top_nav, table#LC_menubuttons, table#LC_nav_location, table#LC_breadcrumbs {  table#LC_top_nav, table#LC_menubuttons {
   width: 100%;    width: 100%;
   background: $pgbg;    background: $pgbg;
   border: 0px;    border: 2px;
   border-spacing: 2px 1px;  
   padding: 0px;  
   margin: 0px;  
   border-collapse: separate;  
 }  
 table#LC_title_bar {  
   width: 100%;  
   border: 0;  
   border-spacing: 0px 1px;  
   padding: 0px 2px 0px 2px;  
   background: $pgbg;  
   font-family: $sans;  
   border-collapse: separate;    border-collapse: separate;
     padding: 0px;
 }  }
   
   table#LC_title_bar, table#LC_breadcrumbs, table#LC_nav_location,
 table#LC_title_bar.LC_with_remote {  table#LC_title_bar.LC_with_remote {
   width: 100%;    width: 100%;
   border: 0;    border-color: $pgbg;
   border-spacing: 0;    border-style: solid;
     border-width: $border;
   
   background: $pgbg;    background: $pgbg;
   font-family: $sans;    font-family: $sans;
   border-collapse: collapse;    border-collapse: collapse;
     padding: 0px;
 }  }
   
 table#LC_title_bar td {  table#LC_title_bar td {
   padding: 3px;    padding: 3px;
   background: $tabbg;    background: $tabbg;
Line 3174  table#LC_menubuttons img, table#LC_menub Line 3199  table#LC_menubuttons img, table#LC_menub
 }  }
 table#LC_top_nav td {  table#LC_top_nav td {
   background: $tabbg;    background: $tabbg;
     border: 0px;
 }  }
 table#LC_top_nav td a, div#LC_top_nav a {  table#LC_top_nav td a, div#LC_top_nav a {
   color: $font;    color: $font;
Line 3196  table#LC_breadcrumbs td.LC_breadcrumb_co Line 3222  table#LC_breadcrumbs td.LC_breadcrumb_co
   font-size: larger;    font-size: larger;
   text-align: right;    text-align: right;
 }  }
   td.LC_table_cell_checkbox {
     text-align: center;
   }
   
 .LC_menubuttons_inline_text {  .LC_menubuttons_inline_text {
   color: $font;    color: $font;
   font-family: $sans;    font-family: $sans;
Line 3220  td.LC_menubuttons_img { Line 3250  td.LC_menubuttons_img {
   
 table.LC_data_table, table.LC_mail_list {  table.LC_data_table, table.LC_mail_list {
   border: 1px solid #000000;    border: 1px solid #000000;
   border-collapse: seperate;    border-collapse: separate;
 }  }
 table.LC_data_table tr th, table.LC_calendar tr th, table.LC_mail_list tr th {  table.LC_data_table tr th, table.LC_calendar tr th, table.LC_mail_list tr th {
   font-weight: bold;    font-weight: bold;
Line 3278  table.LC_mail_list tr.LC_mail_other { Line 3308  table.LC_mail_list tr.LC_mail_other {
 table.LC_mail_list tr.LC_mail_other:hover {  table.LC_mail_list tr.LC_mail_other:hover {
   background-color: $mail_other_hover;    background-color: $mail_other_hover;
 }  }
   
   table#LC_portfolio_actions {
     width: auto;
     background: $pgbg;
     border: 0px;
     border-spacing: 2px 2px;
     padding: 0px;
     margin: 0px;
     border-collapse: separate;
   }
   table#LC_portfolio_actions td.LC_label {
     background: $tabbg;
     text-align: right;
   }
   table#LC_portfolio_actions td.LC_value {
     background: $tabbg;
   }
   
   table#LC_cstr_controls {
     width: 100%;
     border-collapse: collapse;
   }
   table#LC_cstr_controls tr td {
     border: 4px solid $pgbg;
     padding: 4px;
     text-align: center;
     background: $tabbg;
   }
   table#LC_cstr_controls tr th {
     border: 4px solid $pgbg;
     background: $table_header;
     text-align: center;
     font-family: $sans;
     font-size: smaller;
   }
   
   table#LC_browser {
    
   }
   table#LC_browser tr th {
     background: $table_header;
   }
   table#LC_browser tr td {
     padding: 2px;
   }
   table#LC_browser tr.LC_browser_file,
   table#LC_browser tr.LC_browser_file_published {
     background: #CCFF88;
   }
   table#LC_browser tr.LC_browser_file_locked,
   table#LC_browser tr.LC_browser_file_unpublished {
     background: #FFAA99;
   }
   table#LC_browser tr.LC_browser_file_obsolete {
     background: #AAAAAA;
   }
   table#LC_browser tr.LC_browser_file_modified {
     background: #FFFF77;
   }
   table#LC_browser tr.LC_browser_folder {
     background: #CCCCFF;
   }
   span.LC_current_location {
     font-size: x-large;
     background: $pgbg;
   }
   
   span.LC_parm_menu_item {
     font-size: larger;
     font-family: $sans;
   }
   span.LC_parm_scope_all {
     color: red;
   }
   span.LC_parm_scope_folder {
     color: green;
   }
   span.LC_parm_scope_resource {
     color: orange;
   }
   span.LC_parm_part {
     color: blue;
   }
   span.LC_parm_folder, span.LC_parm_symb {
     font-size: x-small;
     font-family: $mono;
     color: #AAAAAA;
   }
   
   td.LC_parm_overview_level_menu, td.LC_parm_overview_map_menu,
   td.LC_parm_overview_parm_selectors, td.LC_parm_overview_parm_restrictions {
     border: 1px solid black;
     border-collapse: collapse;
   }
   table.LC_parm_overview_restrictions td {
     border-width: 1px 4px 1px 4px;
     border-style: solid;
     border-color: $pgbg;
     text-align: center;
   }
   table.LC_parm_overview_restrictions th {
     background: $tabbg;
     border-width: 1px 4px 1px 4px;
     border-style: solid;
     border-color: $pgbg;
   }
   table#LC_helpmenu {
     border: 0px;
     height: 55px;
     border-spacing: 0px;
   }
   
   table#LC_helpmenu fieldset legend {
     font-size: larger;
     font-weight: bold;
   }
   table#LC_helpmenu_links {
     width: 100%;
     border: 1px solid black;
     background: $pgbg;
     padding: 0px;
     border-spacing: 1px;
   }
   table#LC_helpmenu_links tr td {
     padding: 1px;
     background: $tabbg;
     text-align: center;
     font-weight: bold;
   }
   
   table#LC_helpmenu_links a:link, table#LC_helpmenu_links a:visited,
   table#LC_helpmenu_links a:active {
     text-decoration: none;
     color: $font;
   }
   table#LC_helpmenu_links a:hover {
     text-decoration: underline;
     color: $vlink;
   }
   
 END  END
 }  }
   
Line 3314  sub headtag { Line 3484  sub headtag {
     my $function = $args->{'function'} || &get_users_function();      my $function = $args->{'function'} || &get_users_function();
     my $domain   = $args->{'domain'}   || &determinedomain();      my $domain   = $args->{'domain'}   || &determinedomain();
     my $bgcolor  = $args->{'bgcolor'}  || &designparm($function.'.pgbg',$domain);      my $bgcolor  = $args->{'bgcolor'}  || &designparm($function.'.pgbg',$domain);
     my $url = join(':',$env{'user.name'},$env{'user.domain'},      my $url = join(':',$env{'user.name'},$env{'user.domain'},time(),
    $env{'environment.color.timestamp'},     #$env{'environment.color.timestamp'},
    $function,$domain,$bgcolor);     $function,$domain,$bgcolor);
   
     $url = '/adm/css/'.&escape($url).'.css';      $url = '/adm/css/'.&escape($url).'.css';
Line 3435  Returns a uniform complete <head>..</hea Line 3605  Returns a uniform complete <head>..</hea
   
 Inputs: $title - optional title for the page  Inputs: $title - optional title for the page
         $head_extra - optional extra HTML to put inside the <head>          $head_extra - optional extra HTML to put inside the <head>
   
 =back  =back
   
 =cut  =cut
Line 3548  Inputs:         $args - additional optio Line 3719  Inputs:         $args - additional optio
                                  a html attribute                                   a html attribute
                  frameset     -> if true will start with a <frameset>                   frameset     -> if true will start with a <frameset>
                                  rather than <body>                                   rather than <body>
 =back  
   
 =cut  =cut
   
Line 3643  sub simple_error_page { Line 3813  sub simple_error_page {
     my $row_count;      my $row_count;
     sub start_data_table {      sub start_data_table {
  undef($row_count);   undef($row_count);
  return '<table class="LC_data_table">';   return '<table class="LC_data_table">'."\n";
     }      }
   
     sub end_data_table {      sub end_data_table {
  undef($row_count);   undef($row_count);
  return '</table>';   return '</table>'."\n";;
     }      }
   
     sub start_data_table_row {      sub start_data_table_row {
  $row_count++;   $row_count++;
  return  '<tr '.(($row_count % 2)?'':'class="LC_even_row"').'>';   return  '<tr '.(($row_count % 2)?'':'class="LC_even_row"').'>'."\n";;
     }      }
   
     sub end_data_table_row {      sub end_data_table_row {
  return '</tr>';   return '</tr>'."\n";;
     }      }
   
     sub start_data_table_header_row {      sub start_data_table_header_row {
  return  '<tr class="LC_header_row">';   return  '<tr class="LC_header_row">'."\n";;
     }      }
   
     sub end_data_table_header_row {      sub end_data_table_header_row {
  return '</tr>';   return '</tr>'."\n";;
     }      }
 }  }
   
Line 3673  sub simple_error_page { Line 3843  sub simple_error_page {
   
 =pod  =pod
   
 =over 4  =item * &get_users_function()
   
 =item get_users_function  
   
 Used by &bodytag to determine the current users primary role.  Used by &bodytag to determine the current users primary role.
 Returns either 'student','coordinator','admin', or 'author'.  Returns either 'student','coordinator','admin', or 'author'.
Line 3702  sub get_users_function { Line 3870  sub get_users_function {
   
 =pod  =pod
   
 =item check_user_status  =item * &check_user_status
   
 Determines current status of supplied role for a  Determines current status of supplied role for a
 specific user. Roles can be active, previous or future.  specific user. Roles can be active, previous or future.
   
 Inputs:   Inputs: 
 user's domain, user's username, course's domain,  user's domain, user's username, course's domain,
 course's number, optional section/group.  course's number, optional section ID.
   
 Outputs:  Outputs:
 role status: active, previous or future.   role status: active, previous or future. 
Line 3756  sub check_user_status { Line 3924  sub check_user_status {
   
 =pod  =pod
   
 =item get_sections  =item * &get_sections()
   
 Determines all the sections for a course including  Determines all the sections for a course including
 sections with students and sections containing other roles.  sections with students and sections containing other roles.
 Incoming parameters: domain, course number, reference to   Incoming parameters: domain, course number, 
 section hash (keys to be section/group IDs), reference to   reference to array containing roles for which sections should 
 array containing roles for which sections should be gathered  be gathered (optional). If the third argument is undefined,
 (optional). If the fourth argument is undefined, sections  sections are gathered for any role.
 are gathered for any role.  
     
 Returns number of sections.  Returns section hash (keys are section IDs, values are
   number of users in each section), subject to the
   optional roles filter.
   
 =cut  =cut
   
Line 3814  sub get_sections { Line 3983  sub get_sections {
 }  }
   
 ###############################################  ###############################################
                                                                                     
 =pod  
                                                                                     
 =item coursegroups  
   
 Retrieve information about groups in a course,  
   
 Input:  
 1. Reference to hash to populate with group information.   
 2. Optional course domain  
 3. Optional course number  
 4. Optional group name  
   
 Course domain and number will be taken from user's  
 environment if not supplied. Optional group name will'  
 be passed to lonnet::get_coursegroups() as a regexp to  
 use in the call to the dump function.  
   
 Output  
 Returns number of groups in the course (subject to the  
 optional group name filter).  
   
 Side effects:  
 Populates the referenced curr_groups hash, with key,  
 value pairs. Keys are group names, corresponding values  
 are scalars containing group information in XML. This  
 can be sent to &get_group_settings() to be parsed.       
   
 =cut   
   
 ###############################################  
   
 sub coursegroups {  
     my ($cdom,$cnum,$group) = @_;  
     if (!defined($cdom) || !defined($cnum)) {  
         my $cid =  $env{'request.course.id'};  
   
  return if (!defined($cid));  
   
         $cdom = $env{'course.'.$cid.'.domain'};  
         $cnum = $env{'course.'.$cid.'.num'};  
     }  
     my %curr_groups = &Apache::lonnet::get_coursegroups($cdom,$cnum,$group);  
     my ($tmp) = keys(%curr_groups);  
     if ($tmp=~/^(con_lost|no_such_host|error: [^2] )/) {  
  undef(%curr_groups);  
  &logthis('Error retrieving groups: '.$tmp.' in '.$cnum.':'.$cdom);  
     } elsif ($tmp=~/^error: 2 /) {  
  undef(%curr_groups);  
     }  
     return %curr_groups;  
 }  
   
 ###############################################  
   
 =pod  =pod
   
 =item get_group_settings  =item * &get_course_users()
   
 Uses TokeParser to extract group information from the  
 XML used to describe course groups.  
   
 Input:  
 Scalar containing XML  - as retrieved from &coursegroups().  
   
 Output:  
 Hash containing group information as key=values for (a), and  
 hash of hashes for (b)  
   
 Keys (in two categories):  
 (a) groupname, creator, creation, modified, startdate,enddate.  
 Corresponding values are name of the group, creator of the group  
 (username:domain), UNIX time for date group was created, and  
 settings were last modified, and default start and end access  
 times for group members.  
   
 (b) functions returned in hash of hashes.  
 Outer hash key is functions.  
 Inner hash keys are chat,discussion,email,files,homepage,roster.  
 Corresponding values are either on or off, depending on  
 whether this type of functionality is available for the group.  
   
 =cut  
                                                                                    
 ###############################################  
   
 sub get_group_settings {  
     my ($groupinfo)=@_;  
     my $parser=HTML::TokeParser->new(\$groupinfo);  
     my $token;  
     my $tool = '';  
     my $role = '';  
     my %content=();  
     while ($token=$parser->get_token) {  
         if ($token->[0] eq 'S')  {  
             my $entry=$token->[1];  
             if ($entry eq 'functions' || $entry eq 'autosec') {  
                 %{$content{$entry}} = ();  
                 $tool = $entry;  
             } elsif ($entry eq 'role') {  
                 if ($tool eq 'autosec') {  
                     $role = $token->[2]{id};  
                     @{$content{$tool}{$role}} = ();  
                 }  
             } else {  
                 my $value=$parser->get_text('/'.$entry);  
                 if ($entry eq 'name') {  
                     if ($tool eq 'functions') {  
                         my $function = $token->[2]{id};  
                         $content{$tool}{$function} = $value;  
                     }  
                 } elsif ($entry eq 'groupname') {  
                     $content{$entry}=&unescape($value);  
                 } elsif (($entry eq 'roles') || ($entry eq 'types') ||  
                          ($entry eq 'sectionpick') || ($entry eq 'defpriv')) {  
                     push(@{$content{$entry}},$value);  
                 } elsif ($entry eq 'section') {  
                     if ($tool eq 'autosec'  && $role ne '') {  
                         push(@{$content{$tool}{$role}},$value);  
                     }  
                 } else {  
                     $content{$entry}=$value;  
                 }  
             }  
         } elsif ($token->[0] eq 'E') {  
             if ($token->[1] eq 'functions' || $token->[1] eq 'autosec') {  
                 $tool = '';  
             } elsif ($token->[1] eq 'role') {  
                 $role = '';  
             }  
   
         }  
     }  
     return %content;  
 }  
   
 sub check_group_access {  
     my ($group) = @_;  
     my $access = 1;  
     my $now = time;  
     my ($start,$end) = split(/\./,$env{'user.role.gr/'.$env{'request.course,id'}.'/'.$group});  
     if (($end!=0) && ($end<$now)) { $access = 0; }  
     if (($start!=0) && ($start>$now)) { $access=0; }  
     return $access;  
 }  
   
 ###############################################  
   
 =pod  
                                                                                   
 =item get_course_users  
                                                                                   
 Retrieves usernames:domains for users in the specified course  Retrieves usernames:domains for users in the specified course
 with specific role(s), and access status.   with specific role(s), and access status. 
   
Line 3988  Entries for end, start, section and stat Line 4010  Entries for end, start, section and stat
 of the possibility of multiple values for non-student roles.  of the possibility of multiple values for non-student roles.
   
 =cut  =cut
                                                                                   
 ###############################################  ###############################################
                                                                                   
 sub get_course_users {  sub get_course_users {
     my ($cdom,$cnum,$types,$roles,$sections,$users,$userdata) = @_;      my ($cdom,$cnum,$types,$roles,$sections,$users,$userdata) = @_;
     my %idx = ();      my %idx = ();
Line 4093  sub get_user_info { Line 4115  sub get_user_info {
     return;      return;
 }  }
   
   sub get_secgrprole_info {
       my ($cdom,$cnum,$needroles,$type)  = @_;
       my %sections_count = &get_sections($cdom,$cnum);
       my @sections =  (sort {$a <=> $b} keys(%sections_count));
       my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum);
       my @groups = sort(keys(%curr_groups));
       my $allroles = [];
       my $rolehash;
       my $accesshash = {
                        active => 'Currently has access',
                        future => 'Will have future access',
                        previous => 'Previously had access',
                     };
       if ($needroles) {
           $rolehash = {'all' => 'all'};
           my %user_roles = &Apache::lonnet::dump('nohist_userroles',$cdom,$cnum);
    if (&Apache::lonnet::error(%user_roles)) {
       undef(%user_roles);
    }
           foreach my $item (keys(%user_roles)) {
               my ($role)=split(/\:/,$item,2);
               if ($role eq 'cr') { next; }
               if ($role =~ /^cr/) {
                   $$rolehash{$role} = (split('/',$role))[3];
               } else {
                   $$rolehash{$role} = &Apache::lonnet::plaintext($role,$type);
               }
           }
           foreach my $key (sort(keys(%{$rolehash}))) {
               push(@{$allroles},$key);
           }
           push (@{$allroles},'st');
           $$rolehash{'st'} = &Apache::lonnet::plaintext('st',$type);
       }
       return (\@sections,\@groups,$allroles,$rolehash,$accesshash);
   }
   
 =pod  =pod
   
 =item * get_unprocessed_cgi($query,$possible_names)  =item * get_unprocessed_cgi($query,$possible_names)
Line 5108  sub restore_course_settings { Line 5167  sub restore_course_settings {
 ############################################################  ############################################################
 ############################################################  ############################################################
   
 sub propath {  sub course_type {
     my ($udom,$uname)=@_;      my ($cid) = @_;
     $udom=~s/\W//g;      if (!defined($cid)) {
     $uname=~s/\W//g;          $cid = $env{'request.course.id'};
     my $subdir=$uname.'__';      }
     $subdir =~ s/(.)(.)(.).*/$1\/$2\/$3/;      if (defined($env{'course.'.$cid.'.type'})) {
     my $proname="$Apache::lonnet::perlvar{'lonUsersDir'}/$udom/$subdir/$uname";          return $env{'course.'.$cid.'.type'};
     return $proname;      } else {
 }           return 'Course';
       }
   }
   
 sub icon {  sub icon {
     my ($file)=@_;      my ($file)=@_;

Removed from v.1.373  
changed lines
  Added in v.1.405


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