--- loncom/interface/lonparmset.pm 2006/07/17 17:23:24 1.325 +++ loncom/interface/lonparmset.pm 2006/12/14 20:50:25 1.350.2.3 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to set parameters for assessments # -# $Id: lonparmset.pm,v 1.325 2006/07/17 17:23:24 www Exp $ +# $Id: lonparmset.pm,v 1.350.2.3 2006/12/14 20:50:25 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -65,7 +65,7 @@ use Apache::lonlocal; use Apache::lonnavmaps; use Apache::longroup; use Apache::lonrss; -use LONCAPA; +use LONCAPA qw(:DEFAULT :match); # --- Caches local to lonparmset @@ -122,7 +122,10 @@ sub parmval_by_symb { # load caches &cacheparmhash(); - my $useropt=&Apache::lonnet::get_userresdata($uname,$udom); + my $useropt; + if ($uname ne '' && $udom ne '') { + $useropt = &Apache::lonnet::get_userresdata($uname,$udom); + } my $result=''; my @outpar=(); @@ -173,7 +176,7 @@ sub parmval_by_symb { } # ------------------------------------------------------ fourth, back to course - if (defined($csec)) { + if ($csec ne '') { if (defined($$courseopt{$seclevel})) { $outpar[9]=$$courseopt{$seclevel}; $result=9; @@ -189,7 +192,7 @@ sub parmval_by_symb { } } # ------------------------------------------------------ fifth, check course group - if (defined($cgroup)) { + if ($cgroup ne '') { if (defined($$courseopt{$grplevel})) { $outpar[6]=$$courseopt{$grplevel}; $result=6; @@ -206,7 +209,7 @@ sub parmval_by_symb { # ---------------------------------------------------------- fifth, check user - if (defined($uname)) { + if ($uname ne '') { if (defined($$useropt{$courselevel})) { $outpar[3]=$$useropt{$courselevel}; $result=3; @@ -269,10 +272,8 @@ sub resetrulescache { sub rulescache { my $id=shift; - if ($rulesid ne $env{'request.course.id'}) { - %rules=(); - } - unless (defined($rules{$id})) { + 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); @@ -1514,7 +1515,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 +1563,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 +1640,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 +1741,8 @@ ENDTABLEHEADFOUR "$title"); + "', 'metadatafile', '450', '500', 'no', 'yes');\"". + " target=\"_self\">$title"); if ($thistitle) { $r->print(' ('.$thistitle.')'); @@ -2005,7 +2006,7 @@ sub crsenv { ('environment', {'top level map backup '.$bkuptime => $tmp[1] }, $dom,$crs). - '
'; + '
'; } # # Deal with modified default spreadsheets @@ -2116,7 +2117,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;...;*;...),...)', @@ -2193,7 +2194,7 @@ sub crsenv { ' Tabloid [11x17 in], Executive [7 1/2x10 in], A2 [420x594 mm],'. ' A3 [297x420 mm], A4 [210x297 mm], A5 [148x210 mm], A6 [105x148 mm])', 'print_header_format' - => 'Print header format; substitutions: %n student name %c course id %a assignment', + => 'Print header format; substitutions: %n student name %c course id %a assignment note, numbers after the % limit the field size', 'anonymous_quiz' => ''.&mt('Anonymous quiz/exam').'
'. ' ('.&mt('yes').' '.&mt('to avoid print students names').' )', @@ -2363,8 +2364,7 @@ sub readdata { my $classlist=&Apache::loncoursedata::get_classlist(); foreach (keys %$classlist) { - # the following undefs are for 'domain', and 'username' respectively. - if ($_=~/^(\w+)\:(\w+)$/) { + if ($_=~/^($match_username)\:($match_domain)$/) { my ($tuname,$tudom)=($1,$2); my $useropt=&Apache::lonnet::get_userresdata($tuname,$tudom); foreach my $userkey (keys %{$useropt}) { @@ -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{$_}); @@ -2486,7 +2486,7 @@ sub storedata { sub extractuser { my $key=shift; - return ($key=~/^$env{'request.course.id'}.\[useropt\:(\w+)\:(\w+)\]\./); + return ($key=~/^$env{'request.course.id'}.\[useropt\:($match_username)\:($match_domain)\]\./); } sub listdata { @@ -2544,7 +2544,7 @@ sub listdata { my $section=&mt('All Students'); if ($middle=~/^\[(.*)\]/) { my $issection=$1; - if ($issection=~/^useropt\:(\w+)\:(\w+)/) { + if ($issection=~/^useropt\:($match_username)\:($match_domain)/) { $section=&mt('User').": ".&Apache::loncommon::plainname($1,$2); } else { $section=&mt('Group/Section').': '.$issection; @@ -2832,9 +2832,127 @@ ENDOVER &Apache::loncommon::end_page()); } +sub clean_parameters { + 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('Clean Parameters'); + my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Clean'); + $r->print(< +ENDOVER +# Store modified + + &storedata($r,$crs,$dom); + +# Read modified data + + my $resourcedata=&readdata($crs,$dom); + +# List data + + $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\:($match_username)\:($match_domain)/) { + $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 @@ -3070,36 +3188,174 @@ ENDMAINFORMHEAD } ### Set portfolio metadata sub output_row { - my ($r, $field_name, $field_text) = @_; + my ($r, $field_name, $field_text, $added_flag) = @_; + my $row_class; 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.='
'; - - my @options= ( ['active', 'Show to student'], + if (!($options =~ /deleted/)) { + $output = &Apache::loncommon::start_data_table_row(); + $output .= ''.$field_text.':'; + # $output .= ''.$field_text.':'; + $output .= ''; + $output .= &Apache::loncommon::end_data_table_row(); + 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 .= &Apache::loncommon::continue_data_table_row(); + $output .= ''.(' ' x 5).' '; + $output .= &Apache::loncommon::end_data_table_row(); + } + } return ($output); } - +sub order_meta_fields { + my ($r)=@_; + my $idx = 1; + my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + my $crs = $env{'course.'.$env{'request.course.id'}.'.num'}; + $r->print(&Apache::loncommon::start_page('Order Metadata Fields')); + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>"/adm/parmset?action=setrestrictmeta", + text=>"Restrict Metadata"}, + {text=>"Order Metadata"}); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Order Metadata')); + if ($env{'form.storeorder'}) { + my $newpos = $env{'form.newpos'} - 1; + my $currentpos = $env{'form.currentpos'} - 1; + my @neworder = (); + my @oldorder = split /,/,$env{'course.'.$env{'request.course.id'}.'.metadata.addedorder'}; + my $i; + if ($newpos > $currentpos) { + # moving stuff up + for ($i=0;$i<$currentpos;$i++) { + $neworder[$i]=$oldorder[$i]; + } + for ($i=$currentpos;$i<$newpos;$i++) { + $neworder[$i]=$oldorder[$i+1]; + } + $neworder[$newpos]=$oldorder[$currentpos]; + for ($i=$newpos+1;$i<=$#oldorder;$i++) { + $neworder[$i]=$oldorder[$i]; + } + } else { + # moving stuff down + for ($i=0;$i<$newpos;$i++) { + $neworder[$i]=$oldorder[$i]; + } + $neworder[$newpos]=$oldorder[$currentpos]; + for ($i=$newpos+1;$i<$currentpos+1;$i++) { + $neworder[$i]=$oldorder[$i-1]; + } + for ($i=$currentpos+1;$i<=$#oldorder;$i++) { + $neworder[$i]=$oldorder[$i]; + } + } + my $ordered_fields = join ",", @neworder; + my $put_result = &Apache::lonnet::put('environment', + {'metadata.addedorder'=>$ordered_fields},$dom,$crs); + &Apache::lonnet::appenv('course.'.$env{'request.course.id'}.'.metadata.addedorder' => $ordered_fields); + } + my $fields = &get_added_meta_fieldnames(); + my $ordered_fields; + my @fields_in_order = split /,/,$env{'course.'.$env{'request.course.id'}.'.metadata.addedorder'}; + if (!@fields_in_order) { + # no order found, pick sorted order then create metadata.addedorder key. + foreach my $key (sort keys %$fields) { + push @fields_in_order, $key; + $ordered_fields = join ",", @fields_in_order; + } + my $put_result = &Apache::lonnet::put('environment', + {'metadata.addedorder'=>$ordered_fields},$dom,$crs); + } + $r->print(''); + my $num_fields = scalar(@fields_in_order); + foreach my $key (@fields_in_order) { + $r->print(''); + $idx ++; + } + $r->print('
'); + $r->print('
'); + $r->print('
'); + $r->print(''); + $r->print(''); + $r->print(''); + $r->print($$fields{$key}.'
'); + return 'ok'; +} +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.undelete'})) { + my @meta_fields = &Apache::loncommon::get_env_multiple('form.undelete'); + foreach my $meta_field(@meta_fields) { + my $options = $env{'course.'.$env{'request.course.id'}.'.metadata.'.$meta_field.'.options'}; + $options =~ s/deleted//; + $options =~ s/,,/,/; + my $put_result = &Apache::lonnet::put('environment', + {'metadata.'.$meta_field.'.options'=>$options},$dom,$crs); + + $r->print('Undeleted Metadata Field '.$env{'course.'.$env{'request.course.id'}.'.metadata.'.$meta_field.'.added'}." with result ".$put_result.'
'); + } + $r->print('
'); + $r->print(''); + $r->print(''); + } elsif (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 { + my $fields = &get_deleted_meta_fieldnames(); + if ($fields) { + $r->print('You may undelete previously deleted fields.
Check those you wish to undelete and click Undelete.
'); + $r->print(''); + foreach my $key(keys(%$fields)) { + $r->print(''.$$fields{$key}.'
print(''); + $r->print('
'); + } + $r->print('
Or you may enter a new metadata field name.
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'}; @@ -3123,6 +3379,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, @@ -3134,25 +3394,66 @@ 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); + my $row_alt = 1; + $output .= &Apache::loncommon::start_data_table(); foreach my $field (sort(keys(%metadata_fields))) { - &Apache::lonnet::logthis ($field); if ($field ne 'courserestricted') { + $row_alt = $row_alt ? 0 : 1; $output.= &output_row($r, $field, $metadata_fields{$field}); } } + my $added_flag = 1; + foreach my $field (sort(keys(%$added_metadata_fields))) { + $row_alt = $row_alt ? 0 : 1; + $output.= &output_row($r, $field, $$added_metadata_fields{$field},$added_flag, $row_alt); + } + $output .= &Apache::loncommon::end_data_table(); $r->print(< -

$output - + +
+

+ +
+
+
+
ENDenv $r->print(&Apache::loncommon::end_page()); return 'ok'; } ################################################## - +sub get_added_meta_fieldnames { + my %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 get_deleted_meta_fieldnames { + my %fields; + my ($default_fields) = @_; + foreach my $key(%env) { + if ($key =~ m/\.metadata\.(.+)\.added$/) { + my $field_name = $1; + if ($env{'course.'.$env{'request.course.id'}.'.metadata.'.$field_name.'.options'} =~ m/deleted/) { + my ($display_field_name) = $env{$key}; + $fields{$field_name} = $display_field_name; + } + } + } + return \%fields; +} sub defaultsetter { my ($r) = @_; @@ -3314,14 +3615,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; @@ -3345,31 +3648,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 { @@ -3384,31 +3689,27 @@ 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', \%saveable_parameters); &Apache::loncommon::restore_course_settings('parameter_log', \%saveable_parameters); - if (!$env{'form.show'}) { $env{'form.show'}=10; } - - my $countselect = - &Apache::lonmeta::selectbox('show',$env{'form.show'},undef, - (&mt('all'),10,20,50,100,1000,10000)); - - $r->print(''.&mt('[_1] Records',$countselect).''. - ''); + $r->print(&Apache::loncommon::display_filter(). + ''. + '
'); my $courseopt=&Apache::lonnet::get_courseresdata($env{'course.'.$env{'request.course.id'}.'.num'}, $env{'course.'.$env{'request.course.id'}.'.domain'}); @@ -3417,9 +3718,19 @@ sub parm_change_log { &mt('Parameter').''.&mt('Part').''.&mt('New Value').''.&mt('Announce').''. &Apache::loncommon::end_data_table_header_row()); my $shown=0; + my $folder=''; + if ($env{'form.displayfilter'} eq 'currentfolder') { + my $last=''; + if (tie(my %hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db', + &GDBM_READER(),0640)) { + $last=$hash{'last_known'}; + untie(%hash); + } + if ($last) { ($folder) = &Apache::lonnet::decode_symb($last); } + } 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 = @@ -3438,71 +3749,99 @@ 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.''); 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 ($env{'form.displayfilter'} eq 'currentfolder') { + if ($folder) { + if ($middle!~/^\Q$folder\E/) { next; } + } + } + 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(); + } + if ($env{'form.displayfilter'} eq 'containing') { + my $wholeentry=$about_me_link.':'. + $parmlog{$id}{'exe_uname'}.':'.$parmlog{$id}{'exe_udom'}.':'. + $output; + if ($wholeentry!~/\Q$env{'form.containingphrase'}\E/i) { next; } + } + if ($count) { + $r->print($row_start.''.$time.' + '.$about_me_link. + '
'.$parmlog{$id}{'exe_uname'}. + ':'.$parmlog{$id}{'exe_udom'}.''. + $send_msg_link.''.$output); + $shown++; } - $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()); } +sub check_for_course_info { + my $navmap = Apache::lonnavmaps::navmap->new(); + return 1 if ($navmap); + return 0; +} + ################################################## ################################################## @@ -3546,7 +3885,9 @@ sub handler { (&Apache::lonnet::allowed('opa',$env{'request.course.id'}) || &Apache::lonnet::allowed('opa',$env{'request.course.id'}.'/'. $env{'request.course.sec'})); - if ($env{'request.course.id'} && $parm_permission) { + my $exists = &check_for_course_info(); + + if ($env{'request.course.id'} && $parm_permission && $exists) { # Start Page &Apache::loncommon::content_type($r,'text/html'); @@ -3580,6 +3921,14 @@ 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 'ordermetadata' && $parm_permission) { + &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=addmetadata', + text=>"Add Metadata Field"}); + &order_meta_fields($r); } elsif ($env{'form.action'} eq 'setrestrictmeta' && $parm_permission) { &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setrestrictmeta', text=>"Restrict Metadata"}); @@ -3601,11 +3950,20 @@ 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 - $env{'user.error.msg'}= - "/adm/parmset:opa:0:0:Cannot modify assessment parameters"; + if ($exists) { + $env{'user.error.msg'}= + "/adm/parmset:opa:0:0:Cannot modify assessment parameters"; + } else { + $env{'user.error.msg'}= + "/adm/parmset::0:1:Course environment gone, reinitialize the course"; + } return HTTP_NOT_ACCEPTABLE; } return OK;