Diff for /loncom/interface/loncommon.pm between versions 1.577 and 1.585

version 1.577, 2007/08/31 17:58:47 version 1.585, 2007/09/12 23:32:59
Line 860  sub help_menu_js { Line 860  sub help_menu_js {
  'js_ready'    => 1,   'js_ready'    => 1,
  'add_entries' => {   'add_entries' => {
     'border' => '0',      'border' => '0',
     'rows'   => "105,*",},});      'rows'   => "110,*",},});
     my $end_page =      my $end_page =
         &Apache::loncommon::end_page({'frameset' => 1,          &Apache::loncommon::end_page({'frameset' => 1,
       'js_ready' => 1,});        'js_ready' => 1,});
Line 2531  sub preferred_languages { Line 2531  sub preferred_languages {
  @languages=(@languages,   @languages=(@languages,
     split(/\s*(\,|\;|\:)\s*/,$env{'environment.languages'}));      split(/\s*(\,|\;|\:)\s*/,$env{'environment.languages'}));
     }      }
     my $browser=(split(/\;/,$ENV{'HTTP_ACCEPT_LANGUAGE'}))[0];      my $browser=$ENV{'HTTP_ACCEPT_LANGUAGE'};
     if ($browser) {      if ($browser) {
  @languages=(@languages,split(/\s*(\,|\;|\:)\s*/,$browser));   my @browser = 
       map { (split(/\s*;\s*/,$_))[0] } (split(/\s*,\s*/,$browser));
    push(@languages,@browser);
     }      }
     if (&Apache::lonnet::domain($env{'user.domain'},'lang_def')) {      if (&Apache::lonnet::domain($env{'user.domain'},'lang_def')) {
  @languages=(@languages,   @languages=(@languages,
Line 2555  sub preferred_languages { Line 2557  sub preferred_languages {
     my @genlanguages;      my @genlanguages;
     foreach my $lang (@languages) {      foreach my $lang (@languages) {
  unless ($lang=~/\w/) { next; }   unless ($lang=~/\w/) { next; }
  push (@genlanguages,$lang);   push(@genlanguages,$lang);
  if ($lang=~/(\-|\_)/) {   if ($lang=~/(\-|\_)/) {
     push(@genlanguages,(split(/(\-|\_)/,$lang))[0]);      push(@genlanguages,(split(/(\-|\_)/,$lang))[0]);
  }   }
     }      }
       #uniqueify the languages list
       my %count;
       @genlanguages = map { $count{$_}++ == 0 ? $_ : () } @genlanguages;
     return @genlanguages;      return @genlanguages;
 }  }
   
   sub languages {
       my ($possible_langs) = @_;
       my @preferred_langs = &preferred_languages();
       if (!ref($possible_langs)) {
    if( wantarray ) {
       return @preferred_langs;
    } else {
       return $preferred_langs[0];
    }
       }
       my %possibilities = map { $_ => 1 } (@$possible_langs);
       my @preferred_possibilities;
       foreach my $preferred_lang (@preferred_langs) {
    if (exists($possibilities{$preferred_lang})) {
       push(@preferred_possibilities, $preferred_lang);
    }
       }
       if( wantarray ) {
    return @preferred_possibilities;
       }
       return $preferred_possibilities[0];
   }
   
 ###############################################################  ###############################################################
 ##               Student Answer Attempts                     ##  ##               Student Answer Attempts                     ##
 ###############################################################  ###############################################################
Line 2637  sub get_previous_attempt { Line 2665  sub get_previous_attempt {
  for ($version=1;$version<=$returnhash{'version'};$version++) {   for ($version=1;$version<=$returnhash{'version'};$version++) {
   $prevattempts.='</tr><tr bgcolor="#ffffe6"><td>Transaction '.$version.'</td>';    $prevattempts.='</tr><tr bgcolor="#ffffe6"><td>Transaction '.$version.'</td>';
     foreach my $key (sort(keys(%lasthash))) {      foreach my $key (sort(keys(%lasthash))) {
        my $value;   my $value = &format_previous_attempt_value($key,
        if ($key =~ /timestamp/) {     $returnhash{$version.':'.$key});
   $value=scalar(localtime($returnhash{$version.':'.$key}));   $prevattempts.='<td>'.$value.'&nbsp;</td>';   
        } else {  
   $value=$returnhash{$version.':'.$key};  
        }  
        $prevattempts.='<td>'.&unescape($value).'&nbsp;</td>';     
     }      }
  }   }
       }        }
       $prevattempts.='</tr><tr bgcolor="#ffffe6"><td>Current</td>';        $prevattempts.='</tr><tr bgcolor="#ffffe6"><td>Current</td>';
       foreach my $key (sort(keys(%lasthash))) {        foreach my $key (sort(keys(%lasthash))) {
  my $value;   my $value = &format_previous_attempt_value($key,$lasthash{$key});
  if ($key =~ /timestamp/) {  
   $value=scalar(localtime($lasthash{$key}));  
  } else {  
   $value=$lasthash{$key};  
  }  
  $value=&unescape($value);  
  if ($key =~/$regexp$/ && (defined &$gradesub)) {$value = &$gradesub($value)}   if ($key =~/$regexp$/ && (defined &$gradesub)) {$value = &$gradesub($value)}
  $prevattempts.='<td>'.$value.'&nbsp;</td>';   $prevattempts.='<td>'.$value.'&nbsp;</td>';
       }        }
Line 2668  sub get_previous_attempt { Line 2686  sub get_previous_attempt {
   }    }
 }  }
   
   sub format_previous_attempt_value {
       my ($key,$value) = @_;
       if ($key =~ /timestamp/) {
    $value = &Apache::lonlocal::locallocaltime($value);
       } elsif (ref($value) eq 'ARRAY') {
    $value = '('.join(', ', @{ $value }).')';
       } else {
    $value = &unescape($value);
       }
       return $value;
   }
   
   
 sub relative_to_absolute {  sub relative_to_absolute {
     my ($url,$output)=@_;      my ($url,$output)=@_;
     my $parser=HTML::TokeParser->new(\$output);      my $parser=HTML::TokeParser->new(\$output);
Line 4330  table#LC_helpmenu_links a:hover { Line 4361  table#LC_helpmenu_links a:hover {
   border: 1px solid #8888FF;    border: 1px solid #8888FF;
   background: #CCCCFF;    background: #CCCCFF;
 }  }
   
 table.LC_pick_box {  table.LC_pick_box {
   width: 100%;  
   border-collapse: separate;    border-collapse: separate;
   background: white;    background: white;
   border: 1px solid black;    border: 1px solid black;
Line 4345  table.LC_pick_box td.LC_pick_box_title { Line 4374  table.LC_pick_box td.LC_pick_box_title {
   width: 184px;    width: 184px;
   padding: 8px;    padding: 8px;
 }  }
   table.LC_pick_box td.LC_pick_box_value {
     text-align: left;
     padding: 8px;
   }
   table.LC_pick_box td.LC_pick_box_select {
     text-align: left;
     padding: 8px;
   }
 table.LC_pick_box td.LC_pick_box_separator {  table.LC_pick_box td.LC_pick_box_separator {
   padding: 0px;    padding: 0px;
   height: 1px;    height: 1px;
Line 4353  table.LC_pick_box td.LC_pick_box_separat Line 4390  table.LC_pick_box td.LC_pick_box_separat
 table.LC_pick_box td.LC_pick_box_submit {  table.LC_pick_box td.LC_pick_box_submit {
   text-align: right;    text-align: right;
 }  }
   table.LC_pick_box td.LC_evenrow_value {
     text-align: left;
     padding: 8px;
     background-color: $data_table_light;
   }
   table.LC_pick_box td.LC_oddrow_value {
     text-align: left;
     padding: 8px;
     background-color: $data_table_light;
   }
   table.LC_helpform_receipt {
     width: 620px;
     border-collapse: separate;
     background: white;
     border: 1px solid black;
     border-spacing: 1px;
   }
   table.LC_helpform_receipt td.LC_pick_box_title {
     background: $tabbg;
     font-weight: bold;
     text-align: right;
     width: 184px;
     padding: 8px;
   }
   table.LC_helpform_receipt td.LC_evenrow_value {
     text-align: left;
     padding: 8px;
     background-color: $data_table_light;
   }
   table.LC_helpform_receipt td.LC_oddrow_value {
     text-align: left;
     padding: 8px;
     background-color: $data_table_light;
   }
   table.LC_helpform_receipt td.LC_pick_box_separator {
     padding: 0px;
     height: 1px;
     background: black;
   }
   span.LC_helpform_receipt_cat {
     font-weight: bold;
   }
 table.LC_group_priv_box {  table.LC_group_priv_box {
   background: white;    background: white;
   border: 1px solid black;    border: 1px solid black;
Line 4569  table.LC_docs_adddocs th { Line 4647  table.LC_docs_adddocs th {
   background: #DDDDDD;    background: #DDDDDD;
 }  }
   
   table.LC_sty_begin {
     background: #BBFFBB;
   }
   table.LC_sty_end {
     background: #FFBBBB;
   }
   
 END  END
 }  }
   
Line 5604  sub user_picker { Line 5689  sub user_picker {
     my $currdom = $dom;      my $currdom = $dom;
     my %curr_selected = (      my %curr_selected = (
                         srchin => 'dom',                          srchin => 'dom',
                         srchby => 'uname',                          srchby => 'lastname',
                       );                        );
     my $srchterm;      my $srchterm;
     if (ref($srch) eq 'HASH') {      if (ref($srch) eq 'HASH') {
Line 5666  sub user_picker { Line 5751  sub user_picker {
     $srchinsel .= "\n  </select>\n";      $srchinsel .= "\n  </select>\n";
   
     my $srchbysel =  ' <select name="srchby">';      my $srchbysel =  ' <select name="srchby">';
     foreach my $option ('uname','lastname','lastfirst') {      foreach my $option ('lastname','lastfirst','uname') {
         if ($curr_selected{'srchby'} eq $option) {          if ($curr_selected{'srchby'} eq $option) {
             $srchbysel .= '              $srchbysel .= '
    <option value="'.$option.'" selected="selected">'.$lt{$option}.'</option>';     <option value="'.$option.'" selected="selected">'.$lt{$option}.'</option>';
Line 5678  sub user_picker { Line 5763  sub user_picker {
     $srchbysel .= "\n  </select>\n";      $srchbysel .= "\n  </select>\n";
   
     my $srchtypesel = ' <select name="srchtype">';      my $srchtypesel = ' <select name="srchtype">';
     foreach my $option ('exact','begins','contains') {      foreach my $option ('begins','contains','exact') {
         if ($curr_selected{'srchtype'} eq $option) {          if ($curr_selected{'srchtype'} eq $option) {
             $srchtypesel .= '              $srchtypesel .= '
    <option value="'.$option.'" selected="selected">'.$lt{$option}.'</option>';     <option value="'.$option.'" selected="selected">'.$lt{$option}.'</option>';
Line 5823  END_BLOCK Line 5908  END_BLOCK
     return $output;      return $output;
 }  }
   
   sub username_rule_check {
       my ($srch,$caller) = @_;
       my ($response,@curr_rules,%inst_results,$rulematch);
       my ($rules,$ruleorder) = &Apache::lonnet::inst_userrules($srch->{'srchdomain'});
       if (ref($srch) eq 'HASH') {
           (my $inst_response,%inst_results) = 
               &Apache::lonnet::get_instuser($srch->{'srchdomain'},
                                             $srch->{'srchterm'});
           my %domconfig = &Apache::lonnet::get_dom('configuration',
                                 ['usercreation'],$srch->{'srchdomain'});
           if (ref($domconfig{'usercreation'}) eq 'HASH') {
               if (ref($domconfig{'usercreation'}{'username_rule'}) eq 'ARRAY') {
                   @curr_rules = @{$domconfig{'usercreation'}{'username_rule'}};
               }
           }
           if (@curr_rules > 0) {
               my $domdesc = &Apache::lonnet::domain($srch->{'srchdomain'},'description');
               my $instuser_reqd;
               my %rule_check = &Apache::lonnet::inst_rulecheck($srch->{'srchdomain'},$srch->{'srchterm'},\@curr_rules);
               foreach my $rule (@curr_rules) {
                   if ($rule_check{$rule}) {
                       $rulematch = $rule;
                       if ($inst_response eq 'ok') {
                           if (keys(%inst_results) == 0) {
                               if ($caller eq 'new') {
                                   $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.");
                               }
                           }
                       }
                       last;
                   }
               }
               if ($response) {
                   if ((ref($rules) eq 'HASH') && (ref($ruleorder) eq 'ARRAY')) {
                       if (@{$ruleorder} > 0) {
                           $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>';
                           foreach my $rule (@{$ruleorder}) {
                               if (grep(/^\Q$rule\E$/,@curr_rules)) {
                                   if (ref($rules->{$rule}) eq 'HASH') {
                                       $response .= '<li>'.$rules->{$rule}{'name'}.': '.
                                                    $rules->{$rule}{'desc'}.'</li>';
                                   }
                               }
                           }
                       }
                       $response .= '</ul>';
                   }
               }
           }
       }
       return ($response,$rulematch,$rules,%inst_results);
   }
   
 =pod  =pod
   
 =back  =back
Line 6983  sub commit_studentrole { Line 7121  sub commit_studentrole {
 ############################################################  ############################################################
   
 sub check_clone {  sub check_clone {
     my ($args) = @_;      my ($args,$linefeed) = @_;
     my $cloneid='/'.$args->{'clonedomain'}.'/'.$args->{'clonecourse'};      my $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);
Line 6991  sub check_clone { Line 7129  sub check_clone {
     my $can_clone = 0;      my $can_clone = 0;
   
     if ($clonehome eq 'no_host') {      if ($clonehome eq 'no_host') {
  $clonemsg = &mt('Attempting to clone non-existing [_1]',          $clonemsg = &mt('No new course created.').$linefeed.&mt('A new course could not be cloned from the specified original - [_1] - because it is a non-existent course.',$args->{'clonecourse'}.':'.$args->{'clonedomain'});     
  $args->{'crstype'});  
     } else {      } else {
  my %clonedesc = &Apache::lonnet::coursedescription($cloneid,{'one_time' => 1});   my %clonedesc = &Apache::lonnet::coursedescription($cloneid,{'one_time' => 1});
  if ($env{'request.role.domain'} eq $args->{'clonedomain'}) {   if ($env{'request.role.domain'} eq $args->{'clonedomain'}) {
Line 7001  sub check_clone { Line 7138  sub check_clone {
     my %clonehash = &Apache::lonnet::get('environment',['cloners'],      my %clonehash = &Apache::lonnet::get('environment',['cloners'],
  $args->{'clonedomain'},$args->{'clonecourse'});   $args->{'clonedomain'},$args->{'clonecourse'});
     my @cloners = split(/,/,$clonehash{'cloners'});      my @cloners = split(/,/,$clonehash{'cloners'});
     my %roleshash =              if (grep(/^\*$/,@cloners)) {
  &Apache::lonnet::get_my_roles($args->{'ccuname'},                  $can_clone = 1;
       $args->{'ccdomain'},'userroles',['active'],['cc'],              } elsif (grep(/^\*\:\Q$args->{'ccdomain'}\E$/,@cloners)) {
       [$args->{'clonedomain'}]);                  $can_clone = 1;
     if (($roleshash{$args->{'clonecourse'}.':'.$args->{'clonedomain'}.':cc'}) || (grep(/^\Q$args->{'ccuname'}\E:\Q$args->{'ccdomain'}\E$/,@cloners))) {              } else {
  $can_clone = 1;          my %roleshash =
     } else {      &Apache::lonnet::get_my_roles($args->{'ccuname'},
  $clonemsg = &mt('The new course was not cloned from an existing course because the new course owner ([_1]) does not have cloning rights in the existing course ([_2]).',$args->{'ccuname'}.':'.$args->{'ccdomain'},$clonedesc{'description'});   $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('No new course created.').$linefeed.&mt('The new course could not be cloned from the existing course because the new course owner ([_1]) does not have cloning rights in the existing course ([_2]).',$args->{'ccuname'}.':'.$args->{'ccdomain'},$clonedesc{'description'});
           }
     }      }
  }          }
     }      }
   
     return ($can_clone, $clonemsg, $cloneid, $clonehome);      return ($can_clone, $clonemsg, $cloneid, $clonehome);
 }  }
   
Line 7029  sub construct_course { Line 7172  sub construct_course {
 #  #
     my ($can_clone, $clonemsg, $cloneid, $clonehome);      my ($can_clone, $clonemsg, $cloneid, $clonehome);
     if (($args->{'clonecourse'}) && ($args->{'clonedomain'})) {      if (($args->{'clonecourse'}) && ($args->{'clonedomain'})) {
  ($can_clone, $clonemsg, $cloneid, $clonehome) = &check_clone($args);   ($can_clone, $clonemsg, $cloneid, $clonehome) = &check_clone($args,$linefeed);
  if ($context ne 'auto') {   if ($context ne 'auto') {
     $clonemsg = '<span class="LC_error">'.$clonemsg.'</span>';              if ($clonemsg ne '') {
           $clonemsg = '<span class="LC_error">'.$clonemsg.'</span>';
               }
  }   }
  $outcome .= $clonemsg.$linefeed;   $outcome .= $clonemsg.$linefeed;
   

Removed from v.1.577  
changed lines
  Added in v.1.585


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