Diff for /loncom/interface/loncommon.pm between versions 1.533 and 1.556

version 1.533, 2007/05/09 23:53:15 version 1.556, 2007/07/30 00:31:28
Line 240  Inputs: formname, elementname Line 240  Inputs: formname, elementname
   
 formname and elementname specify the name of the html form and the name  formname and elementname specify the name of the html form and the name
 of the element the selection from the search results will be placed in.  of the element the selection from the search results will be placed in.
 =back  
 =cut  =cut
   
 sub browser_and_searcher_javascript {  sub browser_and_searcher_javascript {
Line 378  sub coursebrowser_javascript { Line 378  sub coursebrowser_javascript {
     my ($domainfilter,$sec_element,$formname)=@_;      my ($domainfilter,$sec_element,$formname)=@_;
     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');      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');
    my $output = '     my $output = '
 <script type="text/javascript" language="Javascript" >  <script type="text/javascript">
     var stdeditbrowser;'."\n";      var stdeditbrowser;'."\n";
    $output .= <<"ENDSTDBRW";     $output .= <<"ENDSTDBRW";
     function opencrsbrowser(formname,uname,udom,desc,extra_element,multflag,crstype) {      function opencrsbrowser(formname,uname,udom,desc,extra_element,multflag,crstype) {
Line 524  function uncheckAll(field) { Line 524  function uncheckAll(field) {
     if (field.length > 0) {      if (field.length > 0) {
         for (i = 0; i < field.length; i++) {          for (i = 0; i < field.length; i++) {
             field[i].checked = false ;              field[i].checked = false ;
         }     } else {          }
       } else {
         field.checked = false ;          field.checked = false ;
     }      }
 }  }
Line 708  sub help_open_topic { Line 709  sub help_open_topic {
     my ($topic, $text, $stayOnPage, $width, $height) = @_;      my ($topic, $text, $stayOnPage, $width, $height) = @_;
     $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') {
  $env{'environment.remote'} eq 'off' ) {  
  $stayOnPage=1;   $stayOnPage=1;
     }      }
     $width = 350 if (not defined $width);      $width = 350 if (not defined $width);
Line 801  ENDOUTPUT Line 801  ENDOUTPUT
 # now just updates the help link and generates a blue icon  # now just updates the help link and generates a blue icon
 sub help_open_menu {  sub help_open_menu {
     my ($topic,$component_help,$faq,$bug,$stayOnPage,$width,$height,$text)       my ($topic,$component_help,$faq,$bug,$stayOnPage,$width,$height,$text) 
  = @_;   = @_;    
       
     $stayOnPage = 0 if (not defined $stayOnPage);      $stayOnPage = 0 if (not defined $stayOnPage);
     if ($env{'browser.interface'} eq 'textual' ||      # formerly only used pop-up help (stayOnPage = 0)
  $env{'environment.remote'} eq 'off' ) {      # if environment.remote is on (using remote control UI)
  $stayOnPage=1;      # if ($env{'browser.interface'} eq 'textual' ||
       # $env{'environment.remote'} eq 'off' ) {
       #   $stayOnPage=1;
       #}
       # Now making pop-up help the default even with remote control
       if ($env{'browser.interface'} eq 'textual') {
           $stayOnPage=1;
     }      }
     my $output;      my $output;
     if ($component_help) {      if ($component_help) {
Line 1078  sub changable_area { Line 1083  sub changable_area {
 =pod  =pod
   
 =back  =back
    
 =head1 Excel and CSV file utility routines  =head1 Excel and CSV file utility routines
   
 =over 4  =over 4
Line 1212  sub create_workbook { Line 1217  sub create_workbook {
   
 =item * create_text_file  =item * create_text_file
   
 Create a file to write to and eventually make available to the usre.  Create a file to write to and eventually make available to the user.
 If file creation fails, outputs an error message on the request object and   If file creation fails, outputs an error message on the request object and 
 return undefs.  return undefs.
   
Line 1262  sub domain_select { Line 1267  sub domain_select {
     } &Apache::lonnet::all_domains();      } &Apache::lonnet::all_domains();
     if ($multiple) {      if ($multiple) {
  $domains{''}=&mt('Any domain');   $domains{''}=&mt('Any domain');
    $domains{'select_form_order'} = [sort {lc($a) cmp lc($b) } (keys(%domains))];
  return &multiple_select_form($name,$value,4,\%domains);   return &multiple_select_form($name,$value,4,\%domains);
     } else {      } else {
    $domains{'select_form_order'} = [sort {lc($a) cmp lc($b) } (keys(%domains))];
  return &select_form($name,$value,%domains);   return &select_form($name,$value,%domains);
     }      }
 }  }
Line 1429  selected"); Line 1436  selected");
 #-------------------------------------------  #-------------------------------------------
 sub select_dom_form {  sub select_dom_form {
     my ($defdom,$name,$includeempty) = @_;      my ($defdom,$name,$includeempty) = @_;
     my @domains = sort(&Apache::lonnet::all_domains());      my @domains = sort {lc($a) cmp lc($b)} (&Apache::lonnet::all_domains());
     if ($includeempty) { @domains=('',@domains); }      if ($includeempty) { @domains=('',@domains); }
     my $selectdomain = "<select name=\"$name\" size=\"1\">\n";      my $selectdomain = "<select name=\"$name\" size=\"1\">\n";
     foreach my $dom (@domains) {      foreach my $dom (@domains) {
Line 1467  sub home_server_option_list { Line 1474  sub home_server_option_list {
   
 =pod  =pod
   
   =back 
   
 =cut  =cut
   
 ###############################################################  ###############################################################
Line 2052  if $first is set to 'lastname' then it r Line 2061  if $first is set to 'lastname' then it r
 ###############################################################  ###############################################################
 sub plainname {  sub plainname {
     my ($uname,$udom,$first)=@_;      my ($uname,$udom,$first)=@_;
       return if (!defined($uname) || !defined($udom));
     my %names=&getnames($uname,$udom);      my %names=&getnames($uname,$udom);
     my $name=&Apache::lonnet::format_name($names{'firstname'},      my $name=&Apache::lonnet::format_name($names{'firstname'},
   $names{'middlename'},    $names{'middlename'},
Line 2083  if the user does not Line 2093  if the user does not
   
 sub nickname {  sub nickname {
     my ($uname,$udom)=@_;      my ($uname,$udom)=@_;
       return if (!defined($uname) || !defined($udom));
     my %names=&getnames($uname,$udom);      my %names=&getnames($uname,$udom);
     my $name=$names{'nickname'};      my $name=$names{'nickname'};
     if ($name) {      if ($name) {
Line 2098  sub nickname { Line 2109  sub nickname {
   
 sub getnames {  sub getnames {
     my ($uname,$udom)=@_;      my ($uname,$udom)=@_;
       return if (!defined($uname) || !defined($udom));
     if ($udom eq 'public' && $uname eq 'public') {      if ($udom eq 'public' && $uname eq 'public') {
  return ('lastname' => &mt('Public'));   return ('lastname' => &mt('Public'));
     }      }
Line 2114  sub getnames { Line 2126  sub getnames {
     }      }
 }  }
   
   # -------------------------------------------------------------------- getemails
   =pod
   
   =item * getemails($uname,$udom)
   
   Gets a user's email information and returns it as a hash with keys:
   notification, critnotification, permanentemail
   
   For notification and critnotification, values are comma-separated lists 
   of e-mail address(es); for permanentemail, value is a single e-mail address.
    
   =cut
   
 sub getemails {  sub getemails {
     my ($uname,$udom)=@_;      my ($uname,$udom)=@_;
     if ($udom eq 'public' && $uname eq 'public') {      if ($udom eq 'public' && $uname eq 'public') {
Line 2135  sub getemails { Line 2160  sub getemails {
     }      }
 }  }
   
   sub flush_email_cache {
       my ($uname,$udom)=@_;
       if (!$udom)  { $udom =$env{'user.domain'}; }
       if (!$uname) { $uname=$env{'user.name'};   }
       return if ($udom eq 'public' && $uname eq 'public');
       my $id=$uname.':'.$udom;
       &Apache::lonnet::devalidate_cache_new('emailscache',$id);
   }
   
 # ------------------------------------------------------------------ Screenname  # ------------------------------------------------------------------ Screenname
   
 =pod  =pod
Line 2208  sub track_student_link { Line 2242  sub track_student_link {
         $target = '';          $target = '';
     }      }
     if ($start) { $link.='&amp;start='.$start; }      if ($start) { $link.='&amp;start='.$start; }
           $title = &mt($title);
       $linktext = &mt($linktext);
     return qq{<a href="$link" title="$title" $target>$linktext</a>}.      return qq{<a href="$link" title="$title" $target>$linktext</a>}.
  &help_open_topic('View_recent_activity');   &help_open_topic('View_recent_activity');
 }  }
Line 2661  sub get_student_answers { Line 2696  sub get_student_answers {
   $moreenv{'grade_target'}='answer';    $moreenv{'grade_target'}='answer';
   %moreenv=(%form,%moreenv);    %moreenv=(%form,%moreenv);
   $feedurl = &Apache::lonnet::clutter($feedurl);    $feedurl = &Apache::lonnet::clutter($feedurl);
   &Apache::lonenc::check_encrypt(\$feedurl);  
   my $userview=&Apache::lonnet::ssi($feedurl,%moreenv);    my $userview=&Apache::lonnet::ssi($feedurl,%moreenv);
   return $userview;    return $userview;
 }  }
Line 3248  sub domainlogo { Line 3282  sub domainlogo {
     # See if there is a logo      # See if there is a logo
     if ($designhash{$domain.'.login.domlogo'} ne '') {      if ($designhash{$domain.'.login.domlogo'} ne '') {
         my $imgsrc = $designhash{$domain.'.login.domlogo'};          my $imgsrc = $designhash{$domain.'.login.domlogo'};
         if ($imgsrc =~ /^\/(adm|res)/) {          if ($imgsrc =~ m{^/(adm|res)/}) {
             $imgsrc = &lonhttpdurl($imgsrc);      if ($imgsrc =~ m{^/res/}) {
    my $local_name = &Apache::lonnet::filelocation('',$imgsrc);
    &Apache::lonnet::repcopy($local_name);
       }
      $imgsrc = &lonhttpdurl($imgsrc);
         }           } 
         return '<img src="'.$imgsrc.'" alt="'.$domain.'" />';          return '<img src="'.$imgsrc.'" alt="'.$domain.'" />';
     } elsif (defined(&Apache::lonnet::domain($domain,'description'))) {      } elsif (defined(&Apache::lonnet::domain($domain,'description'))) {
Line 3298  sub designparm { Line 3336  sub designparm {
     }      }
     if (($which =~ /^(student|coordinator|author|admin)\.img$/) ||      if (($which =~ /^(student|coordinator|author|admin)\.img$/) ||
         ($which =~ /login\.(img|logo|domlogo)/)) {          ($which =~ /login\.(img|logo|domlogo)/)) {
         if ($output =~ /^\/(adm|res)\//) {          if ($output =~ m{^/(adm|res)/}) {
       if ($output =~ m{^/res/}) {
    my $local_name = &Apache::lonnet::filelocation('',$output);
    &Apache::lonnet::repcopy($local_name);
       }
             $output = &lonhttpdurl($output);              $output = &lonhttpdurl($output);
         }          }
     }      }
Line 3312  sub designparm { Line 3354  sub designparm {
   
 =back  =back
   
 =head1 HTTP Helpers  =head1 HTML Helpers
   
 =over 4  =over 4
   
Line 3375  sub bodytag { Line 3417  sub bodytag {
     my $pgbg   = $bgcolor || &designparm($function.'.pgbg',$domain);      my $pgbg   = $bgcolor || &designparm($function.'.pgbg',$domain);
   
     my %design = ( 'style'   => 'margin-top: 0px',      my %design = ( 'style'   => 'margin-top: 0px',
    'bgcolor' => '#ffffff',     'bgcolor' => $pgbg,
    'text'    => $font,     'text'    => $font,
                    'alink'   => &designparm($function.'.alink',$domain),                     'alink'   => &designparm($function.'.alink',$domain),
    'vlink'   => &designparm($function.'.vlink',$domain),     'vlink'   => &designparm($function.'.vlink',$domain),
Line 3606  sub make_attr_string { Line 3648  sub make_attr_string {
   
 =pod  =pod
   
 =back  
   
 =head1 HTML Helpers  
   
 =over 4  
   
 =item * &endbodytag()  =item * &endbodytag()
   
 Returns a uniform footer for LON-CAPA web pages.  Returns a uniform footer for LON-CAPA web pages.
   
 Inputs: none  Inputs: none
   
 =back  
   
 =cut  =cut
   
 sub endbodytag {  sub endbodytag {
Line 3636  sub endbodytag { Line 3670  sub endbodytag {
   
 =pod  =pod
   
 =over 4  
   
 =item * &standard_css()  =item * &standard_css()
   
 Returns a style sheet  Returns a style sheet
Line 3648  Inputs: (all optional) Line 3680  Inputs: (all optional)
             function       -> force usage of a specific rolish color scheme              function       -> force usage of a specific rolish color scheme
             bgcolor        -> override the default page bgcolor              bgcolor        -> override the default page bgcolor
   
 =back  
   
 =cut  =cut
   
 sub standard_css {  sub standard_css {
Line 3721  form, .inline { display: inline; } Line 3751  form, .inline { display: inline; }
 .LC_diff_added {  .LC_diff_added {
   color: green;    color: green;
 }  }
   .LC_unknown {
     color: yellow;
   }
   
 .LC_icon {  .LC_icon {
   border: 0px;    border: 0px;
 }  }
   .LC_indexer_icon {
     border: 0px;
     height: 22px;
   }
   .LC_docs_spacer {
     width: 25px;
     height: 1px;
     border: 0px;
   }
   
 .LC_internal_info {  .LC_internal_info {
   color: #999;    color: #999;
Line 4393  table.LC_prior_match tr td { Line 4436  table.LC_prior_match tr td {
 }  }
   
 span.LC_nobreak {  span.LC_nobreak {
     white-space: nowrap;    white-space: nowrap;
   }
   
   table.LC_docs_documents {
     background: #BBBBBB;
     border-width: 0px;
     border-collapse: collapse;
   }
   
   table.LC_docs_documents td.LC_docs_document {
     border: 2px solid black;
     padding: 4px;
   }
   
   .LC_docs_course_commands div {
     float: left;
     border: 4px solid #AAAAAA;
     padding: 4px;
     background: #DDDDCC;
   }
   
   .LC_docs_entry_move {
     border: 0px;
     border-collapse: collapse;
   }
   
   .LC_docs_entry_move td {
     border: 2px solid #BBBBBB;
     background: #DDDDDD;
   }
   
   .LC_docs_editor td.LC_docs_entry_commands {
     background: #DDDDDD;
     font-size: x-small;
   }
   .LC_docs_copy {
     color: #000099;
   }
   .LC_docs_cut {
     color: #550044;
   }
   .LC_docs_rename {
     color: #009900;
   }
   .LC_docs_remove {
     color: #990000;
   }
   
   .LC_docs_reinit_warn,
   .LC_docs_ext_edit {
     font-size: x-small;
   }
   
   .LC_docs_editor td.LC_docs_entry_title,
   .LC_docs_editor td.LC_docs_entry_icon {
     background: #FFFFBB;
   }
   .LC_docs_editor td.LC_docs_entry_parameter {
     background: #BBBBFF;
     font-size: x-small;
     white-space: nowrap;
   }
   
   table.LC_docs_adddocs td,
   table.LC_docs_adddocs th {
     border: 1px solid #BBBBBB;
     padding: 4px;
     background: #DDDDDD;
 }  }
   
 END  END
Line 4401  END Line 4511  END
   
 =pod  =pod
   
 =over 4  
   
 =item * &headtag()  =item * &headtag()
   
 Returns a uniform footer for LON-CAPA web pages.  Returns a uniform footer for LON-CAPA web pages.
Line 4426  Inputs: $title - optional title for the Line 4534  Inputs: $title - optional title for the
             no_auto_mt_title              no_auto_mt_title
                            -> prevent &mt()ing the title arg                             -> prevent &mt()ing the title arg
   
 =back  
   
 =cut  =cut
   
 sub headtag {  sub headtag {
Line 4483  ADDMETA Line 4589  ADDMETA
   
 =pod  =pod
   
 =over 4  
   
 =item * &font_settings()  =item * &font_settings()
   
 Returns neccessary <meta> to set the proper encoding  Returns neccessary <meta> to set the proper encoding
   
 Inputs: none  Inputs: none
   
 =back  
   
 =cut  =cut
   
 sub font_settings {  sub font_settings {
Line 4509  sub font_settings { Line 4611  sub font_settings {
   
 =pod  =pod
   
 =over 4  
   
 =item * &xml_begin()  =item * &xml_begin()
   
 Returns the needed doctype and <html>  Returns the needed doctype and <html>
   
 Inputs: none  Inputs: none
   
 =back  
   
 =cut  =cut
   
 sub xml_begin {  sub xml_begin {
Line 4543  sub xml_begin { Line 4641  sub xml_begin {
   
 =pod  =pod
   
 =over 4  
   
 =item * &endheadtag()  =item * &endheadtag()
   
 Returns a uniform </head> for LON-CAPA web pages.  Returns a uniform </head> for LON-CAPA web pages.
   
 Inputs: none  Inputs: none
   
 =back  
   
 =cut  =cut
   
 sub endheadtag {  sub endheadtag {
Line 4561  sub endheadtag { Line 4655  sub endheadtag {
   
 =pod  =pod
   
 =over 4  
   
 =item * &head()  =item * &head()
   
 Returns a uniform complete <head>..</head> section for LON-CAPA web pages.  Returns a uniform complete <head>..</head> section for LON-CAPA web pages.
Line 4570  Returns a uniform complete <head>..</hea Line 4662  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  
   
 =cut  =cut
   
 sub head {  sub head {
Line 4581  sub head { Line 4671  sub head {
   
 =pod  =pod
   
 =over 4  
   
 =item * &start_page()  =item * &start_page()
   
 Returns a complete <html> .. <body> section for LON-CAPA web pages.  Returns a complete <html> .. <body> section for LON-CAPA web pages.
Line 4621  Inputs: $title - optional title for the Line 4709  Inputs: $title - optional title for the
   
                   no_auto_mt_title -> prevent &mt()ing the title arg                    no_auto_mt_title -> prevent &mt()ing the title arg
   
 =back  
   
 =cut  =cut
   
 sub start_page {  sub start_page {
Line 4674  sub start_page { Line 4760  sub start_page {
   
 =pod  =pod
   
 =over 4  
   
 =item * &head()  =item * &head()
   
 Returns a complete </body></html> section for LON-CAPA web pages.  Returns a complete </body></html> section for LON-CAPA web pages.
Line 4833  sub simple_error_page { Line 4917  sub simple_error_page {
     }      }
 }  }
   
   =pod
   
   =item * &inhibit_menu_check($arg)
   
   Checks for a inhibitmenu state and generates output to preserve it
   
   Inputs:         $arg - can be any of
                        - undef - in which case the return value is a string 
                                  to add  into arguments list of a uri
                        - 'input' - in which case the return value is a HTML
                                    <form> <input> field of type hidden to
                                    preserve the value
                        - a url - in which case the return value is the url with
                                  the neccesary cgi args added to preserve the
                                  inhibitmenu state
                        - a ref to a url - no return value, but the string is
                                           updated to include the neccessary cgi
                                           args to preserve the inhibitmenu state
   
   =cut
   
   sub inhibit_menu_check {
       my ($arg) = @_;
       &get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['inhibitmenu']);
       if ($arg eq 'input') {
    if ($env{'form.inhibitmenu'}) {
       return '<input type="hidden" name="inhibitmenu" value="'.$env{'form.inhibitmenu'}.'" />';
    } else {
       return
    }
       }
       if ($env{'form.inhibitmenu'}) {
    if (ref($arg)) {
       $$arg .= '?inhibitmenu='.$env{'form.inhibitmenu'};
    } elsif ($arg eq '') {
       $arg .= 'inhibitmenu='.$env{'form.inhibitmenu'};
    } else {
       $arg .= '?inhibitmenu='.$env{'form.inhibitmenu'};
    }
       }
       if (!ref($arg)) {
    return $arg;
       }
   }
   
 ###############################################  ###############################################
   
 =pod  =pod
   
   =back
   
   =head1 User Information Routines
   
   =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.
Line 4864  sub get_users_function { Line 4999  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.
Line 5225  Incoming parameters: Line 5360  Incoming parameters:
 2. user's domain  2. user's domain
   
 Returns:  Returns:
 1. Disk quota (in Mb) assigned to student.   1. Disk quota (in Mb) assigned to student.
   2. (Optional) Type of setting: custom or default
      (individually assigned or default for user's 
      institutional status).
   3. (Optional) - User's institutional status (e.g., faculty, staff
      or student - types as defined in localenroll::inst_usertypes 
      for user's domain, which determines default quota for user.
   4. (Optional) - Default quota which would apply to the user.
   
 If a value has been stored in the user's environment,   If a value has been stored in the user's environment, 
 it will return that, otherwise it returns the default  it will return that, otherwise it returns the maximal default
 for users in the domain.  defined for the user's instituional status(es) in the domain.
   
 =cut  =cut
   
Line 5238  for users in the domain. Line 5380  for users in the domain.
   
 sub get_user_quota {  sub get_user_quota {
     my ($uname,$udom) = @_;      my ($uname,$udom) = @_;
     my $quota;      my ($quota,$quotatype,$settingstatus,$defquota);
     if (!defined($udom)) {      if (!defined($udom)) {
         $udom = $env{'user.domain'};          $udom = $env{'user.domain'};
     }      }
Line 5248  sub get_user_quota { Line 5390  sub get_user_quota {
     if (($udom eq '' || $uname eq '') ||      if (($udom eq '' || $uname eq '') ||
         ($udom eq 'public') && ($uname eq 'public')) {          ($udom eq 'public') && ($uname eq 'public')) {
         $quota = 0;          $quota = 0;
           $quotatype = 'default';
           $defquota = 0; 
     } else {      } else {
           my $inststatus;
         if ($udom eq $env{'user.domain'} && $uname eq $env{'user.name'}) {          if ($udom eq $env{'user.domain'} && $uname eq $env{'user.name'}) {
             $quota = $env{'environment.portfolioquota'};              $quota = $env{'environment.portfolioquota'};
               $inststatus = $env{'environment.inststatus'};
         } else {          } else {
             my %userenv = &Apache::lonnet::dump('environment',$udom,$uname);              my %userenv = 
                   &Apache::lonnet::get('environment',['portfolioquota',
                                        'inststatus'],$udom,$uname);
             my ($tmp) = keys(%userenv);              my ($tmp) = keys(%userenv);
             if ($tmp !~ /^(con_lost|error|no_such_host)/i) {              if ($tmp !~ /^(con_lost|error|no_such_host)/i) {
                 $quota = $userenv{'portfolioquota'};                  $quota = $userenv{'portfolioquota'};
                   $inststatus = $userenv{'inststatus'};
             } else {              } else {
                 undef(%userenv);                  undef(%userenv);
             }              }
         }          }
           ($defquota,$settingstatus) = &default_quota($udom,$inststatus);
         if ($quota eq '') {          if ($quota eq '') {
             $quota = &default_quota($udom);              $quota = $defquota;
               $quotatype = 'default';
           } else {
               $quotatype = 'custom';
         }          }
     }      }
     return $quota;      if (wantarray) {
           return ($quota,$quotatype,$settingstatus,$defquota);
       } else {
           return $quota;
       }
 }  }
   
 ###############################################  ###############################################
Line 5273  sub get_user_quota { Line 5430  sub get_user_quota {
   
 =item * &default_quota()  =item * &default_quota()
   
 Retrieves default quota assigned for storage of user portfolio files  Retrieves default quota assigned for storage of user portfolio files,
   given an (optional) user's institutional status.
   
 Incoming parameters:  Incoming parameters:
 1. domain  1. domain
   2. (Optional) institutional status(es).  This is a : separated list of 
      status types (e.g., faculty, staff, student etc.)
      which apply to the user for whom the default is being retrieved.
      If the institutional status string in undefined, the domain
      default quota will be returned. 
   
 Returns:  Returns:
 1. Default disk quota (in Mb) for user portfolios in the domain.  1. Default disk quota (in Mb) for user portfolios in the domain.
   2. (Optional) institutional type which determined the value of the
      default quota.
   
 If a value has been stored in the domain's configuration db,  If a value has been stored in the domain's configuration db,
 it will return that, otherwise it returns 20 (for backwards   it will return that, otherwise it returns 20 (for backwards 
 compatibility with domains which have not set up a configuration  compatibility with domains which have not set up a configuration
 db file; the original statically defined portfolio quota was 20 Mb).   db file; the original statically defined portfolio quota was 20 Mb). 
   
   If the user's status includes multiple types (e.g., staff and student),
   the largest default quota which applies to the user determines the
   default quota returned.
   
 =cut  =cut
   
 ###############################################  ###############################################
   
   
 sub default_quota {  sub default_quota {
     my ($udom) = @_;      my ($udom,$inststatus) = @_;
     my %defaults = &Apache::lonnet::get_dom('configuration',      my ($defquota,$settingstatus);
                                             ['portfolioquota'],$udom);      my %quotahash = &Apache::lonnet::get_dom('configuration',
     if ($defaults{'portfolioquota'} ne '') {                                              ['quota'],$udom);
         return $defaults{'portfolioquota'};      if (ref($quotahash{'quota'}) eq 'HASH') {
           if ($inststatus ne '') {
               my @statuses = split(/:/,$inststatus);
               foreach my $item (@statuses) {
                   if ($quotahash{'quota'}{$item} ne '') {
                       if ($defquota eq '') {
                           $defquota = $quotahash{'quota'}{$item};
                           $settingstatus = $item;
                       } elsif ($quotahash{'quota'}{$item} > $defquota) {
                           $defquota = $quotahash{'quota'}{$item};
                           $settingstatus = $item;
                       }
                   }
               }
           }
           if ($defquota eq '') {
               $defquota = $quotahash{'quota'}{'default'};
               $settingstatus = 'default';
           }
       } else {
           $settingstatus = 'default';
           $defquota = 20;
       }
       if (wantarray) {
           return ($defquota,$settingstatus);
     } else {      } else {
         return '20';          return $defquota;
     }      }
 }  }
   
Line 5339  sub get_secgrprole_info { Line 5532  sub get_secgrprole_info {
     return (\@sections,\@groups,$allroles,$rolehash,$accesshash);      return (\@sections,\@groups,$allroles,$rolehash,$accesshash);
 }  }
   
   sub user_picker {
       my ($dom,$srch,$forcenewuser) = @_;
       my $currdom = $dom;
       my %curr_selected = (
                           srchin => 'dom',
                           srchby => 'uname',
                         );
       my $srchterm;
       if (ref($srch) eq 'HASH') {
           if ($srch->{'srchby'} ne '') {
               $curr_selected{'srchby'} = $srch->{'srchby'};
           }
           if ($srch->{'srchin'} ne '') {
               $curr_selected{'srchin'} = $srch->{'srchin'};
           }
           if ($srch->{'srchtype'} ne '') {
               $curr_selected{'srchtype'} = $srch->{'srchtype'};
           }
           if ($srch->{'srchdomain'} ne '') {
               $currdom = $srch->{'srchdomain'};
           }
           $srchterm = $srch->{'srchterm'};
       }
   
       my %lt=&Apache::lonlocal::texthash(
                       'usr'  => 'Search for',
                       'or'   => 'or',
                       'in'   => 'in',
                       'doma' => 'domain',
                       'uname' => 'username',
                       'lastname' => 'last name',
                       'lastfirst' => 'last name, first name',
                       'crs' => 'this course',
                       'dom' => 'this domain', 
                       'alc' => 'all LON-CAPA',
                       'instd' => 'institutional directory',
                       'exact' => 'as exact match to',
                       'contains' => 'contained in',
                                          );
       my $domform = &select_dom_form($currdom,'srchdomain',1);
   
       my $srchinsel = ' <select name="srchin">';
   
       my @srchins = ('crs','dom','alc','instd');
   
       foreach my $option (@srchins) {
           # FIXME 'alc' option unavailable until 
           #       loncreateuser::print_user_query_page()
           #       has been completed.
           next if ($option eq 'alc');
           next if ($option eq 'crs' && !$env{'request.course.id'});
           if ($curr_selected{'srchin'} eq $option) {
               $srchinsel .= ' 
      <option value="'.$option.'" selected="selected">'.$lt{$option}.'</option>';
           } else {
               $srchinsel .= '
      <option value="'.$option.'">'.$lt{$option}.'</option>';
           }
       }
       $srchinsel .= "\n  </select>\n";
   
       my $srchbysel =  ' <select name="srchby">';
       foreach my $option ('uname','lastname','lastfirst') {
           if ($curr_selected{'srchby'} eq $option) {
               $srchbysel .= '
      <option value="'.$option.'" selected="selected">'.$lt{$option}.'</option>';
           } else {
               $srchbysel .= '
      <option value="'.$option.'">'.$lt{$option}.'</option>';
            }
       }
       $srchbysel .= "\n  </select>\n";
   
       my $srchtypesel = ' <select name="srchtype">';
       foreach my $option ('exact','contains') {
           if ($curr_selected{'srchtype'} eq $option) {
               $srchtypesel .= '
      <option value="'.$option.'" selected="selected">'.$lt{$option}.'</option>';
           } else {
               $srchtypesel .= '
      <option value="'.$option.'">'.$lt{$option}.'</option>';
           }
       }
       $srchtypesel .= "\n  </select>\n";
   
       my ($newuserscript,$newuservalidate);
   
       if ($forcenewuser) {
           $newuserscript = <<"ENDSCRIPT";
   
   function setSearch() {
       var createnew = 0;
       for (var i=0; i<document.crtuser.forcenew.length; i++) {
           if (document.crtuser.forcenew[i].checked) {
               if (document.crtuser.forcenew[i].value == 1) {
                   createnew = 1;
               }
           }
       }
       if (createnew == 1) {
           for (var i=0; i<document.crtuser.srchby.length; i++) {
               if (document.crtuser.srchby.options[i].value == 'uname') {
                   document.crtuser.srchby.selectedIndex = i;
               }
           }
           for (var i=0; i<document.crtuser.srchin.length; i++) {
               if (document.crtuser.srchin.options[i].value == 'dom') {
                   document.crtuser.srchin.selectedIndex = i;
               }
           }
           for (var i=0; i<document.crtuser.srchtype.length; i++) {
               if (document.crtuser.srchtype.options[i].value == 'exact') {
                   document.crtuser.srchtype.selectedIndex = i;
               }
           }
           for (var i=0; i<document.crtuser.srchdomain.length; i++) {
               if (document.crtuser.srchdomain.options[i].value == '$env{'request.role.domain'}') {
                   document.crtuser.srchdomain.selectedIndex = i;
               }
           }
       }
   }
   ENDSCRIPT
           $newuservalidate = <<"ENDBLOCK";
   setSearch();
   ENDBLOCK
       }
   
       my $output = <<"END_BLOCK";
   <script type="text/javascript">
   function validateEntry() {
       $newuservalidate
       var checkok = 1;
       var srchin = document.crtuser.srchin.options[document.crtuser.srchin.selectedIndex].value;
       var srchtype = document.crtuser.srchtype.options[document.crtuser.srchtype.selectedIndex].value;
       var srchby = document.crtuser.srchby.options[document.crtuser.srchby.selectedIndex].value;
       var srchdomain = document.crtuser.srchdomain.options[document.crtuser.srchdomain.selectedIndex].value;
       var srchterm =  document.crtuser.srchterm.value;
       var msg = "";
   
       if (srchterm == "") {
           checkok = 0;
           msg += "You must include some text to search for.\\n";
       }
   
       if (srchtype== 'contains') {
           if (srchterm.length < 3) {
               checkok = 0;
               msg += "The text you are searching for must contain at least three characters when using a 'contained in' type search.\\n";
           }
       }
       if (srchin == 'instd') {
           if (srchdomain == '') {
               checkok = 0;
               msg += "You must choose a domain when using an institutional directory search.\\n";
           }
       }
       if (srchin == 'dom') {
           if (srchdomain == '') {
               checkok = 0;
               msg += "You must choose a domain when using a domain search.\\n";
           }
       }
       if (srchby == 'lastfirst') {
           if (srchterm.indexOf(",") == -1) {
               checkok = 0;
               msg += "When using searching by last,first you must include a comma as separator between last name and first name.\\n";
           }
           if (srchterm.indexOf(",") == srchterm.length -1) {
               checkok = 0;
               msg += "When searching by last,first you must include at least one character in the first name.\\n";
           }
       }
       if (checkok == 0) {
           alert("The following need to be corrected before the search can be run:\\n"+msg);
           return;
       }
       if (checkok == 1) {
           document.crtuser.submit();
       }
   }
   
   $newuserscript
   
   </script>
   <table>
   <tr>
    <td align="right">$lt{'usr'}:</td><td><input type="text" size="15" name="srchterm" value="$srchterm" /></td>
    <td>
   $srchtypesel
    </td>
    <td>
   $srchbysel
    </td>
   </tr>
   <tr>
    <td align="right">$lt{'in'}:</td>
    <td colspan="2">
   $srchinsel
    </td>
   </tr>
   <tr>
    <td align="right">$lt{'doma'}:</td><td colspan="2">$domform</td>
   </tr>
   </table>
   <br />
   END_BLOCK
       if ($forcenewuser) {
           $output .= '<span class="LC_nobreak">'.&mt('Make new user if no match found: ').'<input type="radio" name="forcenew" value="1" onclick="javascript:setSearch()" />'.&mt('Yes').'&nbsp;&nbsp;<input type="radio" name="forcenew" value="0" checked="checked" />'.&mt('No').'</span><br />';
       }
       return $output;
   }
   
   
   
 =pod  =pod
   
   =back
   
   =head1 HTTP Helpers
   
   =over 4
   
 =item * get_unprocessed_cgi($query,$possible_names)  =item * get_unprocessed_cgi($query,$possible_names)
   
 Modify the %env hash to contain unprocessed CGI form parameters held in  Modify the %env hash to contain unprocessed CGI form parameters held in
Line 6378  sub commit_customrole { Line 6792  sub commit_customrole {
 }  }
   
 sub commit_standardrole {  sub commit_standardrole {
     my ($udom,$uname,$url,$three,$start,$end,$one,$two,$sec) = @_;      my ($udom,$uname,$url,$three,$start,$end,$one,$two,$sec,$context) = @_;
     my $output;      my ($output,$logmsg,$linefeed);
     my $logmsg;      if ($context eq 'auto') {
           $linefeed = "\n";
       } else {
           $linefeed = "<br />\n";
       }  
     if ($three eq 'st') {      if ($three eq 'st') {
         my $result = &commit_studentrole(\$logmsg,$udom,$uname,$url,$three,$start,$end,$one,$two,$sec);          my $result = &commit_studentrole(\$logmsg,$udom,$uname,$url,$three,$start,$end,
         if (($result =~ /^error/) || ($result eq 'not_in_class') || ($result eq 'unknown_course')) {                                           $one,$two,$sec,$context);
           if (($result =~ /^error/) || ($result eq 'not_in_class') || 
               ($result eq 'unknown_course')) {
             $output = "Error: $result\n";               $output = "Error: $result\n"; 
         } else {          } else {
             $output = &mt('Assigning').' '.$three.' in '.$url.              $output = $logmsg.$linefeed.&mt('Assigning').' '.$three.' in '.$url.
                ($start?', '.&mt('starting').' '.localtime($start):'').                 ($start?', '.&mt('starting').' '.localtime($start):'').
                ($end?', '.&mt('ending').' '.localtime($end):'').                 ($end?', '.&mt('ending').' '.localtime($end):'').': ';
                ': <b>'.$result.'</b><br />'.              if ($context eq 'auto') {
                &mt('Add to classlist').': <b>ok</b><br />';                  $output .= $result.$linefeed.&mt('Add to classlist').': ok';
               } else {
                  $output .= '<b>'.$result.'</b>'.$linefeed.
                  &mt('Add to classlist').': <b>ok</b>';
               }
               $output .= $linefeed;
         }          }
     } else {      } else {
         $output = &mt('Assigning').' '.$three.' in '.$url.          $output = &mt('Assigning').' '.$three.' in '.$url.
                ($start?', '.&mt('starting').' '.localtime($start):'').                 ($start?', '.&mt('starting').' '.localtime($start):'').
                ($end?', '.&mt('ending').' '.localtime($end):'').': <b>'.                 ($end?', '.&mt('ending').' '.localtime($end):'').': ';
                &Apache::lonnet::assignrole(          my $result = &Apache::lonnet::assignrole($udom,$uname,$url,$three,$end,$start);
                    $udom,$uname,$url,$three,$end,$start).          if ($context eq 'auto') {
                    '</b><br />';              $output .= $result.$linefeed;
           } else {
               $output .= '<b>'.$result.'</b>'.$linefeed;
           }
     }      }
     return $output;      return $output;
 }  }
   
 sub commit_studentrole {  sub commit_studentrole {
     my ($logmsg,$udom,$uname,$url,$three,$start,$end,$one,$two,$sec) = @_;      my ($logmsg,$udom,$uname,$url,$three,$start,$end,$one,$two,$sec,$context) = @_;
     my $linefeed =  '<br />'."\n";      my ($result,$linefeed);
     my $result;      if ($context eq 'auto') {
           $linefeed = "\n";
       } else {
           $linefeed = '<br />'."\n";
       }
     if (defined($one) && defined($two)) {      if (defined($one) && defined($two)) {
         my $cid=$one.'_'.$two;          my $cid=$one.'_'.$two;
         my $oldsec=&Apache::lonnet::getsection($udom,$uname,$cid);          my $oldsec=&Apache::lonnet::getsection($udom,$uname,$cid);
Line 6453  sub commit_studentrole { Line 6885  sub commit_studentrole {
 ############################################################  ############################################################
   
 sub construct_course {  sub construct_course {
     my ($args,$logmsg,$courseid,$crsudom,$crsunum,$udom,$uname) = @_;      my ($args,$logmsg,$courseid,$crsudom,$crsunum,$udom,$uname,$context) = @_;
     my $outcome;      my $outcome;
       my $linefeed =  '<br />'."\n";
       if ($context eq 'auto') {
           $linefeed = "\n";
       }
 #  #
 # Open course  # Open course
 #  #
Line 6475  sub construct_course { Line 6910  sub construct_course {
     # Utils::Course. This needs to at least be output as a comment      # Utils::Course. This needs to at least be output as a comment
     # if anyone ever decides to not show this, and Utils::Course::new      # if anyone ever decides to not show this, and Utils::Course::new
     # will need to be suitably modified.      # will need to be suitably modified.
     $outcome .= &mt('New LON-CAPA [_1] ID: [_2]<br />',$crstype,$$courseid);      $outcome .= &mt('New LON-CAPA [_1] ID: [_2]',$crstype,$$courseid).$linefeed;
   
 #  #
 # Check if created correctly  # Check if created correctly
 #  #
     ($$crsudom,$$crsunum)= &LONCAPA::split_courseid($$courseid);      ($$crsudom,$$crsunum)= &LONCAPA::split_courseid($$courseid);
     my $crsuhome=&Apache::lonnet::homeserver($$crsunum,$$crsudom);      my $crsuhome=&Apache::lonnet::homeserver($$crsunum,$$crsudom);
     $outcome .= &mt('Created on').': '.$crsuhome.'<br>';      $outcome .= &mt('Created on').': '.$crsuhome.$linefeed;
 #  #
 # Are we cloning?  # Are we cloning?
 #  #
     my $cloneid='';      my $cloneid='';
     if (($args->{'clonecourse'}) && ($args->{'clonedomain'})) {      if (($args->{'clonecourse'}) && ($args->{'clonedomain'})) {
           my $can_clone = 0;
  $cloneid='/'.$args->{'clonedomain'}.'/'.$args->{'clonecourse'};   $cloneid='/'.$args->{'clonedomain'}.'/'.$args->{'clonecourse'};
         my ($clonecrsudom,$clonecrsunum)= &LONCAPA::split_courseid($cloneid);          my ($clonecrsudom,$clonecrsunum)= &LONCAPA::split_courseid($cloneid);
  my $clonehome=&Apache::lonnet::homeserver($clonecrsunum,$clonecrsudom);   my $clonehome=&Apache::lonnet::homeserver($clonecrsunum,$clonecrsudom);
           my $clonemsg;
  if ($clonehome eq 'no_host') {   if ($clonehome eq 'no_host') {
     $outcome .=              $clonemsg = &mt('Attempting to clone non-existing [_1]',$crstype);
     '<br /><font color="red">'.&mt('Attempting to clone non-existing [_1]',$crstype).' '.$cloneid.'</font>';              if ($context eq 'auto') {
                   $outcome .= $clonemsg;
               } else {
           $outcome .= '<font color="red">'.$clonemsg.'</font>';
               }
               $outcome .= $linefeed;
  } else {   } else {
     $outcome .=               my %clonedesc = &Apache::lonnet::coursedescription($cloneid,{'one_time' => 1});
     '<br /><font color="green">'.&mt('Cloning [_1] from [_2]',$crstype,$clonehome).'</font>';              if ($env{'request.role.domain'} eq $args->{'form.clonedomain'}) {
                   $can_clone = 1;
               } else {
                   my %clonehash = &Apache::lonnet::get('environment',['cloners'],
                               $args->{'clonedomain'},$args->{'clonecourse'});
                   my @cloners = split(/,/,$clonehash{'cloners'});
                   my %roleshash =
                       &Apache::lonnet::get_my_roles($args->{'ccuname'},
                           $args->{'ccdomain'},'userroles',['active'],['cc'],
                           [$args->{'clonedomain'}]);
                   if (($roleshash{$args->{'clonecourse'}.':'.$args->{'clonedomain'}.':cc'}) || (grep(/^\Q$args->{'ccuname'}\E:\Q$args->{'ccdomain'}\E$/,@cloners))) {
                       $can_clone = 1;
                   } else {
                       $clonemsg = &mt('The new course was not cloned from an existing course because the course owner ([_1]) does not have cloning rights in the existing course ([_2]).',$args->{'ccuname'}.':'.$args->{'ccdomain'},$clonedesc{'description'});
                       if ($context eq 'auto') {
                           $outcome .= $clonemsg;
                       } else {
                           $outcome .= '<font color="red">'.$clonemsg.'</font>';
                       }
                       $outcome .= $linefeed;
                   }
               }
           }
           if ($can_clone) {
       $clonemsg = &mt('Cloning [_1] from [_2]',$crstype,$clonehome);
               if ($context eq 'auto') {
                   $outcome = $clonemsg;
               } else { 
                   $outcome .= '<font color="green">'.$clonemsg.'</font>';
               }
               $outcome .= $linefeed;
     my %oldcenv=&Apache::lonnet::dump('environment',$$crsudom,$$crsunum);      my %oldcenv=&Apache::lonnet::dump('environment',$$crsudom,$$crsunum);
 # Copy all files  # Copy all files
     &Apache::lonclonecourse::copycoursefiles($cloneid,$$courseid);      &Apache::lonclonecourse::copycoursefiles($cloneid,$$courseid);
Line 6616  sub construct_course { Line 7089  sub construct_course {
                 'dnhr' => 'does not have rights to access enrollment in these classes',                  'dnhr' => 'does not have rights to access enrollment in these classes',
                 'adby' => 'as determined by the policies of your institution on access to official classlists'                  'adby' => 'as determined by the policies of your institution on access to official classlists'
         );          );
         $outcome .= '<font color="red">'.$lt{'tclb'}.' ('.$cenv{'internal.courseowner'}.') - '.$lt{'dnhr'}.' ('.$lt{'adby'}.').<br /><ul>'."\n";          my $badclass_msg = $cenv{'internal.courseowner'}.') - '.$lt{'dnhr'}.
         foreach (@badclasses) {                             ' ('.$lt{'adby'}.')';
             $outcome .= "<li>$_</li>\n";          if ($context eq 'auto') {
         }              $outcome .= $badclass_msg.$linefeed;
         $outcome .= "</ul><br /><br /></font>\n";              $outcome .= '<font color="red">'.$badclass_msg.$linefeed.'<ul>'."\n";
               foreach my $item (@badclasses) {
                   if ($context eq 'auto') {
                       $outcome .= " - $item\n";
                   } else {
                       $outcome .= "<li>$item</li>\n";
                   }
               }
               if ($context eq 'auto') {
                   $outcome .= $linefeed;
               } else {
                   $outcome .= "</ul><br /><br /></font>\n";
               }
           } 
     }      }
     if ($args->{'no_end_date'}) {      if ($args->{'no_end_date'}) {
         $args->{'endaccess'} = 0;          $args->{'endaccess'} = 0;
Line 6636  sub construct_course { Line 7122  sub construct_course {
     $cenv{'internal.autharg'} = $args->{'autharg'};       $cenv{'internal.autharg'} = $args->{'autharg'}; 
     if ( ($cenv{'internal.authtype'} =~ /^krb/) && ($cenv{'internal.autoadds'} == 1)) {      if ( ($cenv{'internal.authtype'} =~ /^krb/) && ($cenv{'internal.autoadds'} == 1)) {
         if (! defined($cenv{'internal.autharg'}) || $cenv{'internal.autharg'}  eq '') {          if (! defined($cenv{'internal.autharg'}) || $cenv{'internal.autharg'}  eq '') {
             $outcome .= '<font color="red" size="+1">'.              my $krb_msg = &mt('As you did not include the default Kerberos domain to be used for authentication in this class, the institutional data used by the automated enrollment process must include the Kerberos domain for each new student'); 
                       &mt('As you did not include the default Kerberos domain to be used for authentication in this class, the institutional data used by the automated enrollment process must include the Kerberos domain for each new student').'</font></p>';              if ($context eq 'auto') {
                   $outcome .= $krb_msg;
               } else {
                   $outcome .= '<font color="red" size="+1">'.$krb_msg.'</font>';
               }
               $outcome .= $linefeed;
         }          }
     }      }
     if (($args->{'ccdomain'}) && ($args->{'ccuname'})) {      if (($args->{'ccdomain'}) && ($args->{'ccuname'})) {
Line 6693  sub construct_course { Line 7184  sub construct_course {
     # By default, use standard grading      # By default, use standard grading
     if (!defined($cenv{'grading'})) { $cenv{'grading'} = 'standard'; }      if (!defined($cenv{'grading'})) { $cenv{'grading'} = 'standard'; }
   
     $outcome .= ('<br />'.&mt('Setting environment').': '.                       $outcome .= $linefeed.&mt('Setting environment').': '.                 
           &Apache::lonnet::put('environment',\%cenv,$$crsudom,$$crsunum).'<br>');            &Apache::lonnet::put('environment',\%cenv,$$crsudom,$$crsunum).$linefeed;
 #  #
 # Open all assignments  # Open all assignments
 #  #
Line 6704  sub construct_course { Line 7195  sub construct_course {
                            $storeunder.'.type' => 'date_start');                             $storeunder.'.type' => 'date_start');
                 
        $outcome .= &mt('Opening all assignments').': '.&Apache::lonnet::cput         $outcome .= &mt('Opening all assignments').': '.&Apache::lonnet::cput
                  ('resourcedata',\%storecontent,$$crsudom,$$crsunum).'<br>';                   ('resourcedata',\%storecontent,$$crsudom,$$crsunum).$linefeed;
    }     }
 #  #
 # Set first page  # Set first page
Line 6731  sub construct_course { Line 7222  sub construct_course {
  (my $outtext,$errtext) = &LONCAPA::map::storemap($map,1);   (my $outtext,$errtext) = &LONCAPA::map::storemap($map,1);
   
  if ($errtext) { $fatal=2; }   if ($errtext) { $fatal=2; }
         $outcome .= ($fatal?$errtext:'write ok').'<br />';          $outcome .= ($fatal?$errtext:'write ok').$linefeed;
     }      }
     return $outcome;      return $outcome;
 }  }

Removed from v.1.533  
changed lines
  Added in v.1.556


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