Diff for /loncom/interface/loncommon.pm between versions 1.515 and 1.544

version 1.515, 2007/03/15 02:51:23 version 1.544, 2007/07/03 00:30:47
Line 68  use Apache::lontexconvert(); Line 68  use Apache::lontexconvert();
 use Apache::lonclonecourse();  use Apache::lonclonecourse();
 use LONCAPA qw(:DEFAULT :match);  use LONCAPA qw(:DEFAULT :match);
   
   # ---------------------------------------------- Designs
   use vars qw(%defaultdesign);
   
 my $readit;  my $readit;
   
   
 ##  ##
 ## Global Variables  ## Global Variables
 ##  ##
Line 82  my %scprtag; Line 86  my %scprtag;
 my %fe; my %fd; my %fm;  my %fe; my %fd; my %fm;
 my %category_extensions;  my %category_extensions;
   
 # ---------------------------------------------- Designs  
   
 my %designhash;  
   
 # ---------------------------------------------- Thesaurus variables  # ---------------------------------------------- Thesaurus variables
 #  #
 # %Keywords:  # %Keywords:
Line 151  BEGIN { Line 151  BEGIN {
         }          }
     }      }
   
 # -------------------------------------------------------------- domain designs  # -------------------------------------------------------------- default domain designs
   
     my $filename;  
     my $designdir=$Apache::lonnet::perlvar{'lonTabDir'}.'/lonDomColors';      my $designdir=$Apache::lonnet::perlvar{'lonTabDir'}.'/lonDomColors';
     opendir(DIR,$designdir);      my $designfile = $designdir.'/default.tab';
     while ($filename=readdir(DIR)) {      if ( open (my $fh,"<$designfile") ) {
  if ($filename!~/\.tab$/) { next; }          while (my $line = <$fh>) {
  my ($domain)=($filename=~/^($match_domain)\./);              next if ($line =~ /^\#/);
  {              chomp($line);
     my $designfile = $designdir.'/'.$filename;              my ($key,$val)=(split(/\=/,$line));
     if ( open (my $fh,"<$designfile") ) {              if ($val) { $defaultdesign{$key}=$val; }
  while (my $line = <$fh>) {          }
     next if ($line =~ /^\#/);          close($fh);
     chomp($line);  
     my ($key,$val)=(split(/\=/,$line));  
     if ($val) { $designhash{$domain.'.'.$key}=$val; }  
  }  
  close($fh);  
     }  
  }  
   
     }      }
     closedir(DIR);  
   
   
 # ------------------------------------------------------------- file categories  # ------------------------------------------------------------- file categories
     {      {
Line 390  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 536  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 1090  sub changable_area { Line 1079  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 1224  sub create_workbook { Line 1213  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 1284  sub domain_select { Line 1273  sub domain_select {
   
 =pod  =pod
   
   =head1 Routines for form select boxes
   
   =over 4
   
   =cut
   
 =item * multiple_select_form($name,$value,$size,$hash,$order)  =item * multiple_select_form($name,$value,$size,$hash,$order)
   
 Returns a string containing a <select> element int multiple mode  Returns a string containing a <select> element int multiple mode
Line 1435  selected"); Line 1430  selected");
 #-------------------------------------------  #-------------------------------------------
 sub select_dom_form {  sub select_dom_form {
     my ($defdom,$name,$includeempty) = @_;      my ($defdom,$name,$includeempty) = @_;
     my @domains = &Apache::lonnet::all_domains();      my @domains = sort(&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 1473  sub home_server_option_list { Line 1468  sub home_server_option_list {
   
 =pod  =pod
   
 =back  =back 
   
 =cut  =cut
   
Line 2060  if $first is set to 'lastname' then it r Line 2055  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 2091  if the user does not Line 2087  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 2106  sub nickname { Line 2103  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 2122  sub getnames { Line 2120  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 2669  sub get_student_answers { Line 2680  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 2920  sub blockcheck { Line 2930  sub blockcheck {
         }          }
         my $no_ownblock = 0;          my $no_ownblock = 0;
         my $no_userblock = 0;          my $no_userblock = 0;
         if ($otheruser) {          if ($otheruser && $activity ne 'com') {
             # Check if current user has 'evb' priv for this              # Check if current user has 'evb' priv for this
             if (defined($own_courses{$course})) {              if (defined($own_courses{$course})) {
                 foreach my $sec (keys(%{$own_courses{$course}})) {                  foreach my $sec (keys(%{$own_courses{$course}})) {
Line 3173  Returns: Determines which domain should Line 3183  Returns: Determines which domain should
 ###############################################  ###############################################
 sub determinedomain {  sub determinedomain {
     my $domain=shift;      my $domain=shift;
    if (! $domain) {      if (! $domain) {
         # Determine domain if we have not been given one          # Determine domain if we have not been given one
         $domain = $Apache::lonnet::perlvar{'lonDefDomain'};          $domain = $Apache::lonnet::perlvar{'lonDefDomain'};
         if ($env{'user.domain'}) { $domain=$env{'user.domain'}; }          if ($env{'user.domain'}) { $domain=$env{'user.domain'}; }
Line 3184  sub determinedomain { Line 3194  sub determinedomain {
     return $domain;      return $domain;
 }  }
 ###############################################  ###############################################
   
   sub devalidate_domconfig_cache {
       my ($udom)=@_;
       &Apache::lonnet::devalidate_cache_new('domainconfig',$udom);
   }
   
   # ---------------------- Get domain configuration for a domain
   sub get_domainconf {
       my ($udom) = @_;
       my $cachetime=1800;
       my ($result,$cached)=&Apache::lonnet::is_cached_new('domainconfig',$udom);
       if (defined($cached)) { return %{$result}; }
   
       my %domconfig = &Apache::lonnet::get_dom('configuration',
        ['login','rolecolors'],$udom);
       my %designhash;
       if (keys(%domconfig) > 0) {
           if (ref($domconfig{'login'}) eq 'HASH') {
               foreach my $key (keys(%{$domconfig{'login'}})) {
                   $designhash{$udom.'.login.'.$key}=$domconfig{'login'}{$key};
               }
           }
           if (ref($domconfig{'rolecolors'}) eq 'HASH') {
               foreach my $role (keys(%{$domconfig{'rolecolors'}})) {
                   if (ref($domconfig{'rolecolors'}{$role}) eq 'HASH') {
                       foreach my $item (keys(%{$domconfig{'rolecolors'}{$role}})) {
                           $designhash{$udom.'.'.$role.'.'.$item}=$domconfig{'rolecolors'}{$role}{$item};
                       }
                   }
               }
           }
       } else {
           my $designdir=$Apache::lonnet::perlvar{'lonTabDir'}.'/lonDomColors';
           my $designfile =  $designdir.'/'.$udom.'.tab';
           if (-e $designfile) {
               if ( open (my $fh,"<$designfile") ) {
                   while (my $line = <$fh>) {
                       next if ($line =~ /^\#/);
                       chomp($line);
                       my ($key,$val)=(split(/\=/,$line));
                       if ($val) { $designhash{$udom.'.'.$key}=$val; }
                   }
                   close($fh);
               }
           }
           if (-e '/home/httpd/html/adm/lonDomLogos/'.$udom.'.gif') {
               $designhash{$udom.'.login.domlogo'} = "/adm/lonDomLogos/$udom.gif";
           }
       }
       &Apache::lonnet::do_cache_new('domainconfig',$udom,\%designhash,
     $cachetime);
       return %designhash;
   }
   
 =pod  =pod
   
 =item * &domainlogo()  =item * &domainlogo()
Line 3197  If the domain logo does not exist, a des Line 3261  If the domain logo does not exist, a des
   
 ###############################################  ###############################################
 sub domainlogo {  sub domainlogo {
     my $domain = &determinedomain(shift);          my $domain = &determinedomain(shift);
      # See if there is a logo      my %designhash = &get_domainconf($domain);    
     if (-e '/home/httpd/html/adm/lonDomLogos/'.$domain.'.gif') {      # See if there is a logo
  my $logo=&lonhttpdurl("/adm/lonDomLogos/$domain.gif");      if ($designhash{$domain.'.login.domlogo'} ne '') {
         return '<img src="'.$logo.'" alt="'.$domain.'" />';          my $imgsrc = $designhash{$domain.'.login.domlogo'};
           if ($imgsrc =~ m{^/(adm|res)/}) {
       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.'" />';
     } elsif (defined(&Apache::lonnet::domain($domain,'description'))) {      } elsif (defined(&Apache::lonnet::domain($domain,'description'))) {
         return &Apache::lonnet::domain($domain,'description');          return &Apache::lonnet::domain($domain,'description');
     } else {      } else {
Line 3239  sub designparm { Line 3311  sub designparm {
  return $env{'environment.color.'.$which};   return $env{'environment.color.'.$which};
     }      }
     $domain=&determinedomain($domain);      $domain=&determinedomain($domain);
     if (exists($designhash{$domain.'.'.$which})) {      my %domdesign = &get_domainconf($domain);
  return $designhash{$domain.'.'.$which};      my $output;
       if ($domdesign{$domain.'.'.$which} ne '') {
    $output = $domdesign{$domain.'.'.$which};
     } else {      } else {
         return $designhash{'default.'.$which};          $output = $defaultdesign{$which};
       }
       if (($which =~ /^(student|coordinator|author|admin)\.img$/) ||
           ($which =~ /login\.(img|logo|domlogo)/)) {
           if ($output =~ m{^/(adm|res)/}) {
       if ($output =~ m{^/res/}) {
    my $local_name = &Apache::lonnet::filelocation('',$output);
    &Apache::lonnet::repcopy($local_name);
       }
               $output = &lonhttpdurl($output);
           }
     }      }
       return $output;
 }  }
   
 ###############################################  ###############################################
Line 3352  sub bodytag { Line 3437  sub bodytag {
     my $bodytag = "<body $extra_body_attr>".      my $bodytag = "<body $extra_body_attr>".
  &Apache::lontexconvert::init_math_support();   &Apache::lontexconvert::init_math_support();
   
     if ($bodyonly       if ($bodyonly) {
  || ($env{'request.state'} eq 'construct'   
     && $env{'environment.remote'} ne 'off' )) {  
         return $bodytag;          return $bodytag;
     } elsif ($env{'browser.interface'} eq 'textual') {      } elsif ($env{'browser.interface'} eq 'textual') {
 # Accessibility  # Accessibility
Line 3462  ENDROLE Line 3545  ENDROLE
 # Top frame rendering, Remote is up  # Top frame rendering, Remote is up
 #  #
   
     my $upperleft='<img src="http://'.$ENV{'HTTP_HOST'}.':'.      my $imgsrc = $img;
         $lonhttpdPort.$img.'" alt="'.$function.'" />';      if ($img =~ /^\/adm/) {
           $imgsrc = 'http://'.$ENV{'HTTP_HOST'}.':'.$lonhttpdPort.$img;
       }
       my $upperleft='<img src="'.$imgsrc.'" alt="'.$function.'" />';
   
     # Explicit link to get inline menu      # Explicit link to get inline menu
     my $menu= ($no_inline_link?''      my $menu= ($no_inline_link?''
Line 3628  sub standard_css { Line 3714  sub standard_css {
     my $border = ($env{'browser.type'} eq 'explorer') ? '0px 2px 0px 2px'      my $border = ($env{'browser.type'} eq 'explorer') ? '0px 2px 0px 2px'
                                               : '0px 3px 0px 4px';                                                : '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 } 
 table.thinborder,  table.thinborder,
 table.LC_optres_prior {  
   border-collapse: collapse;  
 }  
 table.thinborder tr th {  table.thinborder tr th {
   border-style: solid;    border-style: solid;
   border-width: 1px;    border-width: 1px;
   background: $tabbg;    background: $tabbg;
 }  }
 table.thinborder tr td,   table.thinborder tr td {
 table.LC_optres_prior tr td {  
   border-style: solid;    border-style: solid;
   border-width: 1px    border-width: 1px
 }  }
Line 3657  form, .inline { display: inline; } Line 3741  form, .inline { display: inline; }
 .LC_diff_removed {  .LC_diff_removed {
   color: red;    color: red;
 }  }
   
   .LC_info,
 .LC_success,  .LC_success,
 .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 {
     color: #999;
   }
   
 table.LC_pastsubmission {  table.LC_pastsubmission {
   border: 1px solid black;    border: 1px solid black;
Line 3726  table#LC_title_bar td.LC_title_bar_role_ Line 3829  table#LC_title_bar td.LC_title_bar_role_
 }  }
   
 table#LC_menubuttons_mainmenu {  table#LC_menubuttons_mainmenu {
   background: $pgbg;    width: 100%;
   border: 0px;    border: 0px;
   border-spacing: 1px;    border-spacing: 1px;
   padding: 0px 1px;    padding: 0px 1px;
Line 3781  td.LC_table_cell_checkbox { Line 3884  td.LC_table_cell_checkbox {
   text-align: center;    text-align: center;
 }  }
   
   table#LC_mainmenu td.LC_mainmenu_column {
       vertical-align: top;
   }
   
 .LC_menubuttons_inline_text {  .LC_menubuttons_inline_text {
   color: $font;    color: $font;
   font-family: $sans;    font-family: $sans;
   font-size: smaller;    font-size: smaller;
 }  }
   
   .LC_menubuttons_link {
     text-decoration: none;
   }
   
   .LC_menubuttons_category {
     color: $font;
     background: $pgbg;
     font-family: $sans;
     font-size: larger;
     font-weight: bold;
   }
   
 td.LC_menubuttons_text {  td.LC_menubuttons_text {
     width: 90%;
   color: $font;    color: $font;
   font-family: $sans;    font-family: $sans;
 }  }
   
 td.LC_menubuttons_img {  td.LC_menubuttons_img {
   background: $tabbg;  
 }  }
   
 .LC_current_location {  .LC_current_location {
   font-family: $sans;    font-family: $sans;
   background: $tabbg;    background: $tabbg;
Line 3803  td.LC_menubuttons_img { Line 3924  td.LC_menubuttons_img {
   font-weight: bold;    font-weight: bold;
 }  }
   
   .LC_rolesmenu_is {
     font-family: $sans;
   }
   
   .LC_rolesmenu_selected {
     font-family: $sans;
   }
   
   .LC_rolesmenu_future {
     font-family: $sans;
   }
   
   
   .LC_rolesmenu_will {
     font-family: $sans;
   }
   
   .LC_rolesmenu_will_not {
     font-family: $sans;
   }
   
   .LC_rolesmenu_expired {
     font-family: $sans;
   }
   
   .LC_rolesinfo {
     font-family: $sans;
   }
   
   .LC_dropadd_labeltext {
     font-family: $sans;
     text-align: right;
   }
   
   .LC_preferences_labeltext {
     font-family: $sans;
     text-align: right;
   }
   
 table.LC_aboutme_port {  table.LC_aboutme_port {
   border: 0px;    border: 0px;
   border-collapse: collapse;    border-collapse: collapse;
Line 3828  table.LC_nested { Line 3988  table.LC_nested {
   border-spacing: 0px;    border-spacing: 0px;
   width: 100%;    width: 100%;
 }  }
 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,
   table.LC_prior_tries tr th {
   font-weight: bold;    font-weight: bold;
   background-color: $data_table_head;    background-color: $data_table_head;
   font-size: smaller;    font-size: smaller;
Line 4206  span.LC_feedback_link { Line 4367  span.LC_feedback_link {
 }  }
   
 table.LC_prior_tries {  table.LC_prior_tries {
     border-width: 1px;    border: 1px solid #000000;
     border-style: solid;    border-collapse: separate;
     border-color: gray;    border-spacing: 1px;
     border-collapse: collapse;  
 }  }
 table.LC_prior_tries th,  
 table.LC_prior_tries td {  table.LC_prior_tries td {
     border-width: 1px;    padding: 2px;
     border-style: solid;  }
     border-color: gray;  
     padding: 3px;  .LC_answer_correct {
 }    background: #AAFFAA;
 table.LC_prior_tries tr.LC_correct {    color: black;
     font-weight: bold;  }
     background: #aaffaa;  .LC_answer_charged_try {
 }    background: #FFAAAA ! important;
 span.LC_prior_numerical {    color: black;
     font-family: monospace;  }
     white-space: pre;  .LC_answer_not_charged_try, 
   .LC_answer_no_grade,
   .LC_answer_late {
     background: #FFFFAA;
     color: black;
   }
   .LC_answer_previous {
     background: #AAAAFF;
     color: black;
   }
   .LC_answer_no_message {
     background: #FFFFFF;
     color: black;
   }
   .LC_answer_unknown {
     background: orange;
     color: black;
   }
   
   
   span.LC_prior_numerical,
   span.LC_prior_string,
   span.LC_prior_custom,
   span.LC_prior_reaction,
   span.LC_prior_math {
     font-family: monospace;
     white-space: pre;
   }
   
   span.LC_prior_string {
     font-family: monospace;
     white-space: pre;
   }
   
   table.LC_prior_option {
     width: 100%;
     border-collapse: collapse;
   }
   table.LC_prior_rank, table.LC_prior_match {
     border-collapse: collapse;
   }
   table.LC_prior_option tr td,
   table.LC_prior_rank tr td,
   table.LC_prior_match tr td {
     border: 1px solid #000000;
   }
   
   span.LC_nobreak {
     white-space: nowrap;
   }
   
   .LC_docs_course_commands div{
      float: left;
      border: 4px solid #AAAAAA;
      padding: 4px;
      background: #DDDDCC;
   }
   
   .LC_docs_copy {
      color: #000099;
      font-size: x-small;
   }
   .LC_docs_cut {
      color: #550044;
      font-size: x-small;
   }
   .LC_docs_rename {
      color: #009900;
      font-size: x-small;
   }
   .LC_docs_remove {
      color: #990000;
      font-size: x-small;
 }  }
   
 END  END
Line 4695  sub get_users_function { Line 4927  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 5056  Incoming parameters: Line 5288  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 5069  for users in the domain. Line 5308  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 5079  sub get_user_quota { Line 5318  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 5104  sub get_user_quota { Line 5358  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 6209  sub commit_customrole { Line 6499  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 6284  sub commit_studentrole { Line 6592  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 6306  sub construct_course { Line 6617  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 6447  sub construct_course { Line 6796  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 6467  sub construct_course { Line 6829  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 6524  sub construct_course { Line 6891  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 6535  sub construct_course { Line 6902  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 6562  sub construct_course { Line 6929  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.515  
changed lines
  Added in v.1.544


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