--- loncom/interface/lonparmset.pm 2009/06/18 19:43:14 1.462
+++ loncom/interface/lonparmset.pm 2024/07/06 16:19:42 1.522.2.32
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Handler to set parameters for assessments
#
-# $Id: lonparmset.pm,v 1.462 2009/06/18 19:43:14 neumanie Exp $
+# $Id: lonparmset.pm,v 1.522.2.32 2024/07/06 16:19: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.
=head1 DESCRIPTION
@@ -46,8 +47,6 @@ This module sets coursewide and assessme
=over
-=pod
-
=item parmval()
Figure out a cascading parameter.
@@ -131,39 +130,55 @@ javascript function 'pjump'.
=item print_td()
-=item print_usergroups()
+=item check_other_groups()
=item parm_control_group()
=item extractResourceInformation() :
-Given the course data hash, extractResourceInformation extracts lots of information about the course's resources into a variety of hashes.
+ extractResourceInformation extracts lots of information about all of the the course's resources into a variety of hashes.
+
+Input: See list below
-Input: See list below:
+=over 4
-=item * B : An array that will contain all of the ids in the course.
+=item * B : Current username
-=item * B : hash, id->type, where "type" contains the extension of the file, thus, I.
+=item * B : Domain of current user.
+
+=item * B : Course
+
+=back
-=item * B : hash, id->key list, will contain a comma separated list of the meta-data keys available for the given id
+Outputs: See list below
-=item * B : hash, name of parameter->display value (what is the display value?)
+=over 4
-=item * B : hash, part identification->text representation of part, where the text representation is "[Part $part]"
+=item * B (out) : An array that will contain all of the ids in the course.
-=item * B : hash, full key to part->display value (what's display value?)
+=item * B(out) : hash, id->type, where "type" contains the extension of the file, thus, I.
-=item * B : hash, ???
+=item * B (out) : hash, id->key list, will contain a comma separated list of the meta-data keys available for the given id
-=item * B : ???
+=item * B (out) : hash, name of parameter->display value (what is the display value?)
-=item * B : hash, ???
+=item * B (out) : hash, part identification->text representation of part, where the text representation is "[Part $part]"
+
+=item * B (out) : hash, ???
=item * B : ??
=item * B : hash, id->full sym?
+=item * B
+
+=item * B
+
+=item * B
+=item * B
+
+=back
=item isdateparm()
@@ -196,12 +211,14 @@ Input: See list below:
Show assessment data and parameters. This is a large routine that should
be simplified and shortened... someday.
-Inputs: $r
-
+Inputs: $r - the Apache request object.
+
Returns: nothing
Variables used (guessed by Jeremy):
+=over
+
=item * B: ParameterS CATegories? ends up a list of the types of parameters that exist, e.g., tol, weight, acc, opendate, duedate, answerdate, sig, maxtries, type.
=item * B: ParameterS PaRTs? a list of the parts of a problem that we are displaying? Used to display only selected parts?
@@ -214,6 +231,8 @@ Variables used (guessed by Jeremy):
When storing information, store as part 0
When requesting information, request from full part
+=back
+
=item tablestart()
=item tableend()
@@ -248,37 +267,6 @@ Variables used (guessed by Jeremy):
=item parse_key()
-=item check_cloners() :
-
-Checks if new users included in list of allowed cloners
-are valid users. Replaces supplied list with
-cleaned list containing only users with valid usernames
-and domains.
-
-Inputs: $clonelist, $oldcloner
-where $clonelist is ref to array of requested cloners,
-and $oldcloner is ref to array of currently allowed
-cloners.
-
-Returns: string - comma separated list of requested
-cloners (username:domain) who do not exist in system.
-
-=item change_clone() :
-
-Modifies the list of courses a user can clone (stored
-in the user's environment.db file), called when a
-change is made to the list of users allowed to clone
-a course.
-
-Inputs: $action,$cloner
-where $action is add or drop, and $cloner is identity of
-user for whom cloning ability is to be changed in course.
-
-
-=item check_cloners()
-
-=item change_clone()
-
=item header()
Output html header for page
@@ -311,7 +299,6 @@ Set portfolio metadata
Main handler. Calls &assessparms subroutine.
-
=back
=cut
@@ -333,6 +320,8 @@ use Apache::lonlocal;
use Apache::lonnavmaps;
use Apache::longroup;
use Apache::lonrss;
+use HTML::Entities;
+use Text::Wrap();
use LONCAPA qw(:DEFAULT :match);
@@ -347,7 +336,7 @@ sub parmval_by_symb {
my $useropt;
if ($uname ne '' && $udom ne '') {
- $useropt = &Apache::lonnet::get_userresdata($uname,$udom);
+ $useropt = &Apache::lonnet::get_userresdata($uname,$udom);
}
my $result='';
@@ -375,13 +364,13 @@ sub parmval_by_symb {
# --------------------------------------------------------- first, check course
if (defined($$courseopt{$courselevel})) {
- $outpar[14]=$$courseopt{$courselevel};
- $result=14;
+ $outpar[14]=$$courseopt{$courselevel};
+ $result=14;
}
if (defined($$courseopt{$courselevelm})) {
- $outpar[13]=$$courseopt{$courselevelm};
- $result=13;
+ $outpar[13]=$$courseopt{$courselevelm};
+ $result=13;
}
# ------------------------------------------------------- second, check default
@@ -394,25 +383,25 @@ sub parmval_by_symb {
if (defined($thisparm)) { $outpar[11]=$thisparm; $result=11; }
if (defined($$courseopt{$courselevelr})) {
- $outpar[10]=$$courseopt{$courselevelr};
- $result=10;
+ $outpar[10]=$$courseopt{$courselevelr};
+ $result=10;
}
# ------------------------------------------------------ fourth, back to course
if ($csec ne '') {
if (defined($$courseopt{$seclevel})) {
- $outpar[9]=$$courseopt{$seclevel};
- $result=9;
- }
+ $outpar[9]=$$courseopt{$seclevel};
+ $result=9;
+ }
if (defined($$courseopt{$seclevelm})) {
- $outpar[8]=$$courseopt{$seclevelm};
- $result=8;
- }
+ $outpar[8]=$$courseopt{$seclevelm};
+ $result=8;
+ }
if (defined($$courseopt{$seclevelr})) {
- $outpar[7]=$$courseopt{$seclevelr};
- $result=7;
- }
+ $outpar[7]=$$courseopt{$seclevelr};
+ $result=7;
+ }
}
# ------------------------------------------------------ fifth, check course group
if ($cgroup ne '') {
@@ -433,20 +422,20 @@ sub parmval_by_symb {
# ---------------------------------------------------------- fifth, check user
if ($uname ne '') {
- if (defined($$useropt{$courselevel})) {
- $outpar[3]=$$useropt{$courselevel};
- $result=3;
- }
-
- if (defined($$useropt{$courselevelm})) {
- $outpar[2]=$$useropt{$courselevelm};
- $result=2;
- }
-
- if (defined($$useropt{$courselevelr})) {
- $outpar[1]=$$useropt{$courselevelr};
- $result=1;
- }
+ if (defined($$useropt{$courselevel})) {
+ $outpar[3]=$$useropt{$courselevel};
+ $result=3;
+ }
+
+ if (defined($$useropt{$courselevelm})) {
+ $outpar[2]=$$useropt{$courselevelm};
+ $result=2;
+ }
+
+ if (defined($$useropt{$courselevelr})) {
+ $outpar[1]=$$useropt{$courselevelr};
+ $result=1;
+ }
}
return ($result,@outpar);
}
@@ -466,25 +455,25 @@ sub reset_caches {
my $parmhashid;
my %parmhash;
sub resetparmhash {
- undef($parmhashid);
- undef(%parmhash);
+ undef($parmhashid);
+ undef(%parmhash);
}
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'};
- }
+ 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 parmhash {
- my ($id) = @_;
- &cacheparmhash();
- return $parmhash{$id};
+ my ($id) = @_;
+ &cacheparmhash();
+ return $parmhash{$id};
}
}
@@ -492,27 +481,27 @@ sub reset_caches {
my $symbsid;
my %symbs;
sub resetsymbcache {
- undef($symbsid);
- undef(%symbs);
+ 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 $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};
}
}
@@ -520,20 +509,20 @@ sub reset_caches {
my $rulesid;
my %rules;
sub resetrulescache {
- undef($rulesid);
- undef(%rules);
+ 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};
+ 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};
}
}
@@ -543,13 +532,13 @@ 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'));
+ return (&rulescache($type.'_hours'),
+ &rulescache($type.'_min'),
+ &rulescache($type.'_sec'),
+ &rulescache($type.'_value'));
} else {
# nothing there or something else
- return ('','','','','');
+ return ('','','','','');
}
}
@@ -614,12 +603,12 @@ sub storeparm_by_symb {
my ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$recflag,$cgroup)=@_;
unless ($recflag) {
# first time call
- %recstack=();
- $recflag=1;
+ %recstack=();
+ $recflag=1;
}
# store parameter
&storeparm_by_symb_inner
- ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$cgroup);
+ ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$cgroup);
# don't do anything if parameter was reset
unless ($nval) { return; }
my ($prefix,$parm)=($spnam=~/^(.*[\_\.])([^\_\.]+)$/);
@@ -629,40 +618,40 @@ sub storeparm_by_symb {
foreach my $triggered (split(/\:/,&rulescache($parm.'_triggers'))) {
# don't backfire
unless ((!$triggered) || ($recstack{$triggered})) {
- my $action=&rulescache($triggered.'_action');
- my ($whichaction,$whichparm)=($action=~/^(.*\_)([^\_]+)$/);
+ 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/) {
+ 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);
- }
+ 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',@_);
+ return &Apache::lonnet::write_log('course','parameterlog',@_);
}
sub storeparm_by_symb_inner {
@@ -703,62 +692,62 @@ sub storeparm_by_symb_inner {
my $delete;
if ($nval eq '') { $delete=1;}
my %storecontent = ($storeunder => $nval,
- $storeunder.'.type' => $ntype);
+ $storeunder.'.type' => $ntype);
my $reply='';
if ($snum>3) {
# ---------------------------------------------------------------- Store Course
#
- my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
- my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+ my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
# Expire sheets
- &Apache::lonnet::expirespread('','','studentcalc');
- if (($snum==10) || ($snum==7) || ($snum==4)) {
- &Apache::lonnet::expirespread('','','assesscalc',$symb);
- } elsif (($snum==11) || ($snum==8) || ($snum==5)) {
- &Apache::lonnet::expirespread('','','assesscalc',$map);
- } else {
- &Apache::lonnet::expirespread('','','assesscalc');
- }
+ &Apache::lonnet::expirespread('','','studentcalc');
+ if (($snum==10) || ($snum==7) || ($snum==4)) {
+ &Apache::lonnet::expirespread('','','assesscalc',$symb);
+ } elsif (($snum==11) || ($snum==8) || ($snum==5)) {
+ &Apache::lonnet::expirespread('','','assesscalc',$map);
+ } else {
+ &Apache::lonnet::expirespread('','','assesscalc');
+ }
# Store parameter
- if ($delete) {
- $reply=&Apache::lonnet::del
- ('resourcedata',[keys(%storecontent)],$cdom,$cnum);
+ 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 {
+ $reply=&Apache::lonnet::cput
+ ('resourcedata',\%storecontent,$cdom,$cnum);
+ &log_parmset(\%storecontent);
+ }
+ &Apache::lonnet::devalidatecourseresdata($cnum,$cdom);
} else {
# ------------------------------------------------------------------ Store User
#
# Expire sheets
- &Apache::lonnet::expirespread($uname,$udom,'studentcalc');
- if ($snum==1) {
- &Apache::lonnet::expirespread
- ($uname,$udom,'assesscalc',$symb);
- } elsif ($snum==2) {
- &Apache::lonnet::expirespread
- ($uname,$udom,'assesscalc',$map);
- } else {
- &Apache::lonnet::expirespread($uname,$udom,'assesscalc');
- }
+ &Apache::lonnet::expirespread($uname,$udom,'studentcalc');
+ if ($snum==1) {
+ &Apache::lonnet::expirespread
+ ($uname,$udom,'assesscalc',$symb);
+ } elsif ($snum==2) {
+ &Apache::lonnet::expirespread
+ ($uname,$udom,'assesscalc',$map);
+ } else {
+ &Apache::lonnet::expirespread($uname,$udom,'assesscalc');
+ }
# Store parameter
- 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 ($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 '';
}
@@ -769,11 +758,14 @@ sub valout {
my $result = '';
# Values of zero are valid.
if (! $value && $value ne '0') {
- if ($editable) {
- $result = '* ';
- } else {
- $result=' ';
- }
+ if ($editable) {
+ $result =
+ ' ';
+ } else {
+ $result=' ';
+ }
} else {
if ($type eq 'date_interval') {
my ($sec,$min,$hour,$mday,$mon,$year)=gmtime($value);
@@ -811,10 +803,11 @@ sub valout {
$result.=join(", ",@timer);
} elsif (&isdateparm($type)) {
$result = &Apache::lonlocal::locallocaltime($value).
- &date_sanity_info($value);
+ &date_sanity_info($value);
} else {
$result = $value;
- $result = &HTML::Entities::encode($result,'"<>&');
+ $result=~s/\,/\, /gs;
+ $result = &HTML::Entities::encode($result,'"<>&');
}
}
return $result;
@@ -825,7 +818,7 @@ sub plink {
my ($type,$dis,$value,$marker,$return,$call)=@_;
my $winvalue=$value;
unless ($winvalue) {
- if (&isdateparm($type)) {
+ if (&isdateparm($type)) {
$winvalue=$env{'form.recent_'.$type};
} else {
$winvalue=$env{'form.recent_'.(split(/\_/,$type))[0]};
@@ -837,14 +830,14 @@ sub plink {
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;
+ \$hour, \$min, \$sec) {
+ $$item = &HTML::Entities::encode($$item,'"<>&');
+ $$item =~ s/\'/\\\'/g;
}
return '';
+ ''.
+ $valout.' ';
}
sub page_js {
@@ -855,16 +848,10 @@ sub page_js {
return(<
// "pclose()",
- 'onload' => "group_or_section('cgroup')",);
+ my %loaditems = (
+ 'onload' => "group_or_section('cgroup')",
+ );
+ if (!$psymb) {
+ $loaditems{'onload'} = "showHide_courseContent(); group_or_section('cgroup'); resize_scrollbox('mapmenuscroll','1','1');";
+ }
if ((($env{'form.command'} eq 'set') && ($env{'form.url'})
- && (!$env{'form.dis'})) || ($env{'form.symb'})) {
- &Apache::lonhtmlcommon::add_breadcrumb({help=>'Problem_Parameters',
- text=>"Problem Parameters"});
- } else {
- &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable',
- text=>"Table Mode",
- help => 'Course_Setting_Parameters'});
+ && (!$env{'form.dis'})) || ($env{'form.symb'})) {
+ &Apache::lonhtmlcommon::add_breadcrumb({help=>'Problem_Parameters',
+ text=>"Problem Parameters"});
+ } else {
+ &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable',
+ text=>"Table Mode",
+ help => 'Course_Setting_Parameters'});
}
+ my $js = &page_js().'
+
+';
my $start_page =
- &Apache::loncommon::start_page('Set/Modify Course Parameters',
- &page_js(),
- {'add_entries' => \%loaditems,});
+ &Apache::loncommon::start_page('Set/Modify Course Parameters',$js,
+ {'add_entries' => \%loaditems,});
my $breadcrumbs =
- &Apache::lonhtmlcommon::breadcrumbs('Table Mode Parameter Setting','Table_Mode');
+ &Apache::lonhtmlcommon::breadcrumbs('Table Mode Parameter Setting','Table_Mode');
+ my $escfilter=&Apache::lonhtmlcommon::entity_encode($env{'form.filter'});
+ my $escpart=&Apache::lonhtmlcommon::entity_encode($env{'form.part'});
+ $r->print($start_page.$breadcrumbs);
$r->print(<
+
+
ENDHEAD
}
sub print_row {
my ($r,$which,$part,$name,$symbp,$rid,$default,$defaulttype,$display,$defbgone,
- $defbgtwo,$defbgthree,$parmlev,$uname,$udom,$csec,$cgroup,$usersgroups)=@_;
+ $defbgtwo,$defbgthree,$parmlev,$uname,$udom,$csec,$cgroup,$usersgroups,$noeditgrp,
+ $readonly)=@_;
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,$cgroup,$courseopt);
+ $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,$cgroup,$courseopt);
+ $$defaulttype{$which},$uname,$udom,$csec,$cgroup,$courseopt);
# cascade down manually
my $cascadetype=$$defaulttype{$which};
for (my $i=14;$i>0;$i--) {
- if ($typeoutpar[$i]) {
+ if ($typeoutpar[$i]) {
$cascadetype=$typeoutpar[$i];
- } else {
+ } else {
$typeoutpar[$i]=$cascadetype;
}
}
@@ -960,13 +983,13 @@ sub print_row {
if ($parmlev eq 'full') {
$r->print(''
- .$$part{$which}.' ');
+ .($$part{$which} eq '0'?'0 ('.&mt('default').')':$$part{$which}).'');
} else {
$parm=~s|\[.*\]\s||g;
}
my $automatic=&rulescache(($which=~/\_([^\_]+)$/)[0].'_triggers');
if ($automatic) {
- $parm.=' '.&mt('Automatically sets').' '.join(', ',split(/\:/,$automatic)).' ';
+ $parm.=' '.&mt('Automatically sets').' '.join(', ',split(/\:/,$automatic)).' ';
}
$r->print(''.$parm.' ');
@@ -979,31 +1002,31 @@ sub print_row {
if ($parmlev eq 'general') {
if ($uname) {
- &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
+ &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
} elsif ($cgroup) {
- &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
+ &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,$noeditgrp,$readonly);
} elsif ($csec) {
- &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
+ &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
} else {
- &print_td($r,14,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
+ &print_td($r,14,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
}
} elsif ($parmlev eq 'map') {
if ($uname) {
- &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
+ &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
} elsif ($cgroup) {
- &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
+ &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,$noeditgrp,$readonly);
} elsif ($csec) {
- &print_td($r,8,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
+ &print_td($r,8,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
} else {
- &print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
+ &print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
}
} else {
if ($uname) {
if (@{$usersgroups} > 1) {
my ($coursereply,$grp_parm,$controlgrp);
($coursereply,$othergrp,$grp_parm,$controlgrp) =
- &print_usergroups($r,$$part{$which}.'.'.$$name{$which},
+ &check_other_groups($$part{$which}.'.'.$$name{$which},
$rid,$cgroup,$defbgone,$usersgroups,$result,$courseopt);
if ($coursereply && $result > 3) {
if (defined($controlgrp)) {
@@ -1016,33 +1039,33 @@ sub print_row {
}
}
- &print_td($r,14,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
+ &print_td($r,14,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
- &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);
-
- if ($csec) {
- &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);
- }
+ &print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
+ &print_td($r,12,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
+ &print_td($r,11,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
+ &print_td($r,10,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
+
+ if ($csec) {
+ &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
+ &print_td($r,8,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
+ &print_td($r,7,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
+ }
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);
+ &print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,$noeditgrp,$readonly);
+ &print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,$noeditgrp,$readonly);
+ &print_td($r,4,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,$noeditgrp,$readonly);
}
- if ($uname) {
+ 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);
- }
+ &print_td($r,3,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
+ &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
+ &print_td($r,1,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display,'',$readonly);
+ }
} # end of $parmlev if/else
$r->print(''.$effective_parm.' ');
@@ -1061,15 +1084,27 @@ sub print_row {
}
sub print_td {
- my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display)=@_;
+ my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display,$noeditgrp,$readonly)=@_;
$r->print('');
my $nolink = 0;
- if ($which == 11 || $which == 12) {
+ if ($readonly) {
$nolink = 1;
- } elsif ($mprefix =~ /availablestudent\&$/) {
- if ($which > 3) {
+ } else {
+ if ($which == 11 || $which == 12) {
+ $nolink = 1;
+ } elsif (($env{'request.course.sec'} ne '') && ($which > 9)) {
+ $nolink = 1;
+ } elsif ($which == 4 || $which == 5 || $which == 6) {
+ if ($noeditgrp) {
+ $nolink = 1;
+ }
+ } elsif ($mprefix =~ /availablestudent\&$/) {
$nolink = 1;
+ } elsif ($mprefix =~ /examcode\&$/) {
+ unless ($which == 2) {
+ $nolink = 1;
+ }
}
}
if ($nolink) {
@@ -1082,8 +1117,8 @@ sub print_td {
$r->print(' '."\n");
}
-sub print_usergroups {
- my ($r,$what,$rid,$cgroup,$defbg,$usersgroups,$result,$courseopt) = @_;
+sub check_other_groups {
+ my ($what,$rid,$cgroup,$defbg,$usersgroups,$result,$courseopt) = @_;
my $courseid = $env{'request.course.id'};
my $output;
my $symb = &symbcache($rid);
@@ -1098,7 +1133,6 @@ sub print_usergroups {
if (($coursereply) && ($cgroup ne $resultgroup)) {
if ($result > 3) {
$bgcolor = '#AAFFAA';
- $grp_parm = &valout($coursereply,$resulttype);
}
$grp_parm = &valout($coursereply,$resulttype);
$output = '';
@@ -1159,81 +1193,81 @@ sub extractResourceInformation {
my $navmap = Apache::lonnavmaps::navmap->new();
my @allres=$navmap->retrieveResources(undef,undef,1,undef,1);
foreach my $resource (@allres) {
- my $id=$resource->id();
+ my $id=$resource->id();
my ($mapid,$resid)=split(/\./,$id);
- if ($mapid eq '0') { next; }
- $$ids[$#$ids+1]=$id;
- my $srcf=$resource->src();
- $srcf=~/\.(\w+)$/;
- $$typep{$id}=$1;
- $$keyp{$id}='';
+ if ($mapid eq '0') { next; }
+ $$ids[$#$ids+1]=$id;
+ my $srcf=$resource->src();
+ $srcf=~/\.(\w+)$/;
+ $$typep{$id}=$1;
+ $$keyp{$id}='';
$$uris{$id}=$srcf;
- foreach my $key (split(/\,/,&Apache::lonnet::metadata($srcf,'allpossiblekeys'))) {
- next if ($key!~/^parameter_/);
+
+ foreach my $key (split(/\,/,&Apache::lonnet::metadata($srcf,'allpossiblekeys'))) {
+ next if ($key!~/^parameter_/);
# Hidden parameters
- next if (&Apache::lonnet::metadata($srcf,$key.'.hidden') eq 'parm');
+ next if (&Apache::lonnet::metadata($srcf,$key.'.hidden') eq 'parm');
#
# allparms is a hash of parameter names
#
- 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 = $display;
- }
- $$allparms{$name}=$parmdis;
- if (ref($defkeytype)) {
- $$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
#
- my $part= &Apache::lonnet::metadata($srcf,$key.'.part');
- $$allparts{$part} = &mt('Part: [_1]',$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++;
- }
- }
-
-
- 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 {
- $$mapp{$id} = $$mapp{$mapid};
- }
- $$symbp{$id}=&Apache::lonnet::encode_symb($$mapp{$id},$resid,$srcf);
+ unless ($$keyorder{$key}) {
+ $$keyorder{$key}=$keyordercnt;
+ $keyordercnt++;
+ }
+ }
+
+
+ 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 Content');
+ } else {
+ $$maptitles{$mapid}=&Apache::lonnet::gettitle($$mapp{$id});
+ }
+ $$maptitles{$$mapp{$id}}=$$maptitles{$mapid};
+ $$symbp{$mapid}=$$mapp{$id}.'___(all)';
+ } else {
+ $$mapp{$id} = $$mapp{$mapid};
+ }
+ $$symbp{$id}=&Apache::lonnet::encode_symb($$mapp{$id},$resid,$srcf);
}
}
@@ -1244,9 +1278,13 @@ sub isdateparm {
return (($type=~/^date/) && (!($type eq 'date_interval')));
}
+#
+# parmmenu displays a list of the selected parameters.
+# It also offers a link to show/hide the complete parameter list
+# from which you can select all desired parameters.
+#
sub parmmenu {
- my ($r,$allparms,$pscat,$keyorder)=@_;
- my $tempkey;
+ my ($r)=@_;
$r->print(<
//
ENDSCRIPT
- $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parameters to View')));
- #part to print selected parms overview
- $r->print(&mt('Selected Parameters:').' ');
+ $r->print(' ');
+ &shortCuts($r);
+ $r->print(' ');
+}
+# return a hash
+sub categories {
+ return ('time_settings' => 'Time Settings',
+ 'grading' => 'Grading',
+ 'tries' => 'Tries',
+ 'problem_appearance' => 'Problem Appearance',
+ 'behaviour_of_input_fields' => 'Behaviour of Input Fields',
+ 'hiding' => 'Hiding',
+ 'high_level_randomization' => 'High Level Randomization',
+ 'slots' => 'Slots',
+ 'file_submission' => 'File Submission',
+ 'misc' => 'Miscellaneous' );
+}
+
+# return a hash. Like a look-up table
+sub lookUpTableParameter {
+
+ return (
+ 'opendate' => 'time_settings',
+ 'duedate' => 'time_settings',
+ 'answerdate' => 'time_settings',
+ 'interval' => 'time_settings',
+ 'contentopen' => 'time_settings',
+ 'contentclose' => 'time_settings',
+ 'discussend' => 'time_settings',
+ 'printstartdate' => 'time_settings',
+ 'printenddate' => 'time_settings',
+ 'weight' => 'grading',
+ 'handgrade' => 'grading',
+ 'maxtries' => 'tries',
+ 'hinttries' => 'tries',
+ 'randomizeontries' => 'tries',
+ 'type' => 'problem_appearance',
+ 'problemstatus' => 'problem_appearance',
+ 'display' => 'problem_appearance',
+ 'ordered' => 'problem_appearance',
+ 'numbubbles' => 'problem_appearance',
+ 'tol' => 'behaviour_of_input_fields',
+ 'sig' => 'behaviour_of_input_fields',
+ 'turnoffunit' => 'behaviour_of_input_fields',
+ 'hiddenresource' => 'hiding',
+ 'hiddenparts' => 'hiding',
+ 'discusshide' => 'hiding',
+ 'buttonshide' => 'hiding',
+ 'turnoffeditor' => 'hiding',
+ 'encrypturl' => 'hiding',
+ 'randomorder' => 'high_level_randomization',
+ 'randompick' => 'high_level_randomization',
+ 'available' => 'slots',
+ 'useslots' => 'slots',
+ 'availablestudent' => 'slots',
+ 'uploadedfiletypes' => 'file_submission',
+ 'maxfilesize' => 'file_submission',
+ 'cssfile' => 'misc',
+ 'mapalias' => 'misc',
+ 'acc' => 'misc',
+ 'maxcollaborators' => 'misc',
+ 'scoreformat' => 'misc',
+ 'lenient' => 'grading',
+ 'retrypartial' => 'tries',
+ 'discussvote' => 'misc',
+ 'examcode' => 'high_level_randomization',
+ );
+}
- #print out all possible parms and hide them by default
- $r->print('');
- foreach $tempkey (&keysindisplayorder($allparms,$keyorder)) {
- $r->print('print(' style="display:none"');
+sub whatIsMyCategory {
+ my $name = shift;
+ my $catList = shift;
+ my @list;
+ my %lookUpList = &lookUpTableParameter; #Initilize the lookupList
+ my $cat = $lookUpList{$name};
+ if (defined($cat)) {
+ if (!defined($$catList{$cat})){
+ push @list, ($name);
+ $$catList{$cat} = \@list;
+ } else {
+ push @{${$catList}{$cat}}, ($name);
}
- $r->print('>'
- .($$allparms{$tempkey}=~/\S/ ? $$allparms{$tempkey} : $tempkey)
- .' '
- );
- }
- $r->print(' '
- .''
- .&mt('Show detailed Parameter Selection')
- .'
'
- );
+ } else {
+ if (!defined($$catList{'misc'})){
+ push @list, ($name);
+ $$catList{'misc'} = \@list;
+ } else {
+ push @{${$catList}{'misc'}}, ($name);
+ }
+ }
+}
+
+sub keysindisplayorderCategory {
+ my ($name,$keyorder)=@_;
+ return sort {
+ $$keyorder{'parameter_0_'.$a} <=> $$keyorder{'parameter_0_'.$b};
+ } ( @{$name});
+}
- &shortCuts($r,$allparms,$pscat,$keyorder);
+sub category_order {
+ return (
+ 'time_settings' => 1,
+ 'grading' => 2,
+ 'tries' => 3,
+ 'problem_appearance' => 4,
+ 'hiding' => 5,
+ 'behaviour_of_input_fields' => 6,
+ 'high_level_randomization' => 7,
+ 'slots' => 8,
+ 'file_submission' => 9,
+ 'misc' => 10
+ );
- $r->print(&Apache::lonhtmlcommon::row_closure(1));
}
sub parmboxes {
my ($r,$allparms,$pscat,$keyorder)=@_;
my $tempkey;
-
- #part to print the parm-list
- $r->print(' ');
+ &usermenu($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,\@usersgroups,$pssymb);
+ $r->print(&Apache::lonhtmlcommon::row_closure(1));
+ $r->print(&Apache::lonhtmlcommon::end_pick_box());
+ $r->print(''
+ .' '
+ .' '
+ .'
');
+ }
+
+ # ----- End Parameter Selection
# Display Messages
$r->print(''.$message.'
');
@@ -2073,93 +2559,104 @@ ENDPARMSELSCRIPT
my @catmarker=map { tr|.|_|; 'parameter_'.$_; } @pscat;
my $csuname=$env{'user.name'};
my $csudom=$env{'user.domain'};
+ my $readonly = 1;
+ if ($parm_permission->{'edit'}) {
+ undef($readonly);
+ }
if ($parmlev eq 'full') {
- my $coursespan=$csec?8:5;
- my $userspan=3;
- if ($cgroup ne '') {
- $coursespan += 3;
- }
+#
+# This produces the cascading table output of parameters
+#
+ my $coursespan=$csec?8:5;
+ my $userspan=3;
+ if ($cgroup ne '') {
+ $coursespan += 3;
+ }
- $r->print('
');
- $r->print(' ');
- $r->print(''.&mt('Any User').' ');
- if ($uname) {
- if (@usersgroups > 1) {
- $userspan ++;
+ $r->print(&Apache::loncommon::start_data_table());
+#
+# This produces the headers
+#
+ $r->print(' ');
+ $r->print(''.&mt('Any User').' ');
+ if ($uname) {
+ if (@usersgroups > 1) {
+ $userspan ++;
+ }
+ $r->print('');
+ $r->print(&mt("User")." $uname ".&mt('at Domain')." $udom ");
}
- $r->print('');
- $r->print(&mt("User")." $uname ".&mt('at Domain')." $udom ");
- }
- my %lt=&Apache::lonlocal::texthash(
- 'pie' => "Parameter in Effect",
- 'csv' => "Current Session Value",
- 'at' => 'at',
- 'rl' => "Resource Level",
- 'ic' => 'in Course',
- 'aut' => "Assessment URL and Title",
- 'type' => 'Type',
- 'emof' => "Enclosing Map or Folder",
- 'part' => 'Part',
- 'pn' => 'Parameter Name',
- 'def' => 'default',
- 'femof' => 'from Enclosing Map or Folder',
- 'gen' => 'general',
- 'foremf' => 'for Enclosing Map or Folder',
- 'fr' => 'for Resource'
- );
- $r->print(< "Parameter in Effect",
+ 'csv' => "Current Session Value",
+ 'rl' => "Resource Level",
+ 'ic' => 'in Course',
+ 'aut' => "Assessment URL and Title",
+ 'type' => 'Type',
+ 'emof' => "Enclosing Map or Folder",
+ 'part' => 'Part',
+ 'pn' => 'Parameter Name',
+ 'def' => 'default',
+ 'femof' => 'from Enclosing Map or Folder',
+ 'gen' => 'general',
+ 'foremf' => 'for Enclosing Map or Folder',
+ 'fr' => 'for Resource'
+ );
+ $r->print(<$lt{'pie'}
-$lt{'csv'} ($csuname $lt{'at'} $csudom)
+$lt{'csv'} ($csuname:$csudom)
$lt{'ic'} $lt{'rl'}
$lt{'ic'}
ENDTABLETWO
- if ($csec) {
- $r->print(''.
- &mt("in Section")." $csec ");
- }
- if ($cgroup) {
+ if ($csec) {
+ $r->print(''.
+ &mt("in Section")." $csec ");
+ }
+ if ($cgroup) {
$r->print(''.
- &mt("in Group")." $cgroup ");
- }
- $r->print(<");
+ }
+ $r->print(<$lt{'aut'} $lt{'type'}
$lt{'emof'} $lt{'part'} $lt{'pn'}
$lt{'gen'} $lt{'foremf'}
$lt{'def'} $lt{'femof'} $lt{'fr'}
ENDTABLEHEADFOUR
- if ($csec) {
- $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 ($csec) {
+ $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?').' ');
+ if ($cgroup) {
+ $r->print(''.&mt('general').' '.&mt('for Enclosing Map or Folder').' '.&mt('for Resource').' ');
}
- $r->print(''.&mt('general').' '.&mt('for Enclosing Map or Folder').' '.&mt('for Resource').' ');
- }
- $r->print(' ');
+ 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').' ');
+ }
- my $defbgone='';
- my $defbgtwo='';
- my $defbgthree = '';
+ $r->print(' ');
+#
+# Done with the headers
+#
+ my $defbgone='';
+ my $defbgtwo='';
+ my $defbgthree = '';
- foreach (@ids) {
+ foreach (@ids) {
my $rid=$_;
my ($inmapid)=($rid=~/\.(\d+)$/);
if ((!$pssymb &&
- (($pschp eq 'all') || ($allmaps{$pschp} eq $mapp{$rid})))
- ||
- ($pssymb && $pssymb eq $symbp{$rid})) {
+ (($pschp eq 'all') || ($allmaps{$pschp} eq $mapp{$rid})))
+ ||
+ ($pssymb && $pssymb eq $symbp{$rid})) {
# ------------------------------------------------------ Entry for one resource
if ($defbgone eq '#E0E099') {
$defbgone='#E0E0DD';
@@ -2186,11 +2683,18 @@ ENDTABLEHEADFOUR
my %default=();
my $uri=&Apache::lonnet::declutter($uris{$rid});
+ my $filter=$env{'form.filter'};
foreach (&keysplit($keyp{$rid})) {
my $tempkeyp = $_;
if (grep $_ eq $tempkeyp, @catmarker) {
+ my $parmname=&Apache::lonnet::metadata($uri,$_.'.name');
+# We may only want certain parameters listed
+ if ($filter) {
+ unless ($filter=~/\Q$parmname\E/) { next; }
+ }
+ $name{$_}=$parmname;
$part{$_}=&Apache::lonnet::metadata($uri,$_.'.part');
- $name{$_}=&Apache::lonnet::metadata($uri,$_.'.name');
+
my $parmdis=&Apache::lonnet::metadata($uri,$_.'.display');
if ($allparms{$name{$_}} ne '') {
my $identifier;
@@ -2210,16 +2714,16 @@ ENDTABLEHEADFOUR
}
my $totalparms=scalar keys %name;
if ($totalparms>0) {
- my $firstrow=1;
- my $title=&Apache::lonnet::gettitle($symbp{$rid});
+ my $firstrow=1;
+ my $title=&Apache::lonnet::gettitle($symbp{$rid});
$r->print(''.
join(' / ',split(/\//,$uri)).
' '.
"$title");
@@ -2234,8 +2738,8 @@ ENDTABLEHEADFOUR
$r->print('
'.$maptitles{$mapp{$rid}}.' ');
-
foreach (&keysinorder_bytype(\%name,\%keyorder)) {
+
unless ($firstrow) {
$r->print('');
} else {
@@ -2244,13 +2748,13 @@ ENDTABLEHEADFOUR
&print_row($r,$_,\%part,\%name,\%symbp,$rid,\%default,
\%type,\%display,$defbgone,$defbgtwo,
$defbgthree,$parmlev,$uname,$udom,$csec,
- $cgroup,\@usersgroups);
+ $cgroup,\@usersgroups,$noeditgrp,$readonly);
}
}
}
} # end foreach ids
# -------------------------------------------------- End entry for one resource
- $r->print('
');
+ $r->print(&Apache::loncommon::end_data_table);
} # end of full
#--------------------------------------------------- Entry for parm level map
if ($parmlev eq 'map') {
@@ -2268,7 +2772,7 @@ ENDTABLEHEADFOUR
#-------------------------------------------- for each map, gather information
my $mapid;
- foreach $mapid (sort {$maplist{$a} cmp $maplist{$b}} keys %maplist) {
+ foreach $mapid (sort { $a <=> $b } keys(%maplist)) {
my $maptitle = $maplist{$mapid};
#----------------------- loop through ids and get all parameter types for map
@@ -2280,16 +2784,16 @@ ENDTABLEHEADFOUR
my %default = ();
my $map = 0;
-# $r->print("Catmarker: @catmarker \n");
+# $r->print("Catmarker: @catmarker \n");
foreach (@ids) {
- ($map)=(/([\d]*?)\./);
- my $rid = $_;
+ ($map)=(/([\d]*?)\./);
+ my $rid = $_;
# $r->print("$mapid:$map: $rid \n");
- if ($map eq $mapid) {
- my $uri=&Apache::lonnet::declutter($uris{$rid});
+ if ($map eq $mapid) {
+ my $uri=&Apache::lonnet::declutter($uris{$rid});
# $r->print("Keys: $keyp{$rid} \n");
#--------------------------------------------------------------------
@@ -2299,32 +2803,32 @@ ENDTABLEHEADFOUR
# When storing information, store as part 0
# When requesting information, request from full part
#-------------------------------------------------------------------
- foreach (&keysplit($keyp{$rid})) {
- my $tempkeyp = $_;
- my $fullkeyp = $tempkeyp;
- $tempkeyp =~ s/_\w+_/_0_/;
-
- if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
- $part{$tempkeyp}="0";
- $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');
- 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_/;
- $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp);
- $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type');
+ foreach (&keysplit($keyp{$rid})) {
+ my $tempkeyp = $_;
+ my $fullkeyp = $tempkeyp;
+ $tempkeyp =~ s/_\w+_/_0_/;
+
+ if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
+ $part{$tempkeyp}="0";
+ $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');
+ 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_/;
+ $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp);
+ $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type');
+ }
+ } # end loop through keys
}
- } # end loop through keys
- }
} # end loop through ids
#---------------------------------------------------- print header information
@@ -2332,7 +2836,7 @@ ENDTABLEHEADFOUR
my $showtitle=$maptitles{$maptitle}.($maptitle!~/^uploaded/?' ['.$maptitle.']':'');
my $tmp="";
if ($uname) {
- my $person=&Apache::loncommon::plainname($uname,$udom);
+ my $person=&Apache::loncommon::plainname($uname,$udom);
$tmp.=&mt("User")." $uname \($person\) ".
&mt('in')." \n";
} else {
@@ -2363,11 +2867,12 @@ ENDTABLEHEADFOUR
.&Apache::loncommon::end_data_table_header_row()
);
- foreach (&keysinorder(\%name,\%keyorder)) {
+ foreach (&keysinorder(\%name,\%keyorder)) {
$r->print(&Apache::loncommon::start_data_table_row());
&print_row($r,$_,\%part,\%name,\%symbp,$mapid,\%default,
\%type,\%display,$defbgone,$defbgtwo,$defbgthree,
- $parmlev,$uname,$udom,$csec,$cgroup);
+ $parmlev,$uname,$udom,$csec,$cgroup,'',$noeditgrp,
+ $readonly);
}
$r->print(&Apache::loncommon::end_data_table().'
'
.''
@@ -2403,40 +2908,40 @@ ENDTABLEHEADFOUR
# When requesting information, request from full part
#-------------------------------------------------------------------
foreach (&keysplit($keyp{$rid})) {
- my $tempkeyp = $_;
- my $fullkeyp = $tempkeyp;
- $tempkeyp =~ s/_\w+_/_0_/;
- if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
- $part{$tempkeyp}="0";
- $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');
- my $parmdis=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
- if ($allparms{$name{$tempkeyp}} ne '') {
- my $identifier;
- if ($parmdis =~ /(\s*\[Part.*)$/) {
- $identifier = $1;
+ my $tempkeyp = $_;
+ my $fullkeyp = $tempkeyp;
+ $tempkeyp =~ s/_\w+_/_0_/;
+ if ((grep $_ eq $fullkeyp, @catmarker) &&(!$name{$tempkeyp})) {
+ $part{$tempkeyp}="0";
+ $name{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.name');
+ 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;
}
- $display{$tempkeyp} = $allparms{$name{$tempkeyp}}.$identifier;
- } else {
- $display{$tempkeyp} = $parmdis;
- }
- unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
- $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
- $display{$tempkeyp} =~ s/_\w+_/_0_/;
- $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp);
- $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type');
- }
+ unless ($display{$tempkeyp}) { $display{$tempkeyp}=''; }
+ $display{$tempkeyp}.=' ('.$name{$tempkeyp}.')';
+ $display{$tempkeyp} =~ s/_\w+_/_0_/;
+ $default{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp);
+ $type{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.type');
+ }
} # end loop through keys
} # end loop through ids
#---------------------------------------------------- print header information
- my $setdef=&mt("Set Defaults for All Resources in Course");
+ my $setdef=&mt("Set Defaults for All Resources in Course");
$r->print(<
$setdef
$coursename
ENDMAPONE
if ($uname) {
- my $person=&Apache::loncommon::plainname($uname,$udom);
+ my $person=&Apache::loncommon::plainname($uname,$udom);
$r->print(" ".&mt("User")." $uname \($person\) \n");
} else {
$r->print(" ".&mt("ALL")." ".&mt("USERS")." \n");
@@ -2454,11 +2959,12 @@ ENDMAPONE
.&Apache::loncommon::end_data_table_header_row()
);
- foreach (&keysinorder(\%name,\%keyorder)) {
+ foreach (&keysinorder(\%name,\%keyorder)) {
$r->print(&Apache::loncommon::start_data_table_row());
&print_row($r,$_,\%part,\%name,\%symbp,$mapid,\%default,
- \%type,\%display,$defbgone,$defbgtwo,$defbgthree,
- $parmlev,$uname,$udom,$csec,$cgroup);
+ \%type,\%display,$defbgone,$defbgtwo,$defbgthree,
+ $parmlev,$uname,$udom,$csec,$cgroup,'',$noeditgrp,
+ $readonly);
}
$r->print(&Apache::loncommon::end_data_table()
.''
@@ -2466,7 +2972,8 @@ ENDMAPONE
);
} # end of $parmlev eq general
}
- $r->print(''.&Apache::loncommon::end_page());
+ $r->print('');
+ $r->print(&Apache::loncommon::end_page());
} # end sub assessparms
##################################################
@@ -2475,21 +2982,28 @@ ENDMAPONE
my $tableopen;
sub tablestart {
+ my ($readonly) = @_;
if ($tableopen) {
- return '';
+ return '';
} else {
- $tableopen=1;
- return &Apache::loncommon::start_data_table().''.&mt('Parameter').' '.
- &mt('Delete').' '.&mt('Set to ...').' ';
+ $tableopen=1;
+ my $output = &Apache::loncommon::start_data_table().''.&mt('Parameter').' ';
+ if ($readonly) {
+ $output .= ''.&mt('Current value').' ';
+ } else {
+ $output .= ''.&mt('Delete').' '.&mt('Set to ...').' ';
+ }
+ $output .= ' ';
+ return $output;
}
}
sub tableend {
if ($tableopen) {
- $tableopen=0;
- return &Apache::loncommon::end_data_table();
+ $tableopen=0;
+ return &Apache::loncommon::end_data_table();
} else {
- return'';
+ return'';
}
}
@@ -2502,18 +3016,22 @@ sub readdata {
my $classlist=&Apache::loncoursedata::get_classlist();
foreach (keys %$classlist) {
if ($_=~/^($match_username)\:($match_domain)$/) {
- my ($tuname,$tudom)=($1,$2);
- my $useropt=&Apache::lonnet::get_userresdata($tuname,$tudom);
+ my ($tuname,$tudom)=($1,$2);
+ my $useropt=&Apache::lonnet::get_userresdata($tuname,$tudom);
foreach my $userkey (keys %{$useropt}) {
- if ($userkey=~/^$env{'request.course.id'}/) {
+ if ($userkey=~/^$env{'request.course.id'}/) {
my $newkey=$userkey;
- $newkey=~s/^($env{'request.course.id'}\.)/$1\[useropt\:$tuname\:$tudom\]\./;
- $$resourcedata{$newkey}=$$useropt{$userkey};
- }
- }
- }
+ $newkey=~s/^($env{'request.course.id'}\.)/$1\[useropt\:$tuname\:$tudom\]\./;
+ $$resourcedata{$newkey}=$$useropt{$userkey};
+ }
+ }
+ }
+ }
+ if (wantarray) {
+ return ($resourcedata,$classlist);
+ } else {
+ return $resourcedata;
}
- return $resourcedata;
}
@@ -2528,88 +3046,141 @@ sub storedata {
undef %newdata;
my @deldata=();
undef @deldata;
- foreach (keys %env) {
- if ($_=~/^form\.([a-z]+)\_(.+)$/) {
- my $cmd=$1;
- my $thiskey=$2;
- my ($tuname,$tudom)=&extractuser($thiskey);
- my $tkey=$thiskey;
+ my ($got_chostname,$chostname,$cmajor,$cminor);
+ my $now = time;
+ foreach my $key (keys(%env)) {
+ if ($key =~ /^form\.([a-z]+)\_(.+)$/) {
+ my $cmd=$1;
+ my $thiskey=$2;
+ my ($tuname,$tudom)=&extractuser($thiskey);
+ my $tkey=$thiskey;
+ if ($tuname) {
+ $tkey=~s/\.\[useropt\:$tuname\:$tudom\]\./\./;
+ }
+ if ($cmd eq 'set' || $cmd eq 'datepointer' || $cmd eq 'dateinterval') {
+ my ($data, $typeof, $text, $name, $valchk);
+ if ($cmd eq 'set') {
+ $data=$env{$key};
+ $valchk = $data;
+ $typeof=$env{'form.typeof_'.$thiskey};
+ $text = &mt('Saved modified parameter for');
+ if ($typeof eq 'string_questiontype') {
+ $name = 'type';
+ } elsif ($typeof eq 'string_lenient') {
+ $name = 'lenient';
+ } elsif ($typeof eq 'string_discussvote') {
+ $name = 'discussvote';
+ } elsif ($typeof eq 'string_examcode') {
+ $name = 'examcode';
+ if (&Apache::lonnet::validCODE($data)) {
+ $valchk = 'valid';
+ }
+ } elsif ($typeof eq 'string_yesno') {
+ if ($thiskey =~ /\.retrypartial$/) {
+ $name = 'retrypartial';
+ }
+ }
+ } elsif ($cmd eq 'datepointer') {
+ $data=&Apache::lonhtmlcommon::get_date_from_form($env{$key});
+ $typeof=$env{'form.typeof_'.$thiskey};
+ $text = &mt('Saved modified date for');
+ if ($typeof eq 'date_start') {
+ if ($thiskey =~ /\.printstartdate$/) {
+ $name = 'printstartdate';
+ if (($data) && ($data > $now)) {
+ $valchk = 'future';
+ }
+ }
+ } elsif ($typeof eq 'date_end') {
+ if ($thiskey =~ /\.printenddate$/) {
+ $name = 'printenddate';
+ if (($data) && ($data < $now)) {
+ $valchk = 'past';
+ }
+ }
+ }
+ } elsif ($cmd eq 'dateinterval') {
+ $data=&get_date_interval_from_form($thiskey);
+ $typeof=$env{'form.typeof_'.$thiskey};
+ $text = &mt('Saved modified date for');
+ }
+ if ($name ne '') {
+ my ($needsrelease,$needsnewer);
+ $needsrelease = $Apache::lonnet::needsrelease{"parameter:$name:$valchk"};
+ if ($needsrelease) {
+ unless ($got_chostname) {
+ ($chostname,$cmajor,$cminor)=¶meter_release_vars();
+ $got_chostname = 1;
+ }
+ $needsnewer = ¶meter_releasecheck($name,$valchk,
+ $needsrelease,
+ $cmajor,$cminor);
+ if ($needsnewer) {
+ $r->print(' '.&oldversion_warning($name,$data,
+ $chostname,$cmajor,
+ $cminor,$needsrelease));
+ next;
+ }
+ }
+ }
+ if (defined($data) and $$olddata{$thiskey} ne $data) {
if ($tuname) {
- $tkey=~s/\.\[useropt\:$tuname\:$tudom\]\./\./;
- }
- if ($cmd eq 'set' || $cmd eq 'datepointer' || $cmd eq 'dateinterval') {
- my ($data, $typeof, $text);
- if ($cmd eq 'set') {
- $data=$env{$_};
- $typeof=$env{'form.typeof_'.$thiskey};
- $text = &mt('Saved modified parameter for');
- } elsif ($cmd eq 'datepointer') {
- $data=&Apache::lonhtmlcommon::get_date_from_form($env{$_});
- $typeof=$env{'form.typeof_'.$thiskey};
- $text = &mt('Saved modified date for');
- } elsif ($cmd eq 'dateinterval') {
- $data=&get_date_interval_from_form($thiskey);
- $typeof=$env{'form.typeof_'.$thiskey};
- $text = &mt('Saved modified date for');
- }
- 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));
- } else {
- $r->print(' '.
- &mt('Error saving parameters').'
');
- }
- &Apache::lonnet::devalidateuserresdata($tuname,$tudom);
- } else {
- $newdata{$thiskey}=$data;
- $newdata{$thiskey.'.type'}=$typeof;
+ 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));
+ } else {
+ $r->print(''.
+ &mt('Error saving parameters').'
');
+ }
+ &Apache::lonnet::devalidateuserresdata($tuname,$tudom);
+ } else {
+ $newdata{$thiskey}=$data;
+ $newdata{$thiskey.'.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));
- } else {
- $r->print(''.
- &mt('Error deleting parameters').'
');
- }
- &Apache::lonnet::devalidateuserresdata($tuname,$tudom);
- } else {
- push (@deldata,$thiskey,$thiskey.'.type');
- }
- }
- }
+ }
+ } elsif ($cmd eq 'del') {
+ if ($tuname) {
+ if (&Apache::lonnet::del('resourcedata',[$tkey],$tudom,$tuname) eq 'ok') {
+ &log_parmset({$tkey=>''},1,$tuname,$tudom);
+ $r->print(' '.&mt('Deleted parameter for').' '.&Apache::loncommon::plainname($tuname,$tudom));
+ } else {
+ $r->print(''.
+ &mt('Error deleting parameters').'
');
+ }
+ &Apache::lonnet::devalidateuserresdata($tuname,$tudom);
+ } else {
+ push (@deldata,$thiskey,$thiskey.'.type');
+ }
+ }
+ }
}
# Store all course level
my $delentries=$#deldata+1;
my @newdatakeys=keys %newdata;
my $putentries=$#newdatakeys+1;
if ($delentries) {
- if (&Apache::lonnet::del('resourcedata',\@deldata,$dom,$crs) eq 'ok') {
- my %loghash=map { $_ => '' } @deldata;
- &log_parmset(\%loghash,1);
- $r->print(''.&mt('Deleted [_1] parameter(s) ',$delentries));
- } else {
- $r->print(''.
- &mt('Error deleting parameters').'
');
- }
- &Apache::lonnet::devalidatecourseresdata($crs,$dom);
+ if (&Apache::lonnet::del('resourcedata',\@deldata,$dom,$crs) eq 'ok') {
+ my %loghash=map { $_ => '' } @deldata;
+ &log_parmset(\%loghash,1);
+ $r->print(''.&mt('Deleted [quant,_1,parameter]',$delentries/2).' ');
+ } else {
+ $r->print(''.
+ &mt('Error deleting parameters').'
');
+ }
+ &Apache::lonnet::devalidatecourseresdata($crs,$dom);
}
if ($putentries) {
- if (&Apache::lonnet::put('resourcedata',\%newdata,$dom,$crs) eq 'ok') {
- &log_parmset(\%newdata,0);
- $r->print(''.&mt('Saved [_1] parameter(s)',$putentries/2).' ');
- } else {
- $r->print(''.
- &mt('Error saving parameters').'
');
- }
- &Apache::lonnet::devalidatecourseresdata($crs,$dom);
+ if (&Apache::lonnet::put('resourcedata',\%newdata,$dom,$crs) eq 'ok') {
+ &log_parmset(\%newdata,0);
+ $r->print(''.&mt('Saved [quant,_1,parameter]',$putentries/2).' ');
+ } else {
+ $r->print(''.
+ &mt('Error saving parameters').'
');
+ }
+ &Apache::lonnet::devalidatecourseresdata($crs,$dom);
}
}
@@ -2623,14 +3194,14 @@ sub parse_listdata_key {
# split into student/section affected, and
# the realm (folder/resource part and parameter
my ($student,$realm) =
- ($key=~/^\Q$env{'request.course.id'}\E\.\[([^\.]+)\]\.(.+)$/);
+ ($key=~/^\Q$env{'request.course.id'}\E\.\[([^\.]+)\]\.(.+)$/);
# if course wide student would be undefined
if (!defined($student)) {
- ($realm)=($key=~/^\Q$env{'request.course.id'}\E\.(.+)$/);
+ ($realm)=($key=~/^\Q$env{'request.course.id'}\E\.(.+)$/);
}
# strip off the .type if it's not the Question type parameter
if ($realm=~/\.type$/ && !exists($listdata->{$key.'.type'})) {
- $realm=~s/\.type//;
+ $realm=~s/\.type//;
}
# split into resource+part and parameter name
my ($res, $parm) = ($realm=~/^(.*)\.(.*)$/);
@@ -2639,7 +3210,7 @@ sub parse_listdata_key {
}
sub listdata {
- my ($r,$resourcedata,$listdata,$sortorder)=@_;
+ my ($r,$resourcedata,$listdata,$sortorder,$caller,$classlist,$readonly,$parmlev)=@_;
# Start list output
my $oldsection='';
@@ -2649,159 +3220,226 @@ sub listdata {
$tableopen=0;
my $foundkeys=0;
my %keyorder=&standardkeyorder();
+ my $readonlyall = $readonly;
+
+ my ($secidx,%grouphash);
+ if (($env{'request.course.sec'} ne '') && ($caller eq 'overview')) {
+ $secidx = &Apache::loncoursedata::CL_SECTION();
+ if (&Apache::lonnet::allowed('mdg',$env{'request.course.id'})) {
+ %grouphash = &Apache::longroup::coursegroups();
+ } elsif ($env{'request.course.groups'} ne '') {
+ map { $grouphash{$_} = 1; } split(/:/,$env{'request.course.groups'});
+ }
+ }
foreach my $thiskey (sort {
- my ($astudent,$ares,$apart,$aparm) = &parse_listdata_key($a,$listdata);
- my ($bstudent,$bres,$bpart,$bparm) = &parse_listdata_key($b,$listdata);
+ my ($astudent,$ares,$apart,$aparm) = &parse_listdata_key($a,$listdata);
+ my ($bstudent,$bres,$bpart,$bparm) = &parse_listdata_key($b,$listdata);
- # get the numerical order for the param
- $aparm=$keyorder{'parameter_0_'.$aparm};
- $bparm=$keyorder{'parameter_0_'.$bparm};
+ # get the numerical order for the param
+ $aparm=$keyorder{'parameter_0_'.$aparm};
+ $bparm=$keyorder{'parameter_0_'.$bparm};
- my $result=0;
+ my $result=0;
- if ($sortorder eq 'realmstudent') {
+ if ($sortorder eq 'realmstudent') {
if ($ares ne $bres ) {
- $result = ($ares cmp $bres);
+ $result = ($ares cmp $bres);
} elsif ($astudent ne $bstudent) {
- $result = ($astudent cmp $bstudent);
- } elsif ($apart ne $bpart ) {
- $result = ($apart cmp $bpart);
- }
- } else {
- if ($astudent ne $bstudent) {
- $result = ($astudent cmp $bstudent);
- } elsif ($ares ne $bres ) {
- $result = ($ares cmp $bres);
- } elsif ($apart ne $bpart ) {
- $result = ($apart cmp $bpart);
- }
- }
+ $result = ($astudent cmp $bstudent);
+ } elsif ($apart ne $bpart ) {
+ $result = ($apart cmp $bpart);
+ }
+ } else {
+ if ($astudent ne $bstudent) {
+ $result = ($astudent cmp $bstudent);
+ } elsif ($ares ne $bres ) {
+ $result = ($ares cmp $bres);
+ } elsif ($apart ne $bpart ) {
+ $result = ($apart cmp $bpart);
+ }
+ }
- if (!$result) {
+ if (!$result) {
if (defined($aparm) && defined($bparm)) {
- $result = ($aparm <=> $bparm);
+ $result = ($aparm <=> $bparm);
} elsif (defined($aparm)) {
- $result = -1;
+ $result = -1;
} elsif (defined($bparm)) {
- $result = 1;
- }
- }
+ $result = 1;
+ }
+ }
- $result;
+ $result;
} keys %{$listdata}) {
- if ($$listdata{$thiskey.'.type'}) {
- my $thistype=$$listdata{$thiskey.'.type'};
- if ($$resourcedata{$thiskey.'.type'}) {
- $thistype=$$resourcedata{$thiskey.'.type'};
- }
- my ($middle,$part,$name)=
- ($thiskey=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
- my $section=&mt('All Students');
- if ($middle=~/^\[(.*)\]/) {
- my $issection=$1;
- if ($issection=~/^useropt\:($match_username)\:($match_domain)/) {
- $section=&mt('User').": ".&Apache::loncommon::plainname($1,$2);
- } else {
- $section=&mt('Group/Section').': '.$issection;
- }
- $middle=~s/^\[(.*)\]//;
- }
- $middle=~s/\.+$//;
- $middle=~s/^\.+//;
- my $realm=''.&mt('All Resources').' ';
- if ($middle=~/^(.+)\_\_\_\(all\)$/) {
- $realm=''.&mt('Folder/Map').': '.&Apache::lonnet::gettitle($1).' ('.$1.') ';
- } elsif ($middle) {
- my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);
- $realm=''.&mt('Resource').': '.&Apache::lonnet::gettitle($middle).' ('.$url.' in '.$map.' id: '.$id.') ';
- }
- 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 ");
- $oldpart=$part;
- }
+ if ($$listdata{$thiskey.'.type'}) {
+ my $thistype=$$listdata{$thiskey.'.type'};
+ if ($$resourcedata{$thiskey.'.type'}) {
+ $thistype=$$resourcedata{$thiskey.'.type'};
+ }
+ my ($middle,$part,$name)=
+ ($thiskey=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
+ my $section=&mt('All Students');
+ $readonly = $readonlyall;
+ my $userscope;
+ my $showval = $$resourcedata{$thiskey};
+ if ($middle=~/^\[(.*)\]/) {
+ my $issection=$1;
+ if ($issection=~/^useropt\:($match_username)\:($match_domain)/) {
+ my ($stuname,$studom) = ($1,$2);
+ if (($env{'request.course.sec'} ne '') && ($caller eq 'overview')) {
+ if (ref($classlist) eq 'HASH') {
+ if (ref($classlist->{$stuname.':'.$studom}) eq 'ARRAY') {
+ next unless ($classlist->{$stuname.':'.$studom}->[$secidx] eq $env{'request.course.sec'});
+ }
+ }
+ }
+ $section=&mt('User').": ".&Apache::loncommon::plainname($1,$2);
+ $userscope = 1;
+ } else {
+ if (($env{'request.course.sec'} ne '') && ($caller eq 'overview')) {
+ if (exists($grouphash{$issection})) {
+ $section=&mt('Group').': '.$issection;
+ } elsif ($issection eq $env{'request.course.sec'}) {
+ $section = &mt('Section').': '.$issection;
+ } else {
+ next;
+ }
+ } else {
+ $section=&mt('Group/Section').': '.$issection;
+ }
+ }
+ $middle=~s/^\[(.*)\]//;
+ } elsif (($env{'request.course.sec'} ne '') && ($caller eq 'overview')) {
+ $readonly = 1;
+ }
+ $middle=~s/\.+$//;
+ $middle=~s/^\.+//;
+ my $realm=''.&mt('All Resources').' ';
+
+ if ($middle=~/^(.+)\_\_\_\(all\)$/) {
+ $realm=''.&mt('Folder/Map').': '.&Apache::lonnet::gettitle($1).' ('.$1.') ';
+ } elsif ($middle) {
+ my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);
+ next if (($url =~ /\.(page|sequence)$/) && ($parmlev eq 'full') && ($caller eq 'newoverview'));
+ $realm=''.&mt('Resource').': '.&Apache::lonnet::gettitle($middle).' ('.$url.' in '.$map.' id: '.$id.') ';
+ }
+ 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 ");
+ $oldpart=$part;
+ }
#
# Ready to print
#
- $r->print(&tablestart().
- &Apache::loncommon::start_data_table_row().
- ''.&standard_parameter_names($name).
- ' ');
- $foundkeys++;
- if (&isdateparm($thistype)) {
- my $jskey='key_'.$pointer;
- $pointer++;
- $r->print(
- &Apache::lonhtmlcommon::date_setter('parmform',
- $jskey,
- $$resourcedata{$thiskey},
- '',1,'','').
+ my $parmitem = &standard_parameter_names($name);
+ $r->print(&tablestart($readonly).
+ &Apache::loncommon::start_data_table_row().
+ ' '.&mt($parmitem).
+ ' ');
+ unless ($readonly) {
+ my $disabled;
+ if (($name eq 'availablestudent') &&
+ (($showval eq '') || ($userscope))) {
+ $disabled = ' disabled="disabled"';
+ }
+ $r->print(' ');
+ }
+ $r->print('');
+ $foundkeys++;
+ if (&isdateparm($thistype)) {
+ my $jskey='key_'.$pointer;
+ my $state;
+ $pointer++;
+ if ($readonly) {
+ $state = 'disabled';
+ }
+ $r->print(
+ &Apache::lonhtmlcommon::date_setter('parmform',
+ $jskey,
+ $$resourcedata{$thiskey},
+ '',1,$state));
+ unless ($readonly) {
+ $r->print(
' '.
(($$resourcedata{$thiskey}!=0)?''.
&mt('Shift all dates based on this date').' ':'').
&date_sanity_info($$resourcedata{$thiskey})
- );
- } elsif ($thistype eq 'date_interval') {
- $r->print(&date_interval_selector($thiskey,
- $$resourcedata{$thiskey}));
- } elsif ($thistype =~ m/^string/) {
- $r->print(&string_selector($thistype,$thiskey,
- $$resourcedata{$thiskey}));
- } else {
- $r->print(&default_selector($thiskey,$$resourcedata{$thiskey}));
- }
- $r->print(' ');
- $r->print(' '.&Apache::loncommon::end_data_table_row());
- }
+ );
+ }
+ } elsif ($thistype eq 'date_interval') {
+ $r->print(&date_interval_selector($thiskey,
+ $$resourcedata{$thiskey},$readonly));
+ } elsif ($thistype =~ m/^string/) {
+ if ($name eq 'availablestudent') {
+ $readonly = 1;
+ }
+ $r->print(&string_selector($thistype,$thiskey,
+ $$resourcedata{$thiskey},$name,$readonly));
+ } else {
+ $r->print(&default_selector($thiskey,$$resourcedata{$thiskey},$readonly));
+ }
+ unless ($readonly) {
+ $r->print(' ');
+ }
+ $r->print(''.&Apache::loncommon::end_data_table_row());
+ }
}
return $foundkeys;
}
sub date_interval_selector {
- my ($thiskey, $showval) = @_;
+ my ($thiskey, $showval, $readonly) = @_;
my $result;
+ my $currval = $showval;
foreach my $which (['days', 86400, 31],
- ['hours', 3600, 23],
- ['minutes', 60, 59],
- ['seconds', 1, 59]) {
- my ($name, $factor, $max) = @{ $which };
- my $amount = int($showval/$factor);
- $showval %= $factor;
- my %select = ((map {$_ => $_} (0..$max)),
- 'select_form_order' => [0..$max]);
- $result .= &Apache::loncommon::select_form($amount,$name.'_'.$thiskey,
- %select);
- $result .= ' '.&mt($name);
+ ['hours', 3600, 23],
+ ['minutes', 60, 59],
+ ['seconds', 1, 59]) {
+ my ($name, $factor, $max) = @{ $which };
+ my $amount = int($showval/$factor);
+ $showval %= $factor;
+ my %select = ((map {$_ => $_} (0..$max)),
+ 'select_form_order' => [0..$max]);
+ if ($currval eq '') {
+ unshift(@{$select{'select_form_order'}},'');
+ $select{''} = '';
+ $amount = '';
+ }
+ $result .= &Apache::loncommon::select_form($amount,$name.'_'.$thiskey,
+ \%select,'',$readonly);
+ $result .= ' '.&mt($name);
+ }
+ unless ($readonly) {
+ $result .= ' ';
}
- $result .= ' ';
return $result;
}
@@ -2809,53 +3447,150 @@ sub date_interval_selector {
sub get_date_interval_from_form {
my ($key) = @_;
my $seconds = 0;
+ my $numnotnull = 0;
foreach my $which (['days', 86400],
- ['hours', 3600],
- ['minutes', 60],
- ['seconds', 1]) {
- my ($name, $factor) = @{ $which };
- if (defined($env{'form.'.$name.'_'.$key})) {
- $seconds += $env{'form.'.$name.'_'.$key} * $factor;
- }
+ ['hours', 3600],
+ ['minutes', 60],
+ ['seconds', 1]) {
+ my ($name, $factor) = @{ $which };
+ if (defined($env{'form.'.$name.'_'.$key})) {
+ unless ($env{'form.'.$name.'_'.$key} eq '') {
+ $numnotnull ++;
+ $seconds += $env{'form.'.$name.'_'.$key} * $factor;
+ }
+ }
}
+ return if (!$numnotnull);
return $seconds;
}
sub default_selector {
- my ($thiskey, $showval) = @_;
- return ' ';
+ my ($thiskey, $showval, $readonly) = @_;
+ my $disabled;
+ if ($readonly) {
+ $disabled = ' disabled="disabled"';
+ }
+ return ' ';
}
my %strings =
(
'string_yesno'
=> [[ 'yes', 'Yes' ],
- [ 'no', 'No' ]],
+ [ 'no', 'No' ]],
'string_problemstatus'
=> [[ 'yes', 'Yes' ],
- [ 'answer', 'Yes, and show correct answer if they exceed the maximum number of tries.' ],
- [ 'no', 'No, don\'t show correct/incorrect feedback.' ],
- [ 'no_feedback_ever', 'No, show no feedback at all.' ]],
+ [ 'answer', 'Yes, and show correct answer if they exceed the maximum number of tries.' ],
+ [ 'no', 'No, don\'t show correct/incorrect feedback.' ],
+ [ 'no_feedback_ever', 'No, show no feedback at all.' ]],
+ 'string_questiontype'
+ => [[ 'problem', 'Standard Problem'],
+ [ 'survey', 'Survey'],
+ [ 'anonsurveycred', 'Anonymous Survey (credit for submission)'],
+ [ 'exam', 'Exam'],
+ [ 'anonsurvey', 'Anonymous Survey'],
+ [ 'randomizetry', 'New Randomization Each N Tries (default N=1)'],
+ [ 'practice', 'Practice'],
+ [ 'surveycred', 'Survey (credit for submission)']],
+ 'string_lenient'
+ => [['yes', 'Yes' ],
+ [ 'no', 'No' ],
+ [ 'default', 'Default - only bubblesheet grading is lenient' ]],
+ 'string_discussvote'
+ => [['yes','Yes'],
+ ['notended','Yes, unless discussion ended'],
+ ['no','No']],
);
+sub standard_string_options {
+ my ($string_type) = @_;
+ if (ref($strings{$string_type}) eq 'ARRAY') {
+ return $strings{$string_type};
+ }
+ return;
+}
sub string_selector {
- my ($thistype, $thiskey, $showval) = @_;
+ my ($thistype, $thiskey, $showval, $name, $readonly) = @_;
if (!exists($strings{$thistype})) {
- return &default_selector($thiskey,$showval);
+ return &default_selector($thiskey,$showval,$readonly);
}
- my $result;
- foreach my $possibilities (@{ $strings{$thistype} }) {
- my ($name, $description) = @{ $possibilities };
- $result .= ' ';
+ my %skiptype;
+ if (($thistype eq 'string_questiontype') ||
+ ($thistype eq 'string_lenient') ||
+ ($thistype eq 'string_discussvote') ||
+ ($name eq 'retrypartial')) {
+ my ($got_chostname,$chostname,$cmajor,$cminor);
+ foreach my $possibilities (@{ $strings{$thistype} }) {
+ next unless (ref($possibilities) eq 'ARRAY');
+ my ($parmval, $description) = @{ $possibilities };
+ my $needsrelease=$Apache::lonnet::needsrelease{"parameter:$name:$parmval"};
+ if ($needsrelease) {
+ unless ($got_chostname) {
+ ($chostname,$cmajor,$cminor)=¶meter_release_vars();
+ $got_chostname = 1;
+ }
+ my $needsnewer=¶meter_releasecheck($name,$parmval,$needsrelease,
+ $cmajor,$cminor);
+ if ($needsnewer) {
+ $skiptype{$parmval} = 1;
+ }
+ }
+ }
+ }
+
+ my ($result,$disabled);
+
+ if ($readonly) {
+ $disabled = ' disabled="disabled"';
+ }
+ my $numinrow = 3;
+ if ($thistype eq 'string_problemstatus') {
+ $numinrow = 2;
+ } elsif ($thistype eq 'string_questiontype') {
+ if (keys(%skiptype) > 0) {
+ $numinrow = 4;
+ }
+ }
+ my $rem;
+ if (ref($strings{$thistype}) eq 'ARRAY') {
+ my $i=0;
+ foreach my $possibilities (@{ $strings{$thistype} }) {
+ next unless (ref($possibilities) eq 'ARRAY');
+ my ($name, $description) = @{ $possibilities };
+ next if ($skiptype{$name});
+ $rem = $i%($numinrow);
+ if ($rem == 0) {
+ if ($i > 0) {
+ $result .= '';
+ }
+ $result .= '';
+ }
+ $result .= ''.
+ ''.
+ ' ';
+ $i++;
+ }
+ $rem = @{ $strings{$thistype} }%($numinrow);
+ my $colsleft = $numinrow - $rem;
+ if ($colsleft > 1 ) {
+ $result .= ''.
+ ' ';
+ } elsif ($colsleft == 1) {
+ $result .= ' ';
+ }
+ $result .= ' ';
+ }
+ if ($result) {
+ $result = '';
}
return $result;
}
@@ -2865,9 +3600,22 @@ sub string_selector {
#
sub dateshift {
- my ($shift)=@_;
+ my ($shift,$numchanges)=@_;
my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
+ my $sec = $env{'request.course.sec'};
+ my $secgrpregex;
+ if ($sec ne '') {
+ my @groups;
+ if ($env{'request.course.groups'} ne '') {
+ @groups = split(/:/,$env{'request.course.groups'});
+ }
+ if (@groups) {
+ $secgrpregex = '(?:'.join('|',($sec,@groups)).')';
+ } else {
+ $secgrpregex = $sec;
+ }
+ }
my %data=&Apache::lonnet::dump('resourcedata',$dom,$crs);
# ugly retro fix for broken version of types
foreach my $key (keys %data) {
@@ -2882,7 +3630,11 @@ sub dateshift {
# go through all parameters and look for dates
foreach my $key (keys %data) {
if ($data{$key.'.type'}=~/^date_(start|end)$/) {
+ if ($sec ne '') {
+ next unless ($key =~ /^$env{'request.course.id'}\.\[$secgrpregex\]\./);
+ }
my $newdate=$data{$key}+$shift;
+ $$numchanges ++;
$storecontent{$key}=$newdate;
}
}
@@ -2896,17 +3648,34 @@ sub dateshift {
}
sub newoverview {
- my ($r) = @_;
+ my ($r,$parm_permission) = @_;
my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
+ my $readonly = 1;
+ if ($parm_permission->{'edit'}) {
+ undef($readonly);
+ }
&Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',
- text=>"Overview Mode"});
- my $start_page = &Apache::loncommon::start_page('Set Parameters');
+ text=>"Overview Mode"});
+
+ my %loaditems = (
+ 'onload' => "showHide_courseContent(); resize_scrollbox('mapmenuscroll','1','1');",
+ );
+ my $js = '
+
+';
+ my $start_page = &Apache::loncommon::start_page('Set Parameters',$js,
+ {'add_entries' => \%loaditems,});
my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Overview');
+ $r->print($start_page.$breadcrumbs);
$r->print(<
ENDOVER
my @ids=();
@@ -2932,17 +3701,21 @@ ENDOVER
my @pscat=&Apache::loncommon::get_env_multiple('form.pscat');
my $pschp=$env{'form.pschp'};
+
my @psprt=&Apache::loncommon::get_env_multiple('form.psprt');
if (!@psprt) { $psprt[0]='0'; }
my @selected_sections =
- &Apache::loncommon::get_env_multiple('form.Section');
+ &Apache::loncommon::get_env_multiple('form.Section');
@selected_sections = ('all') if (! @selected_sections);
foreach my $sec (@selected_sections) {
if ($sec eq 'all') {
@selected_sections = ('all');
}
}
+ if ($env{'request.course.sec'} ne '') {
+ @selected_sections = ($env{'request.course.sec'});
+ }
my @selected_groups =
&Apache::loncommon::get_env_multiple('form.Group');
@@ -2956,53 +3729,50 @@ ENDOVER
}
&extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps,
- \%mapp, \%symbp,\%maptitles,\%uris,
- \%keyorder,\%defkeytype);
+ \%mapp, \%symbp,\%maptitles,\%uris,
+ \%keyorder,\%defkeytype);
if (grep {$_ eq 'all'} (@psprt)) {
- @psprt = keys(%allparts);
+ @psprt = keys(%allparts);
}
# Menu to select levels, etc
- #$r->print('');
- #$r->print('
- # ');
$r->print('');
$r->print('
');
- $r->print(&Apache::lonhtmlcommon::start_pick_box());
- &parmmenu($r,\%allparms,\@pscat,\%keyorder);
- $r->print(&Apache::lonhtmlcommon::end_pick_box());
- &parmboxes($r,\%allparms,\@pscat,\%keyorder);
+ &displaymenu($r,\%allparms,\@pscat,\%keyorder);
$r->print(&Apache::lonhtmlcommon::start_pick_box());
$r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parts to View')));
- #$r->print('
'.
- $r->print(''.
- ''.&mt('Parts').' '.&mt('Section(s)').
- ' '.&mt('Group(s)').' ');
+ my $sectionselector = §ionmenu(\@selected_sections);
+ my $groupselector = &groupmenu(\@selected_groups);
+ $r->print(''.
+ ''.&mt('Parts').' ');
+ if ($sectionselector) {
+ $r->print(''.&mt('Section(s)').' ');
+ }
+ if ($groupselector) {
+ $r->print(''.&mt('Group(s)').' ');
+ }
+ $r->print('');
&partmenu($r,\%allparts,\@psprt);
- $r->print(' ');
- §ionmenu($r,\@selected_sections);
- $r->print(' ');
- &groupmenu($r,\@selected_groups);
- $r->print('
');
- #$r->print('
');
+ $r->print(' ');
+ if ($sectionselector) {
+ $r->print(''.$sectionselector.' ');
+ }
+ if ($groupselector) {
+ $r->print(''.$groupselector.' ');
+ }
+ $r->print('
');
$r->print(&Apache::lonhtmlcommon::row_closure(1));
$r->print(&Apache::lonhtmlcommon::end_pick_box());
$r->print('');
@@ -3028,19 +3798,22 @@ ENDOVER
if (($env{'form.store'}) || ($env{'form.dis'})) {
- if ($env{'form.store'}) { &storedata($r,$crs,$dom); }
+ if ($env{'form.store'}) { &storedata($r,$crs,$dom); }
# Read modified data
- my $resourcedata=&readdata($crs,$dom);
+ my $resourcedata=&readdata($crs,$dom);
# List data
- &listdata($r,$resourcedata,$listdata,$sortorder);
+ &listdata($r,$resourcedata,$listdata,$sortorder,'newoverview',undef,$readonly,$parmlev);
}
- $r->print(&tableend().
- ((($env{'form.store'}) || ($env{'form.dis'}))?'
':'').
- ''.&Apache::loncommon::end_page());
+ $r->print(&tableend());
+ unless ($readonly) {
+ $r->print(((($env{'form.store'}) || ($env{'form.dis'}))?'
':''));
+ }
+ $r->print('');
+ $r->print(&Apache::loncommon::end_page());
}
sub secgroup_lister {
@@ -3079,39 +3852,54 @@ sub secgroup_lister {
}
sub overview {
- my ($r) = @_;
+ my ($r,$parm_permission) = @_;
my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
-
+ my $readonly = 1;
+ if ($parm_permission->{'edit'}) {
+ undef($readonly);
+ }
&Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',
- text=>"Overview Mode"});
+ text=>"Overview Mode"});
my $start_page=&Apache::loncommon::start_page('Modify Parameters');
my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Overview');
- $r->print(<
-ENDOVER
-# Store modified
+ $r->print($start_page.$breadcrumbs);
+ $r->print(''.
- &Apache::loncommon::end_page());
+ $r->print(&tableend().'');
+ if ($foundkeys) {
+ unless ($readonly) {
+ $r->print('
'.$submitbutton.'
');
+ }
+ } else {
+ $r->print(''.&mt('There are no parameters.').'
');
+ }
+ $r->print(''.&Apache::loncommon::end_page());
}
sub clean_parameters {
@@ -3120,7 +3908,7 @@ sub clean_parameters {
my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
&Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=cleanparameters',
- text=>"Clean Parameters"});
+ text=>"Clean Parameters"});
my $start_page=&Apache::loncommon::start_page('Clean Parameters');
my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Clean');
$r->print(<print(''.
- &mt('These parameters refer to resources that do not exist.').
- ' '.
- ' '.' '.
- ' ');
+ &mt('These parameters refer to resources that do not exist.').
+ ''.
+ ' '.' '.
+ ' ');
$r->print(&Apache::loncommon::start_data_table().
- ''.
- ''.&mt('Delete').' '.
- ''.&mt('Parameter').' '.
- ' ');
+ ''.
+ ''.&mt('Delete').' '.
+ ''.&mt('Parameter').' '.
+ ' ');
foreach my $thiskey (sort(keys(%{$resourcedata}))) {
- next if (!exists($resourcedata->{$thiskey.'.type'})
- && $thiskey=~/\.type$/);
- my %data = &parse_key($thiskey);
- if (1) { #exists($data{'realm_exists'})
- #&& !$data{'realm_exists'}) {
- $r->print(&Apache::loncommon::start_data_table_row().
- ''.
- ' ' );
-
- $r->print('');
- my $display_value = $resourcedata->{$thiskey};
- if (&isdateparm($resourcedata->{$thiskey.'.type'})) {
- $display_value =
- &Apache::lonlocal::locallocaltime($display_value);
- }
- $r->print(&mt('Parameter: "[_1]" with value: "[_2]"',
- &standard_parameter_names($data{'parameter_name'}),
- $resourcedata->{$thiskey}));
- $r->print(' ');
- if ($data{'scope_type'} eq 'all') {
- $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'}));
- }
- $r->print(' ');
- if ($data{'realm_type'} eq 'all') {
- $r->print(&mt('All Resources'));
- } elsif ($data{'realm_type'} eq 'folder') {
- $r->print(&mt('Folder: [_1]'),$data{'realm'});
- } elsif ($data{'realm_type'} eq 'symb') {
- my ($map,$resid,$url) =
- &Apache::lonnet::decode_symb($data{'realm'});
- $r->print(&mt('Resource: [_1] with ID: [_2] in folder [_3]',
- $url,$resid,$map));
- }
- $r->print(' '.&mt('Part: [_1]',$data{'parameter_part'}));
- $r->print(' ');
+ next if (!exists($resourcedata->{$thiskey.'.type'})
+ && $thiskey=~/\.type$/);
+ my %data = &parse_key($thiskey);
+ if (1) { #exists($data{'realm_exists'})
+ #&& !$data{'realm_exists'}) {
+ $r->print(&Apache::loncommon::start_data_table_row().
+ ''.
+ ' ' );
+
+ $r->print('');
+ my $display_value = $resourcedata->{$thiskey};
+ if (&isdateparm($resourcedata->{$thiskey.'.type'})) {
+ $display_value =
+ &Apache::lonlocal::locallocaltime($display_value);
+ }
+ my $parmitem = &standard_parameter_names($data{'parameter_name'});
+ $parmitem = &mt($parmitem);
+ $r->print(&mt('Parameter: "[_1]" with value: "[_2]"',
+ $parmitem,$resourcedata->{$thiskey}));
+ $r->print(' ');
+ if ($data{'scope_type'} eq 'all') {
+ $r->print(&mt('All users'));
+ } elsif ($data{'scope_type'} eq 'user') {
+ $r->print(&mt('User: [_1]',join(':',@{$data{'scope'}})));
+ } elsif ($data{'scope_type'} eq 'secgroup') {
+ $r->print(&mt('Group/Section: [_1]',$data{'scope'}));
+ }
+ $r->print(' ');
+ if ($data{'realm_type'} eq 'all') {
+ $r->print(&mt('All Resources'));
+ } elsif ($data{'realm_type'} eq 'folder') {
+ $r->print(&mt('Folder: [_1]'),$data{'realm'});
+ } elsif ($data{'realm_type'} eq 'symb') {
+ my ($map,$resid,$url) =
+ &Apache::lonnet::decode_symb($data{'realm'});
+ $r->print(&mt('Resource: [_1]with ID: [_2]in folder [_3]',
+ $url.' ',
+ $resid.' ',$map));
+ }
+ $r->print(' '.&mt('Part: [_1]',$data{'parameter_part'}));
+ $r->print(' ');
- }
+ }
}
$r->print(&Apache::loncommon::end_data_table().''.
- ' '.
- '
'.
- &Apache::loncommon::end_page());
+ ' '.
+ '');
+ $r->print(&Apache::loncommon::end_page());
}
sub date_shift_one {
my ($r) = @_;
my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
-
+ my $sec = $env{'request.course.sec'};
&Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=dateshift1&timebase='.$env{'form.timebase'},
- text=>"Shifting Dates"});
+ text=>"Shifting Dates"});
+ my $submit_text = &mt('Shift all dates accordingly');
+ if ($sec ne '') {
+ my @groups;
+ if ($env{'request.course.groups'} ne '') {
+ @groups = split(/:/,$env{'request.course.groups'});
+ }
+ if (@groups) {
+ $submit_text = &mt("Shift dates set just for your section/group(s), accordingly");
+ } else {
+ $submit_text = &mt("Shift dates set just for your section, accordingly");
+ }
+ }
my $start_page=&Apache::loncommon::start_page('Shift Dates');
my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Shift');
- $r->print(<print('');
+ ' ');
$r->print(&Apache::loncommon::end_page());
}
@@ -3231,20 +4028,57 @@ sub date_shift_two {
my ($r) = @_;
my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
+ my $sec = $env{'request.course.sec'};
&Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=dateshift1&timebase='.$env{'form.timebase'},
- text=>"Shifting Dates"});
+ text=>"Shifting Dates"});
my $start_page=&Apache::loncommon::start_page('Shift Dates');
my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Shift');
- $r->print(<print($start_page.$breadcrumbs);
my $timeshifted=&Apache::lonhtmlcommon::get_date_from_form('timeshifted');
- $r->print(&mt('Shifting all dates such that [_1] becomes [_2]',
- &Apache::lonlocal::locallocaltime($env{'form.timebase'}),
- &Apache::lonlocal::locallocaltime($timeshifted)));
+ $r->print(''.&mt('Shift Dates').' ');
+ if ($sec ne '') {
+ my @groups;
+ if ($env{'request.course.groups'} ne '') {
+ @groups = split(/:/,$env{'request.course.groups'});
+ }
+ if (@groups) {
+ $r->print(''.
+ &mt("Shift dates set just for your section/group(s), such that [_1] becomes [_2]",
+ &Apache::lonlocal::locallocaltime($env{'form.timebase'}),
+ &Apache::lonlocal::locallocaltime($timeshifted)).
+ '
');
+ } else {
+ $r->print(''.
+ &mt("Shift dates set just for your section, such that [_1] becomes [_2]",
+ &Apache::lonlocal::locallocaltime($env{'form.timebase'}),
+ &Apache::lonlocal::locallocaltime($timeshifted)).
+ '
');
+ }
+ } else {
+ $r->print(''.&mt('Shifting all dates such that [_1] becomes [_2]',
+ &Apache::lonlocal::locallocaltime($env{'form.timebase'}),
+ &Apache::lonlocal::locallocaltime($timeshifted)).
+ '
');
+ }
my $delta=$timeshifted-$env{'form.timebase'};
- &dateshift($delta);
+ my $numchanges = 0;
+ my $result = &dateshift($delta,\$numchanges);
+ if ($result eq 'ok') {
+ $r->print(
+ &Apache::lonhtmlcommon::confirm_success(&mt('Completed shifting of [quant,_1,date setting]',
+ $numchanges)));
+ } elsif ($result eq 'con_delayed') {
+ $r->print(
+ &Apache::lonhtmlcommon::confirm_success(&mt('Queued shifting of [quant,_1,date setting]',
+ $numchanges)));
+ } else {
+ $r->print(
+ &Apache::lonhtmlcommon::confirm_success(&mt('An error occurred attempting to shift dates'),1));
+ }
+ $r->print(
+ ' '.
+ &Apache::lonhtmlcommon::actionbox(
+ [''.&mt('Content and Problem Settings').' ']));
$r->print(&Apache::loncommon::end_page());
}
@@ -3252,33 +4086,32 @@ sub parse_key {
my ($key) = @_;
my %data;
my ($middle,$part,$name)=
- ($key=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
+ ($key=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
$data{'scope_type'} = 'all';
if ($middle=~/^\[(.*)\]/) {
- $data{'scope'} = $1;
- if ($data{'scope'}=~/^useropt\:($match_username)\:($match_domain)/) {
- $data{'scope_type'} = 'user';
- $data{'scope'} = [$1,$2];
- } else {
- #FIXME check for group scope
- $data{'scope_type'} = 'section';
- }
- $middle=~s/^\[(.*)\]//;
+ $data{'scope'} = $1;
+ if ($data{'scope'}=~/^useropt\:($match_username)\:($match_domain)/) {
+ $data{'scope_type'} = 'user';
+ $data{'scope'} = [$1,$2];
+ } else {
+ $data{'scope_type'} = 'secgroup';
+ }
+ $middle=~s/^\[(.*)\]//;
}
$middle=~s/\.+$//;
$middle=~s/^\.+//;
$data{'realm_type'}='all';
if ($middle=~/^(.+)\_\_\_\(all\)$/) {
- $data{'realm'} = $1;
- $data{'realm_type'} = 'folder';
- $data{'realm_title'} = &Apache::lonnet::gettitle($data{'realm'});
- ($data{'realm_exists'}) = &Apache::lonnet::is_on_map($data{'realm'});
+ $data{'realm'} = $1;
+ $data{'realm_type'} = 'folder';
+ $data{'realm_title'} = &Apache::lonnet::gettitle($data{'realm'});
+ ($data{'realm_exists'}) = &Apache::lonnet::is_on_map($data{'realm'});
} elsif ($middle) {
- $data{'realm'} = $middle;
- $data{'realm_type'} = 'symb';
- $data{'realm_title'} = &Apache::lonnet::gettitle($data{'realm'});
- my ($map,$resid,$url) = &Apache::lonnet::decode_symb($data{'realm'});
- $data{'realm_exists'} = &Apache::lonnet::symbverify($data{'realm'},$url);
+ $data{'realm'} = $middle;
+ $data{'realm_type'} = 'symb';
+ $data{'realm_title'} = &Apache::lonnet::gettitle($data{'realm'});
+ my ($map,$resid,$url) = &Apache::lonnet::decode_symb($data{'realm'});
+ $data{'realm_exists'} = &Apache::lonnet::symbverify($data{'realm'},$url);
}
$data{'parameter_part'} = $part;
@@ -3288,125 +4121,8 @@ sub parse_key {
}
-
-sub extract_cloners {
- my ($clonelist,$allowclone) = @_;
- if ($clonelist =~ /,/) {
- @{$allowclone} = split(/,/,$clonelist);
- } else {
- $$allowclone[0] = $clonelist;
- }
-}
-
-sub check_cloners {
- my ($clonelist,$oldcloner) = @_;
- my ($clean_clonelist,%disallowed);
- my @allowclone = ();
- &extract_cloners($$clonelist,\@allowclone);
- foreach my $currclone (@allowclone) {
- if (!grep(/^\Q$currclone\E$/,@$oldcloner)) {
- if ($currclone eq '*') {
- $clean_clonelist .= $currclone.',';
- } else {
- my ($uname,$udom) = split(/:/,$currclone);
- if ($uname eq '*') {
- if ($udom =~ /^$match_domain$/) {
- if (!&Apache::lonnet::domain($udom)) {
- $disallowed{'domain'} .= $currclone.',';
- } else {
- $clean_clonelist .= $currclone.',';
- }
- } else {
- $disallowed{'format'} .= $currclone.',';
- }
- } elsif ($currclone !~/^($match_username)\:($match_domain)$/) {
- $disallowed{'format'} .= $currclone.',';
- } else {
- if (&Apache::lonnet::homeserver($uname,$udom) eq 'no_host') {
- $disallowed{'newuser'} .= $currclone.',';
- } else {
- $clean_clonelist .= $currclone.',';
- }
- }
- }
- } else {
- $clean_clonelist .= $currclone.',';
- }
- }
- foreach my $key (keys(%disallowed)) {
- $disallowed{$key} =~ s/,$//;
- }
- if ($clean_clonelist) {
- $clean_clonelist =~ s/,$//;
- }
- $$clonelist = $clean_clonelist;
- return %disallowed;
-}
-
-sub change_clone {
- my ($clonelist,$oldcloner) = @_;
- my ($uname,$udom);
- my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
- my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
- my $clone_crs = $cnum.':'.$cdom;
-
- if ($cnum && $cdom) {
- my @allowclone;
- &extract_cloners($clonelist,\@allowclone);
- foreach my $currclone (@allowclone) {
- if (!grep(/^$currclone$/,@$oldcloner)) {
- if ($currclone ne '*') {
- ($uname,$udom) = split(/:/,$currclone);
- if ($uname && $udom && $uname ne '*') {
- if (&Apache::lonnet::homeserver($uname,$udom) ne 'no_host') {
- my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable');
- if ($currclonecrs{'cloneable'} !~ /\Q$clone_crs\E/) {
- if ($currclonecrs{'cloneable'} eq '') {
- $currclonecrs{'cloneable'} = $clone_crs;
- } else {
- $currclonecrs{'cloneable'} .= ','.$clone_crs;
- }
- &Apache::lonnet::put('environment',\%currclonecrs,$udom,$uname);
- }
- }
- }
- }
- }
- }
- foreach my $oldclone (@$oldcloner) {
- if (!grep(/^\Q$oldclone\E$/,@allowclone)) {
- if ($oldclone ne '*') {
- ($uname,$udom) = split(/:/,$oldclone);
- if ($uname && $udom && $uname ne '*' ) {
- if (&Apache::lonnet::homeserver($uname,$udom) ne 'no_host') {
- my %currclonecrs = &Apache::lonnet::dump('environment',$udom,$uname,'cloneable');
- my %newclonecrs = ();
- if ($currclonecrs{'cloneable'} =~ /\Q$clone_crs\E/) {
- if ($currclonecrs{'cloneable'} =~ /,/) {
- my @currclonecrs = split/,/,$currclonecrs{'cloneable'};
- foreach my $crs (@currclonecrs) {
- if ($crs ne $clone_crs) {
- $newclonecrs{'cloneable'} .= $crs.',';
- }
- }
- $newclonecrs{'cloneable'} =~ s/,$//;
- } else {
- $newclonecrs{'cloneable'} = '';
- }
- &Apache::lonnet::put('environment',\%newclonecrs,$udom,$uname);
- }
- }
- }
- }
- }
- }
- }
-}
-
-
-
sub header {
- return &Apache::loncommon::start_page('Parameter Manager');
+ return &Apache::loncommon::start_page('Content and Problem Settings');
}
@@ -3415,7 +4131,10 @@ sub print_main_menu {
my ($r,$parm_permission)=@_;
#
$r->print(&header());
- $r->print(&Apache::lonhtmlcommon::breadcrumbs('Parameter Manager'));
+ $r->print(&Apache::lonhtmlcommon::breadcrumbs('Content and Problem Settings'));
+ my $crstype = &Apache::loncommon::course_type();
+ my $lc_crstype = lc($crstype);
+
$r->print(<
@@ -3425,83 +4144,118 @@ ENDMAINFORMHEAD
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
my $vgr = &Apache::lonnet::allowed('vgr',$env{'request.course.id'});
my $mgr = &Apache::lonnet::allowed('mgr',$env{'request.course.id'});
-
-
+ my $dcm = &Apache::lonnet::allowed('dcm',$env{'request.course.id'});
+ my $vcb = &Apache::lonnet::allowed('vcb',$env{'request.course.id'});
+ my $vpa = &Apache::lonnet::allowed('vpa',$env{'request.course.id'});
+ if ((!$dcm) && ($env{'request.course.sec'} ne '')) {
+ $dcm = &Apache::lonnet::allowed('dcm',$env{'request.course.id'}.
+ '/'.$env{'request.course.sec'});
+ }
+ if ((!$vcb) && ($env{'request.course.sec'} ne '')) {
+ $vcb = &Apache::lonnet::allowed('vcb',$env{'request.course.id'}.
+ '/'.$env{'request.course.sec'});
+ }
+ my (%linktext,%linktitle,%url);
+ if ($parm_permission->{'edit'}) {
+ %linktext = (
+ newoverview => 'Edit Resource Parameters - Overview Mode',
+ settable => 'Edit Resource Parameters - Table Mode',
+ setoverview => 'Modify Resource Parameters - Overview Mode',
+ );
+ %linktitle = (
+ newoverview => 'Set/Modify resource parameters in overview mode.',
+ settable => 'Set/Modify resource parameters in table mode.',
+ setoverview => 'Set/Modify existing resource parameters in overview mode.',
+ );
+ } else {
+ %linktext = (
+ newoverview => 'View Resource Parameters - Overview Mode',
+ settable => 'View Resource Parameters - Table Mode',
+ setoverview => 'View Resource Parameters - Overview Mode',
+ );
+ %linktitle = (
+ newoverview => 'Display resource parameters in overview mode.',
+ settable => 'Display resource parameters in table mode.',
+ setoverview => 'Display existing resource parameters in overview mode.',
+ );
+ }
+ if ($mgr) {
+ $linktext{'resettimes'} = 'Reset Student Access Times';
+ $linktitle{'resettimes'} = "Reset access times for folders/maps, resources or the $lc_crstype.";
+ $url{'resettimes'} = '/adm/helper/resettimes.helper';
+ } elsif ($vgr) {
+ $linktext{'resettimes'} = 'Display Student Access Times',
+ $linktitle{'resettimes'} = "Display access times for folders/maps, resources or the $lc_crstype.",
+ $url{'resettimes'} = '/adm/accesstimes';
+ }
my @menu =
- ( { categorytitle=>'Settings for this Course',
- items => [
- { linktext => 'Course Configuration',
- url => '/adm/courseprefs?origin=params',
- permission => $parm_permission,
- linktitle =>'Edit course configuration.' ,
- icon => 'preferences-desktop-remote-desktop.png' ,
- #help => 'Course_Environment',
- },
- { linktext => 'Portfolio Metadata',
- url => '/adm/parmset?action=setrestrictmeta',
- permission => $parm_permission,
- linktitle => 'Restrict metadata for this course.' ,
- icon =>'contact-new.png' ,
- },
- { linktext => 'Manage Course Slots',
- url => '/adm/slotrequest?command=showslots',
- permission => $vgr,
- linktitle =>'Manage slots for this course.' ,
- icon => 'format-justify-fill.png' ,
- },
- { linktext => 'Reset Student Access Times',
- url => '/adm/helper/resettimes.helper',
- permission => $mgr,
- linktitle =>'Reset access times for folders/maps, resources or the course.' ,
- icon => 'start-here.png' ,
- },
-
- { linktext => 'Set Parameter Setting Default Actions',
- url => '/adm/parmset?action=setdefaults',
- permission => $parm_permission,
- linktitle =>'Set default actions for parameters.' ,
- icon => 'folder-new.png' ,
- }]},
- { categorytitle => 'New and Existing Parameter Settings for Resources',
- items => [
- { linktext => 'Edit Resource Parameters - Helper Mode',
- url => '/adm/helper/parameter.helper',
- permission => $parm_permission,
- linktitle =>'Set/Modify resource parameters in helper mode.' ,
- icon => 'dialog-information.png' ,
- #help => 'Parameter_Helper',
- },
- { linktext => 'Edit Resource Parameters - Overview Mode',
- url => '/adm/parmset?action=newoverview',
- permission => $parm_permission,
- linktitle =>'Set/Modify resource parameters in overview mode.' ,
- icon => 'edit-find.png' ,
- #help => 'Parameter_Overview',
- },
- { linktext => 'Edit Resource Parameters - Table Mode',
- url => '/adm/parmset?action=settable',
- permission => $parm_permission,
- linktitle =>'Set/Modify resource parameters in table mode.' ,
- icon => 'edit-copy.png' ,
- #help => 'Table_Mode',
- }]},
+ ( { categorytitle=>"Content Settings for this $crstype",
+ items => [
+ { linktext => 'Portfolio Metadata',
+ url => '/adm/parmset?action=setrestrictmeta',
+ permission => $parm_permission->{'setrestrictmeta'},
+ linktitle => "Restrict metadata for this $lc_crstype." ,
+ icon =>'contact-new.png' ,
+ },
+ { linktext => $linktext{'resettimes'},
+ url => $url{'resettimes'},
+ permission => ($vgr || $mgr),
+ linktitle => $linktitle{'resettimes'},
+ icon => 'start-here.png',
+ },
+ { linktext => 'Blocking Communication/Resource Access',
+ url => '/adm/setblock',
+ permission => ($vcb || $dcm),
+ linktitle => 'Configure blocking of communication/collaboration and access to resources during an exam',
+ icon => 'comblock.png',
+ },
+ { linktext => 'Set Parameter Setting Default Actions',
+ url => '/adm/parmset?action=setdefaults',
+ permission => $parm_permission->{'setdefaults'},
+ linktitle =>'Set default actions for parameters.' ,
+ icon => 'folder-new.png' ,
+ }]},
+ { categorytitle => 'New and Existing Parameter Settings for Resources',
+ items => [
+ { linktext => 'Edit Resource Parameters - Helper Mode',
+ url => '/adm/helper/parameter.helper',
+ permission => $parm_permission->{'helper'},
+ linktitle =>'Set/Modify resource parameters in helper mode.' ,
+ icon => 'dialog-information.png' ,
+ #help => 'Parameter_Helper',
+ },
+ { linktext => $linktext{'newoverview'},
+ url => '/adm/parmset?action=newoverview',
+ permission => $parm_permission->{'newoverview'},
+ linktitle => $linktitle{'newoverview'},
+ icon => 'edit-find.png',
+ #help => 'Parameter_Overview',
+ },
+ { linktext => $linktext{'settable'},
+ url => '/adm/parmset?action=settable',
+ permission => $parm_permission->{'settable'},
+ linktitle => $linktitle{'settable'},
+ icon => 'edit-copy.png',
+ #help => 'Table_Mode',
+ }]},
{ categorytitle => 'Existing Parameter Settings for Resources',
- items => [
- { linktext => 'Modify Resource Parameters - Overview Mode',
- url => '/adm/parmset?action=setoverview',
- permission => $parm_permission,
- linktitle =>'Set/Modify existing resource parameters in overview mode.' ,
- icon => 'preferences-desktop-wallpaper.png' ,
- #help => 'Parameter_Overview',
- },
- { linktext => 'Change Log',
- url => '/adm/parmset?action=parameterchangelog',
- permission => $parm_permission,
- linktitle =>'View parameter and course blog posting/user notification change log.' ,
- icon => 'emblem-system.png' ,
- }]}
+ items => [
+ { linktext => $linktext{'setoverview'},
+ url => '/adm/parmset?action=setoverview',
+ permission => $parm_permission->{'setoverview'},
+ linktitle => $linktitle{'setoverview'},
+ icon => 'preferences-desktop-wallpaper.png',
+ #help => 'Parameter_Overview',
+ },
+ { linktext => 'Change Log',
+ url => '/adm/parmset?action=parameterchangelog',
+ permission => $parm_permission->{'parameterchangelog'},
+ linktitle =>"View parameter and $lc_crstype blog posting/user notification change log." ,
+ icon => 'document-properties.png',
+ }]}
);
$r->print(&Apache::lonhtmlcommon::generate_menu(@menu));
+ $r->print(''.&Apache::loncommon::end_page());
return;
}
@@ -3520,7 +4274,7 @@ sub output_row {
my @options= ( ['active', 'Show to student'],
['stuadd', 'Provide text area for students to type metadata'],
['choices','Provide choices for students to select from']);
-# ['onlyone','Student may select only one choice']);
+# ['onlyone','Student may select only one choice']);
if ($added_flag) {
push @options,['deleted', 'Delete Metadata Field'];
}
@@ -3528,14 +4282,14 @@ sub output_row {
$output .= ''.$field_text.': ';
$output .= &Apache::loncommon::end_data_table_row();
foreach my $opt (@options) {
- my $checked = ($options =~ m/$opt->[0]/) ? ' checked="checked" ' : '' ;
- $output .= &Apache::loncommon::continue_data_table_row();
- $output .= ''.(' ' x 5).'
- '.
- &mt($opt->[1]).' ';
- $output .= &Apache::loncommon::end_data_table_row();
- }
+ my $checked = ($options =~ m/$opt->[0]/) ? ' checked="checked" ' : '' ;
+ $output .= &Apache::loncommon::continue_data_table_row();
+ $output .= ''.(' ' x 5).'
+ '.
+ &mt($opt->[1]).' ';
+ $output .= &Apache::loncommon::end_data_table_row();
+ }
$output .= &Apache::loncommon::continue_data_table_row();
$output .= ''.(' ' x 10).' ';
$output .= &Apache::loncommon::end_data_table_row();
@@ -3548,16 +4302,16 @@ sub output_row {
$multiple_checked = ' checked="checked"';
$single_checked = '';
}
- $output .= &Apache::loncommon::continue_data_table_row();
- $output .= ''.(' ' x 10).'
-
- '.&mt('Student may select multiple choices from list').' ';
- $output .= &Apache::loncommon::end_data_table_row();
- $output .= &Apache::loncommon::continue_data_table_row();
- $output .= ''.(' ' x 10).'
-
- '.&mt('Student may select only one choice from list').' ';
- $output .= &Apache::loncommon::end_data_table_row();
+ $output .= &Apache::loncommon::continue_data_table_row();
+ $output .= ''.(' ' x 10).'
+
+ '.&mt('Student may select multiple choices from list').' ';
+ $output .= &Apache::loncommon::end_data_table_row();
+ $output .= &Apache::loncommon::continue_data_table_row();
+ $output .= ''.(' ' x 10).'
+
+ '.&mt('Student may select only one choice from list').' ';
+ $output .= &Apache::loncommon::end_data_table_row();
}
return ($output);
}
@@ -3571,7 +4325,7 @@ sub order_meta_fields {
my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
$r->print(&Apache::loncommon::start_page('Order Metadata Fields'));
&Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=addmetadata',
- text=>"Add Metadata Field"});
+ text=>"Add Metadata Field"});
&Apache::lonhtmlcommon::add_breadcrumb
({href=>"/adm/parmset?action=setrestrictmeta",
text=>"Restrict Metadata"},
@@ -3586,32 +4340,32 @@ sub order_meta_fields {
if ($newpos > $currentpos) {
# moving stuff up
for ($i=0;$i<$currentpos;$i++) {
- $neworder[$i]=$oldorder[$i];
+ $neworder[$i]=$oldorder[$i];
}
for ($i=$currentpos;$i<$newpos;$i++) {
- $neworder[$i]=$oldorder[$i+1];
+ $neworder[$i]=$oldorder[$i+1];
}
$neworder[$newpos]=$oldorder[$currentpos];
for ($i=$newpos+1;$i<=$#oldorder;$i++) {
- $neworder[$i]=$oldorder[$i];
+ $neworder[$i]=$oldorder[$i];
}
} else {
# moving stuff down
- for ($i=0;$i<$newpos;$i++) {
- $neworder[$i]=$oldorder[$i];
- }
- $neworder[$newpos]=$oldorder[$currentpos];
- for ($i=$newpos+1;$i<$currentpos+1;$i++) {
- $neworder[$i]=$oldorder[$i-1];
- }
- for ($i=$currentpos+1;$i<=$#oldorder;$i++) {
- $neworder[$i]=$oldorder[$i];
- }
+ for ($i=0;$i<$newpos;$i++) {
+ $neworder[$i]=$oldorder[$i];
+ }
+ $neworder[$newpos]=$oldorder[$currentpos];
+ for ($i=$newpos+1;$i<$currentpos+1;$i++) {
+ $neworder[$i]=$oldorder[$i-1];
+ }
+ for ($i=$currentpos+1;$i<=$#oldorder;$i++) {
+ $neworder[$i]=$oldorder[$i];
+ }
}
- my $ordered_fields = join ",", @neworder;
+ my $ordered_fields = join ",", @neworder;
my $put_result = &Apache::lonnet::put('environment',
{'metadata.addedorder'=>$ordered_fields},$dom,$crs);
- &Apache::lonnet::appenv({'course.'.$env{'request.course.id'}.'.metadata.addedorder' => $ordered_fields});
+ &Apache::lonnet::appenv({'course.'.$env{'request.course.id'}.'.metadata.addedorder' => $ordered_fields});
}
my $fields = &get_added_meta_fieldnames($env{'request.course.id'});
my $ordered_fields;
@@ -3630,7 +4384,7 @@ sub order_meta_fields {
foreach my $key (@fields_in_order) {
$r->print('');
$r->print('
-
+
-
+
ENDButtons
my $added_flag = 1;
foreach my $field (sort(keys(%$added_metadata_fields))) {
- $row_alt = $row_alt ? 0 : 1;
- $output.= &output_row($r, $field, $$added_metadata_fields{$field},$added_flag, $row_alt);
+ $output.= &output_row($r,$field,$$added_metadata_fields{$field},$added_flag);
}
$output .= &Apache::loncommon::end_data_table();
$r->print(<'/adm/parmset?action=setdefaults',
- text=>"Set Defaults"});
+ text=>"Set Defaults"});
my $start_page =
- &Apache::loncommon::start_page('Parameter Setting Default Actions');
+ &Apache::loncommon::start_page('Parameter Setting Default Actions');
my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Defaults');
- $r->print(<
-ENDDEFHEAD
+ $r->print($start_page.$breadcrumbs);
+ $r->print('');
my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
@@ -3857,135 +4621,135 @@ ENDDEFHEAD
my %defkeytype=();
&extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps,
- \%mapp, \%symbp,\%maptitles,\%uris,
- \%keyorder,\%defkeytype);
+ \%mapp, \%symbp,\%maptitles,\%uris,
+ \%keyorder,\%defkeytype);
if ($env{'form.storerules'}) {
- my %newrules=();
- my @delrules=();
- my %triggers=();
- foreach my $key (keys(%env)) {
+ my %newrules=();
+ my @delrules=();
+ my %triggers=();
+ foreach my $key (keys(%env)) {
if ($key=~/^form\.(\w+)\_action$/) {
- my $tempkey=$1;
- my $action=$env{$key};
+ my $tempkey=$1;
+ my $action=$env{$key};
if ($action) {
- $newrules{$tempkey.'_action'}=$action;
- if ($action ne 'default') {
- my ($whichaction,$whichparm)=($action=~/^(.*\_)([^\_]+)$/);
- $triggers{$whichparm}.=$tempkey.':';
- }
- $newrules{$tempkey.'_type'}=$defkeytype{$tempkey};
- if (&isdateparm($defkeytype{$tempkey})) {
- $newrules{$tempkey.'_days'}=$env{'form.'.$tempkey.'_days'};
- $newrules{$tempkey.'_hours'}=$env{'form.'.$tempkey.'_hours'};
- $newrules{$tempkey.'_min'}=$env{'form.'.$tempkey.'_min'};
- $newrules{$tempkey.'_sec'}=$env{'form.'.$tempkey.'_sec'};
- } else {
- $newrules{$tempkey.'_value'}=$env{'form.'.$tempkey.'_value'};
- $newrules{$tempkey.'_triggervalue'}=$env{'form.'.$tempkey.'_triggervalue'};
- }
- } else {
- push(@delrules,$tempkey.'_action');
- push(@delrules,$tempkey.'_type');
- push(@delrules,$tempkey.'_hours');
- push(@delrules,$tempkey.'_min');
- push(@delrules,$tempkey.'_sec');
- push(@delrules,$tempkey.'_value');
- }
- }
- }
- foreach my $key (keys %allparms) {
- $newrules{$key.'_triggers'}=$triggers{$key};
- }
- &Apache::lonnet::put('parmdefactions',\%newrules,$dom,$crs);
- &Apache::lonnet::del('parmdefactions',\@delrules,$dom,$crs);
- &resetrulescache();
+ $newrules{$tempkey.'_action'}=$action;
+ if ($action ne 'default') {
+ my ($whichaction,$whichparm)=($action=~/^(.*\_)([^\_]+)$/);
+ $triggers{$whichparm}.=$tempkey.':';
+ }
+ $newrules{$tempkey.'_type'}=$defkeytype{$tempkey};
+ if (&isdateparm($defkeytype{$tempkey})) {
+ $newrules{$tempkey.'_days'}=$env{'form.'.$tempkey.'_days'};
+ $newrules{$tempkey.'_hours'}=$env{'form.'.$tempkey.'_hours'};
+ $newrules{$tempkey.'_min'}=$env{'form.'.$tempkey.'_min'};
+ $newrules{$tempkey.'_sec'}=$env{'form.'.$tempkey.'_sec'};
+ } else {
+ $newrules{$tempkey.'_value'}=$env{'form.'.$tempkey.'_value'};
+ $newrules{$tempkey.'_triggervalue'}=$env{'form.'.$tempkey.'_triggervalue'};
+ }
+ } else {
+ push(@delrules,$tempkey.'_action');
+ push(@delrules,$tempkey.'_type');
+ push(@delrules,$tempkey.'_hours');
+ push(@delrules,$tempkey.'_min');
+ push(@delrules,$tempkey.'_sec');
+ push(@delrules,$tempkey.'_value');
+ }
+ }
+ }
+ foreach my $key (keys %allparms) {
+ $newrules{$key.'_triggers'}=$triggers{$key};
+ }
+ &Apache::lonnet::put('parmdefactions',\%newrules,$dom,$crs);
+ &Apache::lonnet::del('parmdefactions',\@delrules,$dom,$crs);
+ &resetrulescache();
}
my %lt=&Apache::lonlocal::texthash('days' => 'Days',
- 'hours' => 'Hours',
- 'min' => 'Minutes',
- 'sec' => 'Seconds',
- 'yes' => 'Yes',
- 'no' => 'No');
+ 'hours' => 'Hours',
+ 'min' => 'Minutes',
+ 'sec' => 'Seconds',
+ 'yes' => 'Yes',
+ 'no' => 'No');
my @standardoptions=('','default');
my @standarddisplay=('',&mt('Default value when manually setting'));
my @dateoptions=('','default');
my @datedisplay=('',&mt('Default value when manually setting'));
foreach my $tempkey (&keysindisplayorder(\%allparms,\%keyorder)) {
- unless ($tempkey) { next; }
- push @standardoptions,'when_setting_'.$tempkey;
- push @standarddisplay,&mt('Automatically set when setting ').$tempkey;
- if (&isdateparm($defkeytype{$tempkey})) {
- push @dateoptions,'later_than_'.$tempkey;
- push @datedisplay,&mt('Automatically set later than ').$tempkey;
- push @dateoptions,'earlier_than_'.$tempkey;
- push @datedisplay,&mt('Automatically set earlier than ').$tempkey;
- }
+ unless ($tempkey) { next; }
+ push @standardoptions,'when_setting_'.$tempkey;
+ push @standarddisplay,&mt('Automatically set when setting ').$tempkey;
+ if (&isdateparm($defkeytype{$tempkey})) {
+ push @dateoptions,'later_than_'.$tempkey;
+ push @datedisplay,&mt('Automatically set later than ').$tempkey;
+ push @dateoptions,'earlier_than_'.$tempkey;
+ push @datedisplay,&mt('Automatically set earlier than ').$tempkey;
+ }
}
$r->print(&mt('Manual setting rules apply to all interfaces.').' '.
- &mt('Automatic setting rules apply to table mode interfaces only.'));
+ &mt('Automatic setting rules apply to table mode interfaces only.'));
$r->print("\n".&Apache::loncommon::start_data_table().
- &Apache::loncommon::start_data_table_header_row().
- "".&mt('Rule for parameter').' '.
- &mt('Action').' '.&mt('Value').' '.
- &Apache::loncommon::end_data_table_header_row());
+ &Apache::loncommon::start_data_table_header_row().
+ "".&mt('Rule for parameter').' '.
+ &mt('Action').' '.&mt('Value').' '.
+ &Apache::loncommon::end_data_table_header_row());
foreach my $tempkey (&keysindisplayorder(\%allparms,\%keyorder)) {
- unless ($tempkey) { next; }
- $r->print("\n".&Apache::loncommon::start_data_table_row().
- "".$allparms{$tempkey}."\n (".$tempkey.') ');
- my $action=&rulescache($tempkey.'_action');
- $r->print('');
- if (&isdateparm($defkeytype{$tempkey})) {
- for (my $i=0;$i<=$#dateoptions;$i++) {
- if ($dateoptions[$i]=~/\_$tempkey$/) { next; }
- $r->print("\n$datedisplay[$i] ");
- }
- } else {
- for (my $i=0;$i<=$#standardoptions;$i++) {
- if ($standardoptions[$i]=~/\_$tempkey$/) { next; }
- $r->print("\n$standarddisplay[$i] ");
- }
- }
- $r->print(' ');
- unless (&isdateparm($defkeytype{$tempkey})) {
- $r->print("\n ".&mt('Triggering value(s) of other parameter (optional, comma-separated):').
- ' ');
- }
- $r->print("\n \n");
+ unless ($tempkey) { next; }
+ $r->print("\n".&Apache::loncommon::start_data_table_row().
+ " ".$allparms{$tempkey}."\n (".$tempkey.') ');
+ my $action=&rulescache($tempkey.'_action');
+ $r->print('');
+ if (&isdateparm($defkeytype{$tempkey})) {
+ for (my $i=0;$i<=$#dateoptions;$i++) {
+ if ($dateoptions[$i]=~/\_$tempkey$/) { next; }
+ $r->print("\n$datedisplay[$i] ");
+ }
+ } else {
+ for (my $i=0;$i<=$#standardoptions;$i++) {
+ if ($standardoptions[$i]=~/\_$tempkey$/) { next; }
+ $r->print("\n$standarddisplay[$i] ");
+ }
+ }
+ $r->print(' ');
+ unless (&isdateparm($defkeytype{$tempkey})) {
+ $r->print("\n ".&mt('Triggering value(s) of other parameter (optional, comma-separated):').
+ ' ');
+ }
+ $r->print("\n \n");
if (&isdateparm($defkeytype{$tempkey})) {
- my $days=&rulescache($tempkey.'_days');
- my $hours=&rulescache($tempkey.'_hours');
- my $min=&rulescache($tempkey.'_min');
- my $sec=&rulescache($tempkey.'_sec');
- $r->print(<print(< $lt{'days'}
$lt{'hours'}
$lt{'min'}
$lt{'sec'}
ENDINPUTDATE
- } elsif ($defkeytype{$tempkey} eq 'string_yesno') {
+ } elsif ($defkeytype{$tempkey} eq 'string_yesno') {
my $yeschecked='';
my $nochecked='';
if (&rulescache($tempkey.'_value') eq 'yes') { $yeschecked=' checked="checked"'; }
if (&rulescache($tempkey.'_value') eq 'no') { $nochecked=' checked="checked"'; }
- $r->print(<print(< $lt{'yes'}
$lt{'no'}
ENDYESNO
} else {
- $r->print(' ');
- }
+ $r->print(' ');
+ }
$r->print(' '.&Apache::loncommon::end_data_table_row());
}
$r->print(&Apache::loncommon::end_data_table().
- "\n".' '."\n".
- &Apache::loncommon::end_page());
+ "\n".' '."\n");
+ $r->print(&Apache::loncommon::end_page());
return;
}
@@ -3993,88 +4757,105 @@ sub components {
my ($key,$uname,$udom,$exeuser,$exedomain,$typeflag)=@_;
if ($typeflag) {
- $key=~s/\.type$//;
+ $key=~s/\.type$//;
}
my ($middle,$part,$name)=
- ($key=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
+ ($key=~/^$env{'request.course.id'}\.(?:(.+)\.)*([\w\s]+)\.(\w+)$/);
my $issection;
my $section=&mt('All Students');
if ($middle=~/^\[(.*)\]/) {
- $issection=$1;
- $section=&mt('Group/Section').': '.$issection;
- $middle=~s/^\[(.*)\]//;
+ $issection=$1;
+ $section=&mt('Group/Section').': '.$issection;
+ $middle=~s/^\[(.*)\]//;
}
$middle=~s/\.+$//;
$middle=~s/^\.+//;
if ($uname) {
- $section=&mt('User').": ".&Apache::loncommon::plainname($uname,$udom);
- $issection='';
+ $section=&mt('User').": ".&Apache::loncommon::plainname($uname,$udom);
+ $issection='';
}
my $realm=''.&mt('All Resources').' ';
my $realmdescription=&mt('all resources');
if ($middle=~/^(.+)\_\_\_\(all\)$/) {
- $realm=''.&mt('Folder/Map').': '.&Apache::lonnet::gettitle($1).' ('.$1.') ';
- $realmdescription=&mt('folder').' '.&Apache::lonnet::gettitle($1);
+ $realm=''.&mt('Folder/Map').': '.&Apache::lonnet::gettitle($1).' ('.$1.') ';
+ $realmdescription=&mt('folder').' '.&Apache::lonnet::gettitle($1);
} elsif ($middle) {
- my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);
- $realm=''.&mt('Resource').': '.&Apache::lonnet::gettitle($middle).' ('.$url.' in '.$map.' id: '.$id.') ';
- $realmdescription=&mt('resource').' '.&Apache::lonnet::gettitle($middle);
+ my ($map,$id,$url)=&Apache::lonnet::decode_symb($middle);
+ $realm=''.&mt('Resource').': '.&Apache::lonnet::gettitle($middle).' ('.$url.' in '.$map.' id: '.$id.') ';
+ $realmdescription=&mt('resource').' '.&Apache::lonnet::gettitle($middle);
}
my $what=$part.'.'.$name;
return ($realm,$section,$name,$part,
- $what,$middle,$uname,$udom,$issection,$realmdescription);
+ $what,$middle,$uname,$udom,$issection,$realmdescription);
}
my %standard_parms;
-
+my %standard_parms_types;
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);
- my ($short,$plain)=split(/:/,$configline);
- my (undef,$name,$type)=split(/\&/,$short,3);
- if ($type eq 'display') {
- $standard_parms{$name} = $plain;
- }
+ if ($configline !~ /\S/ || $configline=~/^\#/) { next; }
+ chomp($configline);
+ my ($short,$plain)=split(/:/,$configline);
+ my (undef,$name,$type)=split(/\&/,$short,3);
+ if ($type eq 'display') {
+ $standard_parms{$name} = $plain;
+ } elsif ($type eq 'type') {
+ $standard_parms_types{$name} = $plain;
+ }
}
close($config);
$standard_parms{'int_pos'} = 'Positive Integer';
$standard_parms{'int_zero_pos'} = 'Positive Integer or Zero';
- %standard_parms=&Apache::lonlocal::texthash(%standard_parms);
+ $standard_parms{'scoreformat'} = 'Format for display of score';
}
sub standard_parameter_names {
my ($name)=@_;
if (!%standard_parms) {
- &load_parameter_names();
+ &load_parameter_names();
}
if ($standard_parms{$name}) {
- return $standard_parms{$name};
+ return $standard_parms{$name};
} else {
- return $name;
+ return $name;
}
}
-
+sub standard_parameter_types {
+ my ($name)=@_;
+ if (!%standard_parms_types) {
+ &load_parameter_names();
+ }
+ if ($standard_parms_types{$name}) {
+ return $standard_parms_types{$name};
+ }
+ return;
+}
sub parm_change_log {
- my ($r)=@_;
+ my ($r,$parm_permission)=@_;
&Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=settable',
- text=>"Parameter Change Log"});
- $r->print(&Apache::loncommon::start_page('Parameter Change Log'));
+ text=>"Parameter Change Log"});
+ my $js = ''."\n";
+ $r->print(&Apache::loncommon::start_page('Parameter Change Log',$js));
$r->print(&Apache::lonhtmlcommon::breadcrumbs('Parameter Change Log'));
-
my %parmlog=&Apache::lonnet::dump('nohist_parameterlog',
- $env{'course.'.$env{'request.course.id'}.'.domain'},
- $env{'course.'.$env{'request.course.id'}.'.num'});
+ $env{'course.'.$env{'request.course.id'}.'.domain'},
+ $env{'course.'.$env{'request.course.id'}.'.num'});
if ((keys(%parmlog))[0]=~/^error\:/) { undef(%parmlog); }
- $r->print('print(''.
+ '
'.&mt('Display of Changes').' '.
+ '');
my %saveable_parameters = ('show' => 'scalar',);
@@ -4082,139 +4863,181 @@ sub parm_change_log {
\%saveable_parameters);
&Apache::loncommon::restore_course_settings('parameter_log',
\%saveable_parameters);
- $r->print(&Apache::loncommon::display_filter().
- ''.&Apache::lonhtmlcommon::checkbox('includetypes',$env{'form.includetypes'},'1').
- ' '.&mt('Include parameter types').' '.
- ' ');
-
+ $r->print(&Apache::loncommon::display_filter('parmslog').' '."\n".
+ ' '.
+ ' ');
+ my $readonly = 1;
+ if ($parm_permission->{'edit'}) {
+ undef($readonly);
+ }
my $courseopt=&Apache::lonnet::get_courseresdata($env{'course.'.$env{'request.course.id'}.'.num'},
- $env{'course.'.$env{'request.course.id'}.'.domain'});
+ $env{'course.'.$env{'request.course.id'}.'.domain'});
$r->print(&Apache::loncommon::start_data_table().&Apache::loncommon::start_data_table_header_row().
- ''.&mt('Time').' '.&mt('User').' '.&mt('Extent').' '.&mt('Users').' '.
- &mt('Parameter').' '.&mt('Part').' '.&mt('New Value').' '.&mt('Announce').' '.
- &Apache::loncommon::end_data_table_header_row());
+ ''.&mt('Time').' '.&mt('User').' '.&mt('Extent').' '.&mt('Users').' '.
+ &mt('Parameter').' '.&mt('Part').' '.&mt('New Value').' ');
+ unless ($readonly) {
+ $r->print(''.&mt('Announce').' ');
+ }
+ $r->print(&Apache::loncommon::end_data_table_header_row());
my $shown=0;
my $folder='';
if ($env{'form.displayfilter'} eq 'currentfolder') {
- my $last='';
- if (tie(my %hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db',
- &GDBM_READER(),0640)) {
- $last=$hash{'last_known'};
- untie(%hash);
- }
- if ($last) { ($folder) = &Apache::lonnet::decode_symb($last); }
+ my $last='';
+ if (tie(my %hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db',
+ &GDBM_READER(),0640)) {
+ $last=$hash{'last_known'};
+ untie(%hash);
+ }
+ if ($last) { ($folder) = &Apache::lonnet::decode_symb($last); }
+ }
+ my $numgroups = 0;
+ my @groups;
+ if ($env{'request.course.groups'} ne '') {
+ @groups = split(/:/,$env{'request.course.groups'});
+ $numgroups = scalar(@groups);
}
foreach my $id (sort
- {
- if ($parmlog{$b}{'exe_time'} ne $parmlog{$a}{'exe_time'}) {
- return $parmlog{$b}{'exe_time'} <=>$parmlog{$a}{'exe_time'}
- }
- my $aid = (split('00000',$a))[-1];
- my $bid = (split('00000',$b))[-1];
- return $bid<=>$aid;
- } (keys(%parmlog))) {
+ {
+ if ($parmlog{$b}{'exe_time'} ne $parmlog{$a}{'exe_time'}) {
+ return $parmlog{$b}{'exe_time'} <=>$parmlog{$a}{'exe_time'}
+ }
+ my $aid = (split('00000',$a))[-1];
+ my $bid = (split('00000',$b))[-1];
+ return $bid<=>$aid;
+ } (keys(%parmlog))) {
my @changes=keys(%{$parmlog{$id}{'logentry'}});
- my $count = 0;
- my $time =
- &Apache::lonlocal::locallocaltime($parmlog{$id}{'exe_time'});
- my $plainname =
- &Apache::loncommon::plainname($parmlog{$id}{'exe_uname'},
- $parmlog{$id}{'exe_udom'});
- my $about_me_link =
- &Apache::loncommon::aboutmewrapper($plainname,
- $parmlog{$id}{'exe_uname'},
- $parmlog{$id}{'exe_udom'});
- my $send_msg_link='';
- if ((($parmlog{$id}{'exe_uname'} ne $env{'user.name'})
- || ($parmlog{$id}{'exe_udom'} ne $env{'user.domain'}))) {
- $send_msg_link =' '.
- &Apache::loncommon::messagewrapper(&mt('Send message'),
- $parmlog{$id}{'exe_uname'},
- $parmlog{$id}{'exe_udom'});
- }
- my $row_start=&Apache::loncommon::start_data_table_row();
- my $makenewrow=0;
- my %istype=();
- my $output;
- foreach my $changed (reverse(sort(@changes))) {
+ my $count = 0;
+ my $time =
+ &Apache::lonlocal::locallocaltime($parmlog{$id}{'exe_time'});
+ my $plainname =
+ &Apache::loncommon::plainname($parmlog{$id}{'exe_uname'},
+ $parmlog{$id}{'exe_udom'});
+ my $about_me_link =
+ &Apache::loncommon::aboutmewrapper($plainname,
+ $parmlog{$id}{'exe_uname'},
+ $parmlog{$id}{'exe_udom'});
+ my $send_msg_link='';
+ if ((!$readonly) &&
+ (($parmlog{$id}{'exe_uname'} ne $env{'user.name'})
+ || ($parmlog{$id}{'exe_udom'} ne $env{'user.domain'}))) {
+ $send_msg_link =' '.
+ &Apache::loncommon::messagewrapper(&mt('Send message'),
+ $parmlog{$id}{'exe_uname'},
+ $parmlog{$id}{'exe_udom'});
+ }
+ my $row_start=&Apache::loncommon::start_data_table_row();
+ my $makenewrow=0;
+ my %istype=();
+ my $output;
+ foreach my $changed (reverse(sort(@changes))) {
my $value=$parmlog{$id}{'logentry'}{$changed};
- my $typeflag = ($changed =~/\.type$/ &&
- !exists($parmlog{$id}{'logentry'}{$changed.'.type'}));
+ 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);
- if ($env{'form.displayfilter'} eq 'currentfolder') {
- if ($folder) {
- if ($middle!~/^\Q$folder\E/) { next; }
- }
- }
- if ($typeflag) {
- $istype{$parmname}=$value;
- if (!$env{'form.includetypes'}) { next; }
- }
- $count++;
- if ($makenewrow) {
- $output .= $row_start;
- } else {
- $makenewrow=1;
- }
- $output .=''.$realm.' '.$section.' '.
- &standard_parameter_names($parmname).' '.
- ($part?&mt('Part: [_1]',$part):&mt('All Parts')).' ';
- my $stillactive=0;
- if ($parmlog{$id}{'delflag'}) {
- $output .= &mt('Deleted');
- } else {
- if ($typeflag) {
- $output .= &mt('Type: [_1]',&standard_parameter_names($value));
- } else {
- my ($level,@all)=&parmval_by_symb($what,$middle,&Apache::lonnet::metadata($middle,$what),
- $uname,$udom,$issection,$issection,$courseopt);
- if (&isdateparm($istype{$parmname})) {
- $output .= &Apache::lonlocal::locallocaltime($value);
- } else {
- $output .= $value;
- }
- if ($value ne $all[$level]) {
- $output .= ''.&mt('Not active anymore').' ';
- } else {
- $stillactive=1;
- }
- }
- }
- $output .= ' ';
- if ($stillactive) {
- my $title=&mt('Changed [_1]',&standard_parameter_names($parmname));
- my $description=&mt('Changed [_1] for [_2] to [_3]',&standard_parameter_names($parmname),$realmdescription,
- (&isdateparm($istype{$parmname})?&Apache::lonlocal::locallocaltime($value):$value));
- if (($uname) && ($udom)) {
- $output .=
- &Apache::loncommon::messagewrapper('Notify User',
- $uname,$udom,$title,
- $description);
- } else {
- $output .=
- &Apache::lonrss::course_blog_link($id,$title,
- $description);
- }
- }
- $output .= ' '.&Apache::loncommon::end_data_table_row();
- }
+ &components($changed,$parmlog{$id}{'uname'},$parmlog{$id}{'udom'},undef,undef,$typeflag);
+ if ($env{'request.course.sec'} ne '') {
+ next if (($issection ne '') && (!(($issection eq $env{'request.course.sec'}) ||
+ ($numgroups && (grep(/^\Q$issection\E$/,@groups))))));
+ if ($uname ne '') {
+ my $stusection = &Apache::lonnet::getsection($uname,$udom,$env{'request.course.id'});
+ next if (($stusection ne '-1') && ($stusection ne $env{'request.course.sec'}));
+ }
+ }
+ if ($env{'form.displayfilter'} eq 'currentfolder') {
+ if ($folder) {
+ if ($middle!~/^\Q$folder\E/) { next; }
+ }
+ }
+ if ($typeflag) {
+ $istype{$parmname}=$value;
+ if (!$env{'form.includetypes'}) { next; }
+ }
+ $count++;
+ if ($makenewrow) {
+ $output .= $row_start;
+ } else {
+ $makenewrow=1;
+ }
+ my $parmitem = &standard_parameter_names($parmname);
+ $output .=''.$realm.' '.$section.' '.
+ &mt($parmitem).' '.
+ ($part?&mt('Part: [_1]',$part):&mt('All Parts')).' ';
+ my $stillactive=0;
+ if ($parmlog{$id}{'delflag'}) {
+ $output .= &mt('Deleted');
+ } else {
+ if ($typeflag) {
+ my $parmitem = &standard_parameter_names($value);
+ $parmitem = &mt($parmitem);
+ $output .= &mt('Type: [_1]',$parmitem);
+ } else {
+ my ($level,@all)=&parmval_by_symb($what,$middle,&Apache::lonnet::metadata($middle,$what),
+ $uname,$udom,$issection,$issection,$courseopt);
+ my $showvalue = $value;
+ if ($istype{$parmname} eq '') {
+ my $type = &standard_parameter_types($parmname);
+ if ($type ne '') {
+ if (&isdateparm($type)) {
+ $showvalue =
+ &Apache::lonlocal::locallocaltime($value);
+ }
+ }
+ } else {
+ if (&isdateparm($istype{$parmname})) {
+ $showvalue =
+ &Apache::lonlocal::locallocaltime($value);
+ }
+ }
+ $output .= $showvalue;
+ if ($value ne $all[$level]) {
+ $output .= ''.&mt('Not active anymore').' ';
+ } else {
+ $stillactive=1;
+ }
+ }
+ }
+ $output .= ' ';
+
+ unless ($readonly) {
+ $output .= '';
+ if ($stillactive) {
+ my $parmitem = &standard_parameter_names($parmname);
+ $parmitem = &mt($parmitem);
+ my $title=&mt('Changed [_1]',$parmitem);
+ my $description=&mt('Changed [_1] for [_2] to [_3]',
+ $parmitem,$realmdescription,
+ (&isdateparm($istype{$parmname})?&Apache::lonlocal::locallocaltime($value):$value));
+ if (($uname) && ($udom)) {
+ $output .=
+ &Apache::loncommon::messagewrapper('Notify User',
+ $uname,$udom,$title,
+ $description);
+ } else {
+ $output .=
+ &Apache::lonrss::course_blog_link($id,$title,
+ $description);
+ }
+ }
+ $output .= ' ';
+ }
+ $output .= &Apache::loncommon::end_data_table_row();
+ }
if ($env{'form.displayfilter'} eq 'containing') {
- my $wholeentry=$about_me_link.':'.
- $parmlog{$id}{'exe_uname'}.':'.$parmlog{$id}{'exe_udom'}.':'.
- $output;
- if ($wholeentry!~/\Q$env{'form.containingphrase'}\E/i) { next; }
- }
+ my $wholeentry=$about_me_link.':'.
+ $parmlog{$id}{'exe_uname'}.':'.$parmlog{$id}{'exe_udom'}.':'.
+ $output;
+ if ($wholeentry!~/\Q$env{'form.containingphrase'}\E/i) { next; }
+ }
if ($count) {
- $r->print($row_start.''.$time.'
+ $r->print($row_start.''.$time.'
'.$about_me_link.
- ''.$parmlog{$id}{'exe_uname'}.
- ':'.$parmlog{$id}{'exe_udom'}.' '.
- $send_msg_link.' '.$output);
- $shown++;
- }
- if (!($env{'form.show'} eq &mt('all')
- || $shown<=$env{'form.show'})) { last; }
+ ''.$parmlog{$id}{'exe_uname'}.
+ ':'.$parmlog{$id}{'exe_udom'}.' '.
+ $send_msg_link.' '.$output);
+ $shown++;
+ }
+ if (!($env{'form.show'} eq &mt('all')
+ || $shown<=$env{'form.show'})) { last; }
}
$r->print(&Apache::loncommon::end_data_table());
$r->print(&Apache::loncommon::end_page());
@@ -4264,10 +5087,10 @@ sub update_slots {
action => 'reserve',
context => 'parameter',
);
- &Apache::lonnet::instructor_log('slotreservationslog',\%storehash,
+ &Apache::lonnet::write_log('course','slotreservationslog',\%storehash,
'',$uname,$udom,$cnum,$cdom);
- &Apache::lonnet::instructor_log($cdom.'_'.$cnum.'_slotlog',\%storehash,
+ &Apache::lonnet::write_log('course',$cdom.'_'.$cnum.'_slotlog',\%storehash,
'',$uname,$udom,$uname,$udom);
}
return $success;
@@ -4298,9 +5121,9 @@ sub delete_slots {
action => 'release',
context => 'parameter',
);
- &Apache::lonnet::instructor_log('slotreservationslog',\%storehash,
+ &Apache::lonnet::write_log('course','slotreservationslog',\%storehash,
1,$uname,$udom,$cnum,$cdom);
- &Apache::lonnet::instructor_log($cdom.'_'.$cnum.'_slotlog',\%storehash,
+ &Apache::lonnet::write_log('course',$cdom.'_'.$cnum.'_slotlog',\%storehash,
1,$uname,$udom,$uname,$udom);
}
}
@@ -4314,6 +5137,114 @@ sub check_for_course_info {
return 0;
}
+sub parameter_release_vars {
+ my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ my $chome = $env{'course.'.$env{'request.course.id'}.'.home'};
+ my $chostname = &Apache::lonnet::hostname($chome);
+ my ($cmajor,$cminor) =
+ split(/\./,&Apache::lonnet::get_server_loncaparev($cdom,$chome));
+ return ($chostname,$cmajor,$cminor);
+}
+
+sub parameter_releasecheck {
+ my ($name,$value,$needsrelease,$cmajor,$cminor) = @_;
+ my $needsnewer;
+ my ($needsmajor,$needsminor) = split(/\./,$needsrelease);
+ if (($cmajor < $needsmajor) ||
+ ($cmajor == $needsmajor && $cminor < $needsminor)) {
+ $needsnewer = 1;
+ } else {
+ &Apache::lonnet::update_released_required($Apache::lonnet::needsrelease{'parameter:'.$name.':'.$value});
+ }
+ return $needsnewer;
+}
+
+sub oldversion_warning {
+ my ($name,$value,$chostname,$cmajor,$cminor,$needsrelease) = @_;
+ my $desc;
+ my %stringtypes = (
+ type => 'string_questiontype',
+ lenient => 'string_lenient',
+ retrypartial => 'string_yesno',
+ discussvote => 'string_discussvote',
+ examcode => 'string_examcode',
+ );
+ if (exists($stringtypes{$name})) {
+ if ($name eq 'examcode') {
+ $desc = $value;
+ } elsif (ref($strings{$stringtypes{$name}}) eq 'ARRAY') {
+ foreach my $possibilities (@{ $strings{$stringtypes{$name}} }) {
+ next unless (ref($possibilities) eq 'ARRAY');
+ my ($parmval, $description) = @{ $possibilities };
+ if ($parmval eq $value) {
+ $desc = $description;
+ last;
+ }
+ }
+ }
+ } elsif (($name eq 'printstartdate') || ($name eq 'printenddate')) {
+ my $now = time;
+ if ($value =~ /^\d+$/) {
+ if ($name eq 'printstartdate') {
+ if ($value > $now) {
+ $desc = &Apache::lonlocal::locallocaltime($value);
+ }
+ } elsif ($name eq 'printenddate') {
+ if ($value < $now) {
+ $desc = &Apache::lonlocal::locallocaltime($value);
+ }
+ }
+ }
+ }
+ my $standard_name = &standard_parameter_names($name);
+ return ''.
+ &mt('[_1] was [_2]not[_3] set to [_4].',
+ $standard_name,'',' ','"'.$desc.'"').' '.
+ &mt('LON-CAPA version ([_1]) installed on home server ([_2]) does not meet version requirements ([_3] or newer).',
+ $cmajor.'.'.$cminor,$chostname,
+ $needsrelease).
+ '
';
+}
+
+sub get_permission {
+ my %permission;
+ my $allowed = 0;
+ return (\%permission,$allowed) unless ($env{'request.course.id'});
+ if ((&Apache::lonnet::allowed('opa',$env{'request.course.id'})) ||
+ (&Apache::lonnet::allowed('opa',$env{'request.course.id'}.'/'.
+ $env{'request.course.sec'}))) {
+ %permission= (
+ 'edit' => 1,
+ 'set' => 1,
+ 'setoverview' => 1,
+ 'addmetadata' => 1,
+ 'ordermetadata' => 1,
+ 'setrestrictmeta' => 1,
+ 'newoverview' => 1,
+ 'setdefaults' => 1,
+ 'settable' => 1,
+ 'parameterchangelog' => 1,
+ 'cleanparameters' => 1,
+ 'dateshift1' => 1,
+ 'dateshift2' => 1,
+ 'helper' => 1,
+ );
+ } elsif ((&Apache::lonnet::allowed('vpa',$env{'request.course.id'})) ||
+ (&Apache::lonnet::allowed('vpa',$env{'request.course.id'}.'/'.
+ $env{'request.course.sec'}))) {
+ %permission = (
+ 'set' => 1,
+ 'settable' => 1,
+ 'newoverview' => 1,
+ 'setoverview' => 1,
+ 'parameterchangelog' => 1,
+ );
+ }
+ foreach my $perm (values(%permission)) {
+ if ($perm) { $allowed=1; last; }
+ }
+ return (\%permission,$allowed);
+}
sub handler {
my $r=shift;
@@ -4325,74 +5256,73 @@ sub handler {
return OK if $r->header_only;
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
- ['action','state',
+ ['action','state',
'pres_marker',
'pres_value',
'pres_type',
+ 'filter','part',
'udom','uname','symb','serial','timebase']);
&Apache::lonhtmlcommon::clear_breadcrumbs();
&Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/parmset",
- text=>"Parameter Manager",
- faq=>10,
- bug=>'Instructor Interface',
+ text=>"Content and Problem Settings",
+ faq=>10,
+ bug=>'Instructor Interface',
help =>
'Parameter_Manager,Course_Environment,Parameter_Helper,Parameter_Overview,Table_Mode'});
# ----------------------------------------------------- Needs to be in a course
- my $parm_permission =
- (&Apache::lonnet::allowed('opa',$env{'request.course.id'}) ||
- &Apache::lonnet::allowed('opa',$env{'request.course.id'}.'/'.
- $env{'request.course.sec'}));
+ my ($parm_permission,$allowed) = &get_permission();
my $exists = &check_for_course_info();
- if ($env{'request.course.id'} && $parm_permission && $exists) {
+ if ($env{'request.course.id'} && $allowed && $exists) {
#
# Main switch on form.action and form.state, as appropriate
#
# Check first if coming from someone else headed directly for
# the table mode
- if ((($env{'form.command'} eq 'set') && ($env{'form.url'})
- && (!$env{'form.dis'})) || ($env{'form.symb'})) {
- &assessparms($r);
+ if (($parm_permission->{'set'}) &&
+ ((($env{'form.command'} eq 'set') && ($env{'form.url'})
+ && (!$env{'form.dis'})) || ($env{'form.symb'}))) {
+ &assessparms($r,$parm_permission);
} elsif (! exists($env{'form.action'})) {
&print_main_menu($r,$parm_permission);
+ } elsif (!$parm_permission->{$env{'form.action'}}) {
+ &print_main_menu($r,$parm_permission);
} elsif ($env{'form.action'} eq 'setoverview') {
- &overview($r);
- } elsif ($env{'form.action'} eq 'addmetadata') {
- &addmetafield($r);
- } elsif ($env{'form.action'} eq 'ordermetadata') {
- &order_meta_fields($r);
+ &overview($r,$parm_permission);
+ } elsif ($env{'form.action'} eq 'addmetadata') {
+ &addmetafield($r);
+ } elsif ($env{'form.action'} eq 'ordermetadata') {
+ &order_meta_fields($r);
} elsif ($env{'form.action'} eq 'setrestrictmeta') {
- &setrestrictmeta($r);
+ &setrestrictmeta($r);
} elsif ($env{'form.action'} eq 'newoverview') {
- &newoverview($r);
+ &newoverview($r,$parm_permission);
} elsif ($env{'form.action'} eq 'setdefaults') {
- &defaultsetter($r);
- } elsif ($env{'form.action'} eq 'settable') {
- &assessparms($r);
+ &defaultsetter($r);
+ } elsif ($env{'form.action'} eq 'settable') {
+ &assessparms($r,$parm_permission);
} elsif ($env{'form.action'} eq 'parameterchangelog') {
- &parm_change_log($r);
+ &parm_change_log($r,$parm_permission);
} elsif ($env{'form.action'} eq 'cleanparameters') {
- &clean_parameters($r);
+ &clean_parameters($r);
} elsif ($env{'form.action'} eq 'dateshift1') {
&date_shift_one($r);
} elsif ($env{'form.action'} eq 'dateshift2') {
&date_shift_two($r);
- } elsif ($env{'form.action'} eq 'categorizecourse') {
- &assign_course_categories($r);
}
} else {
# ----------------------------- Not in a course, or not allowed to modify parms
- if ($exists) {
- $env{'user.error.msg'}=
- "/adm/parmset:opa:0:0:Cannot modify assessment parameters";
- } else {
- $env{'user.error.msg'}=
- "/adm/parmset::0:1:Course environment gone, reinitialize the course";
- }
- return HTTP_NOT_ACCEPTABLE;
+ if ($exists) {
+ $env{'user.error.msg'}=
+ "/adm/parmset:opa:0:0:Cannot modify assessment parameters";
+ } else {
+ $env{'user.error.msg'}=
+ "/adm/parmset::0:1:Course environment gone, reinitialize the course";
+ }
+ return HTTP_NOT_ACCEPTABLE;
}
&reset_caches();