Diff for /loncom/interface/loncommon.pm between versions 1.610 and 1.633

version 1.610, 2007/11/06 19:02:57 version 1.633, 2008/01/06 04:38:57
Line 257  sub browser_and_searcher_javascript { Line 257  sub browser_and_searcher_javascript {
         }          }
         url += 'catalogmode=interactive&';          url += 'catalogmode=interactive&';
         url += 'mode=$mode&';          url += 'mode=$mode&';
           url += 'inhibitmenu=yes&';
         url += 'form=' + formname + '&';          url += 'form=' + formname + '&';
         if (only != null) {          if (only != null) {
             url += 'only=' + only + '&';              url += 'only=' + only + '&';
Line 471  sub setsec_javascript { Line 472  sub setsec_javascript {
     my ($sec_element,$formname) = @_;      my ($sec_element,$formname) = @_;
     my $setsections = qq|      my $setsections = qq|
 function setSect(sectionlist) {  function setSect(sectionlist) {
     var sectionsArray = sectionlist.split(",");      var sectionsArray = new Array();
       if ((sectionlist != '') && (typeof sectionlist != "undefined")) {
           sectionsArray = sectionlist.split(",");
       }
     var numSections = sectionsArray.length;      var numSections = sectionsArray.length;
     document.$formname.$sec_element.length = 0;      document.$formname.$sec_element.length = 0;
     if (numSections == 0) {      if (numSections == 0) {
Line 1941  sub authform_kerberos { Line 1945  sub authform_kerberos {
     if (defined($in{'curr_authtype'})) {      if (defined($in{'curr_authtype'})) {
         if ($in{'curr_authtype'} eq 'krb') {          if ($in{'curr_authtype'} eq 'krb') {
             $krbcheck = ' checked="on"';              $krbcheck = ' checked="on"';
               if (defined($in{'mode'})) {
                   if ($in{'mode'} eq 'modifyuser') {
                       $krbcheck = '';
                   }
               }
             if (defined($in{'curr_kerb_ver'})) {              if (defined($in{'curr_kerb_ver'})) {
                 if ($in{'curr_krb_ver'} eq '5') {                  if ($in{'curr_krb_ver'} eq '5') {
                     $check5 = ' checked="on"';                      $check5 = ' checked="on"';
Line 2038  sub authform_internal{ Line 2047  sub authform_internal{
         if ($in{'curr_authtype'} eq 'int') {          if ($in{'curr_authtype'} eq 'int') {
             if ($can_assign{'int'}) {              if ($can_assign{'int'}) {
                 $intcheck = 'checked="on" ';                  $intcheck = 'checked="on" ';
                   if (defined($in{'mode'})) {
                       if ($in{'mode'} eq 'modifyuser') {
                           $intcheck = '';
                       }
                   }
                 if (defined($in{'curr_autharg'})) {                  if (defined($in{'curr_autharg'})) {
                     $intarg = $in{'curr_autharg'};                      $intarg = $in{'curr_autharg'};
                 }                  }
Line 2072  sub authform_internal{ Line 2086  sub authform_internal{
     $result = &mt      $result = &mt
         ('[_1] Internally authenticated (with initial password [_2])',          ('[_1] Internally authenticated (with initial password [_2])',
          '<label>'.$authtype,'</label>'.$autharg);           '<label>'.$authtype,'</label>'.$autharg);
       $result.="<label><input type=\"checkbox\" name=\"visible\" onClick='if (this.checked) { this.form.intarg.type=\"text\" } else { this.form.intarg.type=\"password\" }' />".&mt('Visible input').'</label>';
     return $result;      return $result;
 }  }
   
Line 2087  sub authform_local{ Line 2102  sub authform_local{
         if ($in{'curr_authtype'} eq 'loc') {          if ($in{'curr_authtype'} eq 'loc') {
             if ($can_assign{'loc'}) {              if ($can_assign{'loc'}) {
                 $loccheck = 'checked="on" ';                  $loccheck = 'checked="on" ';
                   if (defined($in{'mode'})) {
                       if ($in{'mode'} eq 'modifyuser') {
                           $loccheck = '';
                       }
                   }
                 if (defined($in{'curr_autharg'})) {                  if (defined($in{'curr_autharg'})) {
                     $locarg = $in{'curr_autharg'};                      $locarg = $in{'curr_autharg'};
                 }                  }
Line 2136  sub authform_filesystem{ Line 2156  sub authform_filesystem{
         if ($in{'curr_authtype'} eq 'fsys') {          if ($in{'curr_authtype'} eq 'fsys') {
             if ($can_assign{'fsys'}) {              if ($can_assign{'fsys'}) {
                 $fsyscheck = 'checked="on" ';                  $fsyscheck = 'checked="on" ';
                   if (defined($in{'mode'})) {
                       if ($in{'mode'} eq 'modifyuser') {
                           $fsyscheck = '';
                       }
                   }
             } else {              } else {
                 $result = &mt('Currently Filesystem Authenticated.');                  $result = &mt('Currently Filesystem Authenticated.');
                 return $result;                  return $result;
Line 3645  sub get_domainconf { Line 3670  sub get_domainconf {
   
     my %domconfig = &Apache::lonnet::get_dom('configuration',      my %domconfig = &Apache::lonnet::get_dom('configuration',
      ['login','rolecolors'],$udom);       ['login','rolecolors'],$udom);
     my %designhash;      my (%designhash,%legacy);
     if (keys(%domconfig) > 0) {      if (keys(%domconfig) > 0) {
         if (ref($domconfig{'login'}) eq 'HASH') {          if (ref($domconfig{'login'}) eq 'HASH') {
             foreach my $key (keys(%{$domconfig{'login'}})) {              if (keys(%{$domconfig{'login'}})) {
                 $designhash{$udom.'.login.'.$key}=$domconfig{'login'}{$key};                  foreach my $key (keys(%{$domconfig{'login'}})) {
                       $designhash{$udom.'.login.'.$key}=$domconfig{'login'}{$key};
                   }
               } else {
                   $legacy{'login'} = 1;
             }              }
           } else {
               $legacy{'login'} = 1;
         }          }
         if (ref($domconfig{'rolecolors'}) eq 'HASH') {          if (ref($domconfig{'rolecolors'}) eq 'HASH') {
             foreach my $role (keys(%{$domconfig{'rolecolors'}})) {              if (keys(%{$domconfig{'rolecolors'}})) {
                 if (ref($domconfig{'rolecolors'}{$role}) eq 'HASH') {                  foreach my $role (keys(%{$domconfig{'rolecolors'}})) {
                     foreach my $item (keys(%{$domconfig{'rolecolors'}{$role}})) {                      if (ref($domconfig{'rolecolors'}{$role}) eq 'HASH') {
                         $designhash{$udom.'.'.$role.'.'.$item}=$domconfig{'rolecolors'}{$role}{$item};                          foreach my $item (keys(%{$domconfig{'rolecolors'}{$role}})) {
                               $designhash{$udom.'.'.$role.'.'.$item}=$domconfig{'rolecolors'}{$role}{$item};
                           }
                     }                      }
                 }                  }
               } else {
                   $legacy{'rolecolors'} = 1;
             }              }
           } else {
               $legacy{'rolecolors'} = 1;
         }          }
     } else {          if (keys(%legacy) > 0) {
         my $designdir=$Apache::lonnet::perlvar{'lonTabDir'}.'/lonDomColors';              my %legacyhash = &get_legacy_domconf($udom);
         my $designfile =  $designdir.'/'.$udom.'.tab';              foreach my $item (keys(%legacyhash)) {
         if (-e $designfile) {                  if ($item =~ /^\Q$udom\E\.login/) {
             if ( open (my $fh,"<$designfile") ) {                      if ($legacy{'login'}) { 
                 while (my $line = <$fh>) {                          $designhash{$item} = $legacyhash{$item};
                     next if ($line =~ /^\#/);                      }
                     chomp($line);                  } else {
                     my ($key,$val)=(split(/\=/,$line));                      if ($legacy{'rolecolors'}) {
                     if ($val) { $designhash{$udom.'.'.$key}=$val; }                          $designhash{$item} = $legacyhash{$item};
                       }
                 }                  }
                 close($fh);  
             }              }
         }          }
         if (-e '/home/httpd/html/adm/lonDomLogos/'.$udom.'.gif') {      } else {
             $designhash{$udom.'.login.domlogo'} = "/adm/lonDomLogos/$udom.gif";          %designhash = &get_legacy_domconf($udom); 
         }  
     }      }
     &Apache::lonnet::do_cache_new('domainconfig',$udom,\%designhash,      &Apache::lonnet::do_cache_new('domainconfig',$udom,\%designhash,
   $cachetime);    $cachetime);
     return %designhash;      return %designhash;
 }  }
   
   sub get_legacy_domconf {
       my ($udom) = @_;
       my %legacyhash;
       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) { $legacyhash{$udom.'.'.$key}=$val; }
               }
               close($fh);
           }
       }
       if (-e '/home/httpd/html/adm/lonDomLogos/'.$udom.'.gif') {
           $legacyhash{$udom.'.login.domlogo'} = "/adm/lonDomLogos/$udom.gif";
       }
       return %legacyhash;
   }
   
 =pod  =pod
   
 =item * &domainlogo()  =item * &domainlogo()
Line 4833  table.LC_descriptive_input td.LC_descrip Line 4891  table.LC_descriptive_input td.LC_descrip
   font-weight: bold;    font-weight: bold;
 }  }
 div.LC_feedback_link {  div.LC_feedback_link {
     clear: both;
   background: white;    background: white;
   width: 100%;      width: 100%;  
 }  }
Line 4920  span.LC_cusr_emph { Line 4979  span.LC_cusr_emph {
   font-style: italic;    font-style: italic;
 }  }
   
   span.LC_cusr_subheading {
     font-weight: normal;
     font-size: 85%;
   }
   
 table.LC_docs_documents {  table.LC_docs_documents {
   background: #BBBBBB;    background: #BBBBBB;
   border-width: 0px;    border-width: 0px;
Line 5036  div.LC_clear_float_footer { Line 5100  div.LC_clear_float_footer {
   
   
 div.LC_grade_select_mode {  div.LC_grade_select_mode {
   float: left;  
   font-family: $sans;    font-family: $sans;
 }  }
 div.LC_grade_select_mode div div {  div.LC_grade_select_mode div div {
Line 5096  span.LC_grade_check_note { Line 5159  span.LC_grade_check_note {
   right: 1em;    right: 1em;
 }  }
   
   table.LC_scantron_action {
     width: 100%;
   }
   table.LC_scantron_action tr th {
     font: normal bold $sans;
   }
   
 div.LC_edit_problem_header {  div.LC_edit_problem_header, 
   div.LC_edit_problem_footer {
   font: normal medium $sans;    font: normal medium $sans;
   margin: 2px;    margin: 2px;
 }  }
 div.LC_edit_problem_header,  div.LC_edit_problem_header,
 div.LC_edit_problem_header div,  div.LC_edit_problem_header div,
   div.LC_edit_problem_footer,
   div.LC_edit_problem_footer div,
 div.LC_edit_problem_editxml_header,  div.LC_edit_problem_editxml_header,
 div.LC_edit_problem_editxml_header div {  div.LC_edit_problem_editxml_header div {
   margin-top: 5px;    margin-top: 5px;
Line 5817  previous, future, or all. Line 5889  previous, future, or all.
 6. reference to results object (hash of hashes).  6. reference to results object (hash of hashes).
 7. reference to optional userdata hash  7. reference to optional userdata hash
 8. reference to optional statushash  8. reference to optional statushash
   9. flag if privileged users (except those set to unhide in
      course settings) should be excluded    
 Keys of top level results hash are roles.  Keys of top level results hash are roles.
 Keys of inner hashes are username:domain, with   Keys of inner hashes are username:domain, with 
 values set to access type.  values set to access type.
Line 5833  of the possibility of multiple values fo Line 5907  of the possibility of multiple values fo
 ###############################################  ###############################################
   
 sub get_course_users {  sub get_course_users {
     my ($cdom,$cnum,$types,$roles,$sections,$users,$userdata,$statushash) = @_;      my ($cdom,$cnum,$types,$roles,$sections,$users,$userdata,$statushash,$hidepriv) = @_;
     my %idx = ();      my %idx = ();
     my %seclists;      my %seclists;
   
Line 5850  sub get_course_users { Line 5924  sub get_course_users {
         my ($classlist,$keylist)=&Apache::loncoursedata::get_classlist($cdom,$cnum);          my ($classlist,$keylist)=&Apache::loncoursedata::get_classlist($cdom,$cnum);
         my $now = time;          my $now = time;
         foreach my $student (keys(%{$classlist})) {          foreach my $student (keys(%{$classlist})) {
             my $status;  
             my $match = 0;              my $match = 0;
             my $secmatch = 0;              my $secmatch = 0;
             my $section = $$classlist{$student}[$idx{section}];              my $section = $$classlist{$student}[$idx{section}];
Line 5910  sub get_course_users { Line 5983  sub get_course_users {
                               active   => 'Active',                                active   => 'Active',
                               future   => 'Future',                                future   => 'Future',
                             );                              );
           my %nothide;
           if ($hidepriv) {
               my %coursehash=&Apache::lonnet::coursedescription($cdom.'_'.$cnum);
               foreach my $user (split(/\s*\,\s*/,$coursehash{'nothideprivileged'})) {
                   if ($user !~ /:/) {
                       $nothide{join(':',split(/[\@]/,$user))}=1;
                   } else {
                       $nothide{$user} = 1;
                   }
               }
           }
         foreach my $person (sort(keys(%coursepersonnel))) {          foreach my $person (sort(keys(%coursepersonnel))) {
             my $match = 0;              my $match = 0;
             my $secmatch = 0;              my $secmatch = 0;
Line 5943  sub get_course_users { Line 6027  sub get_course_users {
                     $usec = 'none';                      $usec = 'none';
                 }                  }
                 if ($uname ne '' && $udom ne '') {                  if ($uname ne '' && $udom ne '') {
                       if ($hidepriv) {
                           if ((&Apache::lonnet::privileged($uname,$udom)) &&
                               (!$nothide{$uname.':'.$udom})) {
                               next;
                           }
                       }
                     if ($end > 0 && $end < $now) {                      if ($end > 0 && $end < $now) {
                         $status = 'previous';                          $status = 'previous';
                     } elsif ($start > $now) {                      } elsif ($start > $now) {
Line 6137  sub default_quota { Line 6227  sub default_quota {
     my ($udom,$inststatus) = @_;      my ($udom,$inststatus) = @_;
     my ($defquota,$settingstatus);      my ($defquota,$settingstatus);
     my %quotahash = &Apache::lonnet::get_dom('configuration',      my %quotahash = &Apache::lonnet::get_dom('configuration',
                                             ['quota'],$udom);                                              ['quotas'],$udom);
     if (ref($quotahash{'quota'}) eq 'HASH') {      if (ref($quotahash{'quotas'}) eq 'HASH') {
         if ($inststatus ne '') {          if ($inststatus ne '') {
             my @statuses = split(/:/,$inststatus);              my @statuses = split(/:/,$inststatus);
             foreach my $item (@statuses) {              foreach my $item (@statuses) {
                 if ($quotahash{'quota'}{$item} ne '') {                  if ($quotahash{'quotas'}{$item} ne '') {
                     if ($defquota eq '') {                      if ($defquota eq '') {
                         $defquota = $quotahash{'quota'}{$item};                          $defquota = $quotahash{'quotas'}{$item};
                         $settingstatus = $item;                          $settingstatus = $item;
                     } elsif ($quotahash{'quota'}{$item} > $defquota) {                      } elsif ($quotahash{'quotas'}{$item} > $defquota) {
                         $defquota = $quotahash{'quota'}{$item};                          $defquota = $quotahash{'quotas'}{$item};
                         $settingstatus = $item;                          $settingstatus = $item;
                     }                      }
                 }                  }
             }              }
         }          }
         if ($defquota eq '') {          if ($defquota eq '') {
             $defquota = $quotahash{'quota'}{'default'};              $defquota = $quotahash{'quotas'}{'default'};
             $settingstatus = 'default';              $settingstatus = 'default';
         }          }
     } else {      } else {
Line 6206  sub get_secgrprole_info { Line 6296  sub get_secgrprole_info {
 }  }
   
 sub user_picker {  sub user_picker {
     my ($dom,$srch,$forcenewuser,$caller) = @_;      my ($dom,$srch,$forcenewuser,$caller,$cancreate,$usertype) = @_;
     my $currdom = $dom;      my $currdom = $dom;
     my %curr_selected = (      my %curr_selected = (
                         srchin => 'dom',                          srchin => 'dom',
                         srchby => 'lastname',                          srchby => 'lastname',
                       );                        );
     my $srchterm;      my $srchterm;
     if (ref($srch) eq 'HASH') {      if ((ref($srch) eq 'HASH') && ($env{'form.origform'} ne 'crtusername')) {
         if ($srch->{'srchby'} ne '') {          if ($srch->{'srchby'} ne '') {
             $curr_selected{'srchby'} = $srch->{'srchby'};              $curr_selected{'srchby'} = $srch->{'srchby'};
         }          }
Line 6300  sub user_picker { Line 6390  sub user_picker {
     if ($forcenewuser) {      if ($forcenewuser) {
         if (ref($srch) eq 'HASH') {          if (ref($srch) eq 'HASH') {
             if ($srch->{'srchby'} eq 'uname' && $srch->{'srchtype'} eq 'exact' && $srch->{'srchin'} eq 'dom' && $srch->{'srchdomain'} eq $env{'request.role.domain'}) {              if ($srch->{'srchby'} eq 'uname' && $srch->{'srchtype'} eq 'exact' && $srch->{'srchin'} eq 'dom' && $srch->{'srchdomain'} eq $env{'request.role.domain'}) {
         $new_user_create = '<p> <input type="submit" name="forcenew" value="'.&HTML::Entities::encode(&mt('Make new user "[_1]"',$srchterm),'<>&"').'" onclick="javascript:setSearch(\'1\','.$caller.');" /> </p>';                  if ($cancreate) {
                       $new_user_create = '<p> <input type="submit" name="forcenew" value="'.&HTML::Entities::encode(&mt('Make new user "[_1]"',$srchterm),'<>&"').'" onclick="javascript:setSearch(\'1\','.$caller.');" /> </p>';
                   } else {
                       my $helplink = ' href="javascript:helpMenu('."'display'".')"';
                       my %usertypetext = (
                           official   => 'institutional',
                           unofficial => 'non-institutional',
                       );
                       $new_user_create = '<br /><span class="LC_warning">'.&mt("You are not authorized to create new $usertypetext{$usertype} users in this domain.").' '.&mt('Contact the <a[_1]>helpdesk</a> for assistance.',$helplink).'</span><br /><br />';
                   }
             }              }
         }          }
   
Line 6429  END_BLOCK Line 6528  END_BLOCK
     return $output;      return $output;
 }  }
   
 sub username_rule_check {  sub user_rule_check {
     my ($srch,$caller) = @_;      my ($usershash,$checks,$alerts,$rulematch,$inst_results,$curr_rules,$got_rules) = @_;
     my ($response,@curr_rules,%inst_results,$rulematch);      my $response;
     my ($rules,$ruleorder) = &Apache::lonnet::inst_userrules($srch->{'srchdomain'});      if (ref($usershash) eq 'HASH') {
     if (ref($srch) eq 'HASH') {          foreach my $user (keys(%{$usershash})) {
         (my $inst_response,%inst_results) =               my ($uname,$udom) = split(/:/,$user);
             &Apache::lonnet::get_instuser($srch->{'srchdomain'},              next if ($udom eq '' || $uname eq '');
                                           $srch->{'srchterm'});              my ($id,$newuser);
         my %domconfig = &Apache::lonnet::get_dom('configuration',              if (ref($usershash->{$user}) eq 'HASH') {
                               ['usercreation'],$srch->{'srchdomain'});                  $newuser = $usershash->{$user}->{'newuser'};
         if (ref($domconfig{'usercreation'}) eq 'HASH') {                  $id = $usershash->{$user}->{'id'};
             if (ref($domconfig{'usercreation'}{'username_rule'}) eq 'ARRAY') {              }
                 @curr_rules = @{$domconfig{'usercreation'}{'username_rule'}};              my $inst_response;
             }              if (ref($checks) eq 'HASH') {
         }                  if (defined($checks->{'username'})) {
         if (@curr_rules > 0) {                      ($inst_response,%{$inst_results->{$user}}) = 
             my $domdesc = &Apache::lonnet::domain($srch->{'srchdomain'},'description');                          &Apache::lonnet::get_instuser($udom,$uname);
             my $instuser_reqd;                  } elsif (defined($checks->{'id'})) {
             my %rule_check = &Apache::lonnet::inst_rulecheck($srch->{'srchdomain'},$srch->{'srchterm'},\@curr_rules);                      ($inst_response,%{$inst_results->{$user}}) =
             foreach my $rule (@curr_rules) {                          &Apache::lonnet::get_instuser($udom,undef,$id);
                 if ($rule_check{$rule}) {                  }
                     $rulematch = $rule;              } else {
                     if ($inst_response eq 'ok') {                  ($inst_response,%{$inst_results->{$user}}) =
                         if (keys(%inst_results) == 0) {                      &Apache::lonnet::get_instuser($udom,$uname);
                             if ($caller eq 'new') {                  return;
                                 $response = &mt('The username you chose matches the format of usernames defined for <span class="LC_cusr_emph">[_1]</span>, but the user does not exist in the institutional directory.',$domdesc).'<br />'.&mt("You must choose a username with a different format -- one that will not conflict with 'official' institutional usernames.");              }
                             }              if (!$got_rules->{$udom}) {
                   my %domconfig = &Apache::lonnet::get_dom('configuration',
                                                     ['usercreation'],$udom);
                   if (ref($domconfig{'usercreation'}) eq 'HASH') {
                       foreach my $item ('username','id') {
                           if (ref($domconfig{'usercreation'}{$item.'_rule'}) eq 'ARRAY') {
                               $$curr_rules{$udom}{$item} = 
                                   $domconfig{'usercreation'}{$item.'_rule'};
                         }                          }
                     }                      }
                     last;  
                 }                  }
                   $got_rules->{$udom} = 1;  
             }              }
             if ($response) {              foreach my $item (keys(%{$checks})) {
                 if ((ref($rules) eq 'HASH') && (ref($ruleorder) eq 'ARRAY')) {                  if (ref($$curr_rules{$udom}) eq 'HASH') {
                     if (@{$ruleorder} > 0) {                      if (ref($$curr_rules{$udom}{$item}) eq 'ARRAY') {
                         $response .= '<br />'.&mt('Usernames with the following format(s) may <span class="LC_cusr_emph">only</span> be used for verified users at [_1]:',$domdesc).' <ul>';                          if (@{$$curr_rules{$udom}{$item}} > 0) {
                         foreach my $rule (@{$ruleorder}) {                              my %rule_check = &Apache::lonnet::inst_rulecheck($udom,$uname,$id,$item,$$curr_rules{$udom}{$item});
                             if (grep(/^\Q$rule\E$/,@curr_rules)) {                              foreach my $rule (@{$$curr_rules{$udom}{$item}}) {
                                 if (ref($rules->{$rule}) eq 'HASH') {                                  if ($rule_check{$rule}) {
                                     $response .= '<li>'.$rules->{$rule}{'name'}.': '.                                      $$rulematch{$user}{$item} = $rule;
                                                  $rules->{$rule}{'desc'}.'</li>';                                      if ($inst_response eq 'ok') {
                                           if (ref($inst_results) eq 'HASH') {
                                               if (ref($inst_results->{$user}) eq 'HASH') {
                                                   if (keys(%{$inst_results->{$user}}) == 0) {
                                                       $$alerts{$item}{$udom}{$uname} = 1;
                                                   }
                                               }
                                           }
                                       }
                                       last;
                                 }                                  }
                             }                              }
                         }                          }
                     }                      }
                     $response .= '</ul>';  
                 }                  }
             }              }
         }          }
     }      }
     return ($response,$rulematch,$rules,%inst_results);      return;
   }
   
   sub user_rule_formats {
       my ($domain,$domdesc,$curr_rules,$check) = @_;
       my %text = ( 
                    'username' => 'Usernames',
                    'id'       => 'IDs',
                  );
       my $output;
       my ($rules,$ruleorder) = &Apache::lonnet::inst_userrules($domain,$check);
       if ((ref($rules) eq 'HASH') && (ref($ruleorder) eq 'ARRAY')) {
           if (@{$ruleorder} > 0) {
               $output = '<br />'.&mt("$text{$check} with the following format(s) may <span class=\"LC_cusr_emph\">only</span> be used for verified users at [_1]:",$domdesc).' <ul>';
               foreach my $rule (@{$ruleorder}) {
                   if (ref($curr_rules) eq 'ARRAY') {
                       if (grep(/^\Q$rule\E$/,@{$curr_rules})) {
                           if (ref($rules->{$rule}) eq 'HASH') {
                               $output .= '<li>'.$rules->{$rule}{'name'}.': '.
                                           $rules->{$rule}{'desc'}.'</li>';
                           }
                       }
                   }
               }
               $output .= '</ul>';
           }
       }
       return $output;
   }
   
   sub instrule_disallow_msg {
       my ($checkitem,$domdesc,$count,$mode) = @_;
       my $response;
       my %text = (
                     item   => 'username',
                     items  => 'usernames',
                     match  => 'matches',
                     do     => 'does',
                     action => 'a username',
                     one    => 'one',
                  );
       if ($count > 1) {
           $text{'item'} = 'usernames';
           $text{'match'} ='match';
           $text{'do'} = 'do';
           $text{'action'} = 'usernames',
           $text{'one'} = 'ones';
       }
       if ($checkitem eq 'id') {
           $text{'items'} = 'IDs';
           $text{'item'} = 'ID';
           $text{'action'} = 'an ID';
           if ($count > 1) {
               $text{'item'} = 'IDs';
               $text{'action'} = 'IDs';
           }
       }
       $response = &mt("The $text{'item'} you chose $text{'match'} the format of $text{'items'} defined for <span class=\"LC_cusr_emph\">[_1]</span>, but the $text{'item'} $text{'do'} not exist in the institutional directory.",$domdesc).'<br />';
       if ($mode eq 'upload') {
           if ($checkitem eq 'username') {
               $response .= &mt("You will need to modify your upload file so it will include $text{'action'} with a different format --  $text{'one'} that will not conflict with 'official' institutional $text{'items'}.");
           } elsif ($checkitem eq 'id') {
               $response .= &mt("Either upload a file which includes $text{'action'} with a different format --  $text{'one'} that will not conflict with 'official' institutional $text{'items'}, or when associating fields with data columns, omit an association for the ID/Student Number field.");
           }
       } else {
           if ($checkitem eq 'username') {
               $response .= &mt("You must choose $text{'action'} with a different format --  $text{'one'} that will not conflict with 'official' institutional $text{'items'}.");
           } elsif ($checkitem eq 'id') {
               $response .= &mt("You must either choose $text{'action'} with a different format --  $text{'one'} that will not conflict with 'official' institutional $text{'items'}, or leave the ID field blank.");
           }
       }
       return $response;
   }
   
   sub personal_data_fieldtitles {
       my %fieldtitles = &Apache::lonlocal::texthash (
                           id => 'Student/Employee ID',
                           permanentemail => 'E-mail address',
                           lastname => 'Last Name',
                           firstname => 'First Name',
                           middlename => 'Middle Name',
                           generation => 'Generation',
                           gen => 'Generation',
                      );
       return %fieldtitles;
 }  }
   
 =pod  =pod
Line 7460  a hash ref describing the data to be sto Line 7658  a hash ref describing the data to be sto
   
 Returns: both routines return nothing  Returns: both routines return nothing
   
   =back
   
 =cut  =cut
   
 #######################################################  #######################################################
Line 7540  sub restore_settings { Line 7740  sub restore_settings {
     }      }
 }  }
   
   #######################################################
   #######################################################
   
   =pod
   
   =head1 Domain E-mail Routines  
   
   =over 4
   
   =item &build_recipient_list
   
   Build recipient lists for three types of e-mail:
   (a) Error Reports, (b) Package Updates, (c) Help requests, generated by
   lonerrorhandler.pm, CHECKRPMS and lonsupportreq.pm respectively.
   
   Inputs:
   defmail (scalar - email address of default recipient), 
   mailing type (scalar - errormail, packagesmail, or helpdeskmail), 
   defdom (domain for which to retrieve configuration settings),
   origmail (scalar - email address of recipient from loncapa.conf, 
   i.e., predates configuration by DC via domainprefs.pm 
   
   Returns: comma separated list of addresses to which to send e-mail.   
   
   =cut
   
   ############################################################
   ############################################################
   sub build_recipient_list {
       my ($defmail,$mailing,$defdom,$origmail) = @_;
       my @recipients;
       my $otheremails;
       my %domconfig =
            &Apache::lonnet::get_dom('configuration',['contacts'],$defdom);
       if (ref($domconfig{'contacts'}) eq 'HASH') {
           if (ref($domconfig{'contacts'}{$mailing}) eq 'HASH') {
               my @contacts = ('adminemail','supportemail');
               foreach my $item (@contacts) {
                   if ($domconfig{'contacts'}{$mailing}{$item}) {
                       my $addr = $domconfig{'contacts'}{$item}; 
                       if (!grep(/^\Q$addr\E$/,@recipients)) {
                           push(@recipients,$addr);
                       }
                   }
                   $otheremails = $domconfig{'contacts'}{$mailing}{'others'};
               }
           }
       } elsif ($origmail ne '') {
           push(@recipients,$origmail);
       }
       if ($defmail ne '') {
           push(@recipients,$defmail);
       }
       if ($otheremails) {
           my @others;
           if ($otheremails =~ /,/) {
               @others = split(/,/,$otheremails);
           } else {
               push(@others,$otheremails);
           }
           foreach my $addr (@others) {
               if (!grep(/^\Q$addr\E$/,@recipients)) {
                   push(@recipients,$addr);
               }
           }
       }
       my $recipientlist = join(',',@recipients); 
       return $recipientlist;
   }
   
 ############################################################  ############################################################
 ############################################################  ############################################################
   
 sub commit_customrole {  sub commit_customrole {
     my ($udom,$uname,$url,$three,$four,$five,$start,$end) = @_;      my ($udom,$uname,$url,$three,$four,$five,$start,$end) = @_;
     my $output = &mt('Assigning custom role').' "'.$five.'" by '.$four.'@'.$three.' in '.$url.      my $output = &mt('Assigning custom role').' "'.$five.'" by '.$four.':'.$three.' in '.$url.
                          ($start?', '.&mt('starting').' '.localtime($start):'').                           ($start?', '.&mt('starting').' '.localtime($start):'').
                          ($end?', ending '.localtime($end):'').': <b>'.                           ($end?', ending '.localtime($end):'').': <b>'.
               &Apache::lonnet::assigncustomrole(                &Apache::lonnet::assigncustomrole(
Line 7566  sub commit_standardrole { Line 7836  sub commit_standardrole {
         my $result = &commit_studentrole(\$logmsg,$udom,$uname,$url,$three,$start,$end,          my $result = &commit_studentrole(\$logmsg,$udom,$uname,$url,$three,$start,$end,
                                          $one,$two,$sec,$context);                                           $one,$two,$sec,$context);
         if (($result =~ /^error/) || ($result eq 'not_in_class') ||           if (($result =~ /^error/) || ($result eq 'not_in_class') || 
             ($result eq 'unknown_course')) {              ($result eq 'unknown_course') || ($result eq 'refused')) {
             $output = "Error: $result\n";               $output = $logmsg.' '.&mt('Error: ').$result."\n"; 
         } else {          } else {
             $output = $logmsg.$linefeed.&mt('Assigning').' '.$three.' in '.$url.              $output = $logmsg.$linefeed.&mt('Assigning').' '.$three.' in '.$url.
                ($start?', '.&mt('starting').' '.localtime($start):'').                 ($start?', '.&mt('starting').' '.localtime($start):'').
Line 7596  sub commit_standardrole { Line 7866  sub commit_standardrole {
   
 sub commit_studentrole {  sub commit_studentrole {
     my ($logmsg,$udom,$uname,$url,$three,$start,$end,$one,$two,$sec,$context) = @_;      my ($logmsg,$udom,$uname,$url,$three,$start,$end,$one,$two,$sec,$context) = @_;
     my ($result,$linefeed);      my ($result,$linefeed,$oldsecurl,$newsecurl);
     if ($context eq 'auto') {      if ($context eq 'auto') {
         $linefeed = "\n";          $linefeed = "\n";
     } else {      } else {
Line 7608  sub commit_studentrole { Line 7878  sub commit_studentrole {
         my $secchange = 0;          my $secchange = 0;
         my $expire_role_result;          my $expire_role_result;
         my $modify_section_result;          my $modify_section_result;
         unless ($oldsec eq '-1') {          if ($oldsec ne '-1') { 
             unless ($sec eq $oldsec) {              if ($oldsec ne $sec) {
                 $secchange = 1;                  $secchange = 1;
                   my $now = time;
                 my $uurl='/'.$cid;                  my $uurl='/'.$cid;
                 $uurl=~s/\_/\//g;                  $uurl=~s/\_/\//g;
                 if ($oldsec) {                  if ($oldsec) {
                     $uurl.='/'.$oldsec;                      $uurl.='/'.$oldsec;
                 }                  }
                 $expire_role_result = &Apache::lonnet::assignrole($udom,$uname,$uurl,'st',time);                  $oldsecurl = $uurl;
                   $expire_role_result = 
                       &Apache::lonnet::assignrole($udom,$uname,$uurl,'st',$now);
                   if ($env{'request.course.sec'} ne '') { 
                       if ($expire_role_result eq 'refused') {
                           my @roles = ('st');
                           my @statuses = ('previous');
                           my @roledoms = ($one);
                           my $withsec = 1;
                           my %roleshash = 
                               &Apache::lonnet::get_my_roles($uname,$udom,'userroles',
                                                 \@statuses,\@roles,\@roledoms,$withsec);
                           if (defined ($roleshash{$two.':'.$one.':st:'.$oldsec})) {
                               my ($oldstart,$oldend) = 
                                   split(':',$roleshash{$two.':'.$one.':st:'.$oldsec});
                               if ($oldend > 0 && $oldend <= $now) {
                                   $expire_role_result = 'ok';
                               }
                           }
                       }
                   }
                 $result = $expire_role_result;                  $result = $expire_role_result;
             }              }
         }          }
Line 7624  sub commit_studentrole { Line 7915  sub commit_studentrole {
             $modify_section_result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,'','',$cid);              $modify_section_result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,'','',$cid);
             if ($modify_section_result =~ /^ok/) {              if ($modify_section_result =~ /^ok/) {
                 if ($secchange == 1) {                  if ($secchange == 1) {
                     $$logmsg .= "Section for $uname switched from old section: $oldsec to new section: $sec".$linefeed;                      if ($sec eq '') {
                           $$logmsg .= &mt('Section for [_1] switched from (possibly expired) old section: [_2] to student role without a section.',$uname,$oldsec).$linefeed;
                       } else {
                           $$logmsg .= &mt('Section for [_1] switched from (possibly expired) old section: [_2] to new section: [_3].',$uname,$oldsec,$sec).$linefeed;
                       }
                 } elsif ($oldsec eq '-1') {                  } elsif ($oldsec eq '-1') {
                     $$logmsg .= "New student role for $uname in section $sec in course $cid".$linefeed;                      if ($sec eq '') {
                           $$logmsg .= &mt('New student role without a section for [_1] in course [_2].',$uname,$cid).$linefeed;
                       } else {
                           $$logmsg .= &mt('New student role for [_1] in section [_2] in course [_3].',$uname,$sec,$cid).$linefeed;
                       }
                 } else {                  } else {
                     $$logmsg .= "Student $uname assigned to unchanged section $sec in course $cid".$linefeed;                      if ($sec eq '') {
                           $$logmsg .= &mt('Student [_1] assigned to course [_2] without a section.',$uname,$cid).$linefeed;
                       } else {
                           $$logmsg .= &mt('Student [_1] assigned to section [_2] in course [_3].',$uname,$sec,$cid).$linefeed;
                       }
                 }                  }
             } else {              } else {
                 $$logmsg .= "Error when attempting section change for $uname from old section $oldsec to new section: $sec in course $cid -error: $modify_section_result".$linefeed;                  if ($secchange) {       
                       $$logmsg .= &mt('Error when attempting section change for [_1] from old section "[_2]" to new section: "[_3]" in course [_4] -error:',$uname,$oldsec,$sec,$cid).' '.$modify_section_result.$linefeed;
                   } else {
                       $$logmsg .= &mt('Error when attempting to modify role for [_1] for section: "[_2]" in course [_3] -error:',$uname,$sec,$cid).' '.$modify_section_result.$linefeed;
                   }
             }              }
             $result = $modify_section_result;              $result = $modify_section_result;
         } elsif ($secchange == 1) {          } elsif ($secchange == 1) {
             $$logmsg .= "Error when attempting to expire role for $uname in old section $oldsec in course $cid -error: $expire_role_result".$linefeed;              if ($oldsec eq '') {
                   $$logmsg .= &mt('Error when attempting to expire existing role without a section for [_1] in course [_3] -error: ',$uname,$cid).' '.$expire_role_result.$linefeed;
               } else {
                   $$logmsg .= &mt('Error when attempting to expire existing role for [_1] in section [_2] in course [_3] -error: ',$uname,$oldsec,$cid).' '.$expire_role_result.$linefeed;
               }
               if ($expire_role_result eq 'refused') {
                   my $newsecurl = '/'.$cid;
                   $newsecurl =~ s/\_/\//g;
                   if ($sec ne '') {
                       $newsecurl.='/'.$sec;
                   }
                   if (&Apache::lonnet::allowed('cst',$newsecurl) && !(&Apache::lonnet::allowed('cst',$oldsecurl))) {
                       if ($sec eq '') {
                           $$logmsg .= &mt('Although your current role has privileges to add students to section "[_1]", you do not have privileges to modify existing enrollments unaffiliated with any section.',$sec).$linefeed;
                       } else {
                           $$logmsg .= &mt('Although your current role has privileges to add students to section "[_1]", you do not have privileges to modify existing enrollments in other sections.',$sec).$linefeed;
                       }
                   }
               }
         }          }
     } else {      } else {
         $$logmsg .= "Incomplete course id defined.  Addition of user $uname from domain $udom to course $one\_$two, section $sec not completed.$linefeed";          $$logmsg .= &mt('Incomplete course id defined.').$linefeed.&mt('Addition of user [_1] from domain [_2] to course [_3], section [_4] not completed.',$uname,$udom,$one.'_'.$two,$sec).$linefeed;
         $result = "error: incomplete course id\n";          $result = "error: incomplete course id\n";
     }      }
     return $result;      return $result;
Line 7850  sub construct_course { Line 8175  sub construct_course {
     }      }
     if ($args->{'notify_dc'}) {      if ($args->{'notify_dc'}) {
         if ($uname ne '') {           if ($uname ne '') { 
             push(@notified,$uname.'@'.$udom);              push(@notified,$uname.':'.$udom);
         }          }
     }      }
     if (@notified > 0) {      if (@notified > 0) {

Removed from v.1.610  
changed lines
  Added in v.1.633


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