--- loncom/interface/lonparmset.pm 2005/06/06 02:25:09 1.211
+++ loncom/interface/lonparmset.pm 2005/06/17 20:01:50 1.226
@@ -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.226 2005/06/17 20:01:50 www Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -70,6 +70,8 @@ my $parmhashid;
my %parmhash;
my $symbsid;
my %symbs;
+my $rulesid;
+my %rules;
# --- end local caches
@@ -240,6 +242,24 @@ sub symbcache {
return $symbs{$id};
}
+sub resetrulescache {
+ $rulesid='';
+}
+
+sub rulescache {
+ my $id=shift;
+ if ($rulesid ne $env{'request.course.id'}) {
+ %rules=();
+ }
+ unless (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};
+}
+
##################################################
##################################################
#
@@ -271,7 +291,36 @@ sub storeparm {
# - username
# - userdomain
+my %recstack;
sub storeparm_by_symb {
+ my ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$recflag)=@_;
+ unless ($recflag) {
+# first time call
+ %recstack=();
+ $recflag=1;
+ }
+# store parameter
+ &storeparm_by_symb_inner
+ ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec);
+ 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;
+
+ &Apache::lonnet::logthis('About to set '.$newspnam.' using action '.$whichaction.' with '.$parm.' ('.$whichparm.')');
+ }
+ }
+ return '';
+}
+
+sub storeparm_by_symb_inner {
# ---------------------------------------------------------- Get symb, map, etc
my ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec)=@_;
# ---------------------------------------------------------- Construct prefixes
@@ -403,7 +452,7 @@ sub valout {
$result.=$sec.' secs ';
}
$result=~s/\s+$//;
- } elsif ($type=~/^date/) {
+ } elsif (&isdateparm($type)) {
$result = localtime($value);
} else {
$result = $value;
@@ -434,7 +483,7 @@ 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]};
@@ -742,6 +791,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 +825,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');
@@ -815,12 +879,14 @@ ENDSCRIPT
}
$r->print('
-Select All
-Select Standard
+Select All
+Select Common Only
|
-Select Dates
-Select Visibilities
-Select Part Parameters
+Add Problem Dates
+Add Content Dates
+Add Discussion Settings
+Add Visibilities
+Add Part Parameters
|
Unselect All
|
@@ -927,43 +993,25 @@ sub levelmenu {
sub sectionmenu {
my ($r,$selectedsections)=@_;
+ my %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('\n");
}
sub keysplit {
@@ -985,6 +1033,20 @@ 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="on"');
+ }
+ $r->print(' />'.&mt('Sort by student (group/section) first, then realm'));
+}
+
sub standardkeyorder {
return ('parameter_0_opendate' => 1,
'parameter_0_duedate' => 2,
@@ -1003,7 +1065,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);
}
##################################################
@@ -1061,7 +1125,7 @@ sub assessparms {
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;
@@ -1212,7 +1276,7 @@ sub assessparms {
} else {
my ($map,$id,$resource)=&Apache::lonnet::decode_symb($pssymb);
$r->print(&mt('Specific Resource').": ".$resource.
- '');
+ '
');
}
&usermenu($r,$uname,$id,$udom,$csec);
@@ -1779,8 +1843,8 @@ sub crsenv {
'anonymous_quiz'
=> ''.&mt('Anonymous quiz/exam').'
'.
' ('.&mt('yes').' '.&mt('to avoid print students names').' )',
- 'default_enrollment_start_date' => ''.&mt('Default beginning date when enrolling students').'',
- 'default_enrollment_end_date' => ''.&mt('Default ending date when enrolling students').'',
+ 'default_enrollment_start_date' => ''.&mt('Default beginning date for student access.').'',
+ 'default_enrollment_end_date' => ''.&mt('Default ending date for student access.').'',
'nothideprivileged' => ''.&mt('Privileged users that should not be hidden on staff listings').''.
'
(user:domain,user:domain,...)',
'languages' => ''.&mt('Languages used').'',
@@ -1967,9 +2031,12 @@ sub storedata {
}
if ($cmd eq 'set') {
my $data=$env{$_};
- if ($$olddata{$thiskey} ne $data) {
+ my $typeof=$env{'form.typeof_'.$thiskey};
+ if ($$olddata{$thiskey} ne $data) {
if ($tuname) {
- if (&Apache::lonnet::put('resourcedata',{$tkey=>$data},$tudom,$tuname) eq 'ok') {
+ if (&Apache::lonnet::put('resourcedata',{$tkey=>$data,
+ $tkey.'.type' => $typeof},
+ $tudom,$tuname) eq 'ok') {
$r->print('
'.&mt('Stored modified parameter for').' '.
&Apache::loncommon::plainname($tuname,$tudom));
} else {
@@ -1979,7 +2046,8 @@ sub storedata {
&Apache::lonnet::devalidateuserresdata($tuname,$tudom);
} else {
$newdata{$thiskey}=$data;
- }
+ $newdata{$thiskey.'.type'}=$typeof;
+ }
}
} elsif ($cmd eq 'del') {
if ($tuname) {
@@ -1995,9 +2063,12 @@ sub storedata {
}
} elsif ($cmd eq 'datepointer') {
my $data=&Apache::lonhtmlcommon::get_date_from_form($env{$_});
+ my $typeof=$env{'form.typeof_'.$thiskey};
if (defined($data) and $$olddata{$thiskey} ne $data) {
if ($tuname) {
- if (&Apache::lonnet::put('resourcedata',{$tkey=>$data},$tudom,$tuname) eq 'ok') {
+ if (&Apache::lonnet::put('resourcedata',{$tkey=>$data,
+ $tkey.'.type' => $typeof},
+ $tudom,$tuname) eq 'ok') {
$r->print('
'.&mt('Stored modified date for').' '.&Apache::loncommon::plainname($tuname,$tudom));
} else {
$r->print(''.
@@ -2005,7 +2076,8 @@ sub storedata {
}
&Apache::lonnet::devalidateuserresdata($tuname,$tudom);
} else {
- $newdata{$thiskey}=$data;
+ $newdata{$thiskey}=$data;
+ $newdata{$thiskey.'.type'}=$typeof;
}
}
}
@@ -2026,7 +2098,7 @@ sub storedata {
}
if ($putentries) {
if (&Apache::lonnet::put('resourcedata',\%newdata,$dom,$crs) eq 'ok') {
- $r->print(''.&mt('Stored [_1] parameter(s)
',$putentries));
+ $r->print(''.&mt('Stored [_1] parameter(s)',$putentries/2).'
');
} else {
$r->print(''.
&mt('Error storing parameters').'
');
@@ -2041,7 +2113,7 @@ sub extractuser {
}
sub listdata {
- my ($r,$resourcedata,$listdata)=@_;
+ my ($r,$resourcedata,$listdata,$sortorder)=@_;
# Start list output
my $oldsection='';
@@ -2050,7 +2122,15 @@ sub listdata {
my $pointer=0;
$tableopen=0;
my $foundkeys=0;
- foreach my $thiskey (sort keys %{$listdata}) {
+ foreach my $thiskey (sort {
+ if ($sortorder eq 'realmstudent') {
+ my ($astudent,$arealm)=($a=~/^$env{'request.course.id'}\.([^\.]+)\.(.+)\.[^\.]+$/);
+ my ($bstudent,$brealm)=($b=~/^$env{'request.course.id'}\.([^\.]+)\.(.+)\.[^\.]+$/);
+ ($arealm cmp $brealm) || ($astudent cmp $bstudent);
+ } else {
+ $a cmp $b;
+ }
+ } keys %{$listdata}) {
if ($$listdata{$thiskey.'.type'}) {
my $thistype=$$listdata{$thiskey.'.type'};
if ($$resourcedata{$thiskey.'.type'}) {
@@ -2077,19 +2157,32 @@ sub listdata {
my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);
$realm=''.&mt('Resource').': '.&Apache::lonnet::gettitle($middle).'
('.$url.' in '.$map.' id: '.$id.')';
}
- if ($section ne $oldsection) {
- $r->print(&tableend()."\n
$section
");
- $oldsection=$section;
- $oldrealm='';
- }
- if ($realm ne $oldrealm) {
- $r->print(&tableend()."\n$realm
");
- $oldrealm=$realm;
- $oldpart='';
+ if ($sortorder eq 'realmstudent') {
+ if ($realm ne $oldrealm) {
+ $r->print(&tableend()."\n
$realm
");
+ $oldrealm=$realm;
+ $oldsection='';
+ }
+ if ($section ne $oldsection) {
+ $r->print(&tableend()."\n$section
");
+ $oldsection=$section;
+ $oldpart='';
+ }
+ } else {
+ if ($section ne $oldsection) {
+ $r->print(&tableend()."\n
$section
");
+ $oldsection=$section;
+ $oldrealm='';
+ }
+ if ($realm ne $oldrealm) {
+ $r->print(&tableend()."\n$realm
");
+ $oldrealm=$realm;
+ $oldpart='';
+ }
}
if ($part ne $oldpart) {
$r->print(&tableend().
- "\n".&mt('Part').": $part
");
+ "\n".&mt('Part').": $part");
$oldpart=$part;
}
#
@@ -2099,15 +2192,29 @@ sub listdata {
': | ');
$foundkeys++;
- if ($thistype=~/^date/) {
+ if (&isdateparm($thistype)) {
my $jskey='key_'.$pointer;
$pointer++;
$r->print(
&Apache::lonhtmlcommon::date_setter('overviewform',
$jskey,
- $$resourcedata{$thiskey}).
+ $$resourcedata{$thiskey},
+ '',1).
''
);
+ } elsif ($thistype eq 'string_yesno') {
+ $r->print(' ');
+ $r->print('');
} else {
$r->print('');
@@ -2122,8 +2229,7 @@ sub listdata {
sub newoverview {
my $r=shift;
- my $bodytag=&Apache::loncommon::bodytag(
- 'Set Course Assessment Parameters');
+ my $bodytag=&Apache::loncommon::bodytag('Set Parameters');
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');
@@ -2152,7 +2258,7 @@ ENDOVER
my %alllevs=();
$alllevs{'Resource Level'}='full';
- $alllevs{'Map Level'}='map';
+ $alllevs{'Map/Folder Level'}='map';
$alllevs{'Course Level'}='general';
my $csec=$env{'form.csec'};
@@ -2201,8 +2307,14 @@ ENDOVER
&partmenu($r,\%allparts,\@psprt);
$r->print(' | ');
§ionmenu($r,\@selected_sections);
+
$r->print(' |
');
-
+
+ my $sortorder=$env{'form.sortorder'};
+ unless ($sortorder) { $sortorder='realmstudent'; }
+ &sortmenu($r,$sortorder);
+
+ $r->print('');
# Build the list data hash from the specified parms
@@ -2212,35 +2324,40 @@ ENDOVER
foreach my $cat (@pscat) {
foreach my $section (@selected_sections) {
foreach my $part (@psprt) {
- my $newparmkey=$env{'request.course.id'};
+ my $rootparmkey=$env{'request.course.id'};
if (($section ne 'all') && ($section ne 'none') && ($section)) {
- $newparmkey.='.['.$section.']';
+ $rootparmkey.='.['.$section.']';
}
if ($parmlev eq 'general') {
# course-level parameter
+ my $newparmkey=$rootparmkey.'.'.$part.'.'.$cat;
+ $$listdata{$newparmkey}=1;
+ $$listdata{$newparmkey.'.type'}=$defkeytype{$cat};
} elsif ($parmlev eq 'map') {
- foreach my $map (keys %allmaps) {
- if (($pschp ne 'all') && ($pschp ne $map)) { next; }
- $newparmkey.='.'.$allmaps{$map}.'.'.$part.'.'.$cat;
+# map-level parameter
+ foreach my $mapid (keys %allmaps) {
+ if (($pschp ne 'all') && ($pschp ne $mapid)) { next; }
+ my $newparmkey=$rootparmkey.'.'.$allmaps{$mapid}.'___(all).'.$part.'.'.$cat;
$$listdata{$newparmkey}=1;
$$listdata{$newparmkey.'.type'}=$defkeytype{$cat};
}
-# map-level parameter
} else {
# resource-level parameter
-
+ foreach my $rid (@ids) {
+ my ($map,$resid,$url)=&Apache::lonnet::decode_symb($symbp{$rid});
+ if (($pschp ne 'all') && ($allmaps{$pschp} ne $map)) { next; }
+ my $newparmkey=$rootparmkey.'.'.$symbp{$rid}.'.'.$part.'.'.$cat;
+ $$listdata{$newparmkey}=1;
+ $$listdata{$newparmkey.'.type'}=$defkeytype{$cat};
+ }
}
}
}
}
+ if (($env{'form.store'}) || ($env{'form.dis'})) {
-
- $r->print(join("\n
",keys %{$listdata}));
-
- if ($env{'form.dis'}) {
-
- &storedata($r,$crs,$dom);
+ if ($env{'form.store'}) { &storedata($r,$crs,$dom); }
# Read modified data
@@ -2248,16 +2365,16 @@ ENDOVER
# List data
- &listdata($r,$resourcedata,$listdata);
+ &listdata($r,$resourcedata,$listdata,$sortorder);
}
$r->print(&tableend().
- '