Diff for /loncom/interface/courseprefs.pm between versions 1.8.2.7 and 1.14

version 1.8.2.7, 2010/02/21 01:06:13 version 1.14, 2009/11/30 06:23:32
Line 28 Line 28
 ###############################################################  ###############################################################
 ##############################################################  ##############################################################
   
 =pod  
   
 =head1 NAME  
   
 courseprefs- Handler to set/modify course configuration  
   
 =head1 SYNOPSIS  
   
 courseprefs provides an interface for setting general course configuration  
   
 =head1 DESCRIPTION  
   
 This module is used for configuration of a course  
   
 =head1 INTERNAL SUBROUTINES  
   
 =over  
   
 =item get_allitems()  
   
 =item print_config_box()  
   
 =item process_changes()  
   
 =item get_sec_str()  
   
 =item check_clone()  
   
 =item store_changes()  
   
 =item update_env()  
   
 =item display_disallowed()  
   
 =item get_course()  
   
 =item get_jscript()  
   
 =item cloners_javascript()  
   
 =item print_courseinfo()  
   
 =item new_cloners_dom_row()  
   
 =item can_modify_catsettings()  
   
 =item assign_course_categories()  
   
 =item print_localization()  
   
 =item get_lang_choices()  
   
 =item print_feedback()  
   
 =item user_table()  
   
 =item select_recipient()  
   
 =item select_sections()  
   
 =item print_discussion()  
   
 =item role_checkboxes()  
   
 =item print_classlists()  
   
 =item print_appearance()  
   
 =item print_grading()  
   
 =item print_printouts()  
   
 =item print_spreadsheet()  
   
 =item print_bridgetasks()  
   
 =item print_other()  
   
 =item get_other_items()  
   
 =item item_table_row_start()  
   
 =item item_table_row_end()  
   
 =item yes_no_radio()  
   
 =item select_from_options()  
   
 =item make_item_rows()  
   
 Creates table used to display and set course configuration items.  
   
 Inputs: $cdom,$items,$ordered,$settings,$rowtotal,$crstype  
 where $cdom is course's domain, $items is HASH ref for current config  
 item, $ordered is ARRAY ref of items to include in row in  
 display order, $settings is HASH ref of current values forrow,  
 $rowtotal is SCALAR ref used to accumulate row count, $crstype is  
 course type.  
   
 Returns: $datatable  
 HTML mark-up of data table which accumulates individual rows.  
   
 =item nothidepriv_row()  
   
 Creates row containing form elements used to display and set  
 whether Domain coordinators who are currently included in  
 advanced course user .db file for a course are to be hidden (e.g.,  
 in syllabus, or from course user lists).  
   
 Inputs: $cdom,$item,$settings,$crstype  
 where $cdom is course domain, item is nothideprivileged, $settings is  
 HASH ref of the current values for nothideprivileged, $crstype is  
 course type (Course or Community).  
   
 Returns: $datatable  
 HTML mark-up for Privileged users (Domain Coordinators) in staff listing.  
   
 =item print_hdrfmt_row()  
   
 Creates row containing form elements used to display and set  
 substitution items and text to be used in the header included  
 on printouts.  
   
 Inputs: $item,$settings  
 where $item is print_header_format, and $settings is a HASH ref  
 of the current values stored for print_header_format.  
   
 Returns: $output  
 HTML mark-up containing Javascript functions: reOrder() and getIndexByName()  
 used to dynamically update position selectboxes, and HTML table elements  
 for the "Print header format" row.  
   
 =item position_selector()  
   
 Creates a select box which can be used to reorder substitutions  
 and text included in a printout header.  
   
 Inputs: $pos,$num,$maxnum  
 where $pos is current position, $num is the unique identifier,  
 and $maxnum is the total number of items (both substitutions  
 and text in the printout header.  
   
 Returns: $output  
 HTML mark-up for the selectbox and a hidden form element containing  
 the current position.  
   
 =item substitution_selector()  
   
 Creates a combination of select box for choosing an item  
 (student name, course ID or assignment note) to substitute,  
 and a corresponding size limit in the header used for printouts.  
   
 Inputs: $num,$subst,$limit,$crstype  
 where $num is the unique identifier, $subst is the current  
 substitution (n,c or a, for name, course or note respectively,  
 $limit is the current size limit (integer), and $crstype is  
 course type - course or community.  
   
 Returns: $output  
 HTML mark-up for selectbox and textbox (separate table cells).  
   
 =item change_clone()  
   
 Modifies the list of courses a user can clone (stored  
 in the user's environment.db file), called when a  
 change is made to the list of users allowed to clone  
 a course.  
   
 Inputs: $action,$cloner  
 where $action is add or drop, and $cloner is identity of  
 user for whom cloning ability is to be changed in course.  
   
 Returns: nothing  
   
 =back  
   
 =cut  
   
   
 package Apache::courseprefs;  package Apache::courseprefs;
   
 use strict;  use strict;
Line 460  sub handler { Line 281  sub handler {
                                 col2 => 'Value',}],                                  col2 => 'Value',}],
                     ordered => ['problem_stream_switch','suppress_tries',                      ordered => ['problem_stream_switch','suppress_tries',
                                 'default_paper_size','print_header_format',                                  'default_paper_size','print_header_format',
                                 'disableexampointprint'],                                  'disableexampointprint','canuse_pdfforms'],
                     itemtext => {                      itemtext => {
                         problem_stream_switch => 'Allow problems to be split over pages',                          problem_stream_switch => 'Allow problems to be split over pages',
                         suppress_tries        => 'Suppress number of tries in printing',                          suppress_tries        => 'Suppress number of tries in printing',
                         default_paper_size    => 'Default paper type',                          default_paper_size    => 'Default paper type',
                         print_header_format   => 'Print header format',                          print_header_format   => 'Print header format',
                         disableexampointprint => 'Disable automatically printing point values on exams',                          disableexampointprint => 'Disable automatically printing point values on exams',
                           canuse_pdfforms    => 'Users can print problems as PDF forms and upload later for grading',
                                 },                                  },
                   },                    },
         'spreadsheet' =>          'spreadsheet' =>
