Diff for /loncom/interface/lonparmset.pm between versions 1.360 and 1.394

version 1.360, 2007/02/27 20:35:22 version 1.394, 2008/04/05 16:10:52
Line 67  use Apache::longroup; Line 67  use Apache::longroup;
 use Apache::lonrss;  use Apache::lonrss;
 use LONCAPA qw(:DEFAULT :match);  use LONCAPA qw(:DEFAULT :match);
   
 # --- Caches local to lonparmset  
   
 my $parmhashid;  
 my %parmhash;  
 my $symbsid;  
 my %symbs;  
 my $rulesid;  
 my %rules;  
   
 # --- end local caches  
   
 ##################################################  ##################################################
 ##################################################  ##################################################
Line 119  sub parmval { Line 109  sub parmval {
   
 sub parmval_by_symb {  sub parmval_by_symb {
     my ($what,$symb,$def,$uname,$udom,$csec,$cgroup,$courseopt)=@_;      my ($what,$symb,$def,$uname,$udom,$csec,$cgroup,$courseopt)=@_;
 # load caches  
     &cacheparmhash();  
   
     my $useropt;      my $useropt;
     if ($uname ne '' && $udom ne '') {      if ($uname ne '' && $udom ne '') {
Line 167  sub parmval_by_symb { Line 155  sub parmval_by_symb {
   
 # ------------------------------------------------------ third, check map parms  # ------------------------------------------------------ third, check map parms
   
     my $thisparm=$parmhash{$symbparm};      my $thisparm=&parmhash($symbparm);
     if (defined($thisparm)) { $outpar[11]=$thisparm; $result=11; }      if (defined($thisparm)) { $outpar[11]=$thisparm; $result=11; }
   
     if (defined($$courseopt{$courselevelr})) {      if (defined($$courseopt{$courselevelr})) {
Line 228  sub parmval_by_symb { Line 216  sub parmval_by_symb {
     return ($result,@outpar);      return ($result,@outpar);
 }  }
   
 sub resetparmhash {  
     $parmhashid='';  
 }  
   
 sub cacheparmhash {  
     if ($parmhashid eq  $env{'request.course.fn'}) { return; }  
     my %parmhashfile;  
     if (tie(%parmhashfile,'GDBM_File',  
       $env{'request.course.fn'}.'_parms.db',&GDBM_READER(),0640)) {  
  %parmhash=%parmhashfile;  
  untie %parmhashfile;  
  $parmhashid=$env{'request.course.fn'};  
     }  
 }  
   
 sub resetsymbcache {  # --- Caches local to lonparmset
     $symbsid='';  
       
   sub reset_caches {
       &resetparmhash();
       &resetsymbcache();
       &resetrulescache();
 }  }
   
 sub symbcache {  {
     my $id=shift;      my $parmhashid;
     if ($symbsid ne $env{'request.course.id'}) {      my %parmhash;
  %symbs=();      sub resetparmhash {
    undef($parmhashid);
    undef(%parmhash);
     }      }
     unless ($symbs{$id}) {      
  my $navmap = Apache::lonnavmaps::navmap->new();      sub cacheparmhash {
  if ($id=~/\./) {   if ($parmhashid eq  $env{'request.course.fn'}) { return; }
     my $resource=$navmap->getById($id);   my %parmhashfile;
     $symbs{$id}=$resource->symb();   if (tie(%parmhashfile,'GDBM_File',
  } else {   $env{'request.course.fn'}.'_parms.db',&GDBM_READER(),0640)) {
     my $resource=$navmap->getByMapPc($id);      %parmhash=%parmhashfile;
     $symbs{$id}=&Apache::lonnet::declutter($resource->src());      untie(%parmhashfile);
       $parmhashid=$env{'request.course.fn'};
  }   }
  $symbsid=$env{'request.course.id'};  
     }      }
     return $symbs{$id};   
 }      sub parmhash {
    my ($id) = @_;
 sub resetrulescache {   &cacheparmhash();
     $rulesid='';   return $parmhash{$id};
 }      }
    }
   
   {   
       my $symbsid;
       my %symbs;
       sub resetsymbcache {
    undef($symbsid);
    undef(%symbs);
       }
       
       sub symbcache {
    my $id=shift;
    if ($symbsid ne $env{'request.course.id'}) {
       undef(%symbs);
    }
    if (!$symbs{$id}) {
       my $navmap = Apache::lonnavmaps::navmap->new();
       if ($id=~/\./) {
    my $resource=$navmap->getById($id);
    $symbs{$id}=$resource->symb();
       } else {
    my $resource=$navmap->getByMapPc($id);
    $symbs{$id}=&Apache::lonnet::declutter($resource->src());
       }
       $symbsid=$env{'request.course.id'};
    }
    return $symbs{$id};
       }
    }
   
 sub rulescache {  {   
     my $id=shift;      my $rulesid;
     if ($rulesid ne $env{'request.course.id'}      my %rules;
  && !defined($rules{$id})) {      sub resetrulescache {
  my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};   undef($rulesid);
  my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};   undef(%rules);
  %rules=&Apache::lonnet::dump('parmdefactions',$dom,$crs);      }
  $rulesid=$env{'request.course.id'};      
       sub rulescache {
    my $id=shift;
    if ($rulesid ne $env{'request.course.id'}
       && !defined($rules{$id})) {
       my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
       my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
       %rules=&Apache::lonnet::dump('parmdefactions',$dom,$crs);
       $rulesid=$env{'request.course.id'};
    }
    return $rules{$id};
     }      }
     return $rules{$id};  
 }  }
   
 sub preset_defaults {  sub preset_defaults {
Line 345  sub storeparm { Line 365  sub storeparm {
 # - new type  # - new type
 # - username  # - username
 # - userdomain  # - userdomain
   
 my %recstack;  my %recstack;
 sub storeparm_by_symb {  sub storeparm_by_symb {
     my ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$recflag,$cgroup)=@_;      my ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$recflag,$cgroup)=@_;
Line 554  sub valout { Line 573  sub valout {
             }              }
             $result=~s/\s+$//;              $result=~s/\s+$//;
         } elsif (&isdateparm($type)) {          } elsif (&isdateparm($type)) {
             $result = localtime($value).&date_sanity_info($value);              $result = &Apache::lonlocal::locallocaltime($value).
    &date_sanity_info($value);
         } else {          } else {
             $result = $value;              $result = $value;
       $result = &HTML::Entities::encode($result,'"<>&');
         }          }
     }      }
     return $result;      return $result;
Line 593  sub plink { Line 614  sub plink {
     my ($parmname)=((split(/\&/,$marker))[1]=~/\_([^\_]+)$/);      my ($parmname)=((split(/\&/,$marker))[1]=~/\_([^\_]+)$/);
     my ($hour,$min,$sec,$val)=&preset_defaults($parmname);      my ($hour,$min,$sec,$val)=&preset_defaults($parmname);
     unless (defined($winvalue)) { $winvalue=$val; }      unless (defined($winvalue)) { $winvalue=$val; }
       my $valout = &valout($value,$type,1);
       foreach my $item (\$type, \$dis, \$winvalue, \$marker, \$return, \$call,
         \$hour, \$min, \$sec) {
    $$item = &HTML::Entities::encode($$item,'"<>&');
    $$item =~ s/\'/\\\'/g;
       }
     return '<table width="100%"><tr valign="top" align="right"><td><a name="'.$marker.'" /></td></tr><tr><td align="center">'.      return '<table width="100%"><tr valign="top" align="right"><td><a name="'.$marker.'" /></td></tr><tr><td align="center">'.
  '<a href="javascript:pjump('."'".$type."','".$dis."','".$winvalue."','"   '<a href="javascript:pjump('."'".$type."','".$dis."','".$winvalue."','"
     .$marker."','".$return."','".$call."','".$hour."','".$min."','".$sec."'".');">'.      .$marker."','".$return."','".$call."','".$hour."','".$min."','".$sec."'".');">'.
  &valout($value,$type,1).'</a></td></tr></table>';      $valout.'</a></td></tr></table>';
 }  }
   
 sub page_js {  sub page_js {
Line 934  sub extractResourceInformation { Line 961  sub extractResourceInformation {
  $$typep{$id}=$1;   $$typep{$id}=$1;
  $$keyp{$id}='';   $$keyp{$id}='';
         $$uris{$id}=$srcf;          $$uris{$id}=$srcf;
  foreach (split(/\,/,&Apache::lonnet::metadata($srcf,'allpossiblekeys'))) {   foreach my $key (split(/\,/,&Apache::lonnet::metadata($srcf,'allpossiblekeys'))) {
     if ($_=~/^parameter\_(.*)/) {      next if ($key!~/^parameter_/);
  my $key=$_;  
 # Hidden parameters  # Hidden parameters
  if (&Apache::lonnet::metadata($srcf,$key.'.hidden') eq 'parm') {      next if (&Apache::lonnet::metadata($srcf,$key.'.hidden') eq 'parm');
     next;  
  }  
  my $display= &Apache::lonnet::metadata($srcf,$key.'.display');  
  my $name=&Apache::lonnet::metadata($srcf,$key.'.name');  
  my $part= &Apache::lonnet::metadata($srcf,$key.'.part');  
 #  #
 # allparms is a hash of parameter names  # allparms is a hash of parameter names
 #  #
       my $name=&Apache::lonnet::metadata($srcf,$key.'.name');
       if (!exists($$allparms{$name}) || $$allparms{$name} =~ m/^\s*$/ ) {
    my $display= &Apache::lonnet::metadata($srcf,$key.'.display');
  my $parmdis = $display;   my $parmdis = $display;
  $parmdis =~ s/\[Part.*$//g;   $parmdis =~ s/\[Part.*$//g;
                 $$allparms{$name}=$parmdis;   $$allparms{$name}=$parmdis;
  $$defkeytype{$name}=&Apache::lonnet::metadata($srcf,$key.'.type');   if (ref($defkeytype)) {
       $$defkeytype{$name}=
    &Apache::lonnet::metadata($srcf,$key.'.type');
    }
       }
   
 #  #
 # allparts is a hash of all parts  # allparts is a hash of all parts
 #  #
  $$allparts{$part} = "Part: $part";      my $part= &Apache::lonnet::metadata($srcf,$key.'.part');
       $$allparts{$part} = "Part: $part";
 #  #
 # Remember all keys going with this resource  # Remember all keys going with this resource
 #  #
  if ($$keyp{$id}) {      if ($$keyp{$id}) {
     $$keyp{$id}.=','.$key;   $$keyp{$id}.=','.$key;
  } else {      } else {
     $$keyp{$id}=$key;   $$keyp{$id}=$key;
  }      }
 #  #
 # Put in order  # Put in order
 #   # 
                 unless ($$keyorder{$key}) {      unless ($$keyorder{$key}) {
                     $$keyorder{$key}=$keyordercnt;   $$keyorder{$key}=$keyordercnt;
                     $keyordercnt++;   $keyordercnt++;
  }  
   
     }      }
  }   }
  $$mapp{$id}=  
     &Apache::lonnet::declutter($resource->enclosing_map_src());  
  $$mapp{$mapid}=$$mapp{$id};   if (!exists($$mapp{$mapid})) {
  $$allmaps{$mapid}=$$mapp{$id};      $$mapp{$id}=
  if ($mapid eq '1') {   &Apache::lonnet::declutter($resource->enclosing_map_src());
     $$maptitles{$mapid}='Main Course Documents';      $$mapp{$mapid}=$$mapp{$id};
       $$allmaps{$mapid}=$$mapp{$id};
       if ($mapid eq '1') {
    $$maptitles{$mapid}='Main Course Documents';
       } else {
    $$maptitles{$mapid}=
       &Apache::lonnet::gettitle($$mapp{$id});    
       }
       $$maptitles{$$mapp{$id}}=$$maptitles{$mapid};
       $$symbp{$mapid}=$$mapp{$id}.'___(all)';
  } else {   } else {
     $$maptitles{$mapid}=&Apache::lonnet::gettitle(&Apache::lonnet::clutter($$mapp{$id}));      $$mapp{$id} = $$mapp{$mapid};
  }   }
  $$maptitles{$$mapp{$id}}=$$maptitles{$mapid};  
  $$symbp{$id}=&Apache::lonnet::encode_symb($$mapp{$id},$resid,$srcf);   $$symbp{$id}=&Apache::lonnet::encode_symb($$mapp{$id},$resid,$srcf);
  $$symbp{$mapid}=$$mapp{$id}.'___(all)';  
     }      }
 }  }
   
Line 1071  ENDSCRIPT Line 1107  ENDSCRIPT
  if ($$pscat[0] eq "all" || grep $_ eq $tempkey, @{$pscat}) {   if ($$pscat[0] eq "all" || grep $_ eq $tempkey, @{$pscat}) {
     $r->print(' checked');      $r->print(' checked');
  }   }
  $r->print('>'.$$allparms{$tempkey}.'</label></td>');   $r->print('>'.($$allparms{$tempkey}=~/\S/ ? $$allparms{$tempkey}
                                     : $tempkey)
     .'</label></td>');
   $cnt++;    $cnt++;
         if ($cnt==3) {          if ($cnt==3) {
     $r->print("</tr>\n<tr>");      $r->print("</tr>\n<tr>");
Line 1563  sub assessparms { Line 1601  sub assessparms {
     foreach ('tolerance','date_default','date_start','date_end',      foreach ('tolerance','date_default','date_start','date_end',
      'date_interval','int','float','string') {       'date_interval','int','float','string') {
  $r->print('<input type="hidden" value="'.   $r->print('<input type="hidden" value="'.
   $env{'form.recent_'.$_}.'" name="recent_'.$_.'" />');    &HTML::Entities::encode($env{'form.recent_'.$_},'"&<>').
     '" name="recent_'.$_.'" />');
     }      }
                                                   
     if (!$pssymb) {      if (!$pssymb) {
Line 1987  sub crsenv { Line 2026  sub crsenv {
     my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};      my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
     my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};      my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
   
       my (%crsinfo,$chome);
   
     #      #
     # Go through list of changes      # Go through list of changes
     foreach (keys %env) {      foreach (keys %env) {
Line 2034  sub crsenv { Line 2075  sub crsenv {
         if ($name =~ /^default_enrollment_(start|end)_date$/) {          if ($name =~ /^default_enrollment_(start|end)_date$/) {
             $value=&Apache::lonhtmlcommon::get_date_from_form($name.'_value');              $value=&Apache::lonhtmlcommon::get_date_from_form($name.'_value');
         }          }
    #
           # Deal with the emails
           if ($name =~ /\.email$/) {
       foreach my $specifier (split(',',$value)) {
    my ($user,$sections_or_groups)=
       ($specifier=~/^([^\(]+)\(([^\)]+)\)/);
    if (!$sections_or_groups) {
       $user = $specifier;
    }
    my ($name,$domain) = split(':',$user);
    if (!defined($user) || !defined($domain)) {
       $setoutput.= '<br /> <span class="LC_error">'.
    &mt("Invalid email address specified, address must be of the form username:domain what was specified was ([_1])",$user).
    '</span>';
       undef($value);
    } elsif (&Apache::lonnet::homeserver($user,$domain) eq 'no_host') {
       $setoutput.= '<br /> <span class="LC_error">'.
    &mt("Invalid email address specified, user [_1] is unknown.",$name).
    '</span>';
       undef($value);
    }
       }
           }
         # Get existing cloners          # Get existing cloners
         my @oldcloner = ();          my @oldcloner = ();
         if ($name eq 'cloners') {          if ($name eq 'cloners') {
Line 2047  sub crsenv { Line 2111  sub crsenv {
         #          #
         # Let the user know we made the changes          # Let the user know we made the changes
         if ($name && defined($value)) {          if ($name && defined($value)) {
             my $failed_cloners;              my %failed_cloners;
             if ($name eq 'cloners') {              if ($name eq 'cloners') {
                 $value =~ s/\s//g;                  $value =~ s/\s//g;
                 $value =~ s/^,//;                  $value =~ s/^,//;
                 $value =~ s/,$//;                  $value =~ s/,$//;
                 # check requested clones are valid users.                  # check requested clones are valid users.
                 $failed_cloners = &check_cloners(\$value,\@oldcloner);                  %failed_cloners = &check_cloners(\$value,\@oldcloner);
             }              }
             my $put_result = &Apache::lonnet::put('environment',              my $put_result = &Apache::lonnet::put('environment',
                                                   {$name=>$value},$dom,$crs);                                                    {$name=>$value},$dom,$crs);
             if ($put_result eq 'ok') {              if ($put_result eq 'ok') {
                 $setoutput.=&mt('Set').' <b>'.$name.'</b> '.&mt('to').' <b>'.$value.'</b>.<br />';                  $setoutput.=&mt('Set').' <b>'.$name.'</b> '.&mt('to').' <b>';
                   if ($name =~ /^default_enrollment_(start|end)_date$/) {
                       $setoutput .= &Apache::lonlocal::locallocaltime($value);
                   } else {
                       $setoutput .= $value;
                   }
                   $setoutput .= '</b>.<br />';
                 if ($name eq 'cloners') {                  if ($name eq 'cloners') {
                     &change_clone($value,\@oldcloner);                      &change_clone($value,\@oldcloner);
                 }                  }
                 # Flush the course logs so course description is immediately updated                  # Update environment and nohist_courseids.db
                   if ($name eq 'description' || $name eq 'cloners') {
                       if ($chome eq '') {
                           %crsinfo =
                               &Apache::lonnet::courseiddump($dom,'.',1,'.','.',
                                                    $crs,undef,undef,'Course');
                           $chome = &Apache::lonnet::homeserver($crs,$dom);
                       }
                   }
                 if ($name eq 'description' && defined($value)) {                  if ($name eq 'description' && defined($value)) {
                     &Apache::lonnet::flushcourselogs();                      &Apache::lonnet::appenv({'course.'.$env{'request.course.id'}.'.description' => $value});
                       if (ref($crsinfo{$env{'request.course.id'}}) eq 'HASH') {
                           $crsinfo{$env{'request.course.id'}}{'description'} = $value; 
                           my $putresult =
                               &Apache::lonnet::courseidput($dom,\%crsinfo,
                                                            $chome,'notime');
                       }
                   }
                   if ($name eq 'cloners') {
                       if (ref($crsinfo{$env{'request.course.id'}}) eq 'HASH') {
                           $crsinfo{$env{'request.course.id'}}{'cloners'} = $value;
                           my $putresult =
                               &Apache::lonnet::courseidput($dom,\%crsinfo,
                                                            $chome,'notime');
                       }
                 }                  }
             } else {              } else {
                 $setoutput.=&mt('Unable to set').' <b>'.$name.'</b> '.&mt('to').                  $setoutput.=&mt('Unable to set').' <b>'.$name.'</b> '.&mt('to').
     ' <b>'.$value.'</b> '.&mt('due to').' '.$put_result.'.<br />';      ' <b>'.$value.'</b> '.&mt('due to').' '.$put_result.'.<br />';
             }              }
             if (($name eq 'cloners') && ($failed_cloners)) {              if (($name eq 'cloners') && (keys(%failed_cloners) > 0)) {
                 $setoutput.= &mt('Unable to include').' - <b>'.$failed_cloners.'</b>, '.                  $setoutput.= &mt('Unable to include').': ';
                  &mt('reason').' - '.&mt('LON-CAPA user(s) do(es) not exist').                  my @fails;
                  '.<br />'.&mt('Please ').                  my $num = 0;
                  ' <a href="/adm/createuser">'.                  if (defined($failed_cloners{'format'})) {
                  &mt('add the user(s)').'</a>, '.                      $fails[$num] .= '<b>'.$failed_cloners{'format'}.
                  &mt('and then return to the ').                                    '</b>, '.&mt('reason').' - '.
                  '<a href="/admparmset?action=crsenv">'.                                    &mt('Invalid format');
                  &mt('Course Parameters page').'</a> '.                      $num ++;
                  &mt('to add the new user(s) to the list of possible cloners').                  }
                  '.<br />';                  if (defined($failed_cloners{'domain'})) {
                       $fails[$num] .= '<b>'.$failed_cloners{'domain'}.
                                     '</b>, '.&mt('reason').' - '.
                                     &mt('Domain does not exist');
                       $num ++;
                   }
                   if (defined($failed_cloners{'newuser'})) {
                       $fails[$num] .= '<b>'.$failed_cloners{'newuser'}.                                   '</b>, '.&mt('reason').' - '.
                           &mt('LON-CAPA user(s) do(es) not exist.').
                           '.<br />'.&mt('Please ').
                           ' <a href="/adm/createuser">'.
                           &mt('add the user(s)').'</a>, '.
                           &mt('and then return to the ').
                           '<a href="/adm/parmset?action=crsenv">'.
                           &mt('Course Parameters page').'</a> '.
                           &mt('to add the new user(s) to the list of possible cloners');
                   }
                   $setoutput .= join(';&nbsp;&nbsp;',@fails).'.<br />';
             }              }
         }          }
     }      }
Line 2111  sub crsenv { Line 2220  sub crsenv {
              'courseid'       => '<b>'.&mt('Course ID or number').               'courseid'       => '<b>'.&mt('Course ID or number').
                                  '</b><br />'.                                   '</b><br />'.
                                  '('.&mt('internal').', '.&mt('optional').')',                                   '('.&mt('internal').', '.&mt('optional').')',
              'cloners'        => '<b>'.&mt('Users allowed to clone course').'</b><br /><tt>(user:domain,user:domain)</tt><br />'.&mt('Users with active Course Coordinator role in the course automatically have the right to clone it, and can be omitted from list.'),               'cloners'        => '<b>'.&mt('Users allowed to clone course').'</b><br /><tt>(user:domain,user:domain,*:domain)</tt><br />'.&mt('Users with active Course Coordinator role in course are permitted to clone and need not be included.<br />
   Use *:domain to allow course to be cloned by anyone in the specified domain.<br />
   Use * to allow unrestricted cloning in all domains.'),
              'grading'        => '<b>'.&mt('Grading').'</b><br />'.               'grading'        => '<b>'.&mt('Grading').'</b><br />'.
                                  '<tt>"standard", "external", or "spreadsheet"</tt> '.&Apache::loncommon::help_open_topic('GradingOptions'),                                   '<tt>"standard", "external", or "spreadsheet"</tt> '.&Apache::loncommon::help_open_topic('GradingOptions'),
        'task_grading'   => '<b>'.&mt('Bridge Task Grading').'</b><br />'.
                                    &mt('Instructors and TAs in sections, when grading bridge tasks, should be allowed to grade other sections, "[_1]" they are allowed (this is the default), "[_2]" no, they can only grade their own section','<tt>any</tt>','<tt>section</tt>'),
              'default_xml_style' => '<b>'.&mt('Default XML Style File').'</b> '.               'default_xml_style' => '<b>'.&mt('Default XML Style File').'</b> '.
                     '<a href="javascript:openbrowser'.                      '<a href="javascript:openbrowser'.
                     "('envform','default_xml_style'".                      "('envform','default_xml_style'".
Line 2136  sub crsenv { Line 2249  sub crsenv {
              'pageseparators'  => '<b>'.&mt('Visibly Separate Items on Pages').'</b><br />'.               'pageseparators'  => '<b>'.&mt('Visibly Separate Items on Pages').'</b><br />'.
                                  '('.&mt('"[_1]" for visible separation','<tt>yes</tt>').', '.                                   '('.&mt('"[_1]" for visible separation','<tt>yes</tt>').', '.
                                  &mt('changes will not show until next login').')',                                   &mt('changes will not show until next login').')',
              'student_classlist_view' => '<b>'.&mt('Allow students to view classlist.').'</b>'.&mt('("all":students can view all sections,"section":students can only view their own section.blank or "disabled" prevents student view.'),               'student_classlist_view' => '<b>'.&mt('Allow students to view classlist.').'</b><br />'.&mt('("all":students can view all sections,"section":students can only view their own section.blank or "disabled" prevents student view.)'),
                'student_classlist_portfiles' => '<b>'.&mt('Include link to accessible portfolio files').'</b><br />'.&mt('"[_1]" for link to each a listing of each student\'s files.','<tt>yes</tt>'),
                'student_classlist_opt_in' => '<b>'.&mt("Student's agreement needed for listing in student-viewable roster").'</b><br />'.&mt('"[_1]" to require students to opt-in to listing in the roster (on the roster page).','<tt>yes</tt>'),
              'plc.roles.denied'=> '<b>'.&mt('Disallow live chatroom use for Roles').               'plc.roles.denied'=> '<b>'.&mt('Disallow live chatroom use for Roles').
                                   '</b><br />"<tt>st</tt>": '.                                    '</b><br />("<tt>st</tt>": '.
                                   &mt('student').', "<tt>ta</tt>": '.                                    &mt('student').', "<tt>ta</tt>": '.
                                   'TA, "<tt>in</tt>": '.                                    'TA, "<tt>in</tt>": '.
                                   &mt('instructor').';<br /><tt>'.&mt('role,role,...').'</tt>) '.                                    &mt('instructor').';<br /><tt>'.&mt('role,role,...').'</tt>) '.
Line 2149  sub crsenv { Line 2263  sub crsenv {
                                  '(<tt>user:domain,user:domain,...</tt>)',                                   '(<tt>user:domain,user:domain,...</tt>)',
   
              'pch.roles.denied'=> '<b>'.&mt('Disallow Resource Discussion for Roles').               'pch.roles.denied'=> '<b>'.&mt('Disallow Resource Discussion for Roles').
                                   '</b><br />"<tt>st</tt>": '.                                    '</b><br />("<tt>st</tt>": '.
                                   'student, "<tt>ta</tt>": '.                                    'student, "<tt>ta</tt>": '.
                                   'TA, "<tt>in</tt>": '.                                    'TA, "<tt>in</tt>": '.
                                   'instructor;<br /><tt>role,role,...</tt>) '.                                    'instructor;<br /><tt>role,role,...</tt>) '.
Line 2200  sub crsenv { Line 2314  sub crsenv {
                     ' Tabloid [11x17 in], Executive [7 1/2x10 in], A2 [420x594 mm],'.                       ' Tabloid [11x17 in], Executive [7 1/2x10 in], A2 [420x594 mm],'. 
                     ' A3 [297x420 mm], A4 [210x297 mm], A5 [148x210 mm], A6 [105x148 mm])',                      ' A3 [297x420 mm], A4 [210x297 mm], A5 [148x210 mm], A6 [105x148 mm])',
      'print_header_format'       'print_header_format'
          => '<b>Print header format; substitutions</b>:  %n student name %c course id %a assignment note, numbers after the % limit the field size',           => &mtn('<b> Print header format; substitutions </b>:  %n student name %c course id %a assignment note, numbers after the % limit the field size.').'</b>',
              'anonymous_quiz'  
                  => '<b>'.&mt('Anonymous quiz/exam').'</b><br />'.  
                     ' (<tt><b>'.&mt('yes').'</b> '.&mt('to avoid print students names').' </tt>)',  
              'default_enrollment_start_date' => '<b>'.&mt('Default beginning date for student access.').'</b>',               'default_enrollment_start_date' => '<b>'.&mt('Default beginning date for student access.').'</b>',
              'default_enrollment_end_date'   => '<b>'.&mt('Default ending date for student access.').'</b>',               'default_enrollment_end_date'   => '<b>'.&mt('Default ending date for student access.').'</b>',
              'nothideprivileged'   => '<b>'.&mt('Privileged users that should not be hidden on staff listings').'</b>'.               'nothideprivileged'   => '<b>'.&mt('Privileged users that should not be hidden on staff listings').'</b>'.
Line 2223  sub crsenv { Line 2334  sub crsenv {
              'externalsyllabus'               'externalsyllabus'
                  => '<b>'.&mt('URL of Syllabus (not using internal handler)').'</b>',                   => '<b>'.&mt('URL of Syllabus (not using internal handler)').'</b>',
      'tthoptions'       'tthoptions'
          => '<b>'.&mt('Default set of options to pass to tth/m when converting tex').'</b>'           => '<b>'.&mt('Default set of options to pass to tth/m when converting tex').'</b>',
   
        'texengine'
            => '<b>'.&mt('Force all students in the course to use a specific math rendering engine.').'</b><br />'.&mt('(Valid options are [_1].)','"tth", "jsMath", "mimetex"').'</b>',
   
              );                ); 
         my @Display_Order = ('url','description','courseid','cloners','grading',          my @Display_Order = ('url','description','courseid','cloners','grading',
                              'externalsyllabus',                               'externalsyllabus',
                              'default_xml_style','pageseparators',                               'default_xml_style','pageseparators',
                              'question.email','question.email.text','comment.email','comment.email.text','policy.email','policy.email.text',                               'question.email','question.email.text','comment.email','comment.email.text','policy.email','policy.email.text',
                              'student_classlist_view',                               'student_classlist_view',
                                'student_classlist_opt_in',
                                'student_classlist_portfiles',
                              'plc.roles.denied','plc.users.denied',                               'plc.roles.denied','plc.users.denied',
                              'pch.roles.denied','pch.users.denied',                               'pch.roles.denied','pch.users.denied',
                              'allow_limited_html_in_feedback',                               'allow_limited_html_in_feedback',
Line 2250  sub crsenv { Line 2367  sub crsenv {
                              'default_enrollment_start_date',                               'default_enrollment_start_date',
                              'default_enrollment_end_date',                               'default_enrollment_end_date',
      'tthoptions',       'tthoptions',
        'texengine',
      'disablesigfigs',       'disablesigfigs',
      'disableexampointprint',       'disableexampointprint',
      'task_messages'       'task_messages','task_grading',
                              );                               );
  foreach my $parameter (sort(keys(%values))) {   foreach my $parameter (sort(keys(%values))) {
             unless (($parameter =~ m/^internal\./)||($parameter =~ m/^metadata\./)) {              unless (($parameter =~ m/^internal\./)||($parameter =~ m/^metadata\./)) {
Line 2333  $start_header_row Line 2451  $start_header_row
 $end_header_row  $end_header_row
 $output  $output
 $end_table  $end_table
 <input type="submit" name="crsenv" value="$lt{'sce'}">  <input type="submit" name="crsenv" value="$lt{'sce'}" />
 </form>  </form>
 $end_page  $end_page
 ENDENV  ENDENV
Line 2406  sub storedata { Line 2524  sub storedata {
             if ($tuname) {              if ($tuname) {
  $tkey=~s/\.\[useropt\:$tuname\:$tudom\]\./\./;   $tkey=~s/\.\[useropt\:$tuname\:$tudom\]\./\./;
     }      }
     if ($cmd eq 'set') {      if ($cmd eq 'set' || $cmd eq 'datepointer' || $cmd eq 'dateinterval') {
  my $data=$env{$_};   my ($data, $typeof, $text);
                 my $typeof=$env{'form.typeof_'.$thiskey};   if ($cmd eq 'set') {
   if ($$olddata{$thiskey} ne $data) {       $data=$env{$_};
       $typeof=$env{'form.typeof_'.$thiskey};
       $text = &mt('Saved modified parameter for');
    } elsif ($cmd eq 'datepointer') {
       $data=&Apache::lonhtmlcommon::get_date_from_form($env{$_});
       $typeof=$env{'form.typeof_'.$thiskey};
       $text = &mt('Saved modified date for');
    } elsif ($cmd eq 'dateinterval') {
       $data=&get_date_interval_from_form($thiskey);
       $typeof=$env{'form.typeof_'.$thiskey};
       $text = &mt('Saved modified date for');
    }
    if (defined($data) and $$olddata{$thiskey} ne $data) { 
     if ($tuname) {      if ($tuname) {
  if (&Apache::lonnet::put('resourcedata',{$tkey=>$data,   if (&Apache::lonnet::put('resourcedata',{$tkey=>$data,
  $tkey.'.type' => $typeof},   $tkey.'.type' => $typeof},
  $tudom,$tuname) eq 'ok') {   $tudom,$tuname) eq 'ok') {
     &log_parmset({$tkey=>$data,$tkey.'.type' => $typeof},0,$tuname,$tudom);      &log_parmset({$tkey=>$data,$tkey.'.type' => $typeof},0,$tuname,$tudom);
     $r->print('<br />'.&mt('Stored modified parameter for').' '.      $r->print('<br />'.$text.' '.
       &Apache::loncommon::plainname($tuname,$tudom));        &Apache::loncommon::plainname($tuname,$tudom));
  } else {   } else {
     $r->print('<div class="LC_error">'.      $r->print('<div class="LC_error">'.
       &mt('Error storing parameters').'</div>');        &mt('Error saving parameters').'</div>');
  }   }
  &Apache::lonnet::devalidateuserresdata($tuname,$tudom);   &Apache::lonnet::devalidateuserresdata($tuname,$tudom);
     } else {      } else {
Line 2440  sub storedata { Line 2570  sub storedata {
  } else {   } else {
     push (@deldata,$thiskey,$thiskey.'.type');      push (@deldata,$thiskey,$thiskey.'.type');
  }   }
     } elsif ($cmd eq 'datepointer') {  
  my $data=&Apache::lonhtmlcommon::get_date_from_form($env{$_});  
                 my $typeof=$env{'form.typeof_'.$thiskey};  
  if (defined($data) and $$olddata{$thiskey} ne $data) {   
     if ($tuname) {  
  if (&Apache::lonnet::put('resourcedata',{$tkey=>$data,  
  $tkey.'.type' => $typeof},  
  $tudom,$tuname) eq 'ok') {  
     &log_parmset({$tkey=>$data,$tkey.'.type' => $typeof},0,$tuname,$tudom);  
     $r->print('<br />'.&mt('Stored modified date for').' '.&Apache::loncommon::plainname($tuname,$tudom));  
  } else {  
     $r->print('<div class="LC_error">'.  
       &mt('Error storing parameters').'</div>');  
  }  
  &Apache::lonnet::devalidateuserresdata($tuname,$tudom);  
     } else {  
  $newdata{$thiskey}=$data;  
  $newdata{$thiskey.'.type'}=$typeof;   
     }  
  }  
     }      }
  }   }
     }      }
Line 2481  sub storedata { Line 2591  sub storedata {
     if ($putentries) {      if ($putentries) {
  if (&Apache::lonnet::put('resourcedata',\%newdata,$dom,$crs) eq 'ok') {   if (&Apache::lonnet::put('resourcedata',\%newdata,$dom,$crs) eq 'ok') {
     &log_parmset(\%newdata,0);      &log_parmset(\%newdata,0);
     $r->print('<h3>'.&mt('Stored [_1] parameter(s)',$putentries/2).'</h3>');      $r->print('<h3>'.&mt('Saved [_1] parameter(s)',$putentries/2).'</h3>');
  } else {   } else {
     $r->print('<div class="LC_error">'.      $r->print('<div class="LC_error">'.
       &mt('Error storing parameters').'</div>');        &mt('Error saving parameters').'</div>');
  }   }
  &Apache::lonnet::devalidatecourseresdata($crs,$dom);   &Apache::lonnet::devalidatecourseresdata($crs,$dom);
     }      }
Line 2495  sub extractuser { Line 2605  sub extractuser {
     return ($key=~/^$env{'request.course.id'}.\[useropt\:($match_username)\:($match_domain)\]\./);      return ($key=~/^$env{'request.course.id'}.\[useropt\:($match_username)\:($match_domain)\]\./);
 }  }
   
   sub parse_listdata_key {
       my ($key,$listdata) = @_;
       # split into student/section affected, and
       # the realm (folder/resource part and parameter
       my ($student,$realm) = 
    ($key=~/^\Q$env{'request.course.id'}\E\.\[([^\.]+)\]\.(.+)$/);
       # if course wide student would be undefined
       if (!defined($student)) {
    ($realm)=($key=~/^\Q$env{'request.course.id'}\E\.(.+)$/);
       }
       # strip off the .type if it's not the Question type parameter
       if ($realm=~/\.type$/ && !exists($listdata->{$key.'.type'})) {
    $realm=~s/\.type//;
       }
       # split into resource+part and parameter name
       my ($res,    $parm) = ($realm=~/^(.*)\.(.*)$/);
          ($res, my $part) = ($res  =~/^(.*)\.(.*)$/);
       return ($student,$res,$part,$parm);
   }
   
 sub listdata {  sub listdata {
     my ($r,$resourcedata,$listdata,$sortorder)=@_;      my ($r,$resourcedata,$listdata,$sortorder)=@_;
 # Start list output  # Start list output
Line 2506  sub listdata { Line 2636  sub listdata {
     $tableopen=0;      $tableopen=0;
     my $foundkeys=0;      my $foundkeys=0;
     my %keyorder=&standardkeyorder();      my %keyorder=&standardkeyorder();
   
     foreach my $thiskey (sort {      foreach my $thiskey (sort {
    my ($astudent,$ares,$apart,$aparm) = &parse_listdata_key($a,$listdata);
    my ($bstudent,$bres,$bpart,$bparm) = &parse_listdata_key($b,$listdata);
   
    # get the numerical order for the param
    $aparm=$keyorder{'parameter_0_'.$aparm};
    $bparm=$keyorder{'parameter_0_'.$bparm};
   
    my $result=0;
   
  if ($sortorder eq 'realmstudent') {   if ($sortorder eq 'realmstudent') {
     my ($astudent,$arealm)=($a=~/^\Q$env{'request.course.id'}\E\.\[([^\.]+)\]\.(.+)\.[^\.]+$/);              if ($ares     ne $bres    ) {
     my ($bstudent,$brealm)=($b=~/^\Q$env{'request.course.id'}\E\.\[([^\.]+)\]\.(.+)\.[^\.]+$/);   $result = ($ares     cmp $bres);
     if (!defined($astudent)) {              } elsif ($astudent ne $bstudent) { 
  ($arealm)=($a=~/^\Q$env{'request.course.id'}\E\.(.+)$/);   $result = ($astudent cmp $bstudent);
     }      } elsif ($apart    ne $bpart   ) {
     if (!defined($bstudent)) {   $result = ($apart    cmp $bpart);
  ($brealm)=($b=~/^\Q$env{'request.course.id'}\E\.(.+)$/);  
     }  
     $arealm=~s/\.type//;  
     my ($ares, $aparm) = ($arealm=~/^(.*)\.(.*)$/);  
     $aparm=$keyorder{'parameter_0_'.$aparm};  
     $brealm=~s/\.type//;  
     my ($bres, $bparm) = ($brealm=~/^(.*)\.(.*)$/);  
     $bparm=$keyorder{'parameter_0_'.$bparm};     
     if ($ares eq $bres) {  
  if (defined($aparm) && defined($bparm)) {  
     ($aparm <=> $bparm);  
  } elsif (defined($aparm)) {  
     -1;  
  } elsif (defined($bparm)) {  
     1;  
  } else {  
     ($arealm cmp $brealm) || ($astudent cmp $bstudent);  
  }  
     } else {  
  ($arealm cmp $brealm) || ($astudent cmp $bstudent);  
     }      }
  } else {   } else {
     $a cmp $b;      if      ($astudent ne $bstudent) { 
    $result = ($astudent cmp $bstudent);
       } elsif ($ares     ne $bres    ) {
    $result = ($ares     cmp $bres);
       } elsif ($apart    ne $bpart   ) {
    $result = ($apart    cmp $bpart);
       }
  }   }
       
    if (!$result) {
               if (defined($aparm) && defined($bparm)) {
    $result = ($aparm <=> $bparm);
               } elsif (defined($aparm)) {
    $result = -1;
               } elsif (defined($bparm)) {
    $result = 1;
       }
    }
   
    $result;
     } keys %{$listdata}) {      } keys %{$listdata}) {
     
  if ($$listdata{$thiskey.'.type'}) {   if ($$listdata{$thiskey.'.type'}) {
             my $thistype=$$listdata{$thiskey.'.type'};              my $thistype=$$listdata{$thiskey.'.type'};
             if ($$resourcedata{$thiskey.'.type'}) {              if ($$resourcedata{$thiskey.'.type'}) {
Line 2612  sub listdata { Line 2750  sub listdata {
       $$resourcedata{$thiskey},        $$resourcedata{$thiskey},
       '',1,'','').        '',1,'','').
 '<input type="hidden" name="datepointer_'.$thiskey.'" value="'.$jskey.'" />'.  '<input type="hidden" name="datepointer_'.$thiskey.'" value="'.$jskey.'" />'.
   (($$resourcedata{$thiskey}!=0)?'<a href="/adm/parmset?&action=dateshift1&timebase='.$$resourcedata{$thiskey}.'">'.
   &mt('Shift all dates based on this date').'</a>':'').
 &date_sanity_info($$resourcedata{$thiskey})  &date_sanity_info($$resourcedata{$thiskey})
   );    );
     } elsif ($thistype eq 'string_yesno') {      } elsif ($thistype eq 'date_interval') {
  my $showval;   $r->print(&date_interval_selector($thiskey,
  if (defined($$resourcedata{$thiskey})) {    $$resourcedata{$thiskey}));
     $showval=$$resourcedata{$thiskey};      } elsif ($thistype =~ m/^string/) {
  }   $r->print(&string_selector($thistype,$thiskey,
  $r->print('<label><input type="radio" name="set_'.$thiskey.     $$resourcedata{$thiskey}));
   '" value="yes"');  
  if ($showval eq 'yes') {  
     $r->print(' checked="checked"');  
  }  
                 $r->print(' />'.&mt('Yes').'</label> ');  
  $r->print('<label><input type="radio" name="set_'.$thiskey.  
   '" value="no"');  
  if ($showval eq 'no') {  
     $r->print(' checked="checked"');  
  }  
                 $r->print(' />'.&mt('No').'</label>');  
     } else {      } else {
  my $showval;   $r->print(&default_selector($thiskey,$$resourcedata{$thiskey}));
  if (defined($$resourcedata{$thiskey})) {  
     $showval=$$resourcedata{$thiskey};  
  }  
  $r->print('<input type="text" name="set_'.$thiskey.'" value="'.  
   $showval.'">');  
     }      }
     $r->print('<input type="hidden" name="typeof_'.$thiskey.'" value="'.      $r->print('<input type="hidden" name="typeof_'.$thiskey.'" value="'.
       $thistype.'">');        $thistype.'">');
Line 2647  sub listdata { Line 2771  sub listdata {
     return $foundkeys;      return $foundkeys;
 }  }
   
   
   sub date_interval_selector {
       my ($thiskey, $showval) = @_;
       my $result;
       foreach my $which (['days', 86400, 31],
          ['hours', 3600, 23],
          ['minutes', 60, 59],
          ['seconds',  1, 59]) {
    my ($name, $factor, $max) = @{ $which };
    my $amount = int($showval/$factor);
    $showval  %= $factor;
    my %select = ((map {$_ => $_} (0..$max)),
         'select_form_order' => [0..$max]);
    $result .= &Apache::loncommon::select_form($amount,$name.'_'.$thiskey,
      %select);
    $result .= ' '.&mt($name);
       }
       $result .= '<input type="hidden" name="dateinterval_'.$thiskey.'" />';
       return $result;
   
   }
   
   sub get_date_interval_from_form {
       my ($key) = @_;
       my $seconds = 0;
       foreach my $which (['days', 86400],
          ['hours', 3600],
          ['minutes', 60],
          ['seconds',  1]) {
    my ($name, $factor) = @{ $which };
    if (defined($env{'form.'.$name.'_'.$key})) {
       $seconds += $env{'form.'.$name.'_'.$key} * $factor;
    }
       }
       return $seconds;
   }
   
   
   sub default_selector {
       my ($thiskey, $showval) = @_;
       return '<input type="text" name="set_'.$thiskey.'" value="'.$showval.'" />';
   }
   
   my %strings = 
       (
        'string_yesno'
                => [[ 'yes', 'Yes' ],
    [ 'no', 'No' ]],
        'string_problemstatus'
                => [[ 'yes', 'Yes' ],
    [ 'answer', 'Yes, and show correct answer if they exceed the maximum number of tries.' ],
    [ 'no', 'No, don\'t show correct/incorrect feedback.' ],
    [ 'no_feedback_ever', 'No, show no feedback at all.' ]],
        );
   
   
   sub string_selector {
       my ($thistype, $thiskey, $showval) = @_;
       
       if (!exists($strings{$thistype})) {
    return &default_selector($thiskey,$showval);
       }
   
       my $result;
       foreach my $possibilities (@{ $strings{$thistype} }) {
    my ($name, $description) = @{ $possibilities };
    $result .= '<label><input type="radio" name="set_'.$thiskey.
     '" value="'.$name.'"';
    if ($showval eq $name) {
       $result .= ' checked="checked"';
    }
    $result .= ' />'.&mt($description).'</label> ';
       }
       return $result;
   }
   
   #
   # Shift all start and end dates by $shift
   #
   
   sub dateshift {
       my ($shift)=@_;
       my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
       my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
       my %data=&Apache::lonnet::dump('resourcedata',$dom,$crs);
   # ugly retro fix for broken version of types
       foreach my $key (keys %data) {
           if ($key=~/\wtype$/) {
               my $newkey=$key;
               $newkey=~s/type$/\.type/;
               $data{$newkey}=$data{$key};
               delete $data{$key};
           }
       }
       my %storecontent=();
   # go through all parameters and look for dates
       foreach my $key (keys %data) {
          if ($data{$key.'.type'}=~/^date_(start|end)$/) {
             my $newdate=$data{$key}+$shift;
             $storecontent{$key}=$newdate;
          }
       }
       my $reply=&Apache::lonnet::cput
                   ('resourcedata',\%storecontent,$dom,$crs);
       if ($reply eq 'ok') {
          &log_parmset(\%storecontent);
       }
       &Apache::lonnet::devalidatecourseresdata($crs,$dom);
       return $reply;
   }
   
 sub newoverview {  sub newoverview {
     my ($r) = @_;      my ($r) = @_;
   
Line 2688  ENDOVER Line 2923  ENDOVER
     my @selected_sections =       my @selected_sections = 
  &Apache::loncommon::get_env_multiple('form.Section');   &Apache::loncommon::get_env_multiple('form.Section');
     @selected_sections = ('all') if (! @selected_sections);      @selected_sections = ('all') if (! @selected_sections);
     foreach (@selected_sections) {      foreach my $sec (@selected_sections) {
         if ($_ eq 'all') {          if ($sec eq 'all') {
             @selected_sections = ('all');              @selected_sections = ('all');
         }          }
     }      }
Line 2709  ENDOVER Line 2944  ENDOVER
  \%mapp, \%symbp,\%maptitles,\%uris,   \%mapp, \%symbp,\%maptitles,\%uris,
  \%keyorder,\%defkeytype);   \%keyorder,\%defkeytype);
   
       if (grep {$_ eq 'all'} (@psprt)) {
    @psprt = keys(%allparts);
       }
 # Menu to select levels, etc  # Menu to select levels, etc
   
     $r->print('<table id="LC_parm_overview_scope">      $r->print('<table id="LC_parm_overview_scope">
Line 2765  ENDOVER Line 3003  ENDOVER
  &listdata($r,$resourcedata,$listdata,$sortorder);   &listdata($r,$resourcedata,$listdata,$sortorder);
     }      }
     $r->print(&tableend().      $r->print(&tableend().
      ((($env{'form.store'}) || ($env{'form.dis'}))?'<p><input type="submit" name="store" value="'.&mt('Store').'" /></p>':'').       ((($env{'form.store'}) || ($env{'form.dis'}))?'<p><input type="submit" name="store" value="'.&mt('Save').'" /></p>':'').
       '</form>'.&Apache::loncommon::end_page());        '</form>'.&Apache::loncommon::end_page());
 }  }
   
Line 2874  ENDOVER Line 3112  ENDOVER
  next if (!exists($resourcedata->{$thiskey.'.type'})   next if (!exists($resourcedata->{$thiskey.'.type'})
  && $thiskey=~/\.type$/);   && $thiskey=~/\.type$/);
  my %data = &parse_key($thiskey);   my %data = &parse_key($thiskey);
  if (exists($data{'realm_exists'})   if (1) { #exists($data{'realm_exists'})
     && !$data{'realm_exists'}) {      #&& !$data{'realm_exists'}) {
     $r->print(&Apache::loncommon::start_data_table_row().      $r->print(&Apache::loncommon::start_data_table_row().
       '<tr>'.        '<tr>'.
       '<td><input type="checkbox" name="del_'.$thiskey.'" /></td>'      );        '<td><input type="checkbox" name="del_'.$thiskey.'" /></td>'      );
           
     $r->print('<td>');      $r->print('<td>');
       my $display_value = $resourcedata->{$thiskey};
       if (&isdateparm($resourcedata->{$thiskey.'.type'})) {
    $display_value = 
       &Apache::lonlocal::locallocaltime($display_value);
       }
     $r->print(&mt('Parameter: "[_1]" with value: "[_2]"',      $r->print(&mt('Parameter: "[_1]" with value: "[_2]"',
   &standard_parameter_names($data{'parameter_name'}),    &standard_parameter_names($data{'parameter_name'}),
   $resourcedata->{$thiskey}));    $resourcedata->{$thiskey}));
Line 2905  ENDOVER Line 3148  ENDOVER
  $r->print(&mt('Resource: [_1] <br />&nbsp;&nbsp;&nbsp;with ID: [_2] <br />&nbsp;&nbsp;&nbsp;in folder [_3]',   $r->print(&mt('Resource: [_1] <br />&nbsp;&nbsp;&nbsp;with ID: [_2] <br />&nbsp;&nbsp;&nbsp;in folder [_3]',
       $url,$resid,$map));        $url,$resid,$map));
     }      }
     $r->print(&mt('Part: [_1]',$data{'parameter_part'}));      $r->print(' <br />&nbsp;&nbsp;&nbsp;'.&mt('Part: [_1]',$data{'parameter_part'}));
     $r->print('</td></tr>');      $r->print('</td></tr>');
   
  }   }
Line 2916  ENDOVER Line 3159  ENDOVER
       &Apache::loncommon::end_page());        &Apache::loncommon::end_page());
 }  }
   
   sub date_shift_one {
       my ($r) = @_;
       my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
       my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
   
       my $start_page=&Apache::loncommon::start_page('Shift Dates');
       my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Shift');
       $r->print(<<ENDOVER);
   $start_page
   $breadcrumbs
   ENDOVER
       $r->print('<form name="shiftform" method="post">'.
                 '<table><tr><td>'.&mt('Currently set date:').'</td><td>'.
                 &Apache::lonlocal::locallocaltime($env{'form.timebase'}).'</td></tr>'.
                 '<tr><td>'.&mt('Shifted date:').'</td><td>'.
                       &Apache::lonhtmlcommon::date_setter('shiftform',
                                                           'timeshifted',
                                                           $env{'form.timebase'},,
                                                           '').
                 '</td></tr></table>'.
                 '<input type="hidden" name="action" value="dateshift2" />'.
                 '<input type="hidden" name="timebase" value="'.$env{'form.timebase'}.'" />'.
                 '<input type="submit" value="'.&mt('Shift all dates accordingly').'" /></form>');
       $r->print(&Apache::loncommon::end_page());
   }
   
   sub date_shift_two {
       my ($r) = @_;
       my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
       my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
       my $start_page=&Apache::loncommon::start_page('Shift Dates');
       my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Shift');
       $r->print(<<ENDOVER);
   $start_page
   $breadcrumbs
   ENDOVER
       my $timeshifted=&Apache::lonhtmlcommon::get_date_from_form('timeshifted');
       $r->print(&mt('Shifting all dates such that [_1] becomes [_2]',
                 &Apache::lonlocal::locallocaltime($env{'form.timebase'}),
                 &Apache::lonlocal::locallocaltime($timeshifted)));
       my $delta=$timeshifted-$env{'form.timebase'};
       &dateshift($delta);
       $r->print(&Apache::loncommon::end_page());
   }
   
 sub parse_key {  sub parse_key {
     my ($key) = @_;      my ($key) = @_;
     my %data;      my %data;
Line 2941  sub parse_key { Line 3229  sub parse_key {
  $data{'realm_type'} = 'folder';   $data{'realm_type'} = 'folder';
  $data{'realm_title'} = &Apache::lonnet::gettitle($data{'realm'});   $data{'realm_title'} = &Apache::lonnet::gettitle($data{'realm'});
  ($data{'realm_exists'}) = &Apache::lonnet::is_on_map($data{'realm'});   ($data{'realm_exists'}) = &Apache::lonnet::is_on_map($data{'realm'});
  &Apache::lonnet::logthis($1." siad ". $data{'realm_exists'} );  
     } elsif ($middle) {      } elsif ($middle) {
  $data{'realm'} = $middle;   $data{'realm'} = $middle;
  $data{'realm_type'} = 'symb';   $data{'realm_type'} = 'symb';
Line 2988  where $action is add or drop, and $clone Line 3275  where $action is add or drop, and $clone
 user for whom cloning ability is to be changed in course.   user for whom cloning ability is to be changed in course. 
   
 =cut  =cut
                                                                                               
 ##################################################  ##################################################
 ##################################################  ##################################################
   
 sub extract_cloners {  sub extract_cloners {
     my ($clonelist,$allowclone) = @_;      my ($clonelist,$allowclone) = @_;
     if ($clonelist =~ /,/) {      if ($clonelist =~ /,/) {
         @{$allowclone} = split/,/,$clonelist;          @{$allowclone} = split(/,/,$clonelist);
     } else {      } else {
         $$allowclone[0] = $clonelist;          $$allowclone[0] = $clonelist;
     }      }
 }  }
   
   
 sub check_cloners {  sub check_cloners {
     my ($clonelist,$oldcloner) = @_;      my ($clonelist,$oldcloner) = @_;
     my ($clean_clonelist,$disallowed);      my ($clean_clonelist,%disallowed);
     my @allowclone = ();      my @allowclone = ();
     &extract_cloners($$clonelist,\@allowclone);      &extract_cloners($$clonelist,\@allowclone);
     foreach my $currclone (@allowclone) {      foreach my $currclone (@allowclone) {
         if (!grep/^$currclone$/,@$oldcloner) {          if (!grep(/^\Q$currclone\E$/,@$oldcloner)) {
             my ($uname,$udom) = split/:/,$currclone;              if ($currclone eq '*') {
             if ($uname && $udom) {                  $clean_clonelist .= $currclone.',';
                 if (&Apache::lonnet::homeserver($uname,$udom) eq 'no_host') {              } else {
                     $disallowed .= $currclone.',';                     my ($uname,$udom) = split(/:/,$currclone);
                   if ($uname eq '*') {
                       if ($udom =~ /^$match_domain$/) {
                           if (!&Apache::lonnet::domain($udom)) {
                               $disallowed{'domain'} .= $currclone.',';
                           } else {
                               $clean_clonelist .= $currclone.',';
                           }
                       } else {
                           $disallowed{'format'} .= $currclone.',';
                       }
                   } elsif ($currclone !~/^($match_username)\:($match_domain)$/) {
                       $disallowed{'format'} .= $currclone.','; 
                 } else {                  } else {
                     $clean_clonelist .= $currclone.',';                      if (&Apache::lonnet::homeserver($uname,$udom) eq 'no_host') {
                           $disallowed{'newuser'} .= $currclone.',';
                       } else {
                           $clean_clonelist .= $currclone.',';
                       }
                 }                  }
             }              }
         } else {          } else {
             $clean_clonelist .= $currclone.',';              $clean_clonelist .= $currclone.',';
         }          }
     }      }
     if ($disallowed) {      foreach my $key (keys(%disallowed)) {
         $disallowed =~ s/,$//;          $disallowed{$key} =~ s/,$//;
     }      }
     if ($clean_clonelist) {      if ($clean_clonelist) {
         $clean_clonelist =~ s/,$//;          $clean_clonelist =~ s/,$//;
     }      }
     $$clonelist = $clean_clonelist;      $$clonelist = $clean_clonelist;
     return $disallowed;      return %disallowed;
 }    }
   
 sub change_clone {  sub change_clone {
     my ($clonelist,$oldcloner) = @_;      my ($clonelist,$oldcloner) = @_;
Line 3042  sub change_clone { Line 3344  sub change_clone {
         my @allowclone;          my @allowclone;
         &extract_cloners($clonelist,\@allowclone);          &extract_cloners($clonelist,\@allowclone);
         foreach my $currclone (@allowclone) {          foreach my $currclone (@allowclone) {
             if (!grep/^$currclone$/,@$oldcloner) {              if (!grep(/^$currclone$/,@$oldcloner)) {
                 ($uname,$udom) = split/:/,$currclone;                  if ($currclone ne '*') {
                 if ($uname && $udom) {                      ($uname,$udom) = split(/:/,$currclone);
                     unless (&Apache::lonnet::homeserver($uname,$udom) eq 'no_host') {                      if ($uname && $udom && $uname ne '*') {
                         my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable');                          if (&Apache::lonnet::homeserver($uname,$udom) ne 'no_host') {
                         if ($currclonecrs{'cloneable'} !~ /\Q$clone_crs\E/) {                              my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable');
                             if ($currclonecrs{'cloneable'} eq '') {                              if ($currclonecrs{'cloneable'} !~ /\Q$clone_crs\E/) {
                                 $currclonecrs{'cloneable'} = $clone_crs;                                  if ($currclonecrs{'cloneable'} eq '') {
                             } else {                                      $currclonecrs{'cloneable'} = $clone_crs;
                                 $currclonecrs{'cloneable'} .= ','.$clone_crs;                                  } else {
                                       $currclonecrs{'cloneable'} .= ','.$clone_crs;
                                   }
                                   &Apache::lonnet::put('environment',\%currclonecrs,$udom,$uname);
                             }                              }
                             &Apache::lonnet::put('environment',\%currclonecrs,$udom,$uname);  
                         }                          }
                     }                      }
                 }                  }
             }              }
         }          }
         foreach my $oldclone (@$oldcloner) {          foreach my $oldclone (@$oldcloner) {
             if (!grep/^$oldclone$/,@allowclone) {              if (!grep(/^\Q$oldclone\E$/,@allowclone)) {
                 ($uname,$udom) = split/:/,$oldclone;                  if ($oldclone ne '*') {
                 if ($uname && $udom) {                      ($uname,$udom) = split(/:/,$oldclone);
                     unless (&Apache::lonnet::homeserver($uname,$udom) eq 'no_host') {                      if ($uname && $udom && $uname ne '*' ) {
                         my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable');                          if (&Apache::lonnet::homeserver($uname,$udom) ne 'no_host') {
                         my %newclonecrs = ();                              my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable');
                         if ($currclonecrs{'cloneable'} =~ /\Q$clone_crs\E/) {                              my %newclonecrs = ();
                             if ($currclonecrs{'cloneable'} =~ /,/) {                              if ($currclonecrs{'cloneable'} =~ /\Q$clone_crs\E/) {
                                 my @currclonecrs = split/,/,$currclonecrs{'cloneable'};                                  if ($currclonecrs{'cloneable'} =~ /,/) {
                                 foreach (@currclonecrs) {                                      my @currclonecrs = split/,/,$currclonecrs{'cloneable'};
                                     unless ($_ eq $clone_crs) {                                      foreach my $crs (@currclonecrs) {
                                         $newclonecrs{'cloneable'} .= $_.',';                                          if ($crs ne $clone_crs) {
                                               $newclonecrs{'cloneable'} .= $crs.',';
                                           }
                                     }                                      }
                                       $newclonecrs{'cloneable'} =~ s/,$//;
                                   } else {
                                       $newclonecrs{'cloneable'} = '';
                                 }                                  }
                                 $newclonecrs{'cloneable'} =~ s/,$//;                                  &Apache::lonnet::put('environment',\%newclonecrs,$udom,$uname);
                             } else {  
                                 $newclonecrs{'cloneable'} = '';  
                             }                              }
                             &Apache::lonnet::put('environment',\%newclonecrs,$udom,$uname);  
                         }                          }
                     }                      }
                 }                  }
Line 3117  ENDMAINFORMHEAD Line 3423  ENDMAINFORMHEAD
     my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};      my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
     my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};      my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
     my $vgr  = &Apache::lonnet::allowed('vgr',$env{'request.course.id'});      my $vgr  = &Apache::lonnet::allowed('vgr',$env{'request.course.id'});
       my $mgr  = &Apache::lonnet::allowed('mgr',$env{'request.course.id'});
   
     my @menu =      my @menu =
         ( { divider=>'Settings for Your Course',          ( { divider=>'Settings for Your Course',
Line 3134  ENDMAINFORMHEAD Line 3441  ENDMAINFORMHEAD
     url => '/adm/slotrequest?command=showslots',      url => '/adm/slotrequest?command=showslots',
     permission => $vgr,      permission => $vgr,
             },              },
     { text => 'Reset Student Access Times',
       url => '/adm/helper/resettimes.helper',
       permission => $mgr,
               },
   
           { text => 'Set Parameter Setting Default Actions',            { text => 'Set Parameter Setting Default Actions',
             action => 'setdefaults',              action => 'setdefaults',
             permission => $parm_permission,              permission => $parm_permission,
Line 3292  sub order_meta_fields { Line 3604  sub order_meta_fields {
  my $ordered_fields = join ",", @neworder;   my $ordered_fields = join ",", @neworder;
         my $put_result = &Apache::lonnet::put('environment',          my $put_result = &Apache::lonnet::put('environment',
                            {'metadata.addedorder'=>$ordered_fields},$dom,$crs);                             {'metadata.addedorder'=>$ordered_fields},$dom,$crs);
  &Apache::lonnet::appenv('course.'.$env{'request.course.id'}.'.metadata.addedorder' => $ordered_fields);   &Apache::lonnet::appenv({'course.'.$env{'request.course.id'}.'.metadata.addedorder' => $ordered_fields});
     }      }
     my $fields = &get_added_meta_fieldnames($env{'request.course.id'});      my $fields = &get_added_meta_fieldnames($env{'request.course.id'});
     my $ordered_fields;      my $ordered_fields;
Line 3379  sub addmetafield { Line 3691  sub addmetafield {
         $r->print('<hr /><strong>Or</strong> you may enter a new metadata field name.<form method="post" action="/adm/parmset?action=addmetadata"');          $r->print('<hr /><strong>Or</strong> you may enter a new metadata field name.<form method="post" action="/adm/parmset?action=addmetadata"');
         $r->print('<input type="text" name="fieldname" /><br />');          $r->print('<input type="text" name="fieldname" /><br />');
         $r->print('<input type="submit" value="Add Metadata Field" />');          $r->print('<input type="submit" value="Add Metadata Field" />');
         $r->print('</form>');  
     }      }
       $r->print('</form>');
 }  }
 sub setrestrictmeta {  sub setrestrictmeta {
     my ($r)=@_;      my ($r)=@_;
Line 3647  ENDYESNO Line 3959  ENDYESNO
     }      }
     $r->print(&Apache::loncommon::end_data_table().      $r->print(&Apache::loncommon::end_data_table().
       "\n<input type='submit' name='storerules' value='".        "\n<input type='submit' name='storerules' value='".
       &mt('Store Rules')."' /></form>\n".        &mt('Save Rules')."' /></form>\n".
       &Apache::loncommon::end_page());        &Apache::loncommon::end_page());
     return;      return;
 }  }
Line 3898  sub check_for_course_info { Line 4210  sub check_for_course_info {
 Main handler.  Calls &assessparms and &crsenv subroutines.  Main handler.  Calls &assessparms and &crsenv subroutines.
   
 =cut  =cut
   
 ##################################################  ##################################################
 ##################################################  ##################################################
 #    use Data::Dumper;  
   
   
 sub handler {  sub handler {
     my $r=shift;      my $r=shift;
   
       &reset_caches();
   
     if ($r->header_only) {      if ($r->header_only) {
  &Apache::loncommon::content_type($r,'text/html');   &Apache::loncommon::content_type($r,'text/html');
  $r->send_http_header;   $r->send_http_header;
Line 3916  sub handler { Line 4229  sub handler {
                                              'pres_marker',                                               'pres_marker',
                                              'pres_value',                                               'pres_value',
                                              'pres_type',                                               'pres_type',
                                              'udom','uname','symb','serial']);                                               'udom','uname','symb','serial','timebase']);
   
   
     &Apache::lonhtmlcommon::clear_breadcrumbs();      &Apache::lonhtmlcommon::clear_breadcrumbs();
Line 3940  sub handler { Line 4253  sub handler {
         $r->send_http_header;          $r->send_http_header;
   
   
         # id numbers can change on re-ordering of folders  
   
         &resetsymbcache();  
   
         #          #
         # Main switch on form.action and form.state, as appropriate          # Main switch on form.action and form.state, as appropriate
         #          #
Line 4000  sub handler { Line 4309  sub handler {
             &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=cleanparameters',              &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=cleanparameters',
     text=>"Clean Parameters"});      text=>"Clean Parameters"});
     &clean_parameters($r);      &clean_parameters($r);
           } elsif ($env{'form.action'} eq 'dateshift1' && $parm_permission) {
               &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=dateshift1&timebase='.$env{'form.timebase'},
                                                       text=>"Shifting Dates"});
               &date_shift_one($r);
           } elsif ($env{'form.action'} eq 'dateshift2' && $parm_permission) {
               &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=dateshift1&timebase='.$env{'form.timebase'},
                                                       text=>"Shifting Dates"});
               &date_shift_two($r);
  }          }       
     } else {      } else {
 # ----------------------------- Not in a course, or not allowed to modify parms  # ----------------------------- Not in a course, or not allowed to modify parms
Line 4012  sub handler { Line 4329  sub handler {
  }   }
  return HTTP_NOT_ACCEPTABLE;   return HTTP_NOT_ACCEPTABLE;
     }      }
       &reset_caches();
   
     return OK;      return OK;
 }  }
   

Removed from v.1.360  
changed lines
  Added in v.1.394


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