--- loncom/interface/lonparmset.pm 2006/07/14 17:44:11 1.321 +++ loncom/interface/lonparmset.pm 2006/09/28 23:58:53 1.338 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to set parameters for assessments # -# $Id: lonparmset.pm,v 1.321 2006/07/14 17:44:11 www Exp $ +# $Id: lonparmset.pm,v 1.338 2006/09/28 23:58:53 banghart Exp $ # # Copyright Michigan State University Board of Trustees # @@ -524,7 +524,7 @@ sub valout { # Values of zero are valid. if (! $value && $value ne '0') { if ($editable) { - $result = ''; + $result = '*'; } else { $result=' '; } @@ -1514,7 +1514,7 @@ sub assessparms { $message="\n

\n".&mt("Full Name").": ". $name{'firstname'}.' '.$name{'middlename'}.' ' .$name{'lastname'}.' '.$name{'generation'}. - "
\n".&mt('ID').": ".$name{'id'}.'

'; + "
\n".&mt('ID').": ".$name{'id'}.'

'; } @usersgroups = &Apache::lonnet::get_users_groups( $udom,$uname,$env{'request.course.id'}); @@ -1562,7 +1562,7 @@ sub assessparms { foreach ('tolerance','date_default','date_start','date_end', 'date_interval','int','float','string') { $r->print(''); + $env{'form.recent_'.$_}.'" name="recent_'.$_.'" />'); } if (!$pssymb) { @@ -1639,7 +1639,7 @@ sub assessparms { ); $r->print(<$lt{'pie'} -$lt{'csv'}
($csuname $lt{'at'} $csudom) +$lt{'csv'}
($csuname $lt{'at'} $csudom) $lt{'ic'}$lt{'rl'} $lt{'ic'} @@ -1740,8 +1740,8 @@ ENDTABLEHEADFOUR "$title"); + "', 'metadatafile', '450', '500', 'no', 'yes');\"". + " target=\"_self\">$title"); if ($thistitle) { $r->print(' ('.$thistitle.')'); @@ -2005,7 +2005,7 @@ sub crsenv { ('environment', {'top level map backup '.$bkuptime => $tmp[1] }, $dom,$crs). - '
'; + '
'; } # # Deal with modified default spreadsheets @@ -2116,7 +2116,7 @@ sub crsenv { 'default_xml_style' => ''.&mt('Default XML Style File').' '. '
$SelectStyleFile
", + ",'sty')\">$SelectStyleFile
", 'question.email' => ''.&mt('Feedback Addresses for Resource Content Question'). '
(user:domain,'. 'user:domain(section;section;...;*;...),...)', @@ -2310,7 +2310,7 @@ sub crsenv { ''; my $start_page = - &Apache::loncommon::start_page('Set Course Environment Parameters', + &Apache::loncommon::start_page('Set Course Environment', $browse_js); my $end_page = &Apache::loncommon::end_page(); @@ -2432,7 +2432,7 @@ sub storedata { } &Apache::lonnet::devalidateuserresdata($tuname,$tudom); } else { - push (@deldata,$thiskey); + push (@deldata,$thiskey,$thiskey.'.type'); } } elsif ($cmd eq 'datepointer') { my $data=&Apache::lonhtmlcommon::get_date_from_form($env{$_}); @@ -2589,15 +2589,6 @@ sub listdata { $oldpart=$part; } # -# Preset defaults? -# - my ($hour,$min,$sec,$val)=('','','',''); - unless ($$resourcedata{$thiskey}) { - my ($parmname)=($thiskey=~/\.(\w+)$/); - ($hour,$min,$sec,$val)=&preset_defaults($parmname); - } - -# # Ready to print # $r->print(&tablestart(). @@ -2613,7 +2604,7 @@ sub listdata { &Apache::lonhtmlcommon::date_setter('parmform', $jskey, $$resourcedata{$thiskey}, - '',1,'','',$hour,$min,$sec). + '',1,'',''). ''. &date_sanity_info($$resourcedata{$thiskey}) ); @@ -2621,8 +2612,6 @@ sub listdata { my $showval; if (defined($$resourcedata{$thiskey})) { $showval=$$resourcedata{$thiskey}; - } else { - $showval=$val; } $r->print('

'. + &mt('These parameters refer to resources that do not exist.'). + '

'. + ''.'
'. + '
'); + $r->print(&Apache::loncommon::start_data_table(). + ''. + ''.&mt('Delete').''. + ''.&mt('Parameter').''. + ''); + foreach my $thiskey (sort(keys(%{$resourcedata}))) { + next if (!exists($resourcedata->{$thiskey.'.type'}) + && $thiskey=~/\.type$/); + my %data = &parse_key($thiskey); + if (exists($data{'realm_exists'}) + && !$data{'realm_exists'}) { + $r->print(&Apache::loncommon::start_data_table_row(). + ''. + '' ); + + $r->print(''); + $r->print(&mt('Parameter: "[_1]" with value: "[_2]"', + &standard_parameter_names($data{'parameter_name'}), + $resourcedata->{$thiskey})); + $r->print('
'); + if ($data{'scope_type'} eq 'all') { + $r->print(&mt('All users')); + } elsif ($data{'scope_type'} eq 'user') { + $r->print(&mt('User: [_1]',join(':',@{$data{'scope'}}))); + } elsif ($data{'scope_type'} eq 'section') { + $r->print(&mt('Section: [_1]',$data{'scope'})); + } elsif ($data{'scope_type'} eq 'group') { + $r->print(&mt('Group: [_1]',$data{'scope'})); + } + $r->print('
'); + if ($data{'realm_type'} eq 'all') { + $r->print(&mt('All Resources')); + } elsif ($data{'realm_type'} eq 'folder') { + $r->print(&mt('Folder: [_1]'),$data{'realm'}); + } elsif ($data{'realm_type'} eq 'symb') { + my ($map,$resid,$url) = + &Apache::lonnet::decode_symb($data{'realm'}); + $r->print(&mt('Resource: [_1]
   with ID: [_2]
   in folder [_3]', + $url,$resid,$map)); + } + $r->print(&mt('Part: [_1]',$data{'parameter_part'})); + $r->print(''); + + } + } + $r->print(&Apache::loncommon::end_data_table().'

'. + ''. + '

'. + &Apache::loncommon::end_page()); +} + +sub parse_key { + my ($key) = @_; + my %data; + my ($middle,$part,$name)= + ($key=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/); + $data{'scope_type'} = 'all'; + if ($middle=~/^\[(.*)\]/) { + $data{'scope'} = $1; + if ($data{'scope'}=~/^useropt\:(\w+)\:(\w+)/) { + $data{'scope_type'} = 'user'; + $data{'scope'} = [$1,$2]; + } else { + #FIXME check for group scope + $data{'scope_type'} = 'section'; + } + $middle=~s/^\[(.*)\]//; + } + $middle=~s/\.+$//; + $middle=~s/^\.+//; + $data{'realm_type'}='all'; + if ($middle=~/^(.+)\_\_\_\(all\)$/) { + $data{'realm'} = $1; + $data{'realm_type'} = 'folder'; + $data{'realm_title'} = &Apache::lonnet::gettitle($data{'realm'}); + ($data{'realm_exists'}) = &Apache::lonnet::is_on_map($data{'realm'}); + &Apache::lonnet::logthis($1." siad ". $data{'realm_exists'} ); + } elsif ($middle) { + $data{'realm'} = $middle; + $data{'realm_type'} = 'symb'; + $data{'realm_title'} = &Apache::lonnet::gettitle($data{'realm'}); + my ($map,$resid,$url) = &Apache::lonnet::decode_symb($data{'realm'}); + $data{'realm_exists'} = &Apache::lonnet::symbverify($data{'realm'},$url); + } + + $data{'parameter_part'} = $part; + $data{'parameter_name'} = $name; + + return %data; +} + ################################################## ################################################## - + =pod =item check_cloners @@ -3008,10 +3113,12 @@ ENDMAINFORMHEAD my $vgr = &Apache::lonnet::allowed('vgr',$env{'request.course.id'}); my @menu = - ( - { text => 'Set Course Environment Parameters', + ( { divider=>'Settings for Your Course', + }, + { text => 'Set Course Environment', action => 'crsenv', permission => $parm_permission, + help => 'Course_Environment', }, { text => 'Set Portfolio Metadata', action => 'setrestrictmeta', @@ -3021,29 +3128,34 @@ ENDMAINFORMHEAD url => '/adm/slotrequest?command=showslots', permission => $vgr, }, - { divider => 1, + { text => 'Set Parameter Setting Default Actions', + action => 'setdefaults', + permission => $parm_permission, + }, + { divider => 'New and Existing Parameter Settings for Your Resources', }, { text => 'Set/Modify Resource Parameters - Helper Mode', url => '/adm/helper/parameter.helper', permission => $parm_permission, + help => 'Parameter_Helper', }, - { text => 'Modify Resource Parameters - Overview Mode', - action => 'setoverview', - permission => $parm_permission, - }, - { text => 'Set Resource Parameters - Overview Mode', + { text => 'Set/Modify Resource Parameters - Overview Mode', action => 'newoverview', permission => $parm_permission, + help => 'Parameter_Overview', }, { text => 'Set/Modify Resource Parameters - Table Mode', action => 'settable', permission => $parm_permission, - help => 'Cascading_Parameters', + help => 'Table_Mode', }, - { text => 'Set Parameter Setting Default Actions', - action => 'setdefaults', + { divider => 'Existing Parameter Settings for Your Resources', + }, + { text => 'Modify Resource Parameters - Overview Mode', + action => 'setoverview', permission => $parm_permission, - }, + help => 'Parameter_Overview', + }, { text => 'Parameter Change Log and Course Blog Posting/User Notification', action => 'parameterchangelog', permission => $parm_permission, @@ -3052,7 +3164,7 @@ ENDMAINFORMHEAD my $menu_html = ''; foreach my $menu_item (@menu) { if ($menu_item->{'divider'}) { - $menu_html .= '
'; + $menu_html .= '

'.&mt($menu_item->{'divider'}).'

'; next; } next if (! $menu_item->{'permission'}); @@ -3076,36 +3188,62 @@ ENDMAINFORMHEAD } ### Set portfolio metadata sub output_row { - my ($r, $field_name, $field_text) = @_; + my ($r, $field_name, $field_text, $added_flag) = @_; my $output; my $options=$env{'course.'.$env{'request.course.id'}.'.metadata.'.$field_name.'.options'}; my $values=$env{'course.'.$env{'request.course.id'}.'.metadata.'.$field_name.'.values'}; - unless (defined($options)) { + if (!defined($options)) { $options = 'active,stuadd'; $values = ''; } - $output.=''.$field_text.':'; - $output.='
'; + if (!($options =~ /deleted/)) { + $output.=''.$field_text.':'; + $output.='
'; - my @options= ( ['active', 'Show to student'], + my @options= ( ['active', 'Show to student'], ['onlyone','Student may select only one choice'], ['stuadd', 'Student may type choices']); - foreach my $opt (@options) { - my $checked = ($options =~ m/$opt->[0]/) ? ' checked="checked" ' : '' ; - $output.=(' 'x5).'
'; + if ($added_flag) { + push @options,['deleted', 'Delete Metadata Field']; + } + foreach my $opt (@options) { + my $checked = ($options =~ m/$opt->[0]/) ? ' checked="checked" ' : '' ; + $output.=(' 'x5).'
'; + } } return ($output); } - +sub addmetafield { + my ($r)=@_; + $r->print(&Apache::loncommon::start_page('Add Metadata Field')); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Add Metadata Field')); + my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + my $crs = $env{'course.'.$env{'request.course.id'}.'.num'}; + if (exists($env{'form.fieldname'})) { + my $meta_field = $env{'form.fieldname'}; + my $display_field = $env{'form.fieldname'}; + $meta_field =~ s/\W/_/g; + $meta_field =~ tr/A-Z/a-z/; + my $put_result = &Apache::lonnet::put('environment', + {'metadata.'.$meta_field.'.values'=>"", + 'metadata.'.$meta_field.'.added'=>"$display_field", + 'metadata.'.$meta_field.'.options'=>""},$dom,$crs); + $r->print('Added new Metadata Field '.$env{'form.fieldname'}." with result ".$put_result); + } else { + $r->print('
print('
'); + $r->print(''); + $r->print('
'); + } +} sub setrestrictmeta { my ($r)=@_; my $next_meta; my $output; my $item_num; my $put_result; - $r->print(&Apache::loncommon::start_page('Restrict Metadata')); $r->print(&Apache::lonhtmlcommon::breadcrumbs('Restrict Metadata')); my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'}; @@ -3129,6 +3267,10 @@ sub setrestrictmeta { if ($env{'form.'.$meta_field.'_active'}) { $options.='active,'; } + if ($env{'form.'.$meta_field.'_deleted'}) { + $options.='deleted,'; + } + my $name = $save_field; $put_result = &Apache::lonnet::put('environment', {'metadata.'.$meta_field.'.options'=>$options, @@ -3140,25 +3282,45 @@ sub setrestrictmeta { } &Apache::lonnet::coursedescription($env{'request.course.id'}, {'freshen_cache' => 1}); + # Get the default metadata fields my %metadata_fields = &Apache::lonmeta::fieldnames('portfolio'); + # Now get possible added metadata fields + my $added_metadata_fields = &get_added_meta_fieldnames(\%metadata_fields); foreach my $field (sort(keys(%metadata_fields))) { - &Apache::lonnet::logthis ($field); if ($field ne 'courserestricted') { $output.= &output_row($r, $field, $metadata_fields{$field}); } } + my $added_flag = 1; + foreach my $field (sort(keys(%$added_metadata_fields))) { + $output.= &output_row($r, $field, $$added_metadata_fields{$field},$added_flag); + } $r->print(<

$output +
+

+
ENDenv $r->print(&Apache::loncommon::end_page()); return 'ok'; } ################################################## - +sub get_added_meta_fieldnames { + my %fields; + my ($default_fields) = @_; + foreach my $key(%env) { + if ($key =~ m/\.metadata\.(.+)\.added$/) { + my $field_name = $1; + my ($display_field_name) = $env{$key}; + $fields{$field_name} = $display_field_name; + } + } + return \%fields; +} sub defaultsetter { my ($r) = @_; @@ -3320,14 +3482,16 @@ ENDYESNO } sub components { - my ($key,$uname,$udom,$exeuser,$exedomain)=@_; - my $typeflag=0; - if ($key=~/\.type$/) { + my ($key,$uname,$udom,$exeuser,$exedomain,$typeflag)=@_; + + if ($typeflag) { $key=~s/\.type$//; - $typeflag=1; } + + my ($middle,$part,$name)= + ($key=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/); my $issection; - my ($middle,$part,$name)=($key=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/); + my $section=&mt('All Students'); if ($middle=~/^\[(.*)\]/) { $issection=$1; @@ -3351,31 +3515,33 @@ sub components { $realmdescription=&mt('resource').' '.&Apache::lonnet::gettitle($middle); } my $what=$part.'.'.$name; - return ($realm,$section,$name,$part,$typeflag, + return ($realm,$section,$name,$part, $what,$middle,$uname,$udom,$issection,$realmdescription); } +my %standard_parms; +sub load_parameter_names { + open(my $config,"<$Apache::lonnet::perlvar{'lonTabDir'}/packages.tab"); + while (my $configline=<$config>) { + if ($configline !~ /\S/ || $configline=~/^\#/) { next; } + chomp($configline); + my ($short,$plain)=split(/:/,$configline); + my (undef,$name,$type)=split(/\&/,$short,3); + if ($type eq 'display') { + $standard_parms{$name} = $plain; + } + } + close($config); + $standard_parms{'int_pos'} = 'Positive Integer'; + $standard_parms{'int_zero_pos'} = 'Positive Integer or Zero'; + %standard_parms=&Apache::lonlocal::texthash(%standard_parms); +} + sub standard_parameter_names { my ($name)=@_; - my %standard_parms=&Apache::lonlocal::texthash('duedate' => 'Due Date', - 'answerdate' => 'Answer Date', - 'opendate' => 'Open Date', - 'maxtries' => 'Max. Number of Tries', - 'weight' => 'Weight', - 'date_start' => 'Starting Date', - 'date_end' => 'Ending Date', - 'interval' => 'Time Interval Length', - 'tol' => 'Numerical Tolerance', - 'sig' => 'Significant Digits', - 'contentopen' => 'Content Opening Date', - 'contentclose' => 'Content Closing Date', - 'discussend' => 'End of Discussion Time', - 'discusshide' => 'Discussion Hidden', - 'problemstatus' => 'Problem Status Visible', - 'int_pos' => 'Positive Integer', - 'int_zero_pos' => 'Positive Integer or Zero', - 'hinttries' => 'Number of Tries till Hints appear', - 'numbubbles' => 'Number of Bubbles in Exam Mode'); + if (!%standard_parms) { + &load_parameter_names(); + } if ($standard_parms{$name}) { return $standard_parms{$name}; } else { @@ -3390,17 +3556,17 @@ sub standard_parameter_names { sub parm_change_log { my ($r)=@_; - &startpage($r); + $r->print(&Apache::loncommon::start_page('Parameter Change Log')); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Parameter Change Log')); + my %parmlog=&Apache::lonnet::dump('nohist_parameterlog', $env{'course.'.$env{'request.course.id'}.'.domain'}, $env{'course.'.$env{'request.course.id'}.'.num'}); if ((keys(%parmlog))[0]=~/^error\:/) { undef(%parmlog); } - $r->print('
- '); + $r->print(''); my %saveable_parameters = ('show' => 'scalar',); &Apache::loncommon::store_course_settings('parameter_log', @@ -3414,7 +3580,9 @@ sub parm_change_log { (&mt('all'),10,20,50,100,1000,10000)); $r->print(''.&mt('[_1] Records',$countselect).''. - ''); + ''. + '
'); my $courseopt=&Apache::lonnet::get_courseresdata($env{'course.'.$env{'request.course.id'}.'.num'}, $env{'course.'.$env{'request.course.id'}.'.domain'}); @@ -3425,7 +3593,7 @@ sub parm_change_log { my $shown=0; foreach my $id (sort { $parmlog{$b}{'exe_time'}<=>$parmlog{$a}{'exe_time'} } (keys(%parmlog))) { my @changes=keys(%{$parmlog{$id}{'logentry'}}); - my $count=$#changes+1; + my $count = 0; my $time = &Apache::lonlocal::locallocaltime($parmlog{$id}{'exe_time'}); my $plainname = @@ -3444,68 +3612,79 @@ sub parm_change_log { $parmlog{$id}{'exe_udom'}); } my $row_start=&Apache::loncommon::start_data_table_row(); - $r->print($row_start.''.$time.' - '.$about_me_link. - '
'.$parmlog{$id}{'exe_uname'}. - ':'.$parmlog{$id}{'exe_udom'}.''. - $send_msg_link.''); + $r->print($row_start); my $makenewrow=0; my %istype=(); + my $output; foreach my $changed (reverse(sort(@changes))) { - my $value=$parmlog{$id}{'logentry'}->{$changed}; - my ($realm,$section,$parmname,$part,$typeflag,$what,$middle,$uname,$udom,$issection,$realmdescription)= - &components($changed,$parmlog{$id}{'uname'},$parmlog{$id}{'udom'}); - if ($typeflag) { $istype{$parmname}=$value; } - if ($makenewrow) { $r->print($row_start); } else { $makenewrow=1; } - $r->print(''.$realm.''.$section.''. + my $value=$parmlog{$id}{'logentry'}{$changed}; + my $typeflag = ($changed =~/\.type$/ && + !exists($parmlog{$id}{'logentry'}{$changed.'.type'})); + my ($realm,$section,$parmname,$part,$what,$middle,$uname,$udom,$issection,$realmdescription)= + &components($changed,$parmlog{$id}{'uname'},$parmlog{$id}{'udom'},undef,undef,$typeflag); + if ($typeflag) { + $istype{$parmname}=$value; + if (!$env{'form.includetypes'}) { next; } + } + $count++; + if ($makenewrow) { + $output .= $row_start; + } else { + $makenewrow=1; + } + $output .=''.$realm.''.$section.''. &standard_parameter_names($parmname).''. - ($part?&mt('Part: [_1]',$part):&mt('All Parts')).''); + ($part?&mt('Part: [_1]',$part):&mt('All Parts')).''; my $stillactive=0; - if ($parmlog{$id}{'deleteflag'}) { - $r->print(&mt('Deleted')); + if ($parmlog{$id}{'delflag'}) { + $output .= &mt('Deleted'); } else { if ($typeflag) { - $r->print(&mt('Type: [_1]',&standard_parameter_names($value))); + $output .= &mt('Type: [_1]',&standard_parameter_names($value)); } else { my ($level,@all)=&parmval_by_symb($what,$middle,&Apache::lonnet::metadata($middle,$what), $uname,$udom,$issection,$issection,$courseopt); if (&isdateparm($istype{$parmname})) { - $r->print(&Apache::lonlocal::locallocaltime($value)); + $output .= &Apache::lonlocal::locallocaltime($value); } else { - $r->print($value); + $output .= $value; } if ($value ne $all[$level]) { - $r->print('
'.&mt('Not active anymore').''); + $output .= '
'.&mt('Not active anymore').''; } else { $stillactive=1; } } } - $r->print(''); + $output .= ''; if ($stillactive) { my $title=&mt('Changed [_1]',&standard_parameter_names($parmname)); my $description=&mt('Changed [_1] for [_2] to [_3]',&standard_parameter_names($parmname),$realmdescription, (&isdateparm($istype{$parmname})?&Apache::lonlocal::locallocaltime($value):$value)); if (($uname) && ($udom)) { - $r->print(''. - &Apache::loncommon::messagewrapper('Notify User',$uname,$udom,$title,$description). - ''); + $output .= + &Apache::loncommon::messagewrapper('Notify User', + $uname,$udom,$title, + $description); } else { - $r->print(''. - &Apache::lonrss::course_blog_link($id,$title,$description). - ''); + $output .= + &Apache::lonrss::course_blog_link($id,$title, + $description); } - } else { - $r->print(' '); } - $r->print(&Apache::loncommon::end_data_table_row()); + $output .= ''.&Apache::loncommon::end_data_table_row(); } + $r->print(''.$time.' + '.$about_me_link. + '
'.$parmlog{$id}{'exe_uname'}. + ':'.$parmlog{$id}{'exe_udom'}.''. + $send_msg_link.''.$output); + $shown++; if (!($env{'form.show'} eq &mt('all') || $shown<=$env{'form.show'})) { last; } } $r->print(&Apache::loncommon::end_data_table()); - $r->print(''); $r->print(&Apache::loncommon::end_page()); } @@ -3544,7 +3723,8 @@ sub handler { &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/parmset", text=>"Parameter Manager", faq=>10, - bug=>'Instructor Interface'}); + bug=>'Instructor Interface', + help => 'Parameter_Manager'}); # ----------------------------------------------------- Needs to be in a course my $parm_permission = @@ -3569,6 +3749,8 @@ sub handler { # the table mode if ((($env{'form.command'} eq 'set') && ($env{'form.url'}) && (!$env{'form.dis'})) || ($env{'form.symb'})) { + &Apache::lonhtmlcommon::add_breadcrumb({help=>'Problem_Parameters', + text=>"Problem Parameters"}); &assessparms($r); } elsif (! exists($env{'form.action'})) { @@ -3583,6 +3765,10 @@ sub handler { &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview', text=>"Overview Mode"}); &overview($r); + } elsif ($env{'form.action'} eq 'addmetadata' && $parm_permission) { + &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=addmetadata', + text=>"Add Metadata Field"}); + &addmetafield($r); } elsif ($env{'form.action'} eq 'setrestrictmeta' && $parm_permission) { &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setrestrictmeta', text=>"Restrict Metadata"}); @@ -3604,6 +3790,10 @@ sub handler { &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable', text=>"Parameter Change Log"}); &parm_change_log($r); + } elsif ($env{'form.action'} eq 'cleanparameters' && $parm_permission) { + &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=cleanparameters', + text=>"Clean Parameters"}); + &clean_parameters($r); } } else { # ----------------------------- Not in a course, or not allowed to modify parms