Line 746  sub process_changes { Line 568  sub process_changes {
                                     my @cloners = split(',',$env{'form.'.$entry});                                      my @cloners = split(',',$env{'form.'.$entry});
                                     my @okcloners;                                      my @okcloners;
                                     foreach my $cloner (@cloners) {                                      foreach my $cloner (@cloners) {
                                         $cloner =~ s/^\s+//;                                          my ($uname,$udom) = split(':',$cloner);
                                         $cloner =~ s/\s+$//;                                          if (&check_clone($udom,$disallowed,$uname) eq 'ok') {
                                         unless ($cloner eq '') {                                              if (!grep(/^\Q$cloner\E$/,@okcloners)) {
                                             my ($uname,$udom) = split(':',$cloner);                                                  push(@okcloners,$cloner);
                                             if (&check_clone($udom,$disallowed,$uname) eq 'ok') {  
                                                 if (!grep(/^\Q$cloner\E$/,@okcloners)) {  
                                                     push(@okcloners,$cloner);  
                                                 }  
                                             }                                              }
                                         }                                          }
                                     }                                      }
Line 1043  sub check_clone { Line 861  sub check_clone {
 sub store_changes {  sub store_changes {
     my ($cdom,$cnum,$prefs_order,$actions,$prefs,$values,$changes,$crstype) = @_;      my ($cdom,$cnum,$prefs_order,$actions,$prefs,$values,$changes,$crstype) = @_;
     my ($chome,$output);      my ($chome,$output);
     my (%storehash,@delkeys,@need_env_update,@oldcloner);      my (%storehash,@delkeys,@need_env_update);
     if ((ref($values) eq 'HASH') && (ref($changes) eq 'HASH')) {      if ((ref($values) eq 'HASH') && (ref($changes) eq 'HASH')) {
         %storehash = %{$values};          %storehash = %{$values};
     } else {      } else {
Line 1168  sub store_changes { Line 986  sub store_changes {
                                     if (defined($yesno{$key})) {                                      if (defined($yesno{$key})) {
                                         $displayval = &mt('No');                                          $displayval = &mt('No');
                                         if ($changes->{$item}{$key} eq 'yes') {                                          if ($changes->{$item}{$key} eq 'yes') {
                                             $displayval = &mt('Yes');                                                       $displayval = &mt('Yes');                          
                                         }                                          }
                                     } elsif (($key =~ /^default_enrollment_(start|end)_date$/) && ($displayval)) {                                      } elsif (($key =~ /^default_enrollment_(start|end)_date$/) && ($displayval)) {
                                         $displayval = &Apache::lonlocal::locallocaltime($displayval);                                          $displayval = &Apache::lonlocal::locallocaltime($displayval);
                                     } elsif ($key eq 'categories') {                                      } elsif ($key eq 'categories') {
                                         $displayval = $env{'form.categories_display'};                                          $displayval = $env{'form.categories_display'};
                                     }                                        } elsif ($key eq 'canuse_pdfforms') {
                                           if ($changes->{$item}{$key} eq '1') {
                                               $displayval = &mt('Yes');
                                           } elsif ($changes->{$item}{$key} eq '0') {
                                               $displayval = &mt('No');
                                           }
                                       }
                                     if ($changes->{$item}{$key} eq '') {                                      if ($changes->{$item}{$key} eq '') {
                                         push(@delkeys,$key);                                          push(@delkeys,$key);
                                         $output .= '<li>'.&mt('Deleted setting for [_1]',                                          $output .= '<li>'.&mt('Deleted setting for [_1]',
Line 1192  sub store_changes { Line 1016  sub store_changes {
                                     }                                      }
                                     $storehash{$key} = $changes->{$item}{$key};                                      $storehash{$key} = $changes->{$item}{$key};
                                 }                                  }
                                 if ($key eq 'cloners') {  
                                     # Get existing cloners  
                                     my %clonenames =  
                                         &Apache::lonnet::dump('environment',$cdom,$cnum,'cloners');  
                                     if ($clonenames{'cloners'} =~ /,/) {  
                                         @oldcloner = split(/\s*\,\s*/,$clonenames{'cloners'});  
                                     } else {  
                                         $oldcloner[0] = $clonenames{'cloners'};  
                                     }  
                                 }  
                                 if (($key eq 'description') || ($key eq 'cloners') ||                                  if (($key eq 'description') || ($key eq 'cloners') ||
                                     ($key eq 'hidefromcat') || ($key eq 'categories')) {                                      ($key eq 'hidefromcat') || ($key eq 'categories')) {
                                     push(@need_env_update,$key);                                      push(@need_env_update,$key);
Line 1221  sub store_changes { Line 1035  sub store_changes {
         }          }
     }      }
     if (&Apache::lonnet::put('environment',\%storehash,$cdom,$cnum) eq 'ok') {      if (&Apache::lonnet::put('environment',\%storehash,$cdom,$cnum) eq 'ok') {
         if (ref($changes) eq 'HASH') {  
             if (ref($changes->{'courseinfo'}) eq 'HASH') {  
                 if (exists($changes->{'courseinfo'}{'cloners'})) {  
                     &change_clone($cdom,$cnum,$changes->{'courseinfo'}{'cloners'},  
                                   \@oldcloner);  
                 }  
             }  
         }  
         if (@delkeys) {          if (@delkeys) {
             if (&Apache::lonnet::del('environment',\@delkeys,$cdom,$cnum) ne 'ok') {              if (&Apache::lonnet::del('environment',\@delkeys,$cdom,$cnum) ne 'ok') {
                 $output .= '<br /><span class="LC_error">';                  $output .= '<br /><span class="LC_error">';
Line 1238  sub store_changes { Line 1044  sub store_changes {
                     $output .= &mt('An error occurred when removing course settings which are no longer in use.');                      $output .= &mt('An error occurred when removing course settings which are no longer in use.');
                 }                  }
                 $output .= '</span>';                  $output .= '</span>';
             }              } else {
         } else {                  foreach my $key (@delkeys) {
             foreach my $key (@delkeys) {                      &Apache::lonnet::delenv('course.'.$cdom.'_'.$cnum.'.'.$key);
                 &Apache::lonnet::delenv('course.'.$cdom.'_'.$cnum.'.'.$key);                  }
             }              }
         }          }
         if (@need_env_update) {          if (@need_env_update) {
Line 1503  sub print_courseinfo { Line 1309  sub print_courseinfo {
         }          }
     }      }
     if (!defined($categoriesform)) {      if (!defined($categoriesform)) {
         $categoriesform = &mt('No categories defined in this domain.');          $categoriesform = &mt('No categories defined for this domain');
     }      }
   
     my ($can_toggle_cat,$can_categorize) = &can_modify_catsettings($cdom,$crstype);      my ($can_toggle_cat,$can_categorize) = &can_modify_catsettings($cdom,$crstype);
Line 1610  sub print_courseinfo { Line 1416  sub print_courseinfo {
                 if (@entries > 0) {                  if (@entries > 0) {
                     foreach my $entry (@entries) {                      foreach my $entry (@entries) {
                         my ($uname,$udom) = split(/:/,$entry);                          my ($uname,$udom) = split(/:/,$entry);
                         my ($uname,$udom) = split(/:/,$entry);  
                         if ($udom =~ /^$match_domain$/) {  
                             unless (&Apache::lonnet::domain($udom)) {  
                                 next;  
                             }  
                         } else {  
                             next;  
                         }  
                         if ($uname eq '*') {                          if ($uname eq '*') {
                             $datatable .=                               $datatable .= 
                                 &Apache::loncommon::start_data_table_row().                                  &Apache::loncommon::start_data_table_row().
                                 '<td valign="top" align="left"><span class="LC_nobreak">'.                                  '<td valign="top" align="left"><span class="LC_nobreak">'.
                                 &mt('Any user in domain:').'<b>&nbsp;'.$udom.                                  &mt('Domain:').'<b>&nbsp;'.$udom.
                                 '</b><input type="hidden" name="cloners_dom_'.$num.                                  '</b><input type="hidden" name="cloners_dom_'.$num.
                                 '" value="'.$udom.'" /></span><br />'.                                  '" value="'.$udom.'" /></span><br />'.
                                 '<span class="LC_nobreak"><label><input type="checkbox" '.                                  '<span class="LC_nobreak"><label><input type="checkbox" '.
Line 1630  sub print_courseinfo { Line 1428  sub print_courseinfo {
                                 &mt('Delete').'</label></span></td>'.                                  &mt('Delete').'</label></span></td>'.
                                 &Apache::loncommon::end_data_table_row();                                  &Apache::loncommon::end_data_table_row();
                             $num ++;                              $num ++;
                         } elsif (&Apache::lonnet::homeserver($uname,$udom) ne 'no_host') {                          } else {
                             unless (grep(/^\Q$entry\E$/,@cloners)) {                              push(@cloners,$entry);
                                 push(@cloners,$entry);  
                             }  
                         }                          }
                     }                      }
                 }                  }
Line 1971  sub print_feedback { Line 1767  sub print_feedback {
     my %sections = &Apache::loncommon::get_sections($cdom,$cnum);      my %sections = &Apache::loncommon::get_sections($cdom,$cnum);
     my @sections = sort( { $a <=> $b } keys(%sections));      my @sections = sort( { $a <=> $b } keys(%sections));
     my %lt = &Apache::lonlocal::texthash (      my %lt = &Apache::lonlocal::texthash (
                                            currone  => 'Current recipient:',                                             currone => 'Current recipient:',
                                            currmult => 'Current recipients:',                                             curmult => 'Current recipients:',
                                            add      => 'Additional recipient:',                                             add     => 'Additional recipient:',
                                            del      => 'Delete?',                                             del     => 'Delete?',
                                            sec      => 'Sections:',                                             sec     => 'Sections:',
                                          );                                           );
   
     foreach my $item (@{$ordered}) {      foreach my $item (@{$ordered}) {
Line 2036  sub user_table { Line 1832  sub user_table {
         if ($num) {          if ($num) {
             $output .= '<tr>'.              $output .= '<tr>'.
                        '<td align="left"><i>';                         '<td align="left"><i>';
             if ($num == 1) {              if ($num > 1) {
                 $output .= $lt->{'currone'};                  $output .= $lt->{'currone'};
             } else {              } else {
                 $output .= $lt->{'currmult'};                  $output .= $lt->{'currmult'};
Line 2156  sub print_discussion { Line 1952  sub print_discussion {
     my %sections = &Apache::loncommon::get_sections($cdom,$cnum);      my %sections = &Apache::loncommon::get_sections($cdom,$cnum);
     my @sections = sort( { $a <=> $b } keys(%sections));      my @sections = sort( { $a <=> $b } keys(%sections));
     my %lt = &Apache::lonlocal::texthash (      my %lt = &Apache::lonlocal::texthash (
                                           currone  => 'Disallowed:',                                            currone => 'Disallowed:',
                                           currmult => 'Disallowed:',                                            curmult => 'Disallowed:',
                                           add      => 'Disallow more:',                                            add     => 'Disallow more:',
                                           del      => 'Delete?',                                            del     => 'Delete?',
                                           sec      => 'Sections:',                                            sec     => 'Sections:',
                                          );                                           );
   
     foreach my $item (@{$ordered}) {      foreach my $item (@{$ordered}) {
Line 2516  sub print_printouts { Line 2312  sub print_printouts {
             text => '<b>'.&mt($itemtext->{'disableexampointprint'}).'</b>',              text => '<b>'.&mt($itemtext->{'disableexampointprint'}).'</b>',
             input => 'radio',              input => 'radio',
                                  },                                   },
           canuse_pdfforms => {
               text  => '<b>'.&mt($itemtext->{'canuse_pdfforms'}).'</b>',
               input => 'selectbox',
               options => {
                            1    => &mt('Yes'),
                            0    => &mt('No'),
                          },
               order => ['1','0'],
               nullval => 'None specified - use domain default',
                       }
     );      );
     return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype);      return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype);
 }  }
Line 2850  sub print_hdrfmt_row { Line 2656  sub print_hdrfmt_row {
         $currstr .= '<b>'.&mt('Current print header:').' <span class="LC_warning"><tt>'.          $currstr .= '<b>'.&mt('Current print header:').' <span class="LC_warning"><tt>'.
                    $settings->{$item}.'</tt></span></b><br />';                     $settings->{$item}.'</tt></span></b><br />';
         my @current = split(/(%\d*[nca])/,$settings->{$item});          my @current = split(/(%\d*[nca])/,$settings->{$item});
         foreach my $val (@current) {          foreach my $item (@current) {
             unless ($val eq '') {              unless ($item eq '') {
                 push(@curr,$val);                  push(@curr,$item);
             }              }
         }          }
         $currnum = @curr;          $currnum = @curr;
Line 3005  sub substitution_selector { Line 2811  sub substitution_selector {
     return $output;      return $output;
 }  }
   
 sub change_clone {  
     my ($cdom,$cnum,$clonelist,$oldcloner) = @_;  
     my $clone_crs = $cnum.':'.$cdom;  
     if ($cnum && $cdom) {  
         my $clone_crs = $cnum.':'.$cdom;  
         my @allowclone;  
         if ($clonelist =~ /,/) {  
             @allowclone = split(',',$clonelist);  
         } else {  
             $allowclone[0] = $clonelist;  
         }  
         foreach my $currclone (@allowclone) {  
             if (!grep(/^$currclone$/,@$oldcloner)) {  
                 if ($currclone ne '*') {  
                     my ($uname,$udom) = split(/:/,$currclone);  
                     if ($uname && $udom && $uname ne '*') {  
                         if (&Apache::lonnet::homeserver($uname,$udom) ne 'no_host') {  
                             my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable');  
                             if ($currclonecrs{'cloneable'} !~ /\Q$clone_crs\E/) {  
                                 if ($currclonecrs{'cloneable'} eq '') {  
                                     $currclonecrs{'cloneable'} = $clone_crs;  
                                 } else {  
                                     $currclonecrs{'cloneable'} .= ','.$clone_crs;  
                                 }  
                                 &Apache::lonnet::put('environment',\%currclonecrs,$udom,$uname);  
                             }  
                         }  
                     }  
                 }  
             }  
         }  
         foreach my $oldclone (@$oldcloner) {  
             if (!grep(/^\Q$oldclone\E$/,@allowclone)) {  
                 if ($oldclone ne '*') {  
                     my ($uname,$udom) = split(/:/,$oldclone);  
                     if ($uname && $udom && $uname ne '*' ) {  
                         if (&Apache::lonnet::homeserver($uname,$udom) ne 'no_host') {  
                             my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable');  
                             my %newclonecrs = ();  
                             if ($currclonecrs{'cloneable'} =~ /\Q$clone_crs\E/) {  
                                 if ($currclonecrs{'cloneable'} =~ /,/) {  
                                     my @currclonecrs = split/,/,$currclonecrs{'cloneable'};  
                                     foreach my $crs (@currclonecrs) {  
                                         if ($crs ne $clone_crs) {  
                                             $newclonecrs{'cloneable'} .= $crs.',';  
                                         }  
                                     }  
                                     $newclonecrs{'cloneable'} =~ s/,$//;  
                                 } else {  
                                     $newclonecrs{'cloneable'} = '';  
                                 }  
                                 &Apache::lonnet::put('environment',\%newclonecrs,$udom,$uname);  
                             }  
                         }  
                     }  
                 }  
             }  
         }  
     }  
     return;  
 }  
   
 1;  1;

Removed from v.1.8.2.7  
changed lines
  Added in v.1.14


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