--- loncom/interface/lonparmset.pm 2006/04/14 16:38:43 1.287
+++ loncom/interface/lonparmset.pm 2006/05/01 14:59:38 1.297
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Handler to set parameters for assessments
#
-# $Id: lonparmset.pm,v 1.287 2006/04/14 16:38:43 albertel Exp $
+# $Id: lonparmset.pm,v 1.297 2006/05/01 14:59:38 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -117,7 +117,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);
@@ -394,38 +393,13 @@ sub storeparm_by_symb {
return '';
}
-{
- my $logid;
- sub log_parmset {
- my ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$cgroup)=@_;
- $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.'_symb' => $symb,
- $id.'_spnam' => $spnam,
- $id.'_snum' => $snum,
- $id.'_nval' => $nval,
- $id.'_ntype' => $ntype,
- $id.'_uname' => $uname,
- $id.'_udom' => $udom,
- $id.'_csec' => $csec,
- $id.'_cgroup' => $cgroup
- },
- $env{'course.'.$env{'request.course.id'}.'.domain'},
- $env{'course.'.$env{'request.course.id'}.'.num'}
- );
- }
+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)=@_;
- &log_parmset(@_);
# ---------------------------------------------------------- Construct prefixes
$spnam=~s/\_([^\_]+)$/\.$1/;
my $map=(&Apache::lonnet::decode_symb($symb))[0];
@@ -479,9 +453,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 {
@@ -502,9 +478,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);
}
@@ -1437,7 +1415,6 @@ sub assessparms {
my $uhome;
my $csec;
my $cgroup;
- my $grouplist;
my @usersgroups = ();
my $coursename=$env{'course.'.$env{'request.course.id'}.'.description'};
@@ -1543,16 +1520,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'});
+ if (@usersgroups > 0) {
unless (grep/^\Q$cgroup\E$/,@usersgroups) {
$cgroup = $usersgroups[0];
- }
- } else {
- $cgroup = '';
+ }
}
}
}
@@ -2115,7 +2088,8 @@ sub crsenv {
}
# ------------------------- 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
@@ -2354,7 +2328,7 @@ sub tablestart {
return '';
} else {
$tableopen=1;
- return '
'.&mt('Parameter').' '.
+ return &Apache::loncommon::start_data_table().' '.&mt('Parameter').' '.
&mt('Delete').' '.&mt('Set to ...').' ';
}
}
@@ -2362,7 +2336,7 @@ sub tablestart {
sub tableend {
if ($tableopen) {
$tableopen=0;
- return '
';
+ return &Apache::loncommon::end_data_table();
} else {
return'';
}
@@ -2421,6 +2395,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 {
@@ -2436,6 +2411,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(''.
@@ -2453,6 +2429,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(''.
@@ -2473,6 +2450,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(''.
@@ -2482,6 +2461,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(''.
@@ -2607,8 +2587,10 @@ sub listdata {
#
# Ready to print
#
- $r->print(&tablestart().''.$name.
- ': ');
$foundkeys++;
if (&isdateparm($thistype)) {
@@ -2653,7 +2635,7 @@ sub listdata {
}
$r->print(' ');
- $r->print(' ');
+ $r->print(''.&Apache::loncommon::end_data_table_row());
}
}
return $foundkeys;
@@ -3046,7 +3028,7 @@ ENDMAINFORMHEAD
action => 'setdefaults',
permission => $parm_permission,
},
- { text => 'Parameter Change Log and Course Blog Posting',
+ { text => 'Parameter Change Log and Course Blog Posting/User Notification',
action => 'parameterchangelog',
permission => $parm_permission,
},
@@ -3141,7 +3123,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);
@@ -3316,116 +3299,138 @@ ENDYESNO
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').' ';
+ 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.') ';
+ }
+ my $what=$part.'.'.$name;
+ return ($realm,$section,$name,$part,$typeflag,
+ $what,$middle,$uname,$udom,$issection);
+}
+
+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',
+ 'int_pos' => 'Positive Integer',
+ 'int_zero_pos' => 'Positive Integer or Zero',
+ 'hinttries' => 'Number of Tries till Hints appear');
+ if ($standard_parms{$name}) {
+ return $standard_parms{$name};
+ } else {
+ return $name;
+ }
+}
+
sub parm_change_log {
my ($r)=@_;
&startpage($r);
-
- my @ids=();
- my %symbp=();
- my %mapp=();
- my %typep=();
- my %keyp=();
- my %uris=();
- my %maptitles=();
-
-# -------------------------------------------------------- Variable declaration
-
- my %allmaps=();
- my %alllevs=();
-
- my $uname;
- my $udom;
- my $uhome;
- my $csec;
- my $cgroup;
- my $grouplist;
- my @usersgroups = ();
-
- my $coursename=$env{'course.'.$env{'request.course.id'}.'.description'};
-
- $alllevs{'Resource Level'}='full';
- $alllevs{'Map/Folder Level'}='map';
- $alllevs{'Course Level'}='general';
-
- my %allparms;
- my %allparts;
- my %keyorder;
-# --------------------------------------------------------- Get all assessments
- &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps,
- \%mapp, \%symbp,\%maptitles,\%uris,
- \%keyorder);
-
- $mapp{'0.0'} = '';
- $symbp{'0.0'} = '';
-
- my %level=&Apache::lonlocal::texthash('parmlevel_14' => 'General Course',
- 'parmlevel_13' => 'Map or Folder level in course',
- 'parmlevel_12' => 'Resource default',
- 'parmlevel_11' => 'Map default',
- 'parmlevel_10' => 'Resource level in course',
- 'parmlevel_9' => 'General for section',
- 'parmlevel_8' => 'Map or Folder level for section',
- 'parmlevel_7' => 'Resource level in section',
- 'parmlevel_6' => 'General for group',
- 'parmlevel_5' => 'Map or Folder level for group',
- 'parmlevel_4' => 'Resource level in group',
- 'parmlevel_3' => 'General for specific student',
- 'parmlevel_2' => 'Map or Folder level for specific student',
- 'parmlevel_1' => 'Resource level for specific student');
-
-# $id.'_exe_uname' => $env{'user.name'},
-# $id.'_exe_udom' => $env{'user.domain'},
-# $id.'_exe_time' => time(),
-# $id.'_exe_ip' => $ENV{'REMOTE_ADDR'},
-# $id.'_symb' => $symb,
-# $id.'_spnam' => $spnam,
-# $id.'_snum' => $snum,
-# $id.'_nval' => $nval,
-# $id.'_ntype' => $ntype,
-# $id.'_uname' => $uname,
-# $id.'_udom' => $udom,
-# $id.'_csec' => $csec,
-# $id.'_cgroup' => $cgroup
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};
- }
- }
+ my $courseopt=&Apache::lonnet::get_courseresdata($env{'course.'.$env{'request.course.id'}.'.num'},
+ $env{'course.'.$env{'request.course.id'}.'.domain'});
$r->print('');
- foreach my $id (sort { $exetime{$a}<=>$exetime{$b} } (keys(%exetime))) {
- my ($part,$name)=($parmlog{$id.'_spnam'}=~/^(.*)[\_\.]([^\_\.]+)$/);
- my $spnam=$part.'_'.$name;
- $r->print(''.
- &Apache::lonlocal::locallocaltime($parmlog{$id.'_exe_time'}).
- ' '.
- &Apache::loncommon::aboutmewrapper(
- &Apache::loncommon::plainname($parmlog{$id.'_exe_uname'},
- $parmlog{$id.'_exe_udom'}),
- $parmlog{$id.'_exe_uname'},
- $parmlog{$id.'_exe_udom'}).''.
- $parmlog{$id.'_exe_uname'}.':'.$parmlog{$id.'_exe_udom'}.' '.
- ((($parmlog{$id.'_exe_uname'} ne $env{'user.name'}) ||
- ($parmlog{$id.'_exe_udom'} ne $env{'user.domain'}))?
- ' '.&Apache::loncommon::messagewrapper(&mt('Send message'),
- $parmlog{$id.'_exe_uname'},
- $parmlog{$id.'_exe_udom'}):'').
- ' '.
- $level{'parmlevel_'.$parmlog{$id.'_snum'}}.
- ' '.
- &mt($allparms{$name}).''.$name.' '.
- ' '.
- ($part?&mt('Part: [_1]',$part):&mt('All parts')).
- ' '.
- $parmlog{$id.'_symb'}.
- ' '.
- ($parmlog{$id.'_nval'}?
- (&isdateparm($spnam)?&Apache::lonlocal::locallocaltime($parmlog{$id.'_nval'}):$parmlog{$id.'_nval'})
- :&mt('Deleted Parameter')).
- ' ');
+ my $bgcolor='#EEEEEE';
+ foreach my $id (sort { $parmlog{$b}{'exe_time'}<=>$parmlog{$a}{'exe_time'} } (keys(%parmlog))) {
+ if ($bgcolor eq '#EEEEEE') { $bgcolor='#FFFFCC'; } else { $bgcolor='#EEEEEE'; }
+ 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'});
+ }
+ $r->print(''.$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)=
+ &components($changed,$parmlog{$id}{'uname'},$parmlog{$id}{'udom'});
+ if ($typeflag) { $istype{$parmname}=$value; }
+ if ($makenewrow) { $r->print(''); } 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) {
+ if (($uname) && ($udom)) {
+ $r->print('Notify Link ');
+ } else {
+ $r->print('Blog Link ');
+ }
+ } else {
+ $r->print(' ');
+ }
+ $r->print(' ');
+ }
}
$r->print('
');
$r->print(&Apache::loncommon::end_page());
@@ -3525,7 +3530,7 @@ sub handler {
&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"});
+ text=>"Parameter Change Log"});
&parm_change_log($r);
}
} else {