--- loncom/interface/lonparmset.pm 2017/07/13 15:29:56 1.578
+++ loncom/interface/lonparmset.pm 2017/11/12 23:05:42 1.583
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Handler to set parameters for assessments
#
-# $Id: lonparmset.pm,v 1.578 2017/07/13 15:29:56 raeburn Exp $
+# $Id: lonparmset.pm,v 1.583 2017/11/12 23:05:42 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -36,7 +36,8 @@ lonparmset - Handler to set parameters f
=head1 SYNOPSIS
-lonparmset provides an interface to setting course parameters.
+lonparmset provides an interface to setting content parameters in a
+course.
It contains all the code for the "Content and Problem Settings" UI, except
for the helpers parameter.helper and resettimes.helper, and lonhelper.pm,
@@ -137,7 +138,7 @@ javascript function 'pjump'.
=item print_td()
-=item print_usergroups()
+=item check_other_groups()
=item parm_control_group()
@@ -1425,14 +1426,19 @@ ENDHEAD
# @param {string} $cgroup - group name
# @param {array reference} $usersgroups - list of groups the user belongs to, if any
# @param {boolean} $noeditgrp - true if no edit is allowed for group level parameters
-# @param {boolean} $readonly - true if no editing allowed.
+# @param {boolean} $readonly - true if no editing allowed.
+# @param {array reference} - $recurseup - list of maps containing current one, ending at top-level.
+# @param {hash reference} - $maptitles - - hash map id or src -> map title
+# @param {hash reference} - $allmaps_inverted - hash map src -> map pc
+# @param {scalar reference} - $reclinks - number of "parameter in effect" cells with link to map where recursive param was set
sub print_row {
my ($r,$which,$part,$name,$symbp,$rid,$default,$defaulttype,$display,$defbgone,
$defbgtwo,$defbgthree,$parmlev,$uname,$udom,$csec,$cgroup,$usersgroups,$noeditgrp,
- $readonly)=@_;
+ $readonly,$recurseup,$maptitles,$allmaps_inverted,$reclinks)=@_;
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);
+ my $numlinks = 0;
# get the values for the parameter in cascading order
# empty levels will remain empty
@@ -1469,9 +1475,64 @@ sub print_row {
my $thismarker=$which;
$thismarker=~s/^parameter\_//;
my $mprefix=$rid.'&'.$thismarker.'&';
- my $effective_parm = &valout($outpar[$result],$typeoutpar[$result],$thismarker);
- my ($othergrp,$grp_parm,$controlgrp,$effparm_rec);
- if ($result == 17 || $result == 11 || $result == 7 || $result == 3) {
+ my ($parmname)=($thismarker=~/\_([^\_]+)$/);
+ my ($othergrp,$grp_parm,$controlgrp,$effective_parm,$effparm_rec,$effparm_level,
+ $eff_groupparm,$recurse_check,$recursinfo);
+ if ((ref($recurseup) eq 'ARRAY') && (@{$recurseup} > 0)) {
+ if ($result eq '') {
+ $recurse_check = 1;
+ } elsif (($uname ne '') && ($result > 3)) {
+ $recurse_check = 1;
+ } elsif (($cgroup ne '') && ($result > 7)) {
+ $recurse_check = 1;
+ } elsif (($csec ne '') && ($result > 11)) {
+ $recurse_check = 1;
+ } elsif ($result > 17) {
+ $recurse_check = 1;
+ }
+ if ($recurse_check) {
+ my $what = $$part{$which}.'.'.$$name{$which};
+ my $prefix;
+ if (($uname ne '') && ($udom ne '')) {
+ my $useropt = &Apache::lonnet::get_userresdata($uname,$udom);
+ $prefix = $env{'request.course.id'};
+ $recursinfo = &get_recursive($recurseup,$useropt,$what,$prefix);
+ if (ref($recursinfo) eq 'ARRAY') {
+ $effparm_rec = 1;
+ $effparm_level = &mt('user: [_1]',$uname);
+ }
+ }
+ if (($cgroup ne '') && (!$effparm_rec)) {
+ $prefix = $env{'request.course.id'}.'.['.$cgroup.']';
+ $recursinfo = &get_recursive($recurseup,$courseopt,$what,$prefix);
+ if (ref($recursinfo) eq 'ARRAY') {
+ $effparm_rec = 1;
+ $effparm_level = &mt('group: [_1]',$cgroup);
+ }
+ }
+ if (($csec ne '') && (!$effparm_rec)) {
+ $prefix = $env{'request.course.id'}.'.['.$csec.']';
+ $recursinfo = &get_recursive($recurseup,$courseopt,$what,$prefix);
+ if (ref($recursinfo) eq 'ARRAY') {
+ $effparm_rec = 1;
+ $effparm_level = &mt('section: [_1]',$csec);
+ }
+ }
+ if (!$effparm_rec) {
+ $prefix = $env{'request.course.id'};
+ $recursinfo = &get_recursive($recurseup,$courseopt,$what,$prefix);
+ if (ref($recursinfo) eq 'ARRAY') {
+ $effparm_rec = 1;
+ }
+ }
+ }
+ }
+ if ((!$effparm_rec) && ($result == 17 || $result == 11 || $result == 7 || $result == 3)) {
+ $effparm_rec = 1;
+ }
+ if ((!$effparm_rec) &&
+ (($$name{$which} eq 'encrypturl') || ($$name{$which} eq 'hiddenresource')) &&
+ ($result == 16 || $result == 10 || $result == 6 || $result == 2)) {
$effparm_rec = 1;
}
if ($parmlev eq 'general') {
@@ -1497,15 +1558,18 @@ sub print_row {
} else {
if ($uname) {
if (@{$usersgroups} > 1) {
- my ($coursereply,$grp_parm,$controlgrp);
- ($coursereply,$othergrp,$grp_parm,$controlgrp) =
- &print_usergroups($r,$$part{$which}.'.'.$$name{$which},
+ (my $coursereply,$othergrp,$grp_parm,$controlgrp,my $grp_is_rec) =
+ &check_other_groups($$part{$which}.'.'.$$name{$which},
$rid,$cgroup,$defbgone,$usersgroups,$result,$courseopt);
- if ($coursereply && $result > 4) {
+ if (($coursereply) && ($result > 4)) {
if (defined($controlgrp)) {
if ($cgroup ne $controlgrp) {
- $effective_parm = $grp_parm;
- $result = 0;
+ $eff_groupparm = $grp_parm;
+ undef($result);
+ undef($effparm_rec);
+ if ($grp_is_rec) {
+ $effparm_rec = 1;
+ }
}
}
}
@@ -1538,12 +1602,35 @@ sub print_row {
&print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly,1);
&print_td($r,1,$defbgone,$result,\@outpar,$mprefix,$which,\@typeoutpar,$display,'',$readonly);
}
-
} # end of $parmlev if/else
- $r->print('
'.$effective_parm.
- ($effparm_rec?' '.&mt('recursive').
- '':'').' | ');
-
+ if (ref($recursinfo) eq 'ARRAY') {
+ my $rectitle = &mt('recursive');
+ if ((ref($maptitles) eq 'HASH') && (exists($maptitles->{$recursinfo->[2]}))) {
+ if ((ref($allmaps_inverted) eq 'HASH') && (exists($allmaps_inverted->{$recursinfo->[2]}))) {
+ $rectitle = &mt('set in: [_1]','"'.
+ '{$recursinfo->[2]}."',".
+ "'$parmname','$$part{$which}'".');">'.
+ $maptitles->{$recursinfo->[2]}.'"');
+
+ $numlinks ++;
+ }
+ }
+ my ($parmname)=($thismarker=~/\_([^\_]+)$/);
+ $effective_parm = &valout($recursinfo->[0],$recursinfo->[1],$parmname);
+ $r->print(''.$effective_parm.
+ ' '.$rectitle.' '.
+ $effparm_level.' | ');
+ } else {
+ if ($result) {
+ $effective_parm = &valout($outpar[$result],$typeoutpar[$result],$parmname);
+ }
+ if ($eff_groupparm) {
+ $effective_parm = $eff_groupparm;
+ }
+ $r->print(''.$effective_parm.
+ ($effparm_rec?' '.&mt('recursive').
+ '':'').' | ');
+ }
if ($parmlev eq 'full') {
my $sessionval=&Apache::lonnet::EXT('resource.'.$$part{$which}.
'.'.$$name{$which},$$symbp{$rid});
@@ -1557,6 +1644,9 @@ sub print_row {
}
$r->print('');
$r->print("\n");
+ if (($numlinks) && (ref($reclinks))) {
+ $$reclinks = $numlinks;
+ }
}
# Prints a cell for table mode.
@@ -1638,11 +1728,9 @@ sub print_td {
$r->print(''."\n");
}
-# FIXME: Despite the name, this does not print anything, the $r parameter is unused.
# Returns HTML and other info for the cell added when a user is selected
# and that user is in several groups. This is the cell with the title "Control by other group".
#
-# @param {Apache2::RequestRec} $r - the Apache request (unused)
# @param {string} $what - parameter part.'.'.parameter name
# @param {string} $rid - resource id
# @param {string} $cgroup - group name
@@ -1650,9 +1738,9 @@ sub print_td {
# @param {array reference} $usersgroups - list of groups the user belongs to, if any
# @param {integer} $result - level
# @param {hash reference} $courseopt - course parameters hash (result of lonnet::get_courseresdata, dump of course's resourcedata.db)
-# @returns {Array} - array (parameter value for the other group, HTML for the cell, HTML with the value, name of the other group)
-sub print_usergroups {
- my ($r,$what,$rid,$cgroup,$defbg,$usersgroups,$result,$courseopt) = @_;
+# @returns {Array} - array (parameter value for the other group, HTML for the cell, HTML with the value, name of the other group, true if recursive)
+sub check_other_groups {
+ my ($what,$rid,$cgroup,$defbg,$usersgroups,$result,$courseopt) = @_;
my $courseid = $env{'request.course.id'};
my $output;
my $symb = &symbcache($rid);
@@ -1664,16 +1752,22 @@ sub print_usergroups {
&parm_control_group($courseid,$usersgroups,$symbparm,$mapparm,
$recurseparm,$what,$courseopt);
my $bgcolor = $defbg;
- my $grp_parm;
+ my ($grp_parm,$grp_is_rec);
if (($coursereply) && ($cgroup ne $resultgroup)) {
+ my ($parmname) = ($what =~ /\.([^.]+)$/);
if ($result > 3) {
$bgcolor = '#AAFFAA';
- $grp_parm = &valout($coursereply,$resulttype,$what);
}
- $grp_parm = &valout($coursereply,$resulttype,$what);
+ $grp_parm = &valout($coursereply,$resulttype,$parmname);
$output = '';
if ($resultgroup && $resultlevel) {
- $output .= ''.$resultgroup.' ('.$resultlevel.'): '.$grp_parm;
+ if ($resultlevel eq 'recursive') {
+ $resultlevel = 'map/folder';
+ $grp_is_rec = 1;
+ }
+ $output .= ''.$resultgroup.' ('.$resultlevel.'): '.$grp_parm.
+ ($grp_is_rec?''.&mt('recursive').'':'');
+
} else {
$output .= ' ';
}
@@ -1681,11 +1775,11 @@ sub print_usergroups {
} else {
$output .= ' | | ';
}
- return ($coursereply,$output,$grp_parm,$resultgroup);
+ return ($coursereply,$output,$grp_parm,$resultgroup,$grp_is_rec);
}
# Looks for a group with a defined parameter for given user and parameter.
-# Used by print_usergroups.
+# Used by check_other_groups.
#
# @param {string} $courseid - the course id
# @param {array reference} $usersgroups - list of groups the user belongs to, if any
@@ -1835,6 +1929,29 @@ sub extractResourceInformation {
}
}
+sub get_recursive {
+ my ($recurseup,$resdata,$what,$prefix) = @_;
+ if ((ref($resdata) eq 'HASH') && (ref($recurseup) eq 'ARRAY')) {
+ foreach my $item (@{$recurseup}) {
+ my $norecursechk=$prefix.'.'.$item.'___(all).'.$what;
+ if (defined($resdata->{$norecursechk})) {
+ if ($what =~ /\.(encrypturl|hiddenresource)$/) {
+ my $type = $resdata->{$norecursechk.'.type'};
+ return [$resdata->{$norecursechk},$type,$item];
+ } else {
+ last;
+ }
+ }
+ my $recursechk=$prefix.'.'.$item.'___(rec).'.$what;
+ if (defined($resdata->{$recursechk})) {
+ my $type = $resdata->{$recursechk.'.type'};
+ return [$resdata->{$recursechk},$type,$item];
+ }
+ }
+ }
+ return;
+}
+
# Tells if a parameter type is a date.
#
@@ -1846,15 +1963,10 @@ sub isdateparm {
}
# Prints the HTML and Javascript to select parameters, with various shortcuts.
-# FIXME: remove unused parameters
#
-# @param {Apache2::RequestRec} $r - the Apache request (unused)
-# @param {hash reference} $allparms - hash parameter name -> parameter title
-# @param {array reference} $pscat - list of selected parameter names (unused)
-# @param {hash reference} $keyorder - hash parameter key -> appearance rank (unused)
+# @param {Apache2::RequestRec} $r - the Apache request
sub parmmenu {
- my ($r,$allparms,$pscat,$keyorder)=@_;
- my $tempkey;
+ my ($r)=@_;
$r->print(<
// print('
');
- &shortCuts($r,$allparms,$pscat,$keyorder);
+ &shortCuts($r);
$r->print('
');
}
@@ -2112,14 +2224,10 @@ sub parmboxes {
}
# Prints HTML with shortcuts to select groups of parameters in one click, or deselect all.
-# FIXME: remove unused parameters
#
# @param {Apache2::RequestRec} $r - the Apache request
-# @param {hash reference} $allparms - hash parameter name -> parameter title (unused)
-# @param {array reference} $pscat - list of selected parameter names (unused)
-# @param {hash reference} $keyorder - hash parameter key -> appearance rank (unused)
sub shortCuts {
- my ($r,$allparms,$pscat,$keyorder)=@_;
+ my ($r)=@_;
# Parameter Selection
$r->print(
@@ -2312,16 +2420,15 @@ function group_or_section(caller) {
# @param {Apache2::RequestRec} $r - the Apache request
# @param {hash reference} $allparms - hash parameter name -> parameter title
# @param {array reference} $pscat - list of selected parameter names
-# @param {array reference} $psprt - list of selected parameter parts (unused)
# @param {hash reference} $keyorder - hash parameter key -> appearance rank
# @param {string} [$divid] - name used to give an id to the HTML element for the scroll box
sub displaymenu {
- my ($r,$allparms,$pscat,$psprt,$keyorder,$divid)=@_;
+ my ($r,$allparms,$pscat,$keyorder,$divid)=@_;
$r->print(&Apache::lonhtmlcommon::start_pick_box());
$r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parameters to View')));
- &parmmenu($r,$allparms,$pscat,$keyorder); # only $allparms is used by parmmenu
+ &parmmenu($r);
$r->print(&Apache::loncommon::start_scrollbox('480px','440px','200px',$divid));
&parmboxes($r,$allparms,$pscat,$keyorder);
$r->print(&Apache::loncommon::end_scrollbox());
@@ -2720,6 +2827,7 @@ sub assessparms {
my %uris=(); # hash resource/map id -> resource src
my %maptitles=(); # hash map pc or src -> map title
my %allmaps=(); # hash map pc -> map src
+ my %allmaps_inverted=(); # hash map src -> map pc
my %alllevs=(); # hash English level title -> value
my $uname; # selected user name
@@ -2728,6 +2836,7 @@ sub assessparms {
my $csec; # selected section name
my $cgroup; # selected group name
my @usersgroups = (); # list of the user groups
+ my $numreclinks = 0;
my $coursename=$env{'course.'.$env{'request.course.id'}.'.description'};
@@ -2875,6 +2984,8 @@ sub assessparms {
\%mapp, \%symbp,\%maptitles,\%uris,
\%keyorder);
+ %allmaps_inverted = reverse(%allmaps);
+
$mapp{'0.0'} = '';
$symbp{'0.0'} = '';
@@ -3105,7 +3216,7 @@ ENDPARMSELSCRIPT
# Step 2
$r->print(&Apache::lonhtmlcommon::topic_bar(2,&mt('Parameter Specification'),'parmstep2'));
- &displaymenu($r,\%allparms,\@pscat,\@psprt,\%keyorder,'parmmenuscroll');
+ &displaymenu($r,\%allparms,\@pscat,\%keyorder,'parmmenuscroll');
# Step 3
$r->print(&Apache::lonhtmlcommon::topic_bar(3,&mt('User Specification (optional)'),'parmstep3'));
@@ -3264,7 +3375,6 @@ ENDTABLEHEADFOUR
foreach my $rid (@ids) {
my ($inmapid)=($rid=~/\.(\d+)$/);
-
if ((!$pssymb &&
(($pschp eq 'all') || ($allmaps{$pschp} eq $mapp{$rid})))
||
@@ -3327,6 +3437,11 @@ ENDTABLEHEADFOUR
if ($totalparms>0) {
my $firstrow=1;
my $title=&Apache::lonnet::gettitle($symbp{$rid});
+ my $navmap = Apache::lonnavmaps::navmap->new();
+ my @recurseup;
+ if (ref($navmap) && $mapp{$rid}) {
+ @recurseup = $navmap->recurseup_maps($mapp{$rid});
+ }
$r->print(''.
@@ -3358,7 +3473,9 @@ ENDTABLEHEADFOUR
&print_row($r,$item,\%part,\%name,\%symbp,$rid,\%default,
\%type,\%display,$defbgone,$defbgtwo,
$defbgthree,$parmlev,$uname,$udom,$csec,
- $cgroup,\@usersgroups,$noeditgrp,$readonly);
+ $cgroup,\@usersgroups,$noeditgrp,$readonly,
+ \@recurseup,\%maptitles,\%allmaps_inverted,
+ \$numreclinks);
}
}
}
@@ -3404,6 +3521,7 @@ ENDTABLEHEADFOUR
if ($map eq $mapid) {
my $uri=&Apache::lonnet::declutter($uris{$rid});
+
# $r->print("Keys: $keyp{$rid} \n");
#--------------------------------------------------------------------
@@ -3476,12 +3594,23 @@ ENDTABLEHEADFOUR
.&Apache::loncommon::end_data_table_header_row()
);
+ my $navmap = Apache::lonnavmaps::navmap->new();
+ my @recurseup;
+ if (ref($navmap)) {
+ my $mapres = $navmap->getByMapPc($mapid);
+ if (ref($mapres)) {
+ @recurseup = $navmap->recurseup_maps($mapres->src());
+ }
+ }
+
+
foreach my $item (&keysinorder(\%name,\%keyorder)) {
$r->print(&Apache::loncommon::start_data_table_row());
&print_row($r,$item,\%part,\%name,\%symbp,$mapid,\%default,
\%type,\%display,$defbgone,$defbgtwo,$defbgthree,
$parmlev,$uname,$udom,$csec,$cgroup,'',$noeditgrp,
- $readonly);
+ $readonly,\@recurseup,\%maptitles,\%allmaps_inverted,
+ \$numreclinks);
}
$r->print(&Apache::loncommon::end_data_table().''
.''
@@ -3581,6 +3710,25 @@ ENDMAPONE
} # end of $parmlev eq general
}
$r->print('');
+ if ($numreclinks) {
+ $r->print(<<"END");
+
+
+END
+ }
&endSettingsScreen($r);
$r->print(&Apache::loncommon::end_page());
} # end sub assessparms
@@ -5110,7 +5258,7 @@ ENDOVER
$r->print('');
$r->print(' ');
- &displaymenu($r,\%allparms,\@pscat,\%keyorder); # FIXME: wrong parameters, could make keysindisplayorderCategory crash because $keyorder is undefined
+ &displaymenu($r,\%allparms,\@pscat,\%keyorder);
$r->print(&Apache::lonhtmlcommon::start_pick_box());
$r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parts to View')));
my $sectionselector = §ionmenu(\@selected_sections);
@@ -5356,10 +5504,8 @@ ENDOVER
$r->print(&mt('All users'));
} elsif ($data{'scope_type'} eq 'user') {
$r->print(&mt('User: [_1]',join(':',@{$data{'scope'}})));
- } elsif ($data{'scope_type'} eq 'section') {
- $r->print(&mt('Section: [_1]',$data{'scope'}));
- } elsif ($data{'scope_type'} eq 'group') {
- $r->print(&mt('Group: [_1]',$data{'scope'}));
+ } elsif ($data{'scope_type'} eq 'secgroup') {
+ $r->print(&mt('Group/Section: [_1]',$data{'scope'}));
}
$r->print(' ');
if ($data{'realm_type'} eq 'all') {
@@ -5466,8 +5612,7 @@ sub parse_key {
$data{'scope_type'} = 'user';
$data{'scope'} = [$1,$2];
} else {
- #FIXME check for group scope
- $data{'scope_type'} = 'section';
+ $data{'scope_type'} = 'secgroup';
}
$middle=~s/^\[(.*)\]//;
}
@@ -5861,16 +6006,17 @@ sub addmetafield {
$r->print('You may undelete previously deleted fields. Check those you wish to undelete and click Undelete. ');
$r->print('');
}
- $r->print(' Or you may enter a new metadata field name.');
}
- $r->print('');
&endSettingsScreen($r);
}
@@ -6193,17 +6339,13 @@ ENDYESNO
# $issection - section or group name
# $realmdescription - title for the parameter level and resource (without using HTML)
#
-# FIXME: remove unused fields.
-#
# @param {string} $key - parameter log key
# @param {string} $uname - user name
# @param {string} $udom - user domain
-# @param {string} $exeuser - unused
-# @param {string} $exedomain - unused
# @param {boolean} $typeflag - .type log entry
# @returns {Array}
sub components {
- my ($key,$uname,$udom,$exeuser,$exedomain,$typeflag)=@_;
+ my ($key,$uname,$udom,$typeflag)=@_;
if ($typeflag) {
$key=~s/\.type$//;
@@ -6255,7 +6397,7 @@ my %standard_parms_types; # hash paramet
# Reads parameter info from packages.tab into %standard_parms.
sub load_parameter_names {
- open(my $config,"<$Apache::lonnet::perlvar{'lonTabDir'}/packages.tab");
+ open(my $config,"<","$Apache::lonnet::perlvar{'lonTabDir'}/packages.tab");
while (my $configline=<$config>) {
if ($configline !~ /\S/ || $configline=~/^\#/) { next; }
chomp($configline);
@@ -6418,7 +6560,7 @@ sub parm_change_log {
my $typeflag = ($changed =~/\.type$/ &&
!exists($parmlog{$id}{'logentry'}{$changed.'.type'}));
my ($realm,$section,$parmname,$part,$what,$middle,$uname,$udom,$issection,$realmdescription)=
- &components($changed,$parmlog{$id}{'uname'},$parmlog{$id}{'udom'},undef,undef,$typeflag);
+ &components($changed,$parmlog{$id}{'uname'},$parmlog{$id}{'udom'},$typeflag);
if ($env{'request.course.sec'} ne '') {
next if (($issection ne '') && ($issection ne $env{'request.course.sec'}));
if ($uname ne '') {
|