--- loncom/interface/lonparmset.pm 2006/03/06 22:17:48 1.278 +++ loncom/interface/lonparmset.pm 2006/06/23 05:25:27 1.316 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to set parameters for assessments # -# $Id: lonparmset.pm,v 1.278 2006/03/06 22:17:48 www Exp $ +# $Id: lonparmset.pm,v 1.316 2006/06/23 05:25:27 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -63,6 +63,9 @@ use Apache::lonhomework; use Apache::lonxml; use Apache::lonlocal; use Apache::lonnavmaps; +use Apache::longroup; +use Apache::lonrss; +use LONCAPA; # --- Caches local to lonparmset @@ -90,11 +93,11 @@ Inputs: $what - a parameter spec (inclu Returns: A list, the first item is the index into the remaining list of items of parm valuse that is the active one, the list consists of parm values at the 14 possible levels -14 - General Course -13 - Map or Folder level in course +14- General Course +13- Map or Folder level in course 12- resource default 11- map default -10 - resource level in course +10- resource level in course 9 - General for section 8 - Map or Folder level for section 7 - resource level in section @@ -117,7 +120,6 @@ sub parmval { sub parmval_by_symb { my ($what,$symb,$def,$uname,$udom,$csec,$cgroup,$courseopt)=@_; # load caches - &cacheparmhash(); my $useropt=&Apache::lonnet::get_userresdata($uname,$udom); @@ -126,6 +128,7 @@ sub parmval_by_symb { my @outpar=(); # ----------------------------------------------------- Cascading lookup scheme my $map=(&Apache::lonnet::decode_symb($symb))[0]; + $map = &Apache::lonnet::deversion($map); my $symbparm=$symb.'.'.$what; my $mapparm=$map.'___(all).'.$what; @@ -394,12 +397,18 @@ sub storeparm_by_symb { return ''; } +sub log_parmset { + return &Apache::lonnet::instructor_log('parameterlog',@_); +} + sub storeparm_by_symb_inner { # ---------------------------------------------------------- Get symb, map, etc my ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$cgroup)=@_; # ---------------------------------------------------------- Construct prefixes $spnam=~s/\_([^\_]+)$/\.$1/; my $map=(&Apache::lonnet::decode_symb($symb))[0]; + $map = &Apache::lonnet::deversion($map); + my $symbparm=$symb.'.'.$spnam; my $mapparm=$map.'___(all).'.$spnam; @@ -450,9 +459,11 @@ sub storeparm_by_symb_inner { if ($delete) { $reply=&Apache::lonnet::del ('resourcedata',[keys(%storecontent)],$cdom,$cnum); + &log_parmset(\%storecontent,1); } else { $reply=&Apache::lonnet::cput ('resourcedata',\%storecontent,$cdom,$cnum); + &log_parmset(\%storecontent); } &Apache::lonnet::devalidatecourseresdata($cnum,$cdom); } else { @@ -473,15 +484,17 @@ sub storeparm_by_symb_inner { if ($delete) { $reply=&Apache::lonnet::del ('resourcedata',[keys(%storecontent)],$udom,$uname); + &log_parmset(\%storecontent,1,$uname,$udom); } else { $reply=&Apache::lonnet::cput ('resourcedata',\%storecontent,$udom,$uname); + &log_parmset(\%storecontent,0,$uname,$udom); } &Apache::lonnet::devalidateuserresdata($uname,$udom); } if ($reply=~/^error\:(.*)/) { - return "Write Error: $1"; + return "Write Error: $1"; } return ''; } @@ -580,20 +593,13 @@ sub plink { &valout($value,$type).''; } -sub startpage { - my $r=shift; - my $loaditems = qq|onUnload="pclose()" onLoad="group_or_section('cgroup')"|; - my $bodytag=&Apache::loncommon::bodytag('Set/Modify Course Parameters','', - $loaditems); - my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs(undef,'Table Mode Parameter Setting'); +sub page_js { + my $selscript=&Apache::loncommon::studentbrowser_javascript(); my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition(); - my $html=&Apache::lonxml::xmlbegin(); - $r->print(< -LON-CAPA Course Parameters - $selscript - -$bodytag +ENDJS + +} +sub startpage { + my ($r) = @_; + + my %loaditems = ('onunload' => "pclose()", + 'onload' => "group_or_section('cgroup')",); + + my $start_page = + &Apache::loncommon::start_page('Set/Modify Course Parameters', + &page_js(), + {'add_entries' => \%loaditems,}); + my $breadcrumbs = + &Apache::lonhtmlcommon::breadcrumbs('Table Mode Parameter Setting'); + $r->print(< - - - - + + + + ENDHEAD } @@ -681,7 +702,7 @@ sub print_row { } my $automatic=&rulescache(($which=~/\_([^\_]+)$/)[0].'_triggers'); if ($automatic) { - $parm.='
'.&mt('Automatically sets').' '.join(', ',split(/\:/,$automatic)).'
'; + $parm.='
'.&mt('Automatically sets').' '.join(', ',split(/\:/,$automatic)).'
'; } $r->print(''.$parm.''); @@ -1102,21 +1123,15 @@ sub usermenu { 'oi' => "or ID", 'ad' => "at Domain" ); - my %sectionhash=(); my $sections=''; - my $numsec = &Apache::loncommon::get_sections( - $env{'course.'.$env{'request.course.id'}.'.domain'}, - $env{'course.'.$env{'request.course.id'}.'.num'}, - \%sectionhash); + my %sectionhash = &Apache::loncommon::get_sections(); + my $groups; - my %grouphash; - my $numgrp = &Apache::loncommon::coursegroups( - \%grouphash, - $env{'course.'.$env{'request.course.id'}.'.domain'}, - $env{'course.'.$env{'request.course.id'}.'.num'}); - if ($numsec > 0) { + my %grouphash = &Apache::longroup::coursegroups(); + + if (%sectionhash) { $sections=$lt{'se'}.': print(''); + foreach my $s ('all',sort keys %sectionhash) { + $r->print(' \n"); } - $r->print("\n"); - } + $r->print('>'.$s."\n"); + } + $r->print("\n"); } sub groupmenu { my ($r,$selectedgroups)=@_; - my %grouphash; - my $numgrp = &Apache::loncommon::coursegroups( - \%grouphash, - $env{'course.'.$env{'request.course.id'}.'.domain'}, - $env{'course.'.$env{'request.course.id'}.'.num'}); - if ($numgrp) { - $r->print('\n"); + my %grouphash = &Apache::longroup::coursegroups(); + return if (!%grouphash); + + $r->print('\n"); } @@ -1399,7 +1406,6 @@ sub assessparms { my $uhome; my $csec; my $cgroup; - my $grouplist; my @usersgroups = (); my $coursename=$env{'course.'.$env{'request.course.id'}.'.description'}; @@ -1471,8 +1477,8 @@ sub assessparms { $id=''; } else { $message= - "".&mt("Unknown ID")." '$id' ". - &mt('at domain')." '$udom'"; + ''.&mt("Unknown ID")." '$id' ". + &mt('at domain')." '$udom'"; } } else { $uname=$env{'form.uname'}; @@ -1483,17 +1489,17 @@ sub assessparms { $uhome=&Apache::lonnet::homeserver($uname,$udom); if ($uhome eq 'no_host') { $message= - "".&mt("Unknown user")." '$uname' ". - &mt("at domain")." '$udom'"; + ''.&mt("Unknown user")." '$uname' ". + &mt("at domain")." '$udom'"; $uname=''; } else { $csec=&Apache::lonnet::getsection($udom,$uname, $env{'request.course.id'}); if ($csec eq '-1') { - $message="". + $message=''. &mt("User")." '$uname' ".&mt("at domain")." '$udom' ". - &mt("not in this course").""; + &mt("not in this course").""; $uname=''; $csec=$env{'form.csec'}; $cgroup=$env{'form.cgroup'}; @@ -1505,16 +1511,12 @@ sub assessparms { .$name{'lastname'}.' '.$name{'generation'}. "
\n".&mt('ID').": ".$name{'id'}.'

'; } - $grouplist = &Apache::lonnet::get_users_groups( + @usersgroups = &Apache::lonnet::get_users_groups( $udom,$uname,$env{'request.course.id'}); - if ($grouplist) { - @usersgroups = &Apache::lonnet::sort_course_groups($grouplist, - $env{'request.course.id'}); - unless (grep/^\Q$cgroup\E$/,@usersgroups) { + if (@usersgroups > 0) { + unless (grep(/^\Q$cgroup\E$/,@usersgroups)) { $cgroup = $usersgroups[0]; - } - } else { - $cgroup = ''; + } } } } @@ -1570,8 +1572,9 @@ sub assessparms { &displaymenu($r,\%allparms,\%allparts,\@pscat,\@psprt,\%keyorder); } else { my ($map,$id,$resource)=&Apache::lonnet::decode_symb($pssymb); - $r->print(&mt('Specific Resource').": ".$resource. - ''. + my $title = &Apache::lonnet::gettitle($pssymb); + $r->print(&mt('Specific Resource: [_1] ([_2])',$title,$resource). + ''. '

'); } @@ -1731,7 +1734,7 @@ ENDTABLEHEADFOUR '

'. "$title"); @@ -1930,7 +1933,7 @@ ENDMAPONE } if ($csec) {$r->print(&mt("Section")." $csec\n")}; - if ($cgroup) {$r->print(&mt("Group")." $csec\n")}; + if ($cgroup) {$r->print(&mt("Group")." $cgroup\n")}; $r->print("\n"); #---------------------------------------------------------------- print table $r->print('

'); @@ -1947,7 +1950,7 @@ ENDMAPONE $r->print("
"); } # end of $parmlev eq general } - $r->print(''); + $r->print(''.&Apache::loncommon::end_page()); } # end sub assessparms @@ -1972,10 +1975,9 @@ Returns: nothing sub crsenv { my $r=shift; my $setoutput=''; - my $bodytag=&Apache::loncommon::bodytag( - 'Set Course Environment Parameters'); - my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs(undef, - 'Edit Course Environment'); + + my $breadcrumbs = + &Apache::lonhtmlcommon::breadcrumbs('Edit Course Environment'); my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'}; my $crs = $env{'course.'.$env{'request.course.id'}.'.num'}; @@ -2076,9 +2078,14 @@ sub crsenv { } } } + + my $start_table =&Apache::loncommon::start_data_table(); + my $start_header_row=&Apache::loncommon::start_data_table_header_row(); + my $end_header_row =&Apache::loncommon::end_data_table_header_row(); # ------------------------- Re-init course environment entries for this session - &Apache::lonnet::coursedescription($env{'request.course.id'}); + &Apache::lonnet::coursedescription($env{'request.course.id'}, + {'freshen_cache' => 1}); # -------------------------------------------------------- Get parameters again @@ -2091,9 +2098,9 @@ sub crsenv { ('url' => ''.&mt('Top Level Map').' '. '". - &mt('Select Map').'
'. + &mt('Select Map').'
'. &mt('Modification may make assessment data inaccessible'). - '
', + '', 'description' => ''.&mt('Course Description').'', 'courseid' => ''.&mt('Course ID or number'). '
'. @@ -2164,8 +2171,8 @@ sub crsenv { '('.&mt('or set value to "[_1]" to allow all roles',"yes").')', 'rndseed' => ''.&mt('Randomization algorithm used').'
'. - ''.&mt('Modifying this will make problems').' '. - &mt('have different numbers and answers').'', + ''.&mt('Modifying this will make problems').' '. + &mt('have different numbers and answers').'', 'receiptalg' => ''.&mt('Receipt algorithm used').'
'. &mt('This controls how receipt numbers are generated.'), @@ -2191,6 +2198,8 @@ sub crsenv { 'disable_receipt_display' => ''.&mt('Disable display of problem receipts').'
'. ' ('.&mt('"[_1]" to disable, anything else if not','yes').')', + 'task_messages' + => ''.&mt('Send message to student when clicking Done on Tasks. [_1] to send a message only to student, [_2] to send message to student and add record to user information page for instructors. Leave blank to disable.','only_student','student_and_user_notes_screen').'', 'disablesigfigs' => ''.&mt('Disable checking of Significant Figures').'
'. ' ('.&mt('"[_1]" to disable, anything else if not','yes').')', @@ -2198,7 +2207,7 @@ sub crsenv { => ''.&mt('Disable automatically printing point values onto exams.').'
'. ' ('.&mt('"[_1]" to disable, anything else if not','yes').')', 'externalsyllabus' - => ''.&mt('URL of Syllabus (not using internal handler))').'', + => ''.&mt('URL of Syllabus (not using internal handler)').'', 'tthoptions' => ''.&mt('Default set of options to pass to tth/m when converting tex').'' ); @@ -2227,7 +2236,8 @@ sub crsenv { 'default_enrollment_end_date', 'tthoptions', 'disablesigfigs', - 'disableexampointprint' + 'disableexampointprint', + 'task_messages' ); foreach my $parameter (sort(keys(%values))) { unless (($parameter =~ m/^internal\./)||($parameter =~ m/^metadata\./)) { @@ -2237,13 +2247,15 @@ sub crsenv { } } } + foreach my $parameter (@Display_Order) { my $description = $descriptions{$parameter}; # onchange is javascript to automatically check the 'Set' button. my $onchange = 'onFocus="javascript:window.document.forms'. "['envform'].elements['".$parameter."_setparmval']". '.checked=true;"'; - $output .= ''.$description.''; + $output .= &Apache::loncommon::start_data_table_row(). + ''.$description.''; if ($parameter =~ /^default_enrollment_(start|end)_date$/) { $output .= ''. &Apache::lonhtmlcommon::date_setter('envform', @@ -2260,17 +2272,19 @@ sub crsenv { $output .= ''. &Apache::lonhtmlcommon::checkbox($parameter.'_setparmval'). ''; - $output .= "\n"; + $output .= &Apache::loncommon::end_data_table_row()."\n"; } my $onchange = 'onFocus="javascript:window.document.forms'. '[\'envform\'].elements[\'newp_setparmval\']'. '.checked=true;"'; - $output.=''.&mt('Create New Environment Variable').'
'. + $output.=&Apache::loncommon::start_data_table_row(). + ''.&mt('Create New Environment Variable').'
'. ''. ''. - ''; + ''. + &Apache::loncommon::end_data_table_row()."\n"; } my %lt=&Apache::lonlocal::texthash( 'par' => 'Parameter', @@ -2282,30 +2296,32 @@ sub crsenv { my $Parameter=&mt('Parameter'); my $Value=&mt('Value'); my $Set=&mt('Set'); - my $browse_js=&Apache::loncommon::browser_and_searcher_javascript('parmset'); - my $html=&Apache::lonxml::xmlbegin(); - $r->print(< - -LON-CAPA Course Environment - -$bodytag + my $browse_js= + ''; + + my $start_page = + &Apache::loncommon::start_page('Set Course Environment Parameters', + $browse_js); + my $end_page = + &Apache::loncommon::end_page(); + my $end_table=&Apache::loncommon::end_data_table(); + $r->print(< $setoutput -

- - +$start_table +$start_header_row + +$end_header_row $output -
$lt{'par'}$lt{'val'}$lt{'set'}?
$lt{'par'}$lt{'val'}$lt{'set'}?
+$end_table - - -ENDenv +$end_page +ENDENV } ################################################## # Overview mode @@ -2317,7 +2333,7 @@ sub tablestart { return ''; } else { $tableopen=1; - return ''; } } @@ -2325,7 +2341,7 @@ sub tablestart { sub tableend { if ($tableopen) { $tableopen=0; - return '
'.&mt('Parameter').''. + return &Apache::loncommon::start_data_table().'
'.&mt('Parameter').''. &mt('Delete').''.&mt('Set to ...').'
'; + return &Apache::loncommon::end_data_table(); } else { return''; } @@ -2384,11 +2400,12 @@ sub storedata { 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('
'.&mt('Stored modified parameter for').' '. &Apache::loncommon::plainname($tuname,$tudom)); } else { - $r->print('

'. - &mt('Error storing parameters').'

'); + $r->print('
'. + &mt('Error storing parameters').'
'); } &Apache::lonnet::devalidateuserresdata($tuname,$tudom); } else { @@ -2399,10 +2416,11 @@ sub storedata { } elsif ($cmd eq 'del') { if ($tuname) { if (&Apache::lonnet::del('resourcedata',[$tkey],$tudom,$tuname) eq 'ok') { + &log_parmset({$tkey=>''},1,$tuname,$tudom); $r->print('
'.&mt('Deleted parameter for').' '.&Apache::loncommon::plainname($tuname,$tudom)); } else { - $r->print('

'. - &mt('Error deleting parameters').'

'); + $r->print('
'. + &mt('Error deleting parameters').'
'); } &Apache::lonnet::devalidateuserresdata($tuname,$tudom); } else { @@ -2416,10 +2434,11 @@ sub storedata { 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('
'.&mt('Stored modified date for').' '.&Apache::loncommon::plainname($tuname,$tudom)); } else { - $r->print('

'. - &mt('Error storing parameters').'

'); + $r->print('
'. + &mt('Error storing parameters').'
'); } &Apache::lonnet::devalidateuserresdata($tuname,$tudom); } else { @@ -2436,19 +2455,22 @@ sub storedata { my $putentries=$#newdatakeys+1; if ($delentries) { if (&Apache::lonnet::del('resourcedata',\@deldata,$dom,$crs) eq 'ok') { + my %loghash=map { $_ => '' } @deldata; + &log_parmset(\%loghash,1); $r->print('

'.&mt('Deleted [_1] parameter(s)

',$delentries)); } else { - $r->print('

'. - &mt('Error deleting parameters').'

'); + $r->print('
'. + &mt('Error deleting parameters').'
'); } &Apache::lonnet::devalidatecourseresdata($crs,$dom); } if ($putentries) { if (&Apache::lonnet::put('resourcedata',\%newdata,$dom,$crs) eq 'ok') { + &log_parmset(\%newdata,0); $r->print('

'.&mt('Stored [_1] parameter(s)',$putentries/2).'

'); } else { - $r->print('

'. - &mt('Error storing parameters').'

'); + $r->print('
'. + &mt('Error storing parameters').'
'); } &Apache::lonnet::devalidatecourseresdata($crs,$dom); } @@ -2523,12 +2545,12 @@ sub listdata { } $middle=~s/\.+$//; $middle=~s/^\.+//; - my $realm=''.&mt('All Resources').''; + my $realm=''.&mt('All Resources').''; if ($middle=~/^(.+)\_\_\_\(all\)$/) { - $realm=''.&mt('Folder/Map').': '.&Apache::lonnet::gettitle($1).'
('.$1.')
'; + $realm=''.&mt('Folder/Map').': '.&Apache::lonnet::gettitle($1).'
('.$1.')
'; } elsif ($middle) { my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle); - $realm=''.&mt('Resource').': '.&Apache::lonnet::gettitle($middle).'
('.$url.' in '.$map.' id: '.$id.')
'; + $realm=''.&mt('Resource').': '.&Apache::lonnet::gettitle($middle).'
('.$url.' in '.$map.' id: '.$id.')
'; } if ($sortorder eq 'realmstudent') { if ($realm ne $oldrealm) { @@ -2555,7 +2577,7 @@ sub listdata { } if ($part ne $oldpart) { $r->print(&tableend(). - "\n".&mt('Part').": $part"); + "\n".&mt('Part').": $part"); $oldpart=$part; } # @@ -2570,8 +2592,10 @@ sub listdata { # # Ready to print # - $r->print(&tablestart().''.$name. - ':'); $foundkeys++; if (&isdateparm($thistype)) { @@ -2616,25 +2640,21 @@ sub listdata { } $r->print(''); - $r->print(''); + $r->print(''.&Apache::loncommon::end_data_table_row()); } } return $foundkeys; } sub newoverview { - my $r=shift; - my $bodytag=&Apache::loncommon::bodytag('Set Parameters'); + my ($r) = @_; + my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'}; my $crs = $env{'course.'.$env{'request.course.id'}.'.num'}; - my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs(undef,'Overview'); - my $html=&Apache::lonxml::xmlbegin(); + my $start_page = &Apache::loncommon::start_page('Set Parameters'); + my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Overview'); $r->print(< -LON-CAPA Parameters - -$bodytag +$start_page $breadcrumbs
ENDOVER @@ -2742,7 +2762,7 @@ ENDOVER } $r->print(&tableend(). ((($env{'form.store'}) || ($env{'form.dis'}))?'

':''). - '
'); + ''.&Apache::loncommon::end_page()); } sub secgroup_lister { @@ -2781,18 +2801,14 @@ sub secgroup_lister { } sub overview { - my $r=shift; - my $bodytag=&Apache::loncommon::bodytag('Modify Parameters'); + my ($r) = @_; my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'}; my $crs = $env{'course.'.$env{'request.course.id'}.'.num'}; - my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs(undef,'Overview'); - my $html=&Apache::lonxml::xmlbegin(); + + my $start_page=&Apache::loncommon::start_page('Modify Parameters'); + my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Overview'); $r->print(< -LON-CAPA Parameters - -$bodytag +$start_page $breadcrumbs
ENDOVER @@ -2814,7 +2830,8 @@ ENDOVER my $foundkeys=&listdata($r,$resourcedata,$resourcedata,$sortorder); $r->print(&tableend().'

'. - ($foundkeys?'':&mt('There are no parameters.')).'

'); + ($foundkeys?'':&mt('There are no parameters.')).'

'. + &Apache::loncommon::end_page()); } ################################################## @@ -2963,16 +2980,7 @@ Output html header for page ################################################## ################################################## sub header { - my $html=&Apache::lonxml::xmlbegin(); - my $bodytag=&Apache::loncommon::bodytag('Parameter Manager'); - my $title = &mt('LON-CAPA Parameter Manager'); - return(< -$title - -$bodytag -ENDHEAD + return &Apache::loncommon::start_page('Parameter Manager'); } ################################################## ################################################## @@ -3024,6 +3032,10 @@ ENDMAINFORMHEAD { text => 'Set Parameter Setting Default Actions', action => 'setdefaults', permission => $parm_permission, + }, + { text => 'Parameter Change Log and Course Blog Posting/User Notification', + action => 'parameterchangelog', + permission => $parm_permission, }, ); my $menu_html = ''; @@ -3034,14 +3046,14 @@ ENDMAINFORMHEAD } next if (! $menu_item->{'permission'}); $menu_html.='

'; - $menu_html.=''; + $menu_html.=''; if (exists($menu_item->{'url'})) { $menu_html.=qq{}; } else { $menu_html.= qq{}; } - $menu_html.= &mt($menu_item->{'text'}).''; + $menu_html.= &mt($menu_item->{'text'}).''; if (exists($menu_item->{'help'})) { $menu_html.= &Apache::loncommon::help_open_topic($menu_item->{'help'}); @@ -3082,13 +3094,9 @@ sub setrestrictmeta { my $output; my $item_num; my $put_result; - $r->print(&Apache::lonxml::xmlbegin()); - $r->print(' - LON-CAPA Restrict Metadata - '); - $r->print(&Apache::loncommon::bodytag('Restrict Metadata')); - $r->print(&Apache::lonhtmlcommon::breadcrumbs(undef, - 'Restrict Metadata')); + + $r->print(&Apache::loncommon::start_page('Restrict Metadata')); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Restrict Metadata')); my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'}; my $crs = $env{'course.'.$env{'request.course.id'}.'.num'}; my $key_base = $env{'course.'.$env{'request.course.id'}.'.'}; @@ -3119,7 +3127,8 @@ sub setrestrictmeta { } } } - &Apache::lonnet::coursedescription($env{'request.course.id'}); + &Apache::lonnet::coursedescription($env{'request.course.id'}, + {'freshen_cache' => 1}); my %metadata_fields = &Apache::lonmeta::fieldnames('portfolio'); foreach my $field (sort(keys(%metadata_fields))) { &Apache::lonnet::logthis ($field); @@ -3134,28 +3143,25 @@ sub setrestrictmeta { ENDenv - $r->print(' - '); + $r->print(&Apache::loncommon::end_page()); return 'ok'; } ################################################## sub defaultsetter { - my $r=shift; - my $bodytag=&Apache::loncommon::bodytag('Parameter Setting Default Actions'); - my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'}; - my $crs = $env{'course.'.$env{'request.course.id'}.'.num'}; - my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs(undef,'Defaults'); - my $html=&Apache::lonxml::xmlbegin(); + my ($r) = @_; + + my $start_page = + &Apache::loncommon::start_page('Parameter Setting Default Actions'); + my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Defaults'); $r->print(< -LON-CAPA Parameters - -$bodytag +$start_page $breadcrumbs

