--- loncom/interface/lonparmset.pm 2006/01/10 05:27:57 1.275 +++ loncom/interface/lonparmset.pm 2006/04/15 21:12:56 1.290 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to set parameters for assessments # -# $Id: lonparmset.pm,v 1.275 2006/01/10 05:27:57 raeburn Exp $ +# $Id: lonparmset.pm,v 1.290 2006/04/15 21:12:56 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -293,6 +293,25 @@ sub preset_defaults { } ################################################## + +sub date_sanity_info { + my $checkdate=shift; + unless ($checkdate) { return ''; } + my $result=''; + my $crsprefix='course.'.$env{'request.course.id'}.'.'; + if ($env{$crsprefix.'default_enrollment_end_date'}) { + if ($checkdate>$env{$crsprefix.'default_enrollment_end_date'}) { + $result.='
'.&mt('After course enrollment end!'); + } + } + if ($env{$crsprefix.'default_enrollment_start_date'}) { + if ($checkdate<$env{$crsprefix.'default_enrollment_start_date'}) { + $result.='
'.&mt('Before course enrollment start!'); + } + } + return $result; +} +################################################## ################################################## # # Store a parameter by ID @@ -375,6 +394,32 @@ sub storeparm_by_symb { return ''; } +{ + my $logid; + sub log_parmset { + my ($storehash,$delflag,$uname,$udom)=@_; + my $logentry=join(',',map { + &Apache::lonnet::escape($_).'=>'.&Apache::lonnet::escape($$storehash{$_}); + } keys %$storehash); + $logid++; + my $id=time().'00000'.$$.'00000'.$logid; + &Apache::lonnet::put('nohist_parameterlog', + { + $id.'_exe_uname' => $env{'user.name'}, + $id.'_exe_udom' => $env{'user.domain'}, + $id.'_exe_time' => time(), + $id.'_exe_ip' => $ENV{'REMOTE_ADDR'}, + $id.'_delflag' => $delflag, + $id.'_logentry' => $logentry, + $id.'_uname' => $uname, + $id.'_udom' => $udom, + }, + $env{'course.'.$env{'request.course.id'}.'.domain'}, + $env{'course.'.$env{'request.course.id'}.'.num'} + ); + } +} + sub storeparm_by_symb_inner { # ---------------------------------------------------------- Get symb, map, etc my ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$cgroup)=@_; @@ -431,9 +476,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 { @@ -454,9 +501,11 @@ 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); } @@ -516,7 +565,7 @@ sub valout { } $result=~s/\s+$//; } elsif (&isdateparm($type)) { - $result = localtime($value); + $result = localtime($value).&date_sanity_info($value); } else { $result = $value; } @@ -561,20 +610,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(undef, + 'Table Mode Parameter Setting'); + $r->print(< - - - - + + + + ENDHEAD } @@ -1928,7 +1986,7 @@ ENDMAPONE $r->print(""); } # end of $parmlev eq general } - $r->print(''); + $r->print(''.&Apache::loncommon::end_page()); } # end sub assessparms @@ -1953,8 +2011,7 @@ 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 $dom = $env{'course.'.$env{'request.course.id'}.'.domain'}; @@ -2138,8 +2195,11 @@ sub crsenv { => ''.&mt('Allow limited HTML in discussion posts').'
'. '('.&mt('Set value to "[_1]" to allow',"yes").')', 'allow_discussion_post_editing' - => ''.&mt('Allow users to edit/delete their own discussion posts').'
'. - '('.&mt('Set value to "[_1]" to allow',"yes").')', + => ''.&mt('Allow users with specified roles to edit/delete their own discussion posts').'
"st": '. + &mt('student').', "ta": '. + 'TA, "in": '. + &mt('instructor').'; ('.&mt('role:section,role:section,..., e.g., st:001,st:002,in,cc would permit students in sections 001 and 002 and instructors in any section, and course coordinators to edit their own posts.').')
'. + '('.&mt('or set value to "[_1]" to allow all roles',"yes").')', 'rndseed' => ''.&mt('Randomization algorithm used').'
'. ''.&mt('Modifying this will make problems').' '. @@ -2175,10 +2235,13 @@ sub crsenv { 'disableexampointprint' => ''.&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)').'', 'tthoptions' => ''.&mt('Default set of options to pass to tth/m when converting tex').'' ); my @Display_Order = ('url','description','courseid','cloners','grading', + 'externalsyllabus', 'default_xml_style','pageseparators', 'question.email','comment.email','policy.email', 'student_classlist_view', @@ -2257,17 +2320,18 @@ 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(); + $r->print(< $setoutput @@ -2278,9 +2342,8 @@ $output - - -ENDenv +$end_page +ENDENV } ################################################## # Overview mode @@ -2359,6 +2422,7 @@ 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 { @@ -2374,6 +2438,7 @@ 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('

'. @@ -2391,6 +2456,7 @@ 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('

'. @@ -2411,6 +2477,8 @@ 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('

'. @@ -2420,6 +2488,7 @@ sub storedata { } 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('

'. @@ -2557,7 +2626,8 @@ sub listdata { $jskey, $$resourcedata{$thiskey}, '',1,'','',$hour,$min,$sec). -'' +''. +&date_sanity_info($$resourcedata{$thiskey}) ); } elsif ($thistype eq 'string_yesno') { my $showval; @@ -2597,18 +2667,14 @@ sub listdata { } 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 $start_page = &Apache::loncommon::start_page('Set Parameters'); my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs(undef,'Overview'); - my $html=&Apache::lonxml::xmlbegin(); $r->print(< -LON-CAPA Parameters - -$bodytag +$start_page $breadcrumbs
ENDOVER @@ -2716,7 +2782,7 @@ ENDOVER } $r->print(&tableend(). ((($env{'form.store'}) || ($env{'form.dis'}))?'

':''). - '
'); + ''.&Apache::loncommon::end_page()); } sub secgroup_lister { @@ -2755,18 +2821,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 $start_page=&Apache::loncommon::start_page('Modify Parameters'); my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs(undef,'Overview'); - my $html=&Apache::lonxml::xmlbegin(); $r->print(< -LON-CAPA Parameters - -$bodytag +$start_page $breadcrumbs
ENDOVER @@ -2788,7 +2850,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()); } ################################################## @@ -2937,16 +3000,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'); } ################################################## ################################################## @@ -2998,6 +3052,10 @@ ENDMAINFORMHEAD { text => 'Set Parameter Setting Default Actions', action => 'setdefaults', permission => $parm_permission, + }, + { text => 'Parameter Change Log and Course Blog Posting', + action => 'parameterchangelog', + permission => $parm_permission, }, ); my $menu_html = ''; @@ -3056,11 +3114,8 @@ 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::loncommon::start_page('Restrict Metadata')); $r->print(&Apache::lonhtmlcommon::breadcrumbs(undef, 'Restrict Metadata')); my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'}; @@ -3108,28 +3163,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 ($r) = @_; + + my $start_page = + &Apache::loncommon::start_page('Parameter Setting Default Actions'); my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs(undef,'Defaults'); - my $html=&Apache::lonxml::xmlbegin(); $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=(); @@ -3266,10 +3318,108 @@ ENDYESNO $r->print(''); } $r->print("\n
\n\n"); + &mt('Store Rules')."' />\n". + &Apache::loncommon::end_page()); return; } +sub components { + my ($key,$uname,$udom)=@_; + my $typeflag=0; + if ($key=~/\.type$/) { + $key=~s/\.type$//; + $typeflag=1; + } + my ($middle,$part,$name)=($key=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/); + my $section=&mt('All Students'); + if ($middle=~/^\[(.*)\]/) { + my $issection=$1; + if ($uname) { + $section=&mt('User').": ".&Apache::loncommon::plainname($uname,$udom); + } else { + $section=&mt('Group/Section').': '.$issection; + } + $middle=~s/^\[(.*)\]//; + } + $middle=~s/\.+$//; + $middle=~s/^\.+//; + my $realm=''.&mt('All Resources').''; + if ($middle=~/^(.+)\_\_\_\(all\)$/) { + $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.')
'; + } + return ($realm,$section,$name,$part,$typeflag); +} + +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'}); + my %exetime=(); + foreach my $key (keys(%parmlog)) { + if ($key=~/^(.+)\_exe\_time$/) { + $exetime{$1}=$parmlog{$key}; + } + } + $r->print(''); + foreach my $id (sort { $exetime{$a}<=>$exetime{$b} } (keys(%exetime))) { + my @changes=split(/\,/,$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'}))) { + my $send_msg_link ='
'. + &Apache::loncommon::messagewrapper(&mt('Send message'), + $parmlog{$id.'_exe_uname'}, + $parmlog{$id.'_exe_udom'}); + } + $r->print(' + '); + my $makenewrow=0; + my %istype=(); + foreach my $changed (sort @changes) { + my ($key,$value)=split(/\=\>/,&Apache::lonnet::unescape($changed)); + my ($realm,$section,$parmname,$part,$typeflag)= + &components($key,$parmlog{$id.'_uname'},$parmlog{$id.'_udom'}); + if ($typeflag) { $istype{$parmname}=$value; } + if ($makenewrow) { $r->print(''); } else { $makenewrow=1; } + $r->print(''); + } + } + $r->print('
'.$time.''.$about_me_link. + '
'.$parmlog{$id.'_exe_uname'}. + ':'.$parmlog{$id.'_exe_udom'}.''. + $send_msg_link.'
'.$realm.''.$section.''. + &mt('Part: [_1]',$part).''); + if ($parmlog{$id.'_deleteflag'}) { + $r->print(&mt('Deleted')); + } else { + if ($typeflag) { + $r->print(&mt('Type: [_1]',$value)); + } elsif (&isdateparm($istype{$parmname})) { + $r->print(&Apache::lonlocal::locallocaltime($value)); + } else { + $r->print($value); + } + } + $r->print('
'); + $r->print(&Apache::loncommon::end_page()); +} + ################################################## ################################################## @@ -3362,8 +3512,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 and Course Blog Posting"}); + &parm_change_log($r); + } } else { # ----------------------------- Not in a course, or not allowed to modify parms $env{'user.error.msg'}=