--- loncom/interface/lonparmset.pm 2005/06/06 02:25:09 1.211
+++ loncom/interface/lonparmset.pm 2009/09/15 02:21:20 1.413.6.1
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Handler to set parameters for assessments
#
-# $Id: lonparmset.pm,v 1.211 2005/06/06 02:25:09 www Exp $
+# $Id: lonparmset.pm,v 1.413.6.1 2009/09/15 02:21:20 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -63,15 +63,10 @@ use Apache::lonhomework;
use Apache::lonxml;
use Apache::lonlocal;
use Apache::lonnavmaps;
+use Apache::longroup;
+use Apache::lonrss;
+use LONCAPA qw(:DEFAULT :match);
-# --- Caches local to lonparmset
-
-my $parmhashid;
-my %parmhash;
-my $symbsid;
-my %symbs;
-
-# --- end local caches
##################################################
##################################################
@@ -86,16 +81,19 @@ Inputs: $what - a parameter spec (inclu
$id - a bighash Id number
$def - the resource's default value 'stupid emacs
-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 11 possible levels
+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
-11 - General Course
-10 - Map or Folder level in course
-9- resource default
-8- map default
-7 - resource level in course
-6 - General for section
-5 - Map or Folder level for section
-4 - resource level in section
+14- General Course
+13- Map or Folder level in course
+12- resource default
+11- map default
+10- resource level in course
+9 - General for section
+8 - Map or Folder level for section
+7 - resource level in section
+6 - General for group
+5 - Map or Folder level for group
+4 - resource level in group
3 - General for specific student
2 - Map or Folder level for specific student
1 - resource level for specific student
@@ -104,30 +102,32 @@ Returns: A list, the first item is the
##################################################
sub parmval {
- my ($what,$id,$def,$uname,$udom,$csec)=@_;
- return &parmval_by_symb($what,&symbcache($id),$def,$uname,$udom,$csec);
+ my ($what,$id,$def,$uname,$udom,$csec,$cgroup,$courseopt)=@_;
+ return &parmval_by_symb($what,&symbcache($id),$def,$uname,$udom,$csec,
+ $cgroup,$courseopt);
}
sub parmval_by_symb {
- my ($what,$symb,$def,$uname,$udom,$csec)=@_;
-# load caches
-
- &cacheparmhash();
-
- my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
- my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
- my $useropt=&Apache::lonnet::get_userresdata($uname,$udom);
- my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom);
+ my ($what,$symb,$def,$uname,$udom,$csec,$cgroup,$courseopt)=@_;
+ my $useropt;
+ if ($uname ne '' && $udom ne '') {
+ $useropt = &Apache::lonnet::get_userresdata($uname,$udom);
+ }
my $result='';
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;
+ my $grplevel=$env{'request.course.id'}.'.['.$cgroup.'].'.$what;
+ my $grplevelr=$env{'request.course.id'}.'.['.$cgroup.'].'.$symbparm;
+ my $grplevelm=$env{'request.course.id'}.'.['.$cgroup.'].'.$mapparm;
+
my $seclevel=$env{'request.course.id'}.'.['.$csec.'].'.$what;
my $seclevelr=$env{'request.course.id'}.'.['.$csec.'].'.$symbparm;
my $seclevelm=$env{'request.course.id'}.'.['.$csec.'].'.$mapparm;
@@ -137,53 +137,67 @@ sub parmval_by_symb {
my $courselevelm=$env{'request.course.id'}.'.'.$mapparm;
-
# --------------------------------------------------------- first, check course
if (defined($$courseopt{$courselevel})) {
- $outpar[11]=$$courseopt{$courselevel};
- $result=11;
+ $outpar[14]=$$courseopt{$courselevel};
+ $result=14;
}
if (defined($$courseopt{$courselevelm})) {
- $outpar[10]=$$courseopt{$courselevelm};
- $result=10;
+ $outpar[13]=$$courseopt{$courselevelm};
+ $result=13;
}
# ------------------------------------------------------- second, check default
- if (defined($def)) { $outpar[9]=$def; $result=9; }
+ if (defined($def)) { $outpar[12]=$def; $result=12; }
# ------------------------------------------------------ third, check map parms
- my $thisparm=$parmhash{$symbparm};
- if (defined($thisparm)) { $outpar[8]=$thisparm; $result=8; }
+ my $thisparm=&parmhash($symbparm);
+ if (defined($thisparm)) { $outpar[11]=$thisparm; $result=11; }
if (defined($$courseopt{$courselevelr})) {
- $outpar[7]=$$courseopt{$courselevelr};
- $result=7;
+ $outpar[10]=$$courseopt{$courselevelr};
+ $result=10;
}
# ------------------------------------------------------ fourth, back to course
- if (defined($csec)) {
+ if ($csec ne '') {
if (defined($$courseopt{$seclevel})) {
- $outpar[6]=$$courseopt{$seclevel};
- $result=6;
+ $outpar[9]=$$courseopt{$seclevel};
+ $result=9;
}
if (defined($$courseopt{$seclevelm})) {
- $outpar[5]=$$courseopt{$seclevelm};
- $result=5;
+ $outpar[8]=$$courseopt{$seclevelm};
+ $result=8;
}
if (defined($$courseopt{$seclevelr})) {
- $outpar[4]=$$courseopt{$seclevelr};
- $result=4;
+ $outpar[7]=$$courseopt{$seclevelr};
+ $result=7;
}
}
+# ------------------------------------------------------ fifth, check course group
+ if ($cgroup ne '') {
+ if (defined($$courseopt{$grplevel})) {
+ $outpar[6]=$$courseopt{$grplevel};
+ $result=6;
+ }
+ if (defined($$courseopt{$grplevelm})) {
+ $outpar[5]=$$courseopt{$grplevelm};
+ $result=5;
+ }
+ if (defined($$courseopt{$grplevelr})) {
+ $outpar[4]=$$courseopt{$grplevelr};
+ $result=4;
+ }
+ }
# ---------------------------------------------------------- fifth, check user
- if (defined($uname)) {
+ if ($uname ne '') {
if (defined($$useropt{$courselevel})) {
$outpar[3]=$$useropt{$courselevel};
$result=3;
@@ -202,44 +216,142 @@ sub parmval_by_symb {
return ($result,@outpar);
}
-sub resetparmhash {
- $parmhashid='';
-}
-sub cacheparmhash {
- if ($parmhashid eq $env{'request.course.fn'}) { return; }
- my %parmhashfile;
- if (tie(%parmhashfile,'GDBM_File',
- $env{'request.course.fn'}.'_parms.db',&GDBM_READER(),0640)) {
- %parmhash=%parmhashfile;
- untie %parmhashfile;
- $parmhashid=$env{'request.course.fn'};
- }
-}
-sub resetsymbcache {
- $symbsid='';
+# --- Caches local to lonparmset
+
+
+sub reset_caches {
+ &resetparmhash();
+ &resetsymbcache();
+ &resetrulescache();
}
-sub symbcache {
- my $id=shift;
- if ($symbsid ne $env{'request.course.id'}) {
- %symbs=();
+{
+ my $parmhashid;
+ my %parmhash;
+ sub resetparmhash {
+ undef($parmhashid);
+ undef(%parmhash);
}
- unless ($symbs{$id}) {
- my $navmap = Apache::lonnavmaps::navmap->new();
- if ($id=~/\./) {
- my $resource=$navmap->getById($id);
- $symbs{$id}=$resource->symb();
- } else {
- my $resource=$navmap->getByMapPc($id);
- $symbs{$id}=&Apache::lonnet::declutter($resource->src());
+
+ sub cacheparmhash {
+ if ($parmhashid eq $env{'request.course.fn'}) { return; }
+ my %parmhashfile;
+ if (tie(%parmhashfile,'GDBM_File',
+ $env{'request.course.fn'}.'_parms.db',&GDBM_READER(),0640)) {
+ %parmhash=%parmhashfile;
+ untie(%parmhashfile);
+ $parmhashid=$env{'request.course.fn'};
}
- $symbsid=$env{'request.course.id'};
}
- return $symbs{$id};
+
+ sub parmhash {
+ my ($id) = @_;
+ &cacheparmhash();
+ return $parmhash{$id};
+ }
+ }
+
+{
+ my $symbsid;
+ my %symbs;
+ sub resetsymbcache {
+ undef($symbsid);
+ undef(%symbs);
+ }
+
+ sub symbcache {
+ my $id=shift;
+ if ($symbsid ne $env{'request.course.id'}) {
+ undef(%symbs);
+ }
+ if (!$symbs{$id}) {
+ my $navmap = Apache::lonnavmaps::navmap->new();
+ if ($id=~/\./) {
+ my $resource=$navmap->getById($id);
+ $symbs{$id}=$resource->symb();
+ } else {
+ my $resource=$navmap->getByMapPc($id);
+ $symbs{$id}=&Apache::lonnet::declutter($resource->src());
+ }
+ $symbsid=$env{'request.course.id'};
+ }
+ return $symbs{$id};
+ }
+ }
+
+{
+ my $rulesid;
+ my %rules;
+ sub resetrulescache {
+ undef($rulesid);
+ undef(%rules);
+ }
+
+ sub rulescache {
+ my $id=shift;
+ 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);
+ $rulesid=$env{'request.course.id'};
+ }
+ return $rules{$id};
+ }
}
+sub preset_defaults {
+ my $type=shift;
+ if (&rulescache($type.'_action') eq 'default') {
+# yes, there is something
+ return (&rulescache($type.'_hours'),
+ &rulescache($type.'_min'),
+ &rulescache($type.'_sec'),
+ &rulescache($type.'_value'));
+ } else {
+# nothing there or something else
+ return ('','','','','');
+ }
+}
+
+##################################################
+
+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!')
+ .'
';
+ }
+ }
+# Preparation for additional warnings about dates in the past/future.
+# An improved, more context sensitive version is recommended,
+# e.g. warn for due and answer dates which are defined before the corresponding open date, etc.
+# if ($checkdate'
+# .'('.&mt('in the past').')'
+# .'';
+# }
+# if ($checkdate>time) {
+# $result.=''
+# .'('.&mt('in the future').')'
+# .'
';
+# }
+ return $result;
+}
##################################################
##################################################
#
@@ -255,8 +367,8 @@ sub symbcache {
# - userdomain
sub storeparm {
- my ($sresid,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec)=@_;
- &storeparm_by_symb(&symbcache($sresid),$spnam,$snum,$nval,$ntype,$uname,$udom,$csec);
+ my ($sresid,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$cgroup)=@_;
+ &storeparm_by_symb(&symbcache($sresid),$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,'',$cgroup);
}
#
@@ -270,16 +382,77 @@ sub storeparm {
# - new type
# - username
# - userdomain
-
+my %recstack;
sub storeparm_by_symb {
+ my ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$recflag,$cgroup)=@_;
+ unless ($recflag) {
+# first time call
+ %recstack=();
+ $recflag=1;
+ }
+# store parameter
+ &storeparm_by_symb_inner
+ ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$cgroup);
+# don't do anything if parameter was reset
+ unless ($nval) { return; }
+ my ($prefix,$parm)=($spnam=~/^(.*[\_\.])([^\_\.]+)$/);
+# remember that this was set
+ $recstack{$parm}=1;
+# what does this trigger?
+ foreach my $triggered (split(/\:/,&rulescache($parm.'_triggers'))) {
+# don't backfire
+ unless ((!$triggered) || ($recstack{$triggered})) {
+ my $action=&rulescache($triggered.'_action');
+ my ($whichaction,$whichparm)=($action=~/^(.*\_)([^\_]+)$/);
+# set triggered parameter on same level
+ my $newspnam=$prefix.$triggered;
+ my $newvalue='';
+ my $active=1;
+ if ($action=~/^when\_setting/) {
+# are there restrictions?
+ if (&rulescache($triggered.'_triggervalue')=~/\w/) {
+ $active=0;
+ foreach my $possiblevalue (split(/\s*\,\s*/,&rulescache($triggered.'_triggervalue'))) {
+ if (lc($possiblevalue) eq lc($nval)) { $active=1; }
+ }
+ }
+ $newvalue=&rulescache($triggered.'_value');
+ } else {
+ my $totalsecs=((&rulescache($triggered.'_days')*24+&rulescache($triggered.'_hours'))*60+&rulescache($triggered.'_min'))*60+&rulescache($triggered.'_sec');
+ if ($action=~/^later\_than/) {
+ $newvalue=$nval+$totalsecs;
+ } else {
+ $newvalue=$nval-$totalsecs;
+ }
+ }
+ if ($active) {
+ &storeparm_by_symb($symb,$newspnam,$snum,$newvalue,&rulescache($triggered.'_type'),
+ $uname,$udom,$csec,$recflag,$cgroup);
+ }
+ }
+ }
+ 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)=@_;
+ 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;
+ my $grplevel=$env{'request.course.id'}.'.['.$cgroup.'].'.$spnam;
+ my $grplevelr=$env{'request.course.id'}.'.['.$cgroup.'].'.$symbparm;
+ my $grplevelm=$env{'request.course.id'}.'.['.$cgroup.'].'.$mapparm;
+
my $seclevel=$env{'request.course.id'}.'.['.$csec.'].'.$spnam;
my $seclevelr=$env{'request.course.id'}.'.['.$csec.'].'.$symbparm;
my $seclevelm=$env{'request.course.id'}.'.['.$csec.'].'.$mapparm;
@@ -289,12 +462,16 @@ sub storeparm_by_symb {
my $courselevelm=$env{'request.course.id'}.'.'.$mapparm;
my $storeunder='';
- if (($snum==11) || ($snum==3)) { $storeunder=$courselevel; }
- if (($snum==10) || ($snum==2)) { $storeunder=$courselevelm; }
- if (($snum==7) || ($snum==1)) { $storeunder=$courselevelr; }
- if ($snum==6) { $storeunder=$seclevel; }
- if ($snum==5) { $storeunder=$seclevelm; }
- if ($snum==4) { $storeunder=$seclevelr; }
+ if (($snum==14) || ($snum==3)) { $storeunder=$courselevel; }
+ if (($snum==13) || ($snum==2)) { $storeunder=$courselevelm; }
+ if (($snum==10) || ($snum==1)) { $storeunder=$courselevelr; }
+ if ($snum==9) { $storeunder=$seclevel; }
+ if ($snum==8) { $storeunder=$seclevelm; }
+ if ($snum==7) { $storeunder=$seclevelr; }
+ if ($snum==6) { $storeunder=$grplevel; }
+ if ($snum==5) { $storeunder=$grplevelm; }
+ if ($snum==4) { $storeunder=$grplevelr; }
+
my $delete;
if ($nval eq '') { $delete=1;}
@@ -308,9 +485,9 @@ sub storeparm_by_symb {
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
# Expire sheets
&Apache::lonnet::expirespread('','','studentcalc');
- if (($snum==7) || ($snum==4)) {
+ if (($snum==10) || ($snum==7) || ($snum==4)) {
&Apache::lonnet::expirespread('','','assesscalc',$symb);
- } elsif (($snum==8) || ($snum==5)) {
+ } elsif (($snum==11) || ($snum==8) || ($snum==5)) {
&Apache::lonnet::expirespread('','','assesscalc',$map);
} else {
&Apache::lonnet::expirespread('','','assesscalc');
@@ -319,9 +496,11 @@ sub storeparm_by_symb {
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 {
@@ -342,15 +521,17 @@ sub storeparm_by_symb {
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 '';
}
@@ -364,49 +545,67 @@ sub storeparm_by_symb {
Format a value for output.
-Inputs: $value, $type
+Inputs: $value, $type, $editable
Returns: $value, formatted for output. If $type indicates it is a date,
localtime($value) is returned.
+$editable will return an icon to click on
=cut
##################################################
##################################################
sub valout {
- my ($value,$type)=@_;
+ my ($value,$type,$editable)=@_;
my $result = '';
# Values of zero are valid.
if (! $value && $value ne '0') {
- $result = ' ';
+ if ($editable) {
+ $result = '* ';
+ } else {
+ $result=' ';
+ }
} else {
if ($type eq 'date_interval') {
my ($sec,$min,$hour,$mday,$mon,$year)=gmtime($value);
+ my @timer;
$year=$year-70;
$mday--;
if ($year) {
- $result.=$year.' yrs ';
+# $result.=&mt('[quant,_1,yr]',$year).' ';
+ push(@timer,&mt('[quant,_1,yr]',$year));
}
if ($mon) {
- $result.=$mon.' mths ';
+# $result.=&mt('[quant,_1,mth]',$mon).' ';
+ push(@timer,&mt('[quant,_1,mth]',$mon));
}
if ($mday) {
- $result.=$mday.' days ';
+# $result.=&mt('[quant,_1,day]',$mday).' ';
+ push(@timer,&mt('[quant,_1,day]',$mday));
}
if ($hour) {
- $result.=$hour.' hrs ';
+# $result.=&mt('[quant,_1,hr]',$hour).' ';
+ push(@timer,&mt('[quant,_1,hr]',$hour));
}
if ($min) {
- $result.=$min.' mins ';
+# $result.=&mt('[quant,_1,min]',$min).' ';
+ push(@timer,&mt('[quant,_1,min]',$min));
}
if ($sec) {
- $result.=$sec.' secs ';
+# $result.=&mt('[quant,_1,sec]',$sec).' ';
+ push(@timer,&mt('[quant,_1,sec]',$sec));
}
- $result=~s/\s+$//;
- } elsif ($type=~/^date/) {
- $result = localtime($value);
+# $result=~s/\s+$//;
+ if (!@timer) { # Special case: all entries 0 -> display "0 secs" intead of empty field to keep this field editable
+ push(@timer,&mt('[quant,_1,sec]',0));
+ }
+ $result.=join(", ",@timer);
+ } elsif (&isdateparm($type)) {
+ $result = &Apache::lonlocal::locallocaltime($value).
+ &date_sanity_info($value);
} else {
$result = $value;
+ $result = &HTML::Entities::encode($result,'"<>&');
}
}
return $result;
@@ -434,34 +633,35 @@ sub plink {
my ($type,$dis,$value,$marker,$return,$call)=@_;
my $winvalue=$value;
unless ($winvalue) {
- if ($type=~/^date/) {
+ if (&isdateparm($type)) {
$winvalue=$env{'form.recent_'.$type};
} else {
$winvalue=$env{'form.recent_'.(split(/\_/,$type))[0]};
}
}
-
-
- return
+ my ($parmname)=((split(/\&/,$marker))[1]=~/\_([^\_]+)$/);
+ my ($hour,$min,$sec,$val)=&preset_defaults($parmname);
+ unless (defined($winvalue)) { $winvalue=$val; }
+ my $valout = &valout($value,$type,1);
+ my $unencmarker = $marker;
+ foreach my $item (\$type, \$dis, \$winvalue, \$marker, \$return, \$call,
+ \$hour, \$min, \$sec) {
+ $$item = &HTML::Entities::encode($$item,'"<>&');
+ $$item =~ s/\'/\\\'/g;
+ }
+ return '';
}
-sub startpage {
- my $r=shift;
+sub page_js {
- my $bodytag=&Apache::loncommon::bodytag('Set/Modify Course Parameters','',
- 'onUnload="pclose()"');
- my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs(undef,'Table Mode Parameter Setting');
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','Table_Mode');
+ $r->print(<
-
-
-
-
+
+
+
+
ENDHEAD
}
sub print_row {
my ($r,$which,$part,$name,$symbp,$rid,$default,$defaulttype,$display,$defbgone,
- $defbgtwo,$parmlev,$uname,$udom,$csec)=@_;
+ $defbgtwo,$defbgthree,$parmlev,$uname,$udom,$csec,$cgroup,$usersgroups)=@_;
+ my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+ my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom);
# get the values for the parameter in cascading order
# empty levels will remain empty
my ($result,@outpar)=&parmval($$part{$which}.'.'.$$name{$which},
- $rid,$$default{$which},$uname,$udom,$csec);
+ $rid,$$default{$which},$uname,$udom,$csec,$cgroup,$courseopt);
# get the type for the parameters
# problem: these may not be set for all levels
my ($typeresult,@typeoutpar)=&parmval($$part{$which}.'.'.
- $$name{$which}.'.type',
- $rid,$$defaulttype{$which},$uname,$udom,$csec);
+ $$name{$which}.'.type',$rid,
+ $$defaulttype{$which},$uname,$udom,$csec,$cgroup,$courseopt);
# cascade down manually
my $cascadetype=$$defaulttype{$which};
- for (my $i=11;$i>0;$i--) {
+ for (my $i=14;$i>0;$i--) {
if ($typeoutpar[$i]) {
$cascadetype=$typeoutpar[$i];
} else {
@@ -544,62 +762,95 @@ sub print_row {
} else {
$parm=~s|\[.*\]\s||g;
}
-
+ my $automatic=&rulescache(($which=~/\_([^\_]+)$/)[0].'_triggers');
+ if ($automatic) {
+ $parm.=' '.&mt('Automatically sets').' '.join(', ',split(/\:/,$automatic)).' ';
+ }
$r->print(''.$parm.' ');
my $thismarker=$which;
$thismarker=~s/^parameter\_//;
my $mprefix=$rid.'&'.$thismarker.'&';
+ my $effective_parm = &valout($outpar[$result],$typeoutpar[$result]);
+ my ($othergrp,$grp_parm,$controlgrp);
if ($parmlev eq 'general') {
if ($uname) {
&print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
+ } elsif ($cgroup) {
+ &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
} elsif ($csec) {
- &print_td($r,6,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
+ &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
} else {
- &print_td($r,11,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
+ &print_td($r,14,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
}
} elsif ($parmlev eq 'map') {
if ($uname) {
&print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
+ } elsif ($cgroup) {
+ &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
} elsif ($csec) {
- &print_td($r,5,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
+ &print_td($r,8,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
} else {
- &print_td($r,10,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
+ &print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
}
} else {
+ if ($uname) {
+ if (@{$usersgroups} > 1) {
+ my ($coursereply,$grp_parm,$controlgrp);
+ ($coursereply,$othergrp,$grp_parm,$controlgrp) =
+ &print_usergroups($r,$$part{$which}.'.'.$$name{$which},
+ $rid,$cgroup,$defbgone,$usersgroups,$result,$courseopt);
+ if ($coursereply && $result > 3) {
+ if (defined($controlgrp)) {
+ if ($cgroup ne $controlgrp) {
+ $effective_parm = $grp_parm;
+ $result = 0;
+ }
+ }
+ }
+ }
+ }
- &print_td($r,11,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
+ &print_td($r,14,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
+ &print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
+ &print_td($r,12,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
+ &print_td($r,11,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
&print_td($r,10,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
- &print_td($r,9,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
- &print_td($r,8,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
- &print_td($r,7,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
if ($csec) {
- &print_td($r,6,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
- &print_td($r,5,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
- &print_td($r,4,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
+ &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
+ &print_td($r,8,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
+ &print_td($r,7,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
}
+
+ if ($cgroup) {
+ &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
+ &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
+ &print_td($r,4,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
+ }
+
if ($uname) {
+ if ($othergrp) {
+ $r->print($othergrp);
+ }
&print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
&print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
&print_td($r,1,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
}
} # end of $parmlev if/else
-
- $r->print(''.
- &valout($outpar[$result],$typeoutpar[$result]).' ');
+ $r->print(''.$effective_parm.' ');
if ($parmlev eq 'full') {
my $sessionval=&Apache::lonnet::EXT('resource.'.$$part{$which}.
'.'.$$name{$which},$$symbp{$rid});
my $sessionvaltype=$typeoutpar[$result];
if (!defined($sessionvaltype)) { $sessionvaltype=$$defaulttype{$which}; }
- $r->print(''.
+ $r->print(' '.
&valout($sessionval,$sessionvaltype).' '.
' ');
}
@@ -611,7 +862,7 @@ sub print_td {
my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display)=@_;
$r->print('');
- if ($which<8 || $which > 9) {
+ if ($which<11 || $which > 12) {
$r->print(&plink($$typeoutpar[$which],
$$display{$value},$$outpar[$which],
$mprefix."$which",'parmform.pres','psub'));
@@ -621,6 +872,61 @@ sub print_td {
$r->print(' '."\n");
}
+sub print_usergroups {
+ my ($r,$what,$rid,$cgroup,$defbg,$usersgroups,$result,$courseopt) = @_;
+ my $courseid = $env{'request.course.id'};
+ my $output;
+ my $symb = &symbcache($rid);
+ my $symbparm=$symb.'.'.$what;
+ my $map=(&Apache::lonnet::decode_symb($symb))[0];
+ my $mapparm=$map.'___(all).'.$what;
+ my ($coursereply,$resultitem,$resultgroup,$resultlevel,$resulttype) =
+ &parm_control_group($courseid,$usersgroups,$symbparm,$mapparm,$what,
+ $courseopt);
+ my $bgcolor = $defbg;
+ my $grp_parm;
+ if (($coursereply) && ($cgroup ne $resultgroup)) {
+ if ($result > 3) {
+ $bgcolor = '"#AAFFAA"';
+ $grp_parm = &valout($coursereply,$resulttype);
+ }
+ $grp_parm = &valout($coursereply,$resulttype);
+ $output = '';
+ if ($resultgroup && $resultlevel) {
+ $output .= ''.$resultgroup.' ('.$resultlevel.'): '.$grp_parm;
+ } else {
+ $output .= ' ';
+ }
+ $output .= ' ';
+ } else {
+ $output .= ' ';
+ }
+ return ($coursereply,$output,$grp_parm,$resultgroup);
+}
+
+sub parm_control_group {
+ my ($courseid,$usersgroups,$symbparm,$mapparm,$what,$courseopt) = @_;
+ my ($coursereply,$resultitem,$resultgroup,$resultlevel,$resulttype);
+ my $grpfound = 0;
+ my @levels = ($symbparm,$mapparm,$what);
+ my @levelnames = ('resource','map/folder','general');
+ foreach my $group (@{$usersgroups}) {
+ if ($grpfound) { last; }
+ for (my $i=0; $i<@levels; $i++) {
+ my $item = $courseid.'.['.$group.'].'.$levels[$i];
+ if (defined($$courseopt{$item})) {
+ $coursereply = $$courseopt{$item};
+ $resultitem = $item;
+ $resultgroup = $group;
+ $resultlevel = $levelnames[$i];
+ $resulttype = $$courseopt{$item.'.type'};
+ $grpfound = 1;
+ last;
+ }
+ }
+ }
+ return($coursereply,$resultitem,$resultgroup,$resultlevel,$resulttype);
+}
=pod
@@ -684,57 +990,72 @@ sub extractResourceInformation {
$$typep{$id}=$1;
$$keyp{$id}='';
$$uris{$id}=$srcf;
- foreach (split(/\,/,&Apache::lonnet::metadata($srcf,'allpossiblekeys'))) {
- if ($_=~/^parameter\_(.*)/) {
- my $key=$_;
+ foreach my $key (split(/\,/,&Apache::lonnet::metadata($srcf,'allpossiblekeys'))) {
+ next if ($key!~/^parameter_/);
+
# Hidden parameters
- if (&Apache::lonnet::metadata($srcf,$key.'.hidden') eq 'parm') {
- next;
- }
- my $display= &Apache::lonnet::metadata($srcf,$key.'.display');
- my $name=&Apache::lonnet::metadata($srcf,$key.'.name');
- my $part= &Apache::lonnet::metadata($srcf,$key.'.part');
+ next if (&Apache::lonnet::metadata($srcf,$key.'.hidden') eq 'parm');
#
# allparms is a hash of parameter names
#
- my $parmdis = $display;
- $parmdis =~ s/\[Part.*$//g;
- $$allparms{$name}=$parmdis;
- $$defkeytype{$name}=&Apache::lonnet::metadata($srcf,$key.'.type');
+ my $name=&Apache::lonnet::metadata($srcf,$key.'.name');
+ if (!exists($$allparms{$name}) || $$allparms{$name} =~ m/^\s*$/ ) {
+ my ($display,$parmdis);
+ $display = &standard_parameter_names($name);
+ if ($display eq '') {
+ $display= &Apache::lonnet::metadata($srcf,$key.'.display');
+ $parmdis = $display;
+ $parmdis =~ s/\s*\[Part.*$//g;
+ } else {
+ $parmdis = &mt($display);
+ }
+ $$allparms{$name}=$parmdis;
+ if (ref($defkeytype)) {
+ $$defkeytype{$name}=
+ &Apache::lonnet::metadata($srcf,$key.'.type');
+ }
+ }
+
#
# allparts is a hash of all parts
#
- $$allparts{$part} = "Part: $part";
+ my $part= &Apache::lonnet::metadata($srcf,$key.'.part');
+ $$allparts{$part} = &mt('Part: [_1]',$part);
#
# Remember all keys going with this resource
#
- if ($$keyp{$id}) {
- $$keyp{$id}.=','.$key;
- } else {
- $$keyp{$id}=$key;
- }
+ if ($$keyp{$id}) {
+ $$keyp{$id}.=','.$key;
+ } else {
+ $$keyp{$id}=$key;
+ }
#
# Put in order
#
- unless ($$keyorder{$key}) {
- $$keyorder{$key}=$keyordercnt;
- $keyordercnt++;
- }
-
+ unless ($$keyorder{$key}) {
+ $$keyorder{$key}=$keyordercnt;
+ $keyordercnt++;
}
}
- $$mapp{$id}=
- &Apache::lonnet::declutter($resource->enclosing_map_src());
- $$mapp{$mapid}=$$mapp{$id};
- $$allmaps{$mapid}=$$mapp{$id};
- if ($mapid eq '1') {
- $$maptitles{$mapid}='Main Course Documents';
+
+
+ if (!exists($$mapp{$mapid})) {
+ $$mapp{$id}=
+ &Apache::lonnet::declutter($resource->enclosing_map_src());
+ $$mapp{$mapid}=$$mapp{$id};
+ $$allmaps{$mapid}=$$mapp{$id};
+ if ($mapid eq '1') {
+ $$maptitles{$mapid}=&mt('Main Course Documents');
+ } else {
+ $$maptitles{$mapid}=
+ &Apache::lonnet::gettitle($$mapp{$id});
+ }
+ $$maptitles{$$mapp{$id}}=$$maptitles{$mapid};
+ $$symbp{$mapid}=$$mapp{$id}.'___(all)';
} else {
- $$maptitles{$mapid}=&Apache::lonnet::gettitle(&Apache::lonnet::clutter($$mapp{$id}));
+ $$mapp{$id} = $$mapp{$mapid};
}
- $$maptitles{$$mapp{$id}}=$$maptitles{$mapid};
$$symbp{$id}=&Apache::lonnet::encode_symb($$mapp{$id},$resid,$srcf);
- $$symbp{$mapid}=$$mapp{$id}.'___(all)';
}
}
@@ -742,6 +1063,11 @@ sub extractResourceInformation {
##################################################
##################################################
+sub isdateparm {
+ my $type=shift;
+ return (($type=~/^date/) && (!($type eq 'date_interval')));
+}
+
sub parmmenu {
my ($r,$allparms,$pscat,$keyorder)=@_;
my $tempkey;
@@ -771,8 +1097,18 @@ sub parmmenu {
checkthis('duedate','pscat');
checkthis('opendate','pscat');
checkthis('answerdate','pscat');
- checkthis('interval','pscat');
- }
+ }
+
+ function checkdisset() {
+ checkthis('discussend','pscat');
+ checkthis('discusshide','pscat');
+ }
+
+ function checkcontdates() {
+ checkthis('contentopen','pscat');
+ checkthis('contentclose','pscat');
+ }
+
function checkvisi() {
checkthis('hiddenresource','pscat');
@@ -798,49 +1134,80 @@ sub parmmenu {
ENDSCRIPT
$r->print();
- $r->print("\n");
+ $r->print("\n".'');
+ $r->print(' '
+ .'
'
+ );
}
sub partmenu {
my ($r,$allparts,$psprt)=@_;
- $r->print('');
+ $r->print('');
$r->print('print(' selected') unless (@{$psprt});
+ $r->print(' selected="selected"') unless (@{$psprt});
$r->print('>'.&mt('All Parts').' ');
my %temphash=();
foreach (@{$psprt}) { $temphash{$_}=1; }
- foreach my $tempkey (sort keys %{$allparts}) {
+ foreach my $tempkey (sort {
+ if ($a==$b) { return ($a cmp $b) } else { return ($a <=> $b); }
+ } keys(%{$allparts})) {
unless ($tempkey =~ /\./) {
$r->print('print(' selected');
+ $r->print(' selected="selected"');
}
$r->print('>'.$$allparts{$tempkey}.' ');
}
@@ -849,41 +1216,103 @@ sub partmenu {
}
sub usermenu {
- my ($r,$uname,$id,$udom,$csec)=@_;
+ my ($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,$usersgroups)=@_;
my $chooseopt=&Apache::loncommon::select_dom_form($udom,'udom').' '.
&Apache::loncommon::selectstudent_link('parmform','uname','udom');
my $selscript=&Apache::loncommon::studentbrowser_javascript();
- my %lt=&Apache::lonlocal::texthash(
- 'sg' => "Section/Group",
- 'fu' => "For User",
- 'oi' => "or ID",
- 'ad' => "at Domain"
- );
- my %sectionhash=();
+
my $sections='';
- if (&Apache::loncommon::get_sections(
- $env{'course.'.$env{'request.course.id'}.'.domain'},
- $env{'course.'.$env{'request.course.id'}.'.num'},
- \%sectionhash)) {
- $sections=$lt{'sg'}.': ';
- foreach ('',sort keys %sectionhash) {
- $sections.=''.$_.' ';
+ my %sectionhash = &Apache::loncommon::get_sections();
+
+ my $groups;
+ my %grouphash = &Apache::longroup::coursegroups();
+
+ my $g_s_header='';
+ my $g_s_footer='';
+
+ if (%sectionhash) {
+ $sections=&mt('Section:').' '.$section.
+ '';
}
$sections.=' ';
- }
- $r->print(<
-$sections
-
-$lt{'fu'}
-
-$lt{'oi'}
-
-$lt{'ad'}
-$chooseopt
-
-ENDMENU
+ }
+
+ if (%sectionhash && %grouphash && $parmlev ne 'full') {
+ $sections .= ' '.&mt('or').' ';
+ $sections .= qq|
+
+|;
+ } else {
+ $sections .= qq|
+
+|;
+ }
+
+ if (%grouphash) {
+ $groups=&mt('Group:').' ';
+ }
+ $groups.=' ';
+ }
+
+ if (%sectionhash || %grouphash) {
+ $g_s_header=''.&mt('Group/Section').' ';
+ $g_s_footer='
';
+ }
+
+ $r->print(''
+ .$g_s_header
+ .$sections
+ .$groups
+ .$g_s_footer
+ .''.&mt('User').' '
+ .&mt('For User [_1] or Student/Employee ID [_2] at Domain [_3]'
+ ,' '
+ ,' '
+ ,$chooseopt)
+ .'
'
+ .' '
+ );
}
sub displaymenu {
@@ -891,19 +1320,19 @@ sub displaymenu {
$r->print(''.&mt('Select Parameters to View').' '.
&mt('Select Parts to View').' ');
&parmmenu($r,$allparms,$pscat,$keyorder);
- $r->print(' ');
+ $r->print(' ');
&partmenu($r,$allparts,$psprt);
$r->print('
');
}
sub mapmenu {
my ($r,$allmaps,$pschp,$maptitles)=@_;
- $r->print(&mt('Select Enclosing Map or Folder').' ');
+ $r->print(''.&mt('Select Enclosing Map or Folder').' ');
$r->print('');
$r->print(''.&mt('All Maps or Folders').' ');
foreach (sort {$$allmaps{$a} cmp $$allmaps{$b}} keys %{$allmaps}) {
$r->print('print(' selected'); }
+ if (($pschp eq $_)) { $r->print(' selected="selected"'); }
$r->print('>'.$$maptitles{$_}.($$allmaps{$_}!~/^uploaded/?' ['.$$allmaps{$_}.']':'').' ');
}
$r->print(" ");
@@ -911,15 +1340,15 @@ sub mapmenu {
sub levelmenu {
my ($r,$alllevs,$parmlev)=@_;
- $r->print(&mt('Select Parameter Level').
- &Apache::loncommon::help_open_topic('Course_Parameter_Levels').' ');
+ $r->print(''.&mt('Select Parameter Level').
+ &Apache::loncommon::help_open_topic('Course_Parameter_Levels').' ');
$r->print('');
foreach (reverse sort keys %{$alllevs}) {
$r->print('print(' selected');
+ $r->print(' selected="selected"');
}
- $r->print('>'.$_.' ');
+ $r->print('>'.&mt($_).'');
}
$r->print(" ");
}
@@ -927,45 +1356,43 @@ sub levelmenu {
sub sectionmenu {
my ($r,$selectedsections)=@_;
+ my %sectionhash = &Apache::loncommon::get_sections();
+ return if (!%sectionhash);
- my ($classlist,$field_names) =
- &Apache::loncoursedata::get_classlist(
- $env{'request.course.id'},
- $env{'course.'.$env{'request.course.id'}.'.domain'},
- $env{'course.'.$env{'request.course.id'}.'.num'});
- my %Sections=();
- while (my ($student,$student_data) = each (%$classlist)) {
- my $studenthash = ();
- for (my $i=0; $i< scalar(@$field_names);$i++) {
- my $field = $field_names->[$i];
- # Store the data
- $studenthash->{$field}=$student_data->[$i];
- }
- my $section = $studenthash->{'section'};
- if (! defined($section) || $section =~/^\s*$/ || $section == -1) {
- $studenthash->{'section'} = 'none';
- $section = $studenthash->{'section'};
- }
- $Sections{$section}++;
- }
- my @Sections = sort {$a cmp $b} keys(%Sections);
- unshift(@Sections,'all');
-
- $r->print('');
-
- foreach my $s (@Sections) {
- $r->print(' print(' selected');
- last;
- }
- }
- $r->print('>'.$s." \n");
+ $r->print('');
+ foreach my $s ('all',sort keys %sectionhash) {
+ $r->print(' print(' selected="selected"');
+ last;
+ }
+ }
+ $r->print('>'.$s." \n");
}
$r->print(" \n");
}
+sub groupmenu {
+ my ($r,$selectedgroups)=@_;
+ my %grouphash = &Apache::longroup::coursegroups();
+ return if (!%grouphash);
+
+ $r->print('');
+ foreach my $group (sort(keys(%grouphash))) {
+ $r->print(' print(' selected="selected"');
+ last;
+ }
+ }
+ $r->print('>'.$group." \n");
+ }
+ $r->print(" \n");
+}
+
+
sub keysplit {
my $keyp=shift;
return (split(/\,/,$keyp));
@@ -978,6 +1405,18 @@ sub keysinorder {
} (keys %{$name});
}
+sub keysinorder_bytype {
+ my ($name,$keyorder)=@_;
+ return sort {
+ my $ta=(split('_',$a))[-1];
+ my $tb=(split('_',$b))[-1];
+ if ($$keyorder{'parameter_0_'.$ta} == $$keyorder{'parameter_0_'.$tb}) {
+ return ($a cmp $b);
+ }
+ $$keyorder{'parameter_0_'.$ta} <=> $$keyorder{'parameter_0_'.$tb};
+ } (keys %{$name});
+}
+
sub keysindisplayorder {
my ($name,$keyorder)=@_;
return sort {
@@ -985,6 +1424,21 @@ sub keysindisplayorder {
} (keys %{$name});
}
+sub sortmenu {
+ my ($r,$sortorder)=@_;
+ $r->print(' print(' checked="on"');
+ }
+ $r->print(' />'.&mt('Sort by realm first, then student (group/section)'));
+ $r->print(' print(' checked="checked"');
+ }
+ $r->print(' />'.&mt('Sort by student (group/section) first, then realm').
+ ' ');
+}
+
sub standardkeyorder {
return ('parameter_0_opendate' => 1,
'parameter_0_duedate' => 2,
@@ -1003,7 +1457,9 @@ sub standardkeyorder {
'parameter_0_ordered' => 15,
'parameter_0_tol' => 16,
'parameter_0_sig' => 17,
- 'parameter_0_turnoffunit' => 18);
+ 'parameter_0_turnoffunit' => 18,
+ 'parameter_0_discussend' => 19,
+ 'parameter_0_discusshide' => 20);
}
##################################################
@@ -1057,11 +1513,13 @@ sub assessparms {
my $udom;
my $uhome;
my $csec;
+ my $cgroup;
+ my @usersgroups = ();
my $coursename=$env{'course.'.$env{'request.course.id'}.'.description'};
$alllevs{'Resource Level'}='full';
- $alllevs{'Map Level'}='map';
+ $alllevs{'Map/Folder Level'}='map';
$alllevs{'Course Level'}='general';
my %allparms;
@@ -1078,6 +1536,7 @@ sub assessparms {
my $message='';
$csec=$env{'form.csec'};
+ $cgroup=$env{'form.cgroup'};
if ($udom=$env{'form.udom'}) {
} elsif ($udom=$env{'request.role.domain'}) {
@@ -1126,8 +1585,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'};
@@ -1138,30 +1597,40 @@ 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'};
} else {
my %name=&Apache::lonnet::userenvironment($udom,$uname,
('firstname','middlename','lastname','generation','id'));
$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'});
+ if (@usersgroups > 0) {
+ unless (grep(/^\Q$cgroup\E$/,@usersgroups)) {
+ $cgroup = $usersgroups[0];
+ }
+ }
}
}
unless ($csec) { $csec=''; }
+ unless ($cgroup) { $cgroup=''; }
# --------------------------------------------------------- Get all assessments
&extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps,
@@ -1180,7 +1649,7 @@ sub assessparms {
$message.=&storeparm(split(/\&/,$markers[$i]),
$values[$i],
$types[$i],
- $uname,$udom,$csec);
+ $uname,$udom,$csec,$cgroup);
}
# ---------------------------------------------------------------- Done storing
$message.='
'.&mt('Changes can take up to 10 minutes before being active for all students.').&Apache::loncommon::help_open_topic('Caching').' ';
@@ -1196,25 +1665,30 @@ sub assessparms {
foreach ('tolerance','date_default','date_start','date_end',
'date_interval','int','float','string') {
$r->print(' ');
+ &HTML::Entities::encode($env{'form.recent_'.$_},'"&<>').
+ '" name="recent_'.$_.'" />');
}
if (!$pssymb) {
$r->print('');
&levelmenu($r,\%alllevs,$parmlev);
+ $r->print(' ');
if ($parmlev ne 'general') {
$r->print('');
&mapmenu($r,\%allmaps,$pschp,\%maptitles);
$r->print(' ');
}
- $r->print('
');
+ $r->print('');
&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).
+ ' '.
+ ''.&mt('Show all parts').': ');
}
- &usermenu($r,$uname,$id,$udom,$csec);
+ &usermenu($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,\@usersgroups);
$r->print(''.$message.'
');
@@ -1236,11 +1710,19 @@ sub assessparms {
if ($parmlev eq 'full') {
my $coursespan=$csec?8:5;
+ my $userspan=3;
+ if ($cgroup ne '') {
+ $coursespan += 3;
+ }
+
$r->print('
');
$r->print(' ');
$r->print(''.&mt('Any User').' ');
if ($uname) {
- $r->print("");
+ if (@usersgroups > 1) {
+ $userspan ++;
+ }
+ $r->print(' ');
$r->print(&mt("User")." $uname ".&mt('at Domain')." $udom ");
}
my %lt=&Apache::lonlocal::texthash(
@@ -1262,14 +1744,18 @@ sub assessparms {
);
$r->print(<$lt{'pie'}
-$lt{'csv'} ($csuname $lt{'at'} $csudom)
+$lt{'csv'} ($csuname $lt{'at'} $csudom)
$lt{'ic'} $lt{'rl'}
$lt{'ic'}
ENDTABLETWO
if ($csec) {
$r->print("".
- &mt("in Section/Group")." $csec ");
+ &mt("in Section")." $csec");
+ }
+ if ($cgroup) {
+ $r->print("".
+ &mt("in Group")." $cgroup ");
}
$r->print(<$lt{'aut'} $lt{'type'}
@@ -1282,7 +1768,14 @@ ENDTABLEHEADFOUR
$r->print(''.&mt('general').' '.&mt('for Enclosing Map or Folder').' '.&mt('for Resource').' ');
}
+ if ($cgroup) {
+ $r->print(''.&mt('general').' '.&mt('for Enclosing Map or Folder').' '.&mt('for Resource').' ');
+ }
+
if ($uname) {
+ if (@usersgroups > 1) {
+ $r->print(''.&mt('Control by other group?').' ');
+ }
$r->print(''.&mt('general').' '.&mt('for Enclosing Map or Folder').' '.&mt('for Resource').' ');
}
@@ -1290,6 +1783,7 @@ ENDTABLEHEADFOUR
my $defbgone='';
my $defbgtwo='';
+ my $defbgthree = '';
foreach (@ids) {
@@ -1311,6 +1805,12 @@ ENDTABLEHEADFOUR
} else {
$defbgtwo='"#FFFF99"';
}
+ if ($defbgthree eq '"#FFBB99"') {
+ $defbgthree='"#FFBBDD"';
+ } else {
+ $defbgthree='"#FFBB99"';
+ }
+
my $thistitle='';
my %name= ();
undef %name;
@@ -1325,7 +1825,16 @@ ENDTABLEHEADFOUR
if (grep $_ eq $tempkeyp, @catmarker) {
$part{$_}=&Apache::lonnet::metadata($uri,$_.'.part');
$name{$_}=&Apache::lonnet::metadata($uri,$_.'.name');
- $display{$_}=&Apache::lonnet::metadata($uri,$_.'.display');
+ my $parmdis=&Apache::lonnet::metadata($uri,$_.'.display');
+ if ($allparms{$name{$_}} ne '') {
+ my $identifier;
+ if ($parmdis =~ /(\s*\[Part.*)$/) {
+ $identifier = $1;
+ }
+ $display{$_} = $allparms{$name{$_}}.$identifier;
+ } else {
+ $display{$_} = $parmdis;
+ }
unless ($display{$_}) { $display{$_}=''; }
$display{$_}.=' ('.$name{$_}.')';
$default{$_}=&Apache::lonnet::metadata($uri,$_);
@@ -1336,16 +1845,17 @@ ENDTABLEHEADFOUR
my $totalparms=scalar keys %name;
if ($totalparms>0) {
my $firstrow=1;
- my $title=&Apache::lonnet::gettitle($uri);
+ my $title=&Apache::lonnet::gettitle($symbp{$rid});
$r->print(''.
join(' / ',split(/\//,$uri)).
' '.
"$title");
+ &Apache::lonnet::clutter($uri).'?symb='.
+ &escape($symbp{$rid}).
+ "', 'metadatafile', '450', '500', 'no', 'yes');\"".
+ " target=\"_self\">$title");
if ($thistitle) {
$r->print(' ('.$thistitle.')');
@@ -1357,23 +1867,18 @@ ENDTABLEHEADFOUR
$r->print('
');
-
- $r->print(' / res / ');
- $r->print(join(' / ', split(/\//,$mapp{$rid})));
-
- $r->print(' ');
+ '>'.$maptitles{$mapp{$rid}}.'');
- foreach (&keysinorder(\%name,\%keyorder)) {
+ foreach (&keysinorder_bytype(\%name,\%keyorder)) {
unless ($firstrow) {
$r->print('');
} else {
undef $firstrow;
}
-
&print_row($r,$_,\%part,\%name,\%symbp,$rid,\%default,
\%type,\%display,$defbgone,$defbgtwo,
- $parmlev,$uname,$udom,$csec);
+ $defbgthree,$parmlev,$uname,$udom,$csec,
+ $cgroup,\@usersgroups);
}
}
}
@@ -1385,6 +1890,7 @@ ENDTABLEHEADFOUR
if ($parmlev eq 'map') {
my $defbgone = '"E0E099"';
my $defbgtwo = '"FFFF99"';
+ my $defbgthree = '"FFBB99"';
my %maplist;
@@ -1435,7 +1941,16 @@ ENDTABLEHEADFOUR
if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
$part{$tempkeyp}="0";
$name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');
- $display{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
+ my $parmdis=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
+ if ($allparms{$name{$tempkeyp}} ne '') {
+ my $identifier;
+ if ($parmdis =~ /(\s*\[Part.*)$/) {
+ $identifier = $1;
+ }
+ $display{$tempkeyp} = $allparms{$name{$tempkeyp}}.$identifier;
+ } else {
+ $display{$tempkeyp} = $parmdis;
+ }
unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
$display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
$display{$tempkeyp} =~ s/_\w+_/_0_/;
@@ -1449,28 +1964,30 @@ ENDTABLEHEADFOUR
#---------------------------------------------------- print header information
my $foldermap=&mt($maptitle=~/^uploaded/?'Folder':'Map');
my $showtitle=$maptitles{$maptitle}.($maptitle!~/^uploaded/?' ['.$maptitle.']':'');
- $r->print(<
-Set Defaults for All Resources in $foldermap
-$showtitle
-Specifically for
-ENDMAPONE
+ my $tmp="";
if ($uname) {
- my %name=&Apache::lonnet::userenvironment($udom,$uname,
- ('firstname','middlename','lastname','generation', 'id'));
- my $person=$name{'firstname'}.' '.$name{'middlename'}.' '
- .$name{'lastname'}.' '.$name{'generation'};
- $r->print(&mt("User")." $uname \($person\) ".
- &mt('in')." \n");
+ my $person=&Apache::loncommon::plainname($uname,$udom);
+ $tmp.=&mt("User")." $uname \($person\) ".
+ &mt('in')." \n";
} else {
- $r->print("".&mt('all').' '.&mt('users in')." \n");
+ $tmp.="".&mt('all').' '.&mt('users in')." \n";
}
-
- if ($csec) {$r->print(&mt("Section")." $csec ".
- &mt('of')." \n")};
-
- $r->print("$coursename ");
- $r->print(" \n");
+ if ($cgroup) {
+ $tmp.=&mt("Group")." $cgroup".
+ " ".&mt('of')." \n";
+ $csec = '';
+ } elsif ($csec) {
+ $tmp.=&mt("Section")." $csec".
+ " ".&mt('of')." \n";
+ }
+ $r->print(''
+ .&mt('Set Defaults for All Resources in [_1]Specifically for [_2][_3]'
+ ,$foldermap.''.$showtitle.' '
+ ,$tmp
+ ,''.$coursename.' '
+ )
+ ." \n"
+ );
#---------------------------------------------------------------- print table
$r->print('
');
$r->print(''.&mt('Parameter Name').' ');
@@ -1480,16 +1997,17 @@ ENDMAPONE
foreach (&keysinorder(\%name,\%keyorder)) {
$r->print('');
&print_row($r,$_,\%part,\%name,\%symbp,$mapid,\%default,
- \%type,\%display,$defbgone,$defbgtwo,
- $parmlev,$uname,$udom,$csec);
+ \%type,\%display,$defbgone,$defbgtwo,$defbgthree,
+ $parmlev,$uname,$udom,$csec,$cgroup);
}
- $r->print("
");
+ $r->print("
");
} # end each map
} # end of $parmlev eq map
#--------------------------------- Entry for parm level general (Course level)
if ($parmlev eq 'general') {
my $defbgone = '"E0E099"';
my $defbgtwo = '"FFFF99"';
+ my $defbgthree = '"FFBB99"';
#-------------------------------------------- for each map, gather information
my $mapid="0.0";
@@ -1520,7 +2038,16 @@ ENDMAPONE
if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
$part{$tempkeyp}="0";
$name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');
- $display{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
+ my $parmdis=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
+ if ($allparms{$name{$tempkeyp}} ne '') {
+ my $identifier;
+ if ($parmdis =~ /(\s*\[Part.*)$/) {
+ $identifier = $1;
+ }
+ $display{$tempkeyp} = $allparms{$name{$tempkeyp}}.$identifier;
+ } else {
+ $display{$tempkeyp} = $parmdis;
+ }
unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
$display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
$display{$tempkeyp} =~ s/_\w+_/_0_/;
@@ -1537,16 +2064,14 @@ ENDMAPONE
$coursename
ENDMAPONE
if ($uname) {
- my %name=&Apache::lonnet::userenvironment($udom,$uname,
- ('firstname','middlename','lastname','generation', 'id'));
- my $person=$name{'firstname'}.' '.$name{'middlename'}.' '
- .$name{'lastname'}.' '.$name{'generation'};
+ my $person=&Apache::loncommon::plainname($uname,$udom);
$r->print(" ".&mt("User")." $uname \($person\) \n");
} else {
$r->print(" ".&mt("ALL")." ".&mt("USERS")." \n");
}
if ($csec) {$r->print(&mt("Section")." $csec \n")};
+ if ($cgroup) {$r->print(&mt("Group")." $cgroup \n")};
$r->print("\n");
#---------------------------------------------------------------- print table
$r->print('
');
@@ -1557,12 +2082,13 @@ ENDMAPONE
foreach (&keysinorder(\%name,\%keyorder)) {
$r->print('');
&print_row($r,$_,\%part,\%name,\%symbp,$mapid,\%default,
- \%type,\%display,$defbgone,$defbgtwo,$parmlev,$uname,$udom,$csec);
+ \%type,\%display,$defbgone,$defbgtwo,$defbgthree,
+ $parmlev,$uname,$udom,$csec,$cgroup);
}
$r->print("
");
} # end of $parmlev eq general
}
- $r->print('