--- loncom/interface/lonparmset.pm 2017/07/10 13:37:59 1.575 +++ loncom/interface/lonparmset.pm 2017/07/10 13:55:36 1.576 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to set parameters for assessments # -# $Id: lonparmset.pm,v 1.575 2017/07/10 13:37:59 raeburn Exp $ +# $Id: lonparmset.pm,v 1.576 2017/07/10 13:55:36 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -3537,7 +3537,7 @@ my $tableopen; # boolean, true if HTML t # @param {boolean} $readonly - true if values cannot be edited (otherwise more columns are added) # @returns {string} sub tablestart { - my ($readonly) = @_; + my ($readonly,$is_map) = @_; if ($tableopen) { return ''; } else { @@ -3546,7 +3546,11 @@ sub tablestart { if ($readonly) { $output .= ''.&mt('Current value').''; } else { - $output .= ''.&mt('Delete').''.&mt('Set to ...').''; + $output .= ''.&mt('Delete').''. + ''.&mt('Set to ...').''; + if ($is_map) { + $output .= ''.&mt('Recursive?').''; + } } $output .= ''; return $output; @@ -3625,6 +3629,8 @@ sub storedata { my %newdata=(); undef %newdata; my @deldata=(); + my @delrec=(); + my @delnonrec=(); undef @deldata; my ($got_chostname,$chostname,$cmajor,$cminor); my $now = time; @@ -3632,11 +3638,27 @@ sub storedata { if ($key =~ /^form\.([a-z]+)\_(.+)$/) { my $cmd=$1; my $thiskey=$2; - next if ($cmd eq 'settext' || $cmd eq 'setipallow' || $cmd eq 'setipdeny'); + my ($altkey,$recursive,$tkey,$tkeyrec,$tkeynonrec); + next if ($cmd eq 'rec' || $cmd eq 'settext' || $cmd eq 'setipallow' || $cmd eq 'setipdeny'); + if ((($cmd eq 'set') || ($cmd eq 'datepointer') || ($cmd eq 'dateinterval') || ($cmd eq 'del')) && + ($thiskey =~ /(?:sequence|page)\Q___(all)\E/)) { + unless ($thiskey =~ /(encrypturl|hiddenresource)$/) { + $altkey = $thiskey; + $altkey =~ s/\Q___(all)\E/___(rec)/; + if ($env{'form.rec_'.$thiskey}) { + $recursive = 1; + } + } + } my ($tuname,$tudom)=&extractuser($thiskey); - my $tkey=$thiskey; if ($tuname) { + $tkey=$thiskey; $tkey=~s/\.\[useropt\:$tuname\:$tudom\]\./\./; + if ($altkey) { + $tkeynonrec = $tkey; + $tkeyrec = $altkey; + $tkeyrec=~s/\.\[useropt\:$tuname\:$tudom\]\./\./; + } } if ($cmd eq 'set' || $cmd eq 'datepointer' || $cmd eq 'dateinterval') { my ($data, $typeof, $text, $name, $valchk, $valmatch, $namematch); @@ -3720,7 +3742,7 @@ sub storedata { $typeof=$env{'form.typeof_'.$thiskey}; $text = &mt('Saved modified date for'); } - if ($thiskey =~ m{\.(?:sequence|page)___\(rec\)}) { + if ($recursive) { $namematch = 'maplevelrecurse'; } if (($name ne '') || ($namematch ne '')) { @@ -3767,54 +3789,195 @@ sub storedata { next; } } - if (defined($data) and $$olddata{$thiskey} ne $data) { - if ($tuname) { - 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('
'.$text.' '. - &Apache::loncommon::plainname($tuname,$tudom)); + my ($reconlychg,$haschange,$storekey); + if ($tuname) { + my $ustorekey; + if ($altkey) { + if ($recursive) { + if (exists($$olddata{$thiskey})) { + if ($$olddata{$thiskey} eq $data) { + $reconlychg = 1; + } + &Apache::lonnet::del('resourcedata',[$tkeynonrec,$tkeynonrec.'.type'],$tudom,$tuname); + } + if (exists($$olddata{$altkey})) { + if (defined($data) && $$olddata{$altkey} ne $data) { + $haschange = 1; + } + } elsif ((!$reconlychg) && ($data ne '')) { + $haschange = 1; + } + $ustorekey = $tkeyrec; + } else { + if (exists($$olddata{$altkey})) { + if ($$olddata{$altkey} eq $data) { + $reconlychg = 1; + } + &Apache::lonnet::del('resourcedata',[$tkeyrec,$tkeyrec.'.type'],$tudom,$tuname); + } + if (exists($$olddata{$thiskey})) { + if (defined($data) && $$olddata{$thiskey} ne $data) { + $haschange = 1; + } + } elsif ((!$reconlychg) && ($data ne '')) { + $haschange = 1; + } + $ustorekey = $tkeynonrec; + } + } else { + if (exists($$olddata{$tkey})) { + if (defined($data) && $$olddata{$tkey} ne $data) { + $haschange = 1; + } + $ustorekey = $tkey; + } + } + if ($haschange || $reconlychg) { + unless ($env{'form.del_'.$thiskey}) { + if (&Apache::lonnet::put('resourcedata',{$ustorekey=>$data, + $ustorekey.'.type' => $typeof}, + $tudom,$tuname) eq 'ok') { + &log_parmset({$ustorekey=>$data,$ustorekey.'.type' => $typeof},0,$tuname,$tudom); + $r->print('
'.$text.' '. + &Apache::loncommon::plainname($tuname,$tudom)); + } else { + $r->print('
'. + &mt('Error saving parameters').'
'); + } + &Apache::lonnet::devalidateuserresdata($tuname,$tudom); + } + } + } else { + if ($altkey) { + if ($recursive) { + if (exists($$olddata{$thiskey})) { + if ($$olddata{$thiskey} eq $data) { + $reconlychg = 1; + } + push(@delnonrec,($thiskey,$thiskey.'.type')); + } + if (exists($$olddata{$altkey})) { + if (defined($data) && $$olddata{$altkey} ne $data) { + $haschange = 1; + } + } elsif (($data ne '') && (!$reconlychg)) { + $haschange = 1; + } + $storekey = $altkey; } else { - $r->print('
'. - &mt('Error saving parameters').'
'); + if (exists($$olddata{$altkey})) { + if ($$olddata{$altkey} eq $data) { + $reconlychg = 1; + } + push(@delrec,($altkey,$altkey.'.type')); + } + if (exists($$olddata{$thiskey})) { + if (defined($data) && $$olddata{$thiskey} ne $data) { + $haschange = 1; + } + } elsif (($data ne '') && (!$reconlychg)) { + $haschange = 1; + } + $storekey = $thiskey; } - &Apache::lonnet::devalidateuserresdata($tuname,$tudom); } else { - $newdata{$thiskey}=$data; - $newdata{$thiskey.'.type'}=$typeof; + if (defined($data) && $$olddata{$thiskey} ne $data) { + $haschange = 1; + $storekey = $thiskey; + } + } + } + if ($reconlychg || $haschange) { + unless ($env{'form.del_'.$thiskey}) { + $newdata{$storekey}=$data; + $newdata{$storekey.'.type'}=$typeof; } } } 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)); + my $error; + if ($altkey) { + if (exists($$olddata{$altkey})) { + if (&Apache::lonnet::del('resourcedata',[$tkeyrec,$tkeyrec.'.type'],$tudom,$tuname) eq 'ok') { + &log_parmset({$tkeyrec=>''},1,$tuname,$tudom); + if ($recursive) { + $r->print('
'.&mt('Deleted parameter for').' '.&Apache::loncommon::plainname($tuname,$tudom)); + } + } elsif ($recursive) { + $error = 1; + } + } + if (exists($$olddata{$thiskey})) { + if (&Apache::lonnet::del('resourcedata',[$tkeynonrec,$tkeynonrec.'.type'],$tudom,$tuname) eq 'ok') { + &log_parmset({$tkeynonrec=>''},1,$tuname,$tudom); + unless ($recursive) { + $r->print('
'.&mt('Deleted parameter for').' '.&Apache::loncommon::plainname($tuname,$tudom)); + } + } elsif (!$recursive) { + $error = 1; + } + } } else { + if (exists($$olddata{$thiskey})) { + if (&Apache::lonnet::del('resourcedata',[$tkey,$tkey.'.type'],$tudom,$tuname) eq 'ok') { + &log_parmset({$tkey=>''},1,$tuname,$tudom); + $r->print('
'.&mt('Deleted parameter for').' '.&Apache::loncommon::plainname($tuname,$tudom)); + } else { + $error = 1; + } + } + } + if ($error) { $r->print('
'. &mt('Error deleting parameters').'
'); } &Apache::lonnet::devalidateuserresdata($tuname,$tudom); } else { - push (@deldata,$thiskey,$thiskey.'.type'); + if ($altkey) { + if (exists($$olddata{$altkey})) { + unless (grep(/^\Q$altkey\E$/,@delrec)) { + push(@deldata,($altkey,$altkey.'.type')); + } + } + if (exists($$olddata{$thiskey})) { + unless (grep(/^\Q$thiskey\E$/,@delnonrec)) { + push(@deldata,($thiskey,$thiskey.'.type')); + } + } + } elsif (exists($$olddata{$thiskey})) { + push(@deldata,($thiskey,$thiskey.'.type')); + } } } } } # Store all course level my $delentries=$#deldata+1; + my @alldels; + if (@delrec) { + push(@alldels,@delrec); + } + if (@delnonrec) { + push(@alldels,@delnonrec); + } + if (@deldata) { + push(@alldels,@deldata); + } my @newdatakeys=keys(%newdata); my $putentries=$#newdatakeys+1; - if ($delentries) { - if (&Apache::lonnet::del('resourcedata',\@deldata,$dom,$crs) eq 'ok') { - my %loghash=map { $_ => '' } @deldata; + my ($delresult,$devalidate); + if (@alldels) { + if (&Apache::lonnet::del('resourcedata',\@alldels,$dom,$crs) eq 'ok') { + my %loghash=map { $_ => '' } @alldels; &log_parmset(\%loghash,1); - $r->print('

