Diff for /loncom/interface/loncommon.pm between versions 1.649 and 1.659

version 1.649, 2008/03/24 01:11:36 version 1.659, 2008/05/31 23:53:18
Line 67  use Apache::loncoursedata(); Line 67  use Apache::loncoursedata();
 use Apache::lontexconvert();  use Apache::lontexconvert();
 use Apache::lonclonecourse();  use Apache::lonclonecourse();
 use LONCAPA qw(:DEFAULT :match);  use LONCAPA qw(:DEFAULT :match);
   use DateTime::TimeZone;
   
 # ---------------------------------------------- Designs  # ---------------------------------------------- Designs
 use vars qw(%defaultdesign);  use vars qw(%defaultdesign);
Line 133  sub ssi_with_retries { Line 134  sub ssi_with_retries {
     do {      do {
  ($content, $response) = &Apache::lonnet::ssi($resource, %form);   ($content, $response) = &Apache::lonnet::ssi($resource, %form);
  $ok      = $response->is_success;   $ok      = $response->is_success;
           if (!$ok) {
               &Apache::lonnet::logthis("Failed ssi_with_retries on $resource: ".$response->is_success.', '.$response->code.', '.$response->message);
           }
  $retries--;   $retries--;
     } while (!$ok && ($retries > 0));      } while (!$ok && ($retries > 0));
   
Line 444  sub selectstudent_link { Line 448  sub selectstudent_link {
    return '';     return '';
 }  }
   
   sub authorbrowser_javascript {
       return <<"ENDAUTHORBRW";
   <script type="text/javascript">
   var stdeditbrowser;
   
   function openauthorbrowser(formname,udom) {
       var url = '/adm/pickauthor?';
       url += 'form='+formname+'&roledom='+udom;
       var title = 'Author_Browser';
       var options = 'scrollbars=1,resizable=1,menubar=0';
       options += ',width=700,height=600';
       stdeditbrowser = open(url,title,options,'1');
       stdeditbrowser.focus();
   }
   
   </script>
   ENDAUTHORBRW
   }
   
 sub coursebrowser_javascript {  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');
Line 581  sub selectcourse_link { Line 604  sub selectcourse_link {
         '","'.$udomele.'","'.$desc.'","'.$extra_element.'","'.$multflag.'","'.$selecttype.'");'."'>".&mt('Select Course')."</a>";          '","'.$udomele.'","'.$desc.'","'.$extra_element.'","'.$multflag.'","'.$selecttype.'");'."'>".&mt('Select Course')."</a>";
 }  }
   
   sub selectauthor_link {
      my ($form,$udom)=@_;
      return '<a href="javascript:openauthorbrowser('."'$form','$udom'".');">'.
             &mt('Select Author').'</a>';
   }
   
 sub check_uncheck_jscript {  sub check_uncheck_jscript {
     my $jscript = <<"ENDSCRT";      my $jscript = <<"ENDSCRT";
 function checkAll(field) {  function checkAll(field) {
Line 606  ENDSCRT Line 635  ENDSCRT
     return $jscript;      return $jscript;
 }  }
   
   sub select_timezone {
      my ($name,$selected,$onchange,$includeempty)=@_;
      my $output='<select name="'.$name.'" '.$onchange.'>'."\n";
      if ($includeempty) {
          $output .= '<option value=""';
          if (($selected eq '') || ($selected eq 'local')) {
              $output .= ' selected="selected" ';
          }
          $output .= '> </option>';
      }
      my @timezones = DateTime::TimeZone->all_names;
      foreach my $tzone (@timezones) {
          $output.= '<option value="'.$tzone.'"';
          if ($tzone eq $selected) {
              $output.=' selected="selected"';
          }
          $output.=">$tzone</option>\n";
      }
      $output.="</select>";
      return $output;
   }
   
 =pod  =pod
   
Line 2904  sub display_languages { Line 2954  sub display_languages {
   
 sub preferred_languages {  sub preferred_languages {
     my @languages=();      my @languages=();
       if (($env{'request.role.adv'}) && ($env{'form.languages'})) {
           @languages=(@languages,split(/\s*(\,|\;|\:)\s*/,$env{'form.languages'}));
       }
     if ($env{'course.'.$env{'request.course.id'}.'.languages'}) {      if ($env{'course.'.$env{'request.course.id'}.'.languages'}) {
  @languages=(@languages,split(/\s*(\,|\;|\:)\s*/,   @languages=(@languages,split(/\s*(\,|\;|\:)\s*/,
          $env{'course.'.$env{'request.course.id'}.'.languages'}));           $env{'course.'.$env{'request.course.id'}.'.languages'}));
     }      }
   
     if ($env{'environment.languages'}) {      if ($env{'environment.languages'}) {
  @languages=(@languages,   @languages=(@languages,
     split(/\s*(\,|\;|\:)\s*/,$env{'environment.languages'}));      split(/\s*(\,|\;|\:)\s*/,$env{'environment.languages'}));
Line 3139  sub get_student_view { Line 3193  sub get_student_view {
   }    }
   if (defined($target)) { $form{'grade_target'} = $target; }    if (defined($target)) { $form{'grade_target'} = $target; }
   $feedurl=&Apache::lonnet::clutter($feedurl);    $feedurl=&Apache::lonnet::clutter($feedurl);
   my $userview=&Apache::lonnet::ssi_body($feedurl,%form);    my ($userview,$response)=&Apache::lonnet::ssi_body($feedurl,%form);
   $userview=~s/\<body[^\>]*\>//gi;    $userview=~s/\<body[^\>]*\>//gi;
   $userview=~s/\<\/body\>//gi;    $userview=~s/\<\/body\>//gi;
   $userview=~s/\<html\>//gi;    $userview=~s/\<html\>//gi;
Line 3148  sub get_student_view { Line 3202  sub get_student_view {
   $userview=~s/\<\/head\>//gi;    $userview=~s/\<\/head\>//gi;
   $userview=~s/action\s*\=/would_be_action\=/gi;    $userview=~s/action\s*\=/would_be_action\=/gi;
   $userview=&relative_to_absolute($feedurl,$userview);    $userview=&relative_to_absolute($feedurl,$userview);
   return $userview;    if (wantarray) {
        return ($userview,$response);
     } else {
        return $userview;
     }
   }
   
   sub get_student_view_with_retries {
     my ($symb,$retries,$username,$domain,$courseid,$target,$moreenv) = @_;
   
       my $ok = 0;                 # True if we got a good response.
       my $content;
       my $response;
   
       # Try to get the student_view done. within the retries count:
       
       do {
            ($content, $response) = &get_student_view($symb,$username,$domain,$courseid,$target,$moreenv);
            $ok      = $response->is_success;
            if (!$ok) {
               &Apache::lonnet::logthis("Failed get_student_view_with_retries on $symb: ".$response->is_success.', '.$response->code.', '.$response->message);
            }
            $retries--;
       } while (!$ok && ($retries > 0));
       
       if (!$ok) {
          $content = '';          # On error return an empty content.
       }
       if (wantarray) {
          return ($content, $response);
       } else {
          return $content;
       }
 }  }
   
 =pod  =pod
Line 7891  defdom (domain for which to retrieve con Line 7977  defdom (domain for which to retrieve con
 origmail (scalar - email address of recipient from loncapa.conf,   origmail (scalar - email address of recipient from loncapa.conf, 
 i.e., predates configuration by DC via domainprefs.pm   i.e., predates configuration by DC via domainprefs.pm 
   
 Returns: comma separated list of addresses to which to send e-mail.     Returns: comma separated list of addresses to which to send e-mail.
   
   =back
   
 =cut  =cut
   
Line 7942  sub build_recipient_list { Line 8030  sub build_recipient_list {
 ############################################################  ############################################################
 ############################################################  ############################################################
   
   =pod
   
   =head1 Course Catalog Routines
   
   =over 4
   
   =item * &gather_categories()
   
   Converts category definitions - keys of categories hash stored in  
   coursecategories in configuration.db on the primary library server in a 
   domain - to an array.  Also generates javascript and idx hash used to 
   generate Domain Coordinator interface for editing Course Categories.
   
   Inputs:
   categories (reference to hash of category definitions).
   cats (reference to array of arrays/hashes which encapsulates hierarchy of
         categories and subcategories).
   idx (reference to hash of counters used in Domain Coordinator interface for 
         editing Course Categories).
   jsarray (reference to array of categories used to create Javascript arrays for
            Domain Coordinator interface for editing Course Categories).
   
   Returns: nothing
   
   Side effects: populates cats, idx and jsarray. 
   
   =cut
   
   sub gather_categories {
       my ($categories,$cats,$idx,$jsarray) = @_;
       my %counters;
       my $num = 0;
       foreach my $item (keys(%{$categories})) {
           my ($cat,$container,$depth) = map { &unescape($_); } split(/:/,$item);
           if ($container eq '' && $depth == 0) {
               $cats->[$depth][$categories->{$item}] = $cat;
           } else {
               $cats->[$depth]{$container}[$categories->{$item}] = $cat;
           }
           my ($escitem,$tail) = split(/:/,$item,2);
           if ($counters{$tail} eq '') {
               $counters{$tail} = $num;
               $num ++;
           }
           if (ref($idx) eq 'HASH') {
               $idx->{$item} = $counters{$tail};
           }
           if (ref($jsarray) eq 'ARRAY') {
               push(@{$jsarray->[$counters{$tail}]},$item);
           }
       }
       return;
   }
   
   =pod
   
   =item * &extract_categories()
   
   Used to generate breadcrumb trails for course categories.
   
   Inputs:
   categories (reference to hash of category definitions).
   cats (reference to array of arrays/hashes which encapsulates hierarchy of
         categories and subcategories).
   trails (reference to array of breacrumb trails for each category).
   allitems (reference to hash - key is category key 
            (format: escaped(name):escaped(parent category):depth in hierarchy).
   idx (reference to hash of counters used in Domain Coordinator interface for
         editing Course Categories).
   jsarray (reference to array of categories used to create Javascript arrays for
            Domain Coordinator interface for editing Course Categories).
   
   Returns: nothing
   
   Side effects: populates trails and allitems hash references.
   
   =cut
   
   sub extract_categories {
       my ($categories,$cats,$trails,$allitems,$idx,$jsarray) = @_;
       if (ref($categories) eq 'HASH') {
           &gather_categories($categories,$cats,$idx,$jsarray);
           if (ref($cats->[0]) eq 'ARRAY') {
               for (my $i=0; $i<@{$cats->[0]}; $i++) {
                   my $name = $cats->[0][$i];
                   my $item = &escape($name).'::0';
                   my $trailstr;
                   if ($name eq 'instcode') {
                       $trailstr = &mt('Official courses (with institutional codes)');
                   } else {
                       $trailstr = $name;
                   }
                   if ($allitems->{$item} eq '') {
                       push(@{$trails},$trailstr);
                       $allitems->{$item} = scalar(@{$trails})-1;
                   }
                   my @parents = ($name);
                   if (ref($cats->[1]{$name}) eq 'ARRAY') {
                       for (my $j=0; $j<@{$cats->[1]{$name}}; $j++) {
                           my $category = $cats->[1]{$name}[$j];
                           &recurse_categories($cats,2,$category,$trails,$allitems,\@parents);
                       }
                   }
               }
           }
       }
       return;
   }
   
   =pod
   
   =item *&recurse_categories()
   
   Recursively used to generate breadcrumb trails for course categories.
   
   Inputs:
   cats (reference to array of arrays/hashes which encapsulates hierarchy of
         categories and subcategories).
   depth (current depth in hierarchy of categories and sub-categories - 0 indexed).
   category (current course category, for which breadcrumb trail is being generated).   
   trails (reference to array of breacrumb trails for each category).
   allitems (reference to hash - key is category key
            (format: escaped(name):escaped(parent category):depth in hierarchy).
   parents (array containing containers directories for current category, 
            back to top level). 
   
   Returns: nothing
   
   Side effects: populates trails and allitems hash references
   
   =back
   
   =cut
   
   sub recurse_categories {
       my ($cats,$depth,$category,$trails,$allitems,$parents) = @_;
       my $shallower = $depth - 1;
       if (ref($cats->[$depth]{$category}) eq 'ARRAY') {
           for (my $k=0; $k<@{$cats->[$depth]{$category}}; $k++) {
               my $name = $cats->[$depth]{$category}[$k];
               my $item = &escape($category).':'.&escape($parents->[-1]).':'.$shallower;
               my $trailstr = join(' -&gt; ',(@{$parents},$category));
               if ($allitems->{$item} eq '') {
                   push(@{$trails},$trailstr);
                   $allitems->{$item} = scalar(@{$trails})-1;
               }
               my $deeper = $depth+1;
               push(@{$parents},$category);
               &recurse_categories($cats,$deeper,$name,$trails,$allitems,$parents);
               pop(@{$parents});
           }
       } else {
           my $item = &escape($category).':'.&escape($parents->[-1]).':'.$shallower;
           my $trailstr = join(' -&gt; ',(@{$parents},$category));
           if ($allitems->{$item} eq '') {
               push(@{$trails},$trailstr);
               $allitems->{$item} = scalar(@{$trails})-1;
           }
       }
       return;
   }
   
   ############################################################
   ############################################################
   
   
 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.
Line 7983  sub commit_standardrole { Line 8237  sub commit_standardrole {
         $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):'').': ';                 ($end?', '.&mt('ending').' '.localtime($end):'').': ';
         my $result = &Apache::lonnet::assignrole($udom,$uname,$url,$three,$end,$start);          my $result = &Apache::lonnet::assignrole($udom,$uname,$url,$three,$end,$start,'','',$context);
         if ($context eq 'auto') {          if ($context eq 'auto') {
             $output .= $result.$linefeed;              $output .= $result.$linefeed;
         } else {          } else {
Line 8018  sub commit_studentrole { Line 8272  sub commit_studentrole {
                 }                  }
                 $oldsecurl = $uurl;                  $oldsecurl = $uurl;
                 $expire_role_result =                   $expire_role_result = 
                     &Apache::lonnet::assignrole($udom,$uname,$uurl,'st',$now);                      &Apache::lonnet::assignrole($udom,$uname,$uurl,'st',$now,'','',$context);
                 if ($env{'request.course.sec'} ne '') {                   if ($env{'request.course.sec'} ne '') { 
                     if ($expire_role_result eq 'refused') {                      if ($expire_role_result eq 'refused') {
                         my @roles = ('st');                          my @roles = ('st');
Line 8041  sub commit_studentrole { Line 8295  sub commit_studentrole {
             }              }
         }          }
         if (($expire_role_result eq 'ok') || ($secchange == 0)) {          if (($expire_role_result eq 'ok') || ($secchange == 0)) {
             $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,'',$context);
             if ($modify_section_result =~ /^ok/) {              if ($modify_section_result =~ /^ok/) {
                 if ($secchange == 1) {                  if ($secchange == 1) {
                     if ($sec eq '') {                      if ($sec eq '') {

Removed from v.1.649  
changed lines
  Added in v.1.659


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