ENDDEFHEAD + + my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + my $crs = $env{'course.'.$env{'request.course.id'}.'.num'}; my @ids=(); my %typep=(); my %keyp=(); @@ -3292,10 +3298,201 @@ ENDYESNO $r->print(''); } $r->print("\n
\n\n"); + &mt('Store Rules')."' />\n". + &Apache::loncommon::end_page()); return; } +sub components { + my ($key,$uname,$udom,$exeuser,$exedomain)=@_; + my $typeflag=0; + if ($key=~/\.type$/) { + $key=~s/\.type$//; + $typeflag=1; + } + my $issection; + my ($middle,$part,$name)=($key=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/); + my $section=&mt('All Students'); + if ($middle=~/^\[(.*)\]/) { + $issection=$1; + $section=&mt('Group/Section').': '.$issection; + $middle=~s/^\[(.*)\]//; + } + $middle=~s/\.+$//; + $middle=~s/^\.+//; + if ($uname) { + $section=&mt('User').": ".&Apache::loncommon::plainname($uname,$udom); + $issection=''; + } + my $realm=''.&mt('All Resources').''; + my $realmdescription=&mt('all resources'); + if ($middle=~/^(.+)\_\_\_\(all\)$/) { + $realm=''.&mt('Folder/Map').': '.&Apache::lonnet::gettitle($1).'
('.$1.')
'; + $realmdescription=&mt('folder').' '.&Apache::lonnet::gettitle($1); + } elsif ($middle) { + my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle); + $realm=''.&mt('Resource').': '.&Apache::lonnet::gettitle($middle).'
('.$url.' in '.$map.' id: '.$id.')
'; + $realmdescription=&mt('resource').' '.&Apache::lonnet::gettitle($middle); + } + my $what=$part.'.'.$name; + return ($realm,$section,$name,$part,$typeflag, + $what,$middle,$uname,$udom,$issection,$realmdescription); +} + +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{$name}) { + return $standard_parms{$name}; + } else { + return $name; + } +} + +# +# Parameter Change Log +# + + +sub parm_change_log { + my ($r)=@_; + &startpage($r); + 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('
+ '); + + 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).''. + ''); + + my $courseopt=&Apache::lonnet::get_courseresdata($env{'course.'.$env{'request.course.id'}.'.num'}, + $env{'course.'.$env{'request.course.id'}.'.domain'}); + $r->print(&Apache::loncommon::start_data_table().&Apache::loncommon::start_data_table_header_row(). + ''.&mt('Time').''.&mt('User').''.&mt('Extent').''.&mt('Users').''. + &mt('Parameter').''.&mt('Part').''.&mt('New Value').''.&mt('Announce').''. + &Apache::loncommon::end_data_table_header_row()); + 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 $time = + &Apache::lonlocal::locallocaltime($parmlog{$id}{'exe_time'}); + my $plainname = + &Apache::loncommon::plainname($parmlog{$id}{'exe_uname'}, + $parmlog{$id}{'exe_udom'}); + my $about_me_link = + &Apache::loncommon::aboutmewrapper($plainname, + $parmlog{$id}{'exe_uname'}, + $parmlog{$id}{'exe_udom'}); + my $send_msg_link=''; + if ((($parmlog{$id}{'exe_uname'} ne $env{'user.name'}) + || ($parmlog{$id}{'exe_udom'} ne $env{'user.domain'}))) { + $send_msg_link ='
'. + &Apache::loncommon::messagewrapper(&mt('Send message'), + $parmlog{$id}{'exe_uname'}, + $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=(); + 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.''. + &standard_parameter_names($parmname).''. + ($part?&mt('Part: [_1]',$part):&mt('All Parts')).''); + my $stillactive=0; + if ($parmlog{$id}{'deleteflag'}) { + $r->print(&mt('Deleted')); + } else { + if ($typeflag) { + $r->print(&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)); + } else { + $r->print($value); + } + if ($value ne $all[$level]) { + $r->print('
'.&mt('Not active anymore').''); + } else { + $stillactive=1; + } + } + } + $r->print(''); + 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). + ''); + } else { + $r->print(''. + &Apache::lonrss::course_blog_link($id,$title,$description). + ''); + } + } else { + $r->print(' '); + } + $r->print(&Apache::loncommon::end_data_table_row()); + } + $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()); +} + ################################################## ################################################## @@ -3360,8 +3557,7 @@ sub handler { } elsif (! exists($env{'form.action'})) { $r->print(&header()); - $r->print(&Apache::lonhtmlcommon::breadcrumbs(undef, - 'Parameter Manager')); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Parameter Manager')); &print_main_menu($r,$parm_permission); } elsif ($env{'form.action'} eq 'crsenv' && $parm_permission) { &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=crsenv', @@ -3388,8 +3584,11 @@ sub handler { text=>"Table Mode", help => 'Course_Setting_Parameters'}); &assessparms($r); - } - + } elsif ($env{'form.action'} eq 'parameterchangelog' && $parm_permission) { + &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable', + text=>"Parameter Change Log"}); + &parm_change_log($r); + } } else { # ----------------------------- Not in a course, or not allowed to modify parms $env{'user.error.msg'}=