'.&mt('Deleted [quant,_1,parameter]',$delentries/2).'

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

'.&mt('Deleted [quant,_1,parameter]',$delentries/2).'

'); + } + } elsif ($delentries) { $r->print('
'. &mt('Error deleting parameters').'
'); } - &Apache::lonnet::devalidatecourseresdata($crs,$dom); + $devalidate = 1; } if ($putentries) { if (&Apache::lonnet::put('resourcedata',\%newdata,$dom,$crs) eq 'ok') { @@ -3824,6 +3987,9 @@ sub storedata { $r->print('
'. &mt('Error saving parameters').'
'); } + $devalidate = 1; + } + if ($devalidate) { &Apache::lonnet::devalidatecourseresdata($crs,$dom); } } @@ -3895,7 +4061,7 @@ sub listdata { } } - foreach my $thiskey (sort { + foreach my $key (sort { my ($astudent,$ares,$apart,$aparm) = &parse_listdata_key($a,$listdata); my ($bstudent,$bres,$bpart,$bparm) = &parse_listdata_key($b,$listdata); @@ -3935,8 +4101,8 @@ sub listdata { $result; - } keys(%{$listdata})) { # foreach my $thiskey - + } keys(%{$listdata})) { # foreach my $key + my $thiskey = $key; if ($$listdata{$thiskey.'.type'}) { my $thistype=$$listdata{$thiskey.'.type'}; if ($$resourcedata{$thiskey.'.type'}) { @@ -3945,6 +4111,7 @@ sub listdata { my ($middle,$part,$name)= ($thiskey=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s\-]+)\.(\w+)$/); my $section=&mt('All Students'); + my $showval = $$resourcedata{$thiskey}; if ($middle=~/^\[(.*)\]/) { my $issection=$1; if ($issection=~/^useropt\:($match_username)\:($match_domain)/) { @@ -3977,12 +4144,37 @@ sub listdata { $middle=~s/\.+$//; $middle=~s/^\.+//; my $realm=''.&mt('All Resources').''; - if ($middle=~/^(.+)\_\_\_\((all|rec)\)$/) { - my $mapurl = $1; - my $maplevel = $2; + my ($is_map,$is_recursive,$mapurl,$maplevel); + if ($caller eq 'overview') { + if ($middle=~/^(.+)\_\_\_\((all|rec)\)$/) { + $mapurl = $1; + $maplevel = $2; + $is_map = 1; + } + } elsif ($caller eq 'newoverview') { + if ($middle=~/^(.+)\_\_\_\((all)\)$/) { + $mapurl = $1; + $maplevel = $2; + $is_map = 1; + } + } + if ($is_map) { my $leveltitle = &mt('Folder/Map'); - if ($maplevel eq 'rec') { - $leveltitle = &mt('Recursive'); + unless (($name eq 'hiddenresource') || ($name eq 'encrypturl')) { + if ($caller eq 'newoverview') { + my $altkey = $thiskey; + $altkey =~ s/\Q___(all)\E/___(rec)/; + if ((exists($$resourcedata{$altkey})) & (!exists($$resourcedata{$thiskey}))) { + $is_recursive = 1; + if ($$resourcedata{$altkey.'.type'}) { + $thistype=$$resourcedata{$altkey.'.type'}; + } + $showval = $$resourcedata{$altkey}; + } + } elsif (($caller eq 'overview') && ($maplevel eq 'rec')) { + $thiskey =~ s/\Q___(rec)\E/___(all)/; + $is_recursive = 1; + } } $realm=''.$leveltitle.': '.&Apache::lonnet::gettitle($mapurl).'
('.$mapurl.')
'; } elsif ($middle) { @@ -4024,7 +4216,7 @@ sub listdata { # Ready to print # my $parmitem = &standard_parameter_names($name); - $r->print(&tablestart($readonly). + $r->print(&tablestart($readonly,$is_map). &Apache::loncommon::start_data_table_row(). ''.&mt($parmitem). ''); @@ -4044,30 +4236,48 @@ sub listdata { $r->print( &Apache::lonhtmlcommon::date_setter('parmform', $jskey, - $$resourcedata{$thiskey}, + $showval, '',1,$state)); unless ($readonly) { $r->print( ''. - (($$resourcedata{$thiskey}!=0)?''. + (($showval!=0)?''. &mt('Shift all dates based on this date').'':''). - &date_sanity_info($$resourcedata{$thiskey}) + &date_sanity_info($showval) ); } } elsif ($thistype eq 'date_interval') { $r->print(&date_interval_selector($thiskey,$name, - $$resourcedata{$thiskey},$readonly)); + $showval,$readonly)); } elsif ($thistype =~ m/^string/) { $r->print(&string_selector($thistype,$thiskey, - $$resourcedata{$thiskey},$name,$readonly)); + $showval,$name,$readonly)); } else { - $r->print(&default_selector($thiskey,$$resourcedata{$thiskey},$readonly)); + $r->print(&default_selector($thiskey,$showval,$readonly)); } unless ($readonly) { $r->print(''); } - $r->print(''.&Apache::loncommon::end_data_table_row()); + $r->print(''); + if ($is_map) { + if (($name eq 'encrypturl') || ($name eq 'hiddenresource')) { + $r->print('
'.&mt('Yes').'
'); + } else { + my ($disabled,$recon,$recoff); + if ($readonly) { + $disabled = ' disabled="disabled"'; + } + if ($is_recursive) { + $recon = ' checked="checked"'; + } else { + $recoff = ' checked="checked"'; + } + $r->print('
'. + '
'); + } + } + $r->print(&Apache::loncommon::end_data_table_row()); } } return $foundkeys; @@ -4941,9 +5151,6 @@ sub secgroup_lister { my $newparmkey=$rootparmkey.'.'.$$allmaps{$mapid}.'___(all).'.$part.'.'.$cat; $$listdata{$newparmkey}=1; $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat}; - $newparmkey=$rootparmkey.'.'.$$allmaps{$mapid}.'___(rec).'.$part.'.'.$cat; - $$listdata{$newparmkey}=1; - $$listdata{$newparmkey.'.type'}=$$defkeytype{$cat}; } } else { # resource-level parameter