--- loncom/interface/lonparmset.pm 2008/09/19 03:27:04 1.409
+++ loncom/interface/lonparmset.pm 2013/01/28 18:17:26 1.530
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Handler to set parameters for assessments
#
-# $Id: lonparmset.pm,v 1.409 2008/09/19 03:27:04 raeburn Exp $
+# $Id: lonparmset.pm,v 1.530 2013/01/28 18:17:26 bisitz Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -44,36 +44,11 @@ This module sets coursewide and assessme
=head1 INTERNAL SUBROUTINES
-=over 4
-
-=cut
-
-###################################################################
-###################################################################
-
-package Apache::lonparmset;
-
-use strict;
-use Apache::lonnet;
-use Apache::Constants qw(:common :http REDIRECT);
-use Apache::lonhtmlcommon();
-use Apache::loncommon;
-use GDBM_File;
-use Apache::lonhomework;
-use Apache::lonxml;
-use Apache::lonlocal;
-use Apache::lonnavmaps;
-use Apache::longroup;
-use Apache::lonrss;
-use LONCAPA qw(:DEFAULT :match);
-
-
-##################################################
-##################################################
+=over
=pod
-=item parmval
+=item parmval()
Figure out a cascading parameter.
@@ -98,9 +73,268 @@ Returns: A list, the first item is the
2 - Map or Folder level for specific student
1 - resource level for specific student
+=item parmval_by_symb()
+
+=item reset_caches()
+
+=item cacheparmhash()
+
+=item parmhash()
+
+=item symbcache()
+
+=item preset_defaults()
+
+=item date_sanity_info()
+
+=item storeparm()
+
+Store a parameter by symb
+
+ Takes
+ - symb
+ - name of parameter
+ - level
+ - new value
+ - new type
+ - username
+ - userdomain
+
+=item log_parmset()
+
+=item storeparm_by_symb_inner()
+
+=item valout()
+
+Format a value for output.
+
+Inputs: $value, $type, $editable
+
+Returns: $value, formatted for output. If $type indicates it is a date,
+localtime($value) is returned.
+$editable will return an icon to click on
+
+=item plink()
+
+Produces a link anchor.
+
+Inputs: $type,$dis,$value,$marker,$return,$call
+
+Returns: scalar with html code for a link which will envoke the
+javascript function 'pjump'.
+
+=item page_js()
+
+=item startpage()
+
+=item print_row()
+
+=item print_td()
+
+=item print_usergroups()
+
+=item parm_control_group()
+
+=item extractResourceInformation() :
+
+ extractResourceInformation extracts lots of information about all of the the course's resources into a variety of hashes.
+
+Input: See list below:
+
+=item * B : Current username
+
+=item * B : Domain of current user.
+
+=item * b (out) : An array that will contain all of the ids in the course.
+
+=item * B(out) : hash, id->type, where "type" contains the extension of the file, thus, I.
+
+=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 (out) : hash, name of parameter->display value (what is the display value?)
+
+=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
+
+=item isdateparm()
+
+=item parmmenu()
+
+=item partmenu()
+
+=item usermenu()
+
+=item displaymenu()
+
+=item mapmenu()
+
+=item levelmenu()
+
+=item sectionmenu()
+
+=item keysplit()
+
+=item keysinorder()
+
+=item keysinorder_bytype()
+
+=item keysindisplayorder()
+
+=item standardkeyorder()
+
+=item assessparms() :
+
+Show assessment data and parameters. This is a large routine that should
+be simplified and shortened... someday.
+
+Inputs: $r - the Apache request object.
+
+Returns: nothing
+
+Variables used (guessed by Jeremy):
+
+=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?
+
+=item * B<@catmarker> contains list of all possible parameters including part #s
+
+=item * B<$fullkeyp> contains the full part/id # for the extraction of proper parameters
+
+=item * B<$tempkeyp> contains part 0 only (no ids - ie, subparts)
+ When storing information, store as part 0
+ When requesting information, request from full part
+
+=item tablestart()
+
+=item tableend()
+
+=item extractuser()
+
+=item parse_listdata_key()
+
+=item listdata()
+
+=item date_interval_selector()
+
+=item get_date_interval_from_form()
+
+=item default_selector()
+
+=item string_selector()
+
+=item dateshift()
+
+=item newoverview()
+
+=item secgroup_lister()
+
+=item overview()
+
+=item clean_parameters()
+
+=item date_shift_one()
+
+=item date_shift_two()
+
+=item parse_key()
+
+=item header()
+
+Output html header for page
+
+=item print_main_menu()
+
+=item output_row()
+
+Set portfolio metadata
+
+=item order_meta_fields()
+
+=item addmetafield()
+
+=item setrestrictmeta()
+
+=item get_added_meta_fieldnames()
+
+=item get_deleted_meta_fieldnames()
+
+=item defaultsetter()
+
+=item components()
+
+=item load_parameter_names()
+
+=item parm_change_log()
+
+=item handler() :
+
+Main handler. Calls &assessparms subroutine.
+
+
+=back
+
=cut
-##################################################
+###################################################################
+###################################################################
+
+package Apache::lonparmset;
+
+use strict;
+use Apache::lonnet;
+use Apache::Constants qw(:common :http REDIRECT);
+use Apache::lonhtmlcommon();
+use Apache::loncommon;
+use GDBM_File;
+use Apache::lonhomework;
+use Apache::lonxml;
+use Apache::lonlocal;
+use Apache::lonnavmaps;
+use Apache::longroup;
+use Apache::lonrss;
+use HTML::Entities;
+use LONCAPA qw(:DEFAULT :match);
+
+
+sub startSettingsScreen {
+ my ($r,$mode)=@_;
+
+ $r->print("\n".''."\n");
+ $r->print('');
+}
+
+sub endSettingsScreen {
+ my ($r)=@_;
+ $r->print('
');
+}
+
+
+
sub parmval {
my ($what,$id,$def,$uname,$udom,$csec,$cgroup,$courseopt)=@_;
return &parmval_by_symb($what,&symbcache($id),$def,$uname,$udom,$csec,
@@ -112,13 +346,13 @@ 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='';
my @outpar=();
# ----------------------------------------------------- Cascading lookup scheme
- my $map=(&Apache::lonnet::decode_symb($symb))[0];
+ my $map=(&Apache::lonnet::decode_symb($symb))[0];
$map = &Apache::lonnet::deversion($map);
my $symbparm=$symb.'.'.$what;
@@ -140,13 +374,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
@@ -159,25 +393,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 '') {
@@ -198,20 +432,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);
}
@@ -220,7 +454,7 @@ sub parmval_by_symb {
# --- Caches local to lonparmset
-
+
sub reset_caches {
&resetparmhash();
&resetsymbcache();
@@ -231,92 +465,95 @@ 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};
}
}
-{
+{
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};
}
}
-{
+{
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};
}
}
+
+
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 ('','','','','');
}
}
-##################################################
+
+
sub date_sanity_info {
my $checkdate=shift;
@@ -325,14 +562,31 @@ sub date_sanity_info {
my $crsprefix='course.'.$env{'request.course.id'}.'.';
if ($env{$crsprefix.'default_enrollment_end_date'}) {
if ($checkdate>$env{$crsprefix.'default_enrollment_end_date'}) {
- $result.=' '.&mt('After course enrollment end!');
+ $result.=''
+ .&mt('After course enrollment end!')
+ .'
';
}
}
if ($env{$crsprefix.'default_enrollment_start_date'}) {
if ($checkdate<$env{$crsprefix.'default_enrollment_start_date'}) {
- $result.=' '.&mt('Before course enrollment start!');
+ $result.=''
+ .&mt('Before course enrollment start!')
+ .'
';
}
}
+# Preparation for additional warnings about dates in the past/future.
+# An improved, more context sensitive version is recommended,
+# e.g. warn for due and answer dates which are defined before the corresponding open date, etc.
+# if ($checkdate'
+# .'('.&mt('in the past').')'
+# .'';
+# }
+# if ($checkdate>time) {
+# $result.=''
+# .'('.&mt('in the future').')'
+# .'
';
+# }
return $result;
}
##################################################
@@ -354,28 +608,17 @@ sub storeparm {
&storeparm_by_symb(&symbcache($sresid),$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,'',$cgroup);
}
-#
-# Store a parameter by symb
-#
-# Takes
-# - symb
-# - name of parameter
-# - level
-# - new value
-# - new type
-# - username
-# - userdomain
my %recstack;
sub storeparm_by_symb {
my ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$recflag,$cgroup)=@_;
unless ($recflag) {
# first time call
- %recstack=();
- $recflag=1;
+ %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=~/^(.*[\_\.])([^\_\.]+)$/);
@@ -385,40 +628,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 {
@@ -426,7 +669,7 @@ sub storeparm_by_symb_inner {
my ($symb,$spnam,$snum,$nval,$ntype,$uname,$udom,$csec,$cgroup)=@_;
# ---------------------------------------------------------- Construct prefixes
$spnam=~s/\_([^\_]+)$/\.$1/;
- my $map=(&Apache::lonnet::decode_symb($symb))[0];
+ my $map=(&Apache::lonnet::decode_symb($symb))[0];
$map = &Apache::lonnet::deversion($map);
my $symbparm=$symb.'.'.$spnam;
@@ -439,11 +682,11 @@ sub storeparm_by_symb_inner {
my $seclevel=$env{'request.course.id'}.'.['.$csec.'].'.$spnam;
my $seclevelr=$env{'request.course.id'}.'.['.$csec.'].'.$symbparm;
my $seclevelm=$env{'request.course.id'}.'.['.$csec.'].'.$mapparm;
-
+
my $courselevel=$env{'request.course.id'}.'.'.$spnam;
my $courselevelr=$env{'request.course.id'}.'.'.$symbparm;
my $courselevelm=$env{'request.course.id'}.'.'.$mapparm;
-
+
my $storeunder='';
if (($snum==14) || ($snum==3)) { $storeunder=$courselevel; }
if (($snum==13) || ($snum==2)) { $storeunder=$courselevelm; }
@@ -455,157 +698,137 @@ sub storeparm_by_symb_inner {
if ($snum==5) { $storeunder=$grplevelm; }
if ($snum==4) { $storeunder=$grplevelr; }
-
+
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 '';
}
-##################################################
-##################################################
-
-=pod
-=item valout
-
-Format a value for output.
-
-Inputs: $value, $type, $editable
-
-Returns: $value, formatted for output. If $type indicates it is a date,
-localtime($value) is returned.
-$editable will return an icon to click on
-
-=cut
-
-##################################################
-##################################################
sub valout {
my ($value,$type,$editable)=@_;
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);
+ my @timer;
$year=$year-70;
$mday--;
if ($year) {
- $result.=$year.' yrs ';
+# $result.=&mt('[quant,_1,yr]',$year).' ';
+ push(@timer,&mt('[quant,_1,yr]',$year));
}
if ($mon) {
- $result.=$mon.' mths ';
+# $result.=&mt('[quant,_1,mth]',$mon).' ';
+ push(@timer,&mt('[quant,_1,mth]',$mon));
}
if ($mday) {
- $result.=$mday.' days ';
+# $result.=&mt('[quant,_1,day]',$mday).' ';
+ push(@timer,&mt('[quant,_1,day]',$mday));
}
if ($hour) {
- $result.=$hour.' hrs ';
+# $result.=&mt('[quant,_1,hr]',$hour).' ';
+ push(@timer,&mt('[quant,_1,hr]',$hour));
}
if ($min) {
- $result.=$min.' mins ';
+# $result.=&mt('[quant,_1,min]',$min).' ';
+ push(@timer,&mt('[quant,_1,min]',$min));
}
if ($sec) {
- $result.=$sec.' secs ';
+# $result.=&mt('[quant,_1,sec]',$sec).' ';
+ push(@timer,&mt('[quant,_1,sec]',$sec));
}
- $result=~s/\s+$//;
+# $result=~s/\s+$//;
+ if (!@timer) { # Special case: all entries 0 -> display "0 secs" intead of empty field to keep this field editable
+ push(@timer,&mt('[quant,_1,sec]',0));
+ }
+ $result.=join(", ",@timer);
} elsif (&isdateparm($type)) {
$result = &Apache::lonlocal::locallocaltime($value).
- &date_sanity_info($value);
+ &date_sanity_info($value);
} else {
$result = $value;
- $result = &HTML::Entities::encode($result,'"<>&');
+ $result=~s/\,/\, /gs;
+ $result = &HTML::Entities::encode($result,'"<>&');
}
}
return $result;
}
-##################################################
-##################################################
-
-=pod
-
-=item plink
-
-Produces a link anchor.
-Inputs: $type,$dis,$value,$marker,$return,$call
-
-Returns: scalar with html code for a link which will envoke the
-javascript function 'pjump'.
-
-=cut
-
-##################################################
-##################################################
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]};
@@ -615,15 +838,16 @@ sub plink {
my ($hour,$min,$sec,$val)=&preset_defaults($parmname);
unless (defined($winvalue)) { $winvalue=$val; }
my $valout = &valout($value,$type,1);
+ my $unencmarker = $marker;
foreach my $item (\$type, \$dis, \$winvalue, \$marker, \$return, \$call,
- \$hour, \$min, \$sec) {
- $$item = &HTML::Entities::encode($$item,'"<>&');
- $$item =~ s/\'/\\\'/g;
- }
- return '';
+ \$hour, \$min, \$sec) {
+ $$item = &HTML::Entities::encode($$item,'"<>&');
+ $$item =~ s/\'/\\\'/g;
+ }
+ return '';
}
sub page_js {
@@ -633,17 +857,11 @@ sub page_js {
return(<
-
- function pclose() {
- parmwin=window.open("/adm/rat/empty.html","LONCAPAparms",
- "height=350,width=350,scrollbars=no,menubar=no");
- parmwin.close();
- }
+//
+
$selscript
ENDJS
}
+
+sub showhide_js {
+ return <<"COURSECONTENTSCRIPT";
+
+function showHide_courseContent() {
+ var parmlevValue=document.getElementById("parmlev").value;
+ if (parmlevValue == 'general') {
+ document.getElementById('mapmenu').style.display="none";
+ } else {
+ if ((parmlevValue == "full") || (parmlevValue == "map")) {
+ document.getElementById('mapmenu').style.display ="";
+ } else {
+ document.getElementById('mapmenu').style.display="none";
+ }
+ }
+ return;
+}
+
+COURSECONTENTSCRIPT
+}
+
sub startpage {
- my ($r) = @_;
+ my ($r,$psymb) = @_;
- my %loaditems = ('onunload' => "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');";
+ }
- my $start_page =
- &Apache::loncommon::start_page('Set/Modify Course Parameters',
- &page_js(),
- {'add_entries' => \%loaditems,});
- my $breadcrumbs =
- &Apache::lonhtmlcommon::breadcrumbs('Table Mode Parameter Setting','Table_Mode');
+ 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'});
+ }
+ my $js = &page_js().'
+
+';
+ my $start_page =
+ &Apache::loncommon::start_page('Set/Modify Course Parameters',$js,
+ {'add_entries' => \%loaditems,});
+ my $breadcrumbs =
+ &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);
+ &startSettingsScreen($r,'parmset');
$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)=@_;
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;
}
}
my $parm=$$display{$which};
if ($parmlev eq 'full') {
- $r->print(''
- .$$part{$which}.' ');
- } else {
+ $r->print(''
+ .($$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.' ');
-
+ $r->print(''.$parm.' ');
+
my $thismarker=$which;
$thismarker=~s/^parameter\_//;
my $mprefix=$rid.'&'.$thismarker.'&';
@@ -752,9 +1018,9 @@ sub print_row {
} elsif ($cgroup) {
&print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
} elsif ($csec) {
- &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
+ &print_td($r,9,$defbgtwo,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
} else {
- &print_td($r,14,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
+ &print_td($r,14,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
}
} elsif ($parmlev eq 'map') {
@@ -787,41 +1053,41 @@ sub print_row {
&print_td($r,14,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
- &print_td($r,13,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
- &print_td($r,12,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
- &print_td($r,11,'#FFDDDD',$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
- &print_td($r,10,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
-
- 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);
+ &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);
+ }
if ($cgroup) {
&print_td($r,6,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
&print_td($r,5,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
&print_td($r,4,$defbgthree,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
}
-
- if ($uname) {
+
+ if ($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);
+ &print_td($r,2,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
+ &print_td($r,1,$defbgone,$result,\@outpar,$mprefix,$_,\@typeoutpar,$display);
+ }
} # end of $parmlev if/else
- $r->print(''.$effective_parm.' ');
+ $r->print(''.$effective_parm.' ');
if ($parmlev eq 'full') {
my $sessionval=&Apache::lonnet::EXT('resource.'.$$part{$which}.
'.'.$$name{$which},$$symbp{$rid});
my $sessionvaltype=$typeoutpar[$result];
if (!defined($sessionvaltype)) { $sessionvaltype=$$defaulttype{$which}; }
- $r->print(''.
+ $r->print(' '.
&valout($sessionval,$sessionvaltype).' '.
' ');
}
@@ -831,14 +1097,22 @@ sub print_row {
sub print_td {
my ($r,$which,$defbg,$result,$outpar,$mprefix,$value,$typeoutpar,$display)=@_;
- $r->print('');
- if ($which<11 || $which > 12) {
- $r->print(&plink($$typeoutpar[$which],
- $$display{$value},$$outpar[$which],
- $mprefix."$which",'parmform.pres','psub'));
+ $r->print(' ');
+ my $nolink = 0;
+ if ($which == 11 || $which == 12) {
+ $nolink = 1;
+ } elsif ($mprefix =~ /availablestudent\&$/) {
+ if ($which > 3) {
+ $nolink = 1;
+ }
+ }
+ if ($nolink) {
+ $r->print(&valout($$outpar[$which],$$typeoutpar[$which]));
} else {
- $r->print(&valout($$outpar[$which],$$typeoutpar[$which]));
+ $r->print(&plink($$typeoutpar[$which],
+ $$display{$value},$$outpar[$which],
+ $mprefix."$which",'parmform.pres','psub'));
}
$r->print(' '."\n");
}
@@ -856,13 +1130,13 @@ sub print_usergroups {
$courseopt);
my $bgcolor = $defbg;
my $grp_parm;
- if (($coursereply) && ($cgroup ne $resultgroup)) {
+ if (($coursereply) && ($cgroup ne $resultgroup)) {
if ($result > 3) {
- $bgcolor = '"#AAFFAA"';
+ $bgcolor = '#AAFFAA';
$grp_parm = &valout($coursereply,$resulttype);
}
$grp_parm = &valout($coursereply,$resulttype);
- $output = '';
+ $output = ' ';
if ($resultgroup && $resultlevel) {
$output .= ''.$resultgroup.' ('.$resultlevel.'): '.$grp_parm;
} else {
@@ -870,7 +1144,7 @@ sub print_usergroups {
}
$output .= ' ';
} else {
- $output .= ' ';
+ $output .= ' ';
}
return ($coursereply,$output,$grp_parm,$resultgroup);
}
@@ -899,39 +1173,7 @@ sub parm_control_group {
return($coursereply,$resultitem,$resultgroup,$resultlevel,$resulttype);
}
-=pod
-
-=item B: Given the course data hash, extractResourceInformation extracts lots of information about the course's resources into a variety of hashes.
-Input: See list below:
-
-=over 4
-
-=item B: An array that will contain all of the ids in the course.
-
-=item B: hash, id->type, where "type" contains the extension of the file, thus, I.
-
-=item B: hash, id->key list, will contain a comma separated list of the meta-data keys available for the given id
-
-=item B: hash, name of parameter->display value (what is the display value?)
-
-=item B: hash, part identification->text representation of part, where the text representation is "[Part $part]"
-
-=item B: hash, full key to part->display value (what's display value?)
-
-=item B: hash, ???
-
-=item B: ???
-
-=item B: hash, ???
-
-=item B: ??
-
-=item B: hash, id->full sym?
-
-=back
-
-=cut
sub extractResourceInformation {
my $ids = shift;
@@ -952,94 +1194,112 @@ 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= &Apache::lonnet::metadata($srcf,$key.'.display');
- my $parmdis = $display;
- $parmdis =~ s/\[Part.*$//g;
- $$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} = "Part: $part";
+ my $part= &Apache::lonnet::metadata($srcf,$key.'.part');
+ $$allparts{$part} = &mt('Part: [_1]',$part);
#
# Remember all keys going with this resource
#
- if ($$keyp{$id}) {
- $$keyp{$id}.=','.$key;
- } else {
- $$keyp{$id}=$key;
- }
+ if ($$keyp{$id}) {
+ $$keyp{$id}.=','.$key;
+ } else {
+ $$keyp{$id}=$key;
+ }
#
# Put in order
-#
- unless ($$keyorder{$key}) {
- $$keyorder{$key}=$keyordercnt;
- $keyordercnt++;
- }
- }
-
-
- 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 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);
}
}
-##################################################
-##################################################
sub isdateparm {
my $type=shift;
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;
$r->print(<
+//
ENDSCRIPT
- $r->print();
- $r->print("\n');
+
+ $r->print(' ');
+ &shortCuts($r,$allparms,$pscat,$keyorder);
+ $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',
+ 'printopendate' => 'time_settings',
+ 'printclosedate' => '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',
+
+ );
+}
+
+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);
+ }
+ } 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});
+}
+
+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
+ );
+
+}
+
+sub parmboxes {
+ my ($r,$allparms,$pscat,$keyorder)=@_;
+ my $tempkey;
+ my $tempparameter;
+ my %categories = &categories;
+ my %category_order = &category_order();
+ my %categoryList = (
+ 'time_settings' => [],
+ 'grading' => [],
+ 'tries' => [],
+ 'problem_appearance' => [],
+ 'behaviour_of_input_fields' => [],
+ 'hiding' => [],
+ 'high_level_randomization' => [],
+ 'slots' => [],
+ 'file_submission' => [],
+ 'misc' => [],
+ );
+
+ foreach $tempparameter (keys %$allparms) {
+ &whatIsMyCategory($tempparameter, \%categoryList);
+ }
+ #part to print the parm-list
+ $r->print(''."\n");
+
+ #Print parameters
+ for my $key (sort { $category_order{$a} <=> $category_order{$b} } keys %categoryList) {
+ if(@{$categoryList{$key}} == 0) {
+ next;
+ } else {
+ $r->print('
'
+ .'
'
+ .&mt($categories{$key})
+ .' '."\n");
+ foreach $tempkey (&keysindisplayorderCategory($categoryList{$key},$keyorder)) {
+ $r->print(''
+ .' print('value="'.$tempkey.'" ');
+ if ($$pscat[0] eq "all" || grep $_ eq $tempkey, @{$pscat}) {
+ $r->print(' checked="checked"');
+ }
+ $r->print(' />'.($$allparms{$tempkey}=~/\S/ ? $$allparms{$tempkey}
+ : $tempkey)
+ .' '."\n");
+ }
+ $r->print("\n");
+ }
+ }
+
+ $r->print("
\n");
+}
+#
+# This function offers some links on the parameter section to get with one click a group a parameters
+#
+sub shortCuts {
+ my ($r,$allparms,$pscat,$keyorder)=@_;
+
+ # Parameter Selection
+ $r->print(
+ &Apache::lonhtmlcommon::start_funclist(&mt('Parameter Selection'))
+ .&Apache::lonhtmlcommon::add_item_funclist(
+ ''.&mt('Select All').' ')
+ .&Apache::lonhtmlcommon::add_item_funclist(
+ ''.&mt('Select Common Only').' ')
+ .&Apache::lonhtmlcommon::add_item_funclist(
+ ''.&mt('Unselect All').' ')
+ .&Apache::lonhtmlcommon::end_funclist()
+ );
+
+ # Add Selection for...
+ $r->print(
+ &Apache::lonhtmlcommon::start_funclist(&mt('Add Selection for...'))
+ .&Apache::lonhtmlcommon::add_item_funclist(
+ ''.&mt('Problem Dates').' ')
+ .&Apache::lonhtmlcommon::add_item_funclist(
+ ''.&mt('Content Dates').' ')
+ .&Apache::lonhtmlcommon::add_item_funclist(
+ ''.&mt('Discussion Settings').' ')
+ .&Apache::lonhtmlcommon::add_item_funclist(
+ ''.&mt('Visibilities').' ')
+ .&Apache::lonhtmlcommon::add_item_funclist(
+ ''.&mt('Part Parameters').' ')
+ .&Apache::lonhtmlcommon::end_funclist()
+ );
}
sub partmenu {
my ($r,$allparts,$psprt)=@_;
- $r->print('');
+ my $selsize = 1+scalar(keys(%{$allparts}));
+ if ($selsize > 8) {
+ $selsize = 8;
+ }
+
+ $r->print('');
$r->print('print(' selected="selected"') unless (@{$psprt});
$r->print('>'.&mt('All Parts').' ');
my %temphash=();
foreach (@{$psprt}) { $temphash{$_}=1; }
foreach my $tempkey (sort {
- if ($a==$b) { return ($a cmp $b) } else { return ($a <=> $b); }
+ if ($a==$b) { return ($a cmp $b) } else { return ($a <=> $b); }
} keys(%{$allparts})) {
- unless ($tempkey =~ /\./) {
- $r->print('print(' selected="selected"');
- }
- $r->print('>'.$$allparts{$tempkey}.' ');
- }
+ unless ($tempkey =~ /\./) {
+ $r->print('print(' selected="selected"');
+ }
+ $r->print('>'.$$allparts{$tempkey}.' ');
+ }
}
$r->print(' ');
}
@@ -1160,36 +1597,35 @@ sub usermenu {
my $chooseopt=&Apache::loncommon::select_dom_form($udom,'udom').' '.
&Apache::loncommon::selectstudent_link('parmform','uname','udom');
my $selscript=&Apache::loncommon::studentbrowser_javascript();
- my %lt=&Apache::lonlocal::texthash(
- 'se' => "Section",
- 'gr' => "Group",
- 'fu' => "For User",
- 'oi' => "or ID",
- 'ad' => "at Domain"
- );
+
my $sections='';
my %sectionhash = &Apache::loncommon::get_sections();
my $groups;
my %grouphash = &Apache::longroup::coursegroups();
+ my $g_s_header='';
+ my $g_s_footer='';
+
if (%sectionhash) {
- $sections=$lt{'se'}.': '.$section.
+ foreach my $section ('',sort keys %sectionhash) {
+ $sections.=''.$section.
' ';
}
$sections.=' ';
}
+
if (%sectionhash && %grouphash && $parmlev ne 'full') {
- $sections .= ' or ';
+ $sections .= ' '.&mt('or').' ';
$sections .= qq|
|;
} else {
$sections .= qq|
|;
- }
+ }
if (%grouphash) {
- $groups=$lt{'gr'}.': ';
}
- $r->print(<
-$sections
-$groups
-
-$lt{'fu'}
-
-$lt{'oi'}
-
-$lt{'ad'}
-$chooseopt
-
-ENDMENU
+
+ if (%sectionhash || %grouphash) {
+ $r->print(&Apache::lonhtmlcommon::row_title(&mt('Group/Section')));
+ $r->print($sections.$groups);
+ $r->print(&Apache::lonhtmlcommon::row_closure());
+ }
+
+ $r->print(&Apache::lonhtmlcommon::row_title(&mt('User')));
+ $r->print(&mt('For User [_1] or Student/Employee ID [_2] at Domain [_3]'
+ ,' '
+ ,' '
+ ,$chooseopt));
}
+#
+# This function shows on table Mode the available Parameters for the selected Resources
+#
sub displaymenu {
- my ($r,$allparms,$allparts,$pscat,$psprt,$keyorder)=@_;
- $r->print(''.&mt('Select Parameters to View').' '.
- &mt('Select Parts to View').' ');
+ my ($r,$allparms,$pscat,$psprt,$keyorder)=@_;
+
+ $r->print(&Apache::lonhtmlcommon::start_pick_box());
+ $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parameters to View')));
+
&parmmenu($r,$allparms,$pscat,$keyorder);
- $r->print(' ');
- &partmenu($r,$allparts,$psprt);
- $r->print('
');
+ $r->print(&Apache::loncommon::start_scrollbox());
+ &parmboxes($r,$allparms,$pscat,$keyorder);
+ $r->print(&Apache::loncommon::end_scrollbox());
+
+ $r->print(&Apache::lonhtmlcommon::row_closure(1));
+ $r->print(&Apache::lonhtmlcommon::end_pick_box());
+
}
sub mapmenu {
- my ($r,$allmaps,$pschp,$maptitles)=@_;
- $r->print(''.&mt('Select Enclosing Map or Folder').' ');
- $r->print('');
- $r->print(''.&mt('All Maps or Folders').' ');
- foreach (sort {$$allmaps{$a} cmp $$allmaps{$b}} keys %{$allmaps}) {
- $r->print('print(' selected="selected"'); }
- $r->print('>'.$$maptitles{$_}.($$allmaps{$_}!~/^uploaded/?' ['.$$allmaps{$_}.']':'').' ');
+ my ($r,$allmaps,$pschp,$maptitles,$symbp)=@_;
+ my %allmaps_inverted = reverse %$allmaps;
+ my $navmap = Apache::lonnavmaps::navmap->new();
+ my $tree=[];
+ my $treeinfo={};
+ if (defined($navmap)) {
+ my $it=$navmap->getIterator(undef,undef,undef,1,1,undef);
+ my $curRes;
+ my $depth = 0;
+ my %parent = ();
+ my $startcount = 5;
+ my $lastcontainer = $startcount;
+# preparing what is to show ...
+ while ($curRes = $it->next()) {
+ if ($curRes == $it->BEGIN_MAP()) {
+ $depth++;
+ $parent{$depth}= $lastcontainer;
+ }
+ if ($curRes == $it->END_MAP()) {
+ $depth--;
+ $lastcontainer = $parent{$depth};
+ }
+ if (ref($curRes)) {
+ my $symb = $curRes->symb();
+ my $ressymb = $symb;
+ if (($curRes->is_sequence()) || ($curRes->is_page())) {
+ my $type = 'sequence';
+ if ($curRes->is_page()) {
+ $type = 'page';
+ }
+ my $id= $curRes->id();
+ my $srcf = $curRes->src();
+ my $resource_name = &Apache::lonnet::gettitle($srcf);
+ if(!exists($treeinfo->{$id})) {
+ push(@$tree,$id);
+ my $enclosing_map_folder = &Apache::lonnet::declutter($curRes->enclosing_map_src());
+ $treeinfo->{$id} = {
+ depth => $depth,
+ type => $type,
+ name => $resource_name,
+ enclosing_map_folder => $enclosing_map_folder,
+ };
+ }
+ }
+ }
+ }
+ }
+# Show it ...
+ $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Enclosing Map or Folder'),'','',' id="mapmenu"'));
+ if ((ref($tree) eq 'ARRAY') && (ref($treeinfo) eq 'HASH')) {
+ my $icon = ' ';
+ my $whitespace =
+ ' ';
+
+ # Info about selectable folders/maps
+ $r->print(
+ ''
+ .&mt('You can only select maps and folders which have modifiable settings.')
+ .' '.&Apache::loncommon::help_open_topic('Parameter_Set_Folder')
+ .'
'
+ );
+
+ $r->print(&Apache::loncommon::start_scrollbox(undef,undef,undef,'mapmenuscroll'));
+ $r->print(&Apache::loncommon::start_data_table(undef,'mapmenuinner'));
+
+ # Display row: "All Maps or Folders"
+ $r->print(
+ &Apache::loncommon::start_data_table_row(undef,'picklevel')
+ .''
+ .''
+ .' print(' checked="checked"') if ($pschp eq 'all' || !$pschp);
+ $r->print(
+ ' value="all" /> '.$icon.' '
+ .&mt('All Maps or Folders')
+ .' '
+ .' '
+ .&Apache::loncommon::end_data_table_row()
+ );
+
+ # Display row: "Main Course Documents"
+ if (exists($$allmaps{1})) {
+ $r->print(
+ &Apache::loncommon::start_data_table_row()
+ .''
+ .''
+ .' print(' checked="checked"') if ($pschp eq '1');
+ $r->print(
+ '/> '.$icon.' '
+ .$$maptitles{1}
+ .($$allmaps{1} !~/^uploaded/?' ['.$$allmaps{1}.']':'')
+ .' '
+ .' '
+ .&Apache::loncommon::end_data_table_row()
+ );
+ }
+
+ # Display rows for all course maps and folders
+ foreach my $id (@{$tree}) {
+ my ($mapid,$resid)=split(/\./,$id);
+ # Indentation
+ my $depth = $treeinfo->{$id}->{'depth'};
+ my $indent;
+ for (my $i = 0; $i < $depth; $i++) {
+ $indent.= $whitespace;
+ }
+ $icon = ' ';
+ if ($treeinfo->{$id}->{'type'} eq 'page') {
+ $icon = ' ';
+ }
+ my $symb_name = $$symbp{$id};
+ my ($front, $tail) = split (/___${resid}___/, $symb_name);
+ $symb_name = $tail;
+ $r->print(
+ &Apache::loncommon::start_data_table_row()
+ .''
+ .''
+ );
+ # Only offer radio button for folders/maps which can be parameterized
+ if ($allmaps_inverted{$symb_name}) {
+ $r->print(
+ ' print(' checked="checked"') if ($allmaps_inverted{$symb_name} eq $pschp);
+ $r->print('/>');
+ } else {
+ $r->print($whitespace);
+ }
+ $r->print(
+ $indent.$icon.' '
+ .$treeinfo->{$id}->{name}
+ .($$allmaps{$mapid}!~/^uploaded/?' ['.$$allmaps{$mapid}.']':'')
+ .' '
+ .' '
+ .&Apache::loncommon::end_data_table_row()
+ );
+ }
+
+ $r->print(&Apache::loncommon::end_data_table().
+ ' '.
+ &Apache::loncommon::end_scrollbox());
}
- $r->print(" ");
}
+# Build up the select Box to choose if your parameter specification should work for the resource, map/folder or the course level
+# The value of default selection in the select box is set by the value that is given by the argument in $parmlev.
sub levelmenu {
my ($r,$alllevs,$parmlev)=@_;
- $r->print(''.&mt('Select Parameter Level').
- &Apache::loncommon::help_open_topic('Course_Parameter_Levels').' ');
- $r->print('');
+
+ $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parameter Level').&Apache::loncommon::help_open_topic('Course_Parameter_Levels')));
+ $r->print('');
foreach (reverse sort keys %{$alllevs}) {
- $r->print('print(' selected="selected"');
- }
- $r->print('>'.&mt($_).' ');
+ $r->print('print(' selected="selected"');
+ }
+ $r->print('>'.&mt($_).' ');
}
$r->print(" ");
}
@@ -1295,16 +1882,16 @@ sub sectionmenu {
my %sectionhash = &Apache::loncommon::get_sections();
return if (!%sectionhash);
- $r->print('');
+ $r->print('');
foreach my $s ('all',sort keys %sectionhash) {
- $r->print(' print(' selected="selected"');
- last;
- }
- }
- $r->print('>'.$s." \n");
+ $r->print(' print(' selected="selected"');
+ last;
+ }
+ }
+ $r->print('>'.$s." \n");
}
$r->print(" \n");
}
@@ -1314,16 +1901,16 @@ sub groupmenu {
my %grouphash = &Apache::longroup::coursegroups();
return if (!%grouphash);
- $r->print('');
+ $r->print('');
foreach my $group (sort(keys(%grouphash))) {
- $r->print(' print(' selected="selected"');
- last;
- }
- }
- $r->print('>'.$group." \n");
+ $r->print(' print(' selected="selected"');
+ last;
+ }
+ }
+ $r->print('>'.$group." \n");
}
$r->print(" \n");
}
@@ -1337,26 +1924,26 @@ sub keysplit {
sub keysinorder {
my ($name,$keyorder)=@_;
return sort {
- $$keyorder{$a} <=> $$keyorder{$b};
+ $$keyorder{$a} <=> $$keyorder{$b};
} (keys %{$name});
}
sub keysinorder_bytype {
my ($name,$keyorder)=@_;
return sort {
- my $ta=(split('_',$a))[-1];
- my $tb=(split('_',$b))[-1];
- if ($$keyorder{'parameter_0_'.$ta} == $$keyorder{'parameter_0_'.$tb}) {
- return ($a cmp $b);
- }
- $$keyorder{'parameter_0_'.$ta} <=> $$keyorder{'parameter_0_'.$tb};
+ my $ta=(split('_',$a))[-1];
+ my $tb=(split('_',$b))[-1];
+ if ($$keyorder{'parameter_0_'.$ta} == $$keyorder{'parameter_0_'.$tb}) {
+ return ($a cmp $b);
+ }
+ $$keyorder{'parameter_0_'.$ta} <=> $$keyorder{'parameter_0_'.$tb};
} (keys %{$name});
}
sub keysindisplayorder {
my ($name,$keyorder)=@_;
return sort {
- $$keyorder{'parameter_0_'.$a} <=> $$keyorder{'parameter_0_'.$b};
+ $$keyorder{'parameter_0_'.$a} <=> $$keyorder{'parameter_0_'.$b};
} (keys %{$name});
}
@@ -1364,74 +1951,51 @@ sub sortmenu {
my ($r,$sortorder)=@_;
$r->print(' print(' checked="on"');
+ $r->print(' checked="checked"');
}
$r->print(' />'.&mt('Sort by realm first, then student (group/section)'));
$r->print(' print(' checked="on"');
+ $r->print(' checked="checked"');
}
$r->print(' />'.&mt('Sort by student (group/section) first, then realm').
- ' ');
+ '');
}
sub standardkeyorder {
return ('parameter_0_opendate' => 1,
- 'parameter_0_duedate' => 2,
- 'parameter_0_answerdate' => 3,
- 'parameter_0_interval' => 4,
- 'parameter_0_weight' => 5,
- 'parameter_0_maxtries' => 6,
- 'parameter_0_hinttries' => 7,
- 'parameter_0_contentopen' => 8,
- 'parameter_0_contentclose' => 9,
- 'parameter_0_type' => 10,
- 'parameter_0_problemstatus' => 11,
- 'parameter_0_hiddenresource' => 12,
- 'parameter_0_hiddenparts' => 13,
- 'parameter_0_display' => 14,
- 'parameter_0_ordered' => 15,
- 'parameter_0_tol' => 16,
- 'parameter_0_sig' => 17,
- 'parameter_0_turnoffunit' => 18,
- 'parameter_0_discussend' => 19,
- 'parameter_0_discusshide' => 20);
+ 'parameter_0_duedate' => 2,
+ 'parameter_0_answerdate' => 3,
+ 'parameter_0_interval' => 4,
+ 'parameter_0_weight' => 5,
+ 'parameter_0_maxtries' => 6,
+ 'parameter_0_hinttries' => 7,
+ 'parameter_0_contentopen' => 8,
+ 'parameter_0_contentclose' => 9,
+ 'parameter_0_type' => 10,
+ 'parameter_0_problemstatus' => 11,
+ 'parameter_0_hiddenresource' => 12,
+ 'parameter_0_hiddenparts' => 13,
+ 'parameter_0_display' => 14,
+ 'parameter_0_ordered' => 15,
+ 'parameter_0_tol' => 16,
+ 'parameter_0_sig' => 17,
+ 'parameter_0_turnoffunit' => 18,
+ 'parameter_0_discussend' => 19,
+ 'parameter_0_discusshide' => 20,
+ 'parameter_0_discussvote' => 21,
+ 'parameter_0_printopendate' => 22,
+ 'parameter_0_printclosedate' => 23);
}
-##################################################
-##################################################
-
-=pod
-=item assessparms
-
-Show assessment data and parameters. This is a large routine that should
-be simplified and shortened... someday.
-
-Inputs: $r
-
-Returns: nothing
-
-Variables used (guessed by Jeremy):
-
-=over 4
-
-=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?
-
-=item B:
-
-=back
-
-=cut
-
-##################################################
-##################################################
sub assessparms {
my $r=shift;
+
+
+# -------------------------------------------------------- Variable declaration
my @ids=();
my %symbp=();
my %mapp=();
@@ -1439,9 +2003,6 @@ sub assessparms {
my %keyp=();
my %uris=();
my %maptitles=();
-
-# -------------------------------------------------------- Variable declaration
-
my %allmaps=();
my %alllevs=();
@@ -1451,7 +2012,7 @@ sub assessparms {
my $csec;
my $cgroup;
my @usersgroups = ();
-
+
my $coursename=$env{'course.'.$env{'request.course.id'}.'.description'};
$alllevs{'Resource Level'}='full';
@@ -1460,14 +2021,16 @@ sub assessparms {
my %allparms;
my %allparts;
+# ------------------------------------------------------------------------------
+
#
# Order in which these parameters will be displayed
#
my %keyorder=&standardkeyorder();
- @ids=();
- %symbp=();
- %typep=();
+# @ids=();
+# %symbp=(); # These seem defined above already.
+# %typep=();
my $message='';
@@ -1478,17 +2041,21 @@ sub assessparms {
} elsif ($udom=$env{'request.role.domain'}) {
} elsif ($udom=$env{'user.domain'}) {
} else {
- $udom=$r->dir_config('lonDefDomain');
+ $udom=$r->dir_config('lonDefDomain');
}
+
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'; }
+ if (!@psprt) { $psprt[0]='all'; }
+ if (($env{'form.part'}) && ($psprt[0] ne 'all')) { $psprt[0]=$env{'form.part'}; }
my $pssymb='';
my $parmlev='';
-
+
unless ($env{'form.parmlev'}) {
$parmlev = 'map';
} else {
@@ -1498,63 +2065,62 @@ sub assessparms {
# ----------------------------------------------- Was this started from grades?
if (($env{'form.command'} eq 'set') && ($env{'form.url'})
- && (!$env{'form.dis'})) {
- my $url=$env{'form.url'};
- $url=~s-^http://($ENV{'SERVER_NAME'}|$ENV{'HTTP_HOST'})--;
- $pssymb=&Apache::lonnet::symbread($url);
- if (!@pscat) { @pscat=('all'); }
- $pschp='';
+ && (!$env{'form.dis'})) {
+ my $url=$env{'form.url'};
+ $url=~s-^http://($ENV{'SERVER_NAME'}|$ENV{'HTTP_HOST'})--;
+ $pssymb=&Apache::lonnet::symbread($url);
+ if (!@pscat) { @pscat=('all'); }
+ $pschp='';
$parmlev = 'full';
} elsif ($env{'form.symb'}) {
- $pssymb=$env{'form.symb'};
- if (!@pscat) { @pscat=('all'); }
- $pschp='';
+ $pssymb=$env{'form.symb'};
+ if (!@pscat) { @pscat=('all'); }
+ $pschp='';
$parmlev = 'full';
} else {
- $env{'form.url'}='';
+ $env{'form.url'}='';
}
my $id=$env{'form.id'};
if (($id) && ($udom)) {
- $uname=(&Apache::lonnet::idget($udom,$id))[1];
- if ($uname) {
- $id='';
- } else {
- $message=
- ''.&mt("Unknown ID")." '$id' ".
- &mt('at domain')." '$udom' ";
- }
+ $uname=(&Apache::lonnet::idget($udom,$id))[1];
+ if ($uname) {
+ $id='';
+ } else {
+ $message=
+ ''.&mt("Unknown ID")." '$id' ".
+ &mt('at domain')." '$udom' ";
+ }
} else {
- $uname=$env{'form.uname'};
+ $uname=$env{'form.uname'};
}
unless ($udom) { $uname=''; }
$uhome='';
if ($uname) {
- $uhome=&Apache::lonnet::homeserver($uname,$udom);
+ $uhome=&Apache::lonnet::homeserver($uname,$udom);
if ($uhome eq 'no_host') {
- $message=
- ''.&mt("Unknown user")." '$uname' ".
- &mt("at domain")." '$udom' ";
- $uname='';
+ $message=
+ ''.&mt("Unknown user")." '$uname' ".
+ &mt("at domain")." '$udom' ";
+ $uname='';
} else {
- $csec=&Apache::lonnet::getsection($udom,$uname,
- $env{'request.course.id'});
-
- if ($csec eq '-1') {
- $message=''.
- &mt("User")." '$uname' ".&mt("at domain")." '$udom' ".
- &mt("not in this course")." ";
- $uname='';
- $csec=$env{'form.csec'};
+ $csec=&Apache::lonnet::getsection($udom,$uname,
+ $env{'request.course.id'});
+ if ($csec eq '-1') {
+ $message=''.
+ &mt("User")." '$uname' ".&mt("at domain")." '$udom' ".
+ &mt("not in this course")." ";
+ $uname='';
+ $csec=$env{'form.csec'};
$cgroup=$env{'form.cgroup'};
- } else {
- my %name=&Apache::lonnet::userenvironment($udom,$uname,
- ('firstname','middlename','lastname','generation','id'));
- $message="\n\n".&mt("Full Name").": ".
- $name{'firstname'}.' '.$name{'middlename'}.' '
- .$name{'lastname'}.' '.$name{'generation'}.
- " \n".&mt('ID').": ".$name{'id'}.'
';
- }
+ } else {
+ my %name=&Apache::lonnet::userenvironment($udom,$uname,
+ ('firstname','middlename','lastname','generation','id'));
+ $message="\n
\n".&mt("Full Name").": ".
+ $name{'firstname'}.' '.$name{'middlename'}.' '
+ .$name{'lastname'}.' '.$name{'generation'}.
+ " \n".&mt('Student/Employee ID').": ".$name{'id'}.'
';
+ }
@usersgroups = &Apache::lonnet::get_users_groups(
$udom,$uname,$env{'request.course.id'});
if (@usersgroups > 0) {
@@ -1569,9 +2135,9 @@ sub assessparms {
unless ($cgroup) { $cgroup=''; }
# --------------------------------------------------------- Get all assessments
- &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps,
- \%mapp, \%symbp,\%maptitles,\%uris,
- \%keyorder);
+ &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps,
+ \%mapp, \%symbp,\%maptitles,\%uris,
+ \%keyorder);
$mapp{'0.0'} = '';
$symbp{'0.0'} = '';
@@ -1581,53 +2147,190 @@ sub assessparms {
my @markers=split(/\&\&\&/,$env{'form.pres_marker'});
my @values=split(/\&\&\&/,$env{'form.pres_value'});
my @types=split(/\&\&\&/,$env{'form.pres_type'});
- for (my $i=0;$i<=$#markers;$i++) {
- $message.=&storeparm(split(/\&/,$markers[$i]),
- $values[$i],
- $types[$i],
- $uname,$udom,$csec,$cgroup);
- }
+ my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+ my $chome = $env{'course.'.$env{'request.course.id'}.'.home'};
+ my ($got_chostname,$chostname,$cmajor,$cminor);
+ my $totalstored = 0;
+
+
+ for (my $i=0;$i<=$#markers;$i++) {
+ my ($needsrelease,$needsnewer,$name);
+ if ($markers[$i] =~ /^[\d.]+\&0_availablestudent\&(1|2|3)$/) {
+ my (@ok_slots,@fail_slots,@del_slots);
+ my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom);
+ my ($level,@all) =
+ &parmval_by_symb('0.availablestudent',$pssymb,'',$uname,$udom,
+ $csec,$cgroup,$courseopt);
+ foreach my $slot_name (split(/:/,$values[$i])) {
+ next if ($slot_name eq '');
+ if (&update_slots($slot_name,$cdom,$cnum,$pssymb,$uname,$udom) eq 'ok') {
+ push(@ok_slots,$slot_name);
+
+ } else {
+ push(@fail_slots,$slot_name);
+ }
+ }
+ if (@ok_slots) {
+ $values[$i] = join(':',@ok_slots);
+ } else {
+ $values[$i] = '';
+ }
+ if ($all[$level] ne '') {
+ my @existing = split(/:/,$all[$level]);
+ foreach my $slot_name (@existing) {
+ if (!grep(/^\Q$slot_name\E$/,split(/:/,$values[$i]))) {
+ if (&delete_slots($slot_name,$cdom,$cnum,$uname,$udom,$pssymb) eq 'ok') {
+ push(@del_slots,$slot_name);
+ }
+ }
+ }
+ }
+ } elsif ($markers[$i] =~ /_(type|lenient|retrypartial|discussvote)\&\d+$/) {
+ $name = $1;
+ $needsrelease =
+ $Apache::lonnet::needsrelease{"parameter:$name:$values[$i]"};
+ if ($needsrelease) {
+ unless ($got_chostname) {
+ ($chostname,$cmajor,$cminor) = ¶meter_release_vars();
+ $got_chostname = 1;
+ }
+ $needsnewer = ¶meter_releasecheck($name,$values[$i],
+ $needsrelease,
+ $chostname,
+ $cmajor,$cminor);
+ }
+ }
+ if ($needsnewer) {
+ $message .= &oldversion_warning($name,$values[$i],$chostname,$cmajor,
+ $cminor,$needsrelease);
+ } else {
+ $message.=&storeparm(split(/\&/,$markers[$i]),
+ $values[$i],
+ $types[$i],
+ $uname,$udom,$csec,$cgroup);
+ $totalstored ++;
+ }
+ }
# ---------------------------------------------------------------- Done storing
- $message.='
'.&mt('Changes can take up to 10 minutes before being active for all students.').&Apache::loncommon::help_open_topic('Caching').' ';
+ if ($totalstored) {
+ $message.=''
+ .&mt('Changes can take up to 10 minutes before being active for all students.')
+ .&Apache::loncommon::help_open_topic('Caching')
+ .'
';
+ }
}
#----------------------------------------------- if all selected, fill in array
if ($pscat[0] eq "all") {@pscat = (keys %allparms);}
- if (!@pscat) { @pscat=('duedate','opendate','answerdate','weight','maxtries') };
+ if (!@pscat) { @pscat=('duedate','opendate','answerdate','weight','maxtries','type','problemstatus') };
if ($psprt[0] eq "all" || !@psprt) {@psprt = (keys %allparts);}
# ------------------------------------------------------------------ Start page
- &startpage($r);
+ &startpage($r,$pssymb);
foreach ('tolerance','date_default','date_start','date_end',
- 'date_interval','int','float','string') {
- $r->print(' ').
- '" name="recent_'.$_.'" />');
+ 'date_interval','int','float','string') {
+ $r->print(' ').
+ '" name="recent_'.$_.'" />');
}
-
+
+ # ----- Start Parameter Selection
+
+ # Hide parm selection?
+ $r->print(<
+//
+
+ENDPARMSELSCRIPT
+
if (!$pssymb) {
- $r->print('');
+ my $parmselhiddenstyle=' style="display:none"';
+ if($env{'form.hideparmsel'} eq 'hidden') {
+ $r->print('');
+ } else {
+ $r->print('
');
+ }
+
+ # Step 1
+ $r->print(&Apache::lonhtmlcommon::topic_bar(1,&mt('Resource Specification'),'parmstep1'));
+ $r->print('
+
+');
+ $r->print(&Apache::lonhtmlcommon::start_pick_box(undef,'parmlevel'));
&levelmenu($r,\%alllevs,$parmlev);
- if ($parmlev ne 'general') {
- $r->print('
');
- &mapmenu($r,\%allmaps,$pschp,\%maptitles);
- $r->print(' ');
- }
- $r->print('
');
- &displaymenu($r,\%allparms,\%allparts,\@pscat,\@psprt,\%keyorder);
+ $r->print(&Apache::lonhtmlcommon::row_closure());
+ &mapmenu($r,\%allmaps,$pschp,\%maptitles, \%symbp);
+ $r->print(&Apache::lonhtmlcommon::row_closure());
+ $r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parts to View')));
+ &partmenu($r,\%allparts,\@psprt);
+ $r->print(&Apache::lonhtmlcommon::row_closure(1));
+ $r->print(&Apache::lonhtmlcommon::end_pick_box());
+
+ # Step 2
+ $r->print(&Apache::lonhtmlcommon::topic_bar(2,&mt('Parameter Specification'),'parmstep2'));
+ &displaymenu($r,\%allparms,\@pscat,\@psprt,\%keyorder);
+
+ # Step 3
+ $r->print(&Apache::lonhtmlcommon::topic_bar(3,&mt('User Specification (optional)'),'parmstep3'));
+ $r->print(&Apache::lonhtmlcommon::start_pick_box());
+ &usermenu($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,\@usersgroups);
+ $r->print(&Apache::lonhtmlcommon::row_closure(1));
+ $r->print(&Apache::lonhtmlcommon::end_pick_box());
+
+ # Update Display Button
+ $r->print(''
+ .' '
+ .' '
+ .'
');
+ $r->print('');
+
+ # Offer link to display parameter selection again
+ $r->print('print($parmselhiddenstyle);
+ }
+ $r->print('>'
+ .''
+ .&mt('Change Parameter Selection')
+ .' '
+ .'
');
} else {
- my ($map,$id,$resource)=&Apache::lonnet::decode_symb($pssymb);
- my $title = &Apache::lonnet::gettitle($pssymb);
- $r->print(&mt('Specific Resource: [_1] ([_2])',$title,$resource).
- ' '.
- ''.&mt('Show all parts').': ');
+ $r->print();
+ # parameter screen for a single resource.
+ my ($map,$iid,$resource)=&Apache::lonnet::decode_symb($pssymb);
+ my $title = &Apache::lonnet::gettitle($pssymb);
+ $r->print(&mt('Specific Resource: [_1] ([_2])',
+ $title,''.$resource.' ').
+ ' '.
+ ' ');
+ $r->print(&Apache::lonhtmlcommon::topic_bar('',&mt('Additional Display Specification (optional)')));
+ $r->print(&Apache::lonhtmlcommon::start_pick_box());
+ &usermenu($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,\@usersgroups);
+ $r->print(&Apache::lonhtmlcommon::row_closure(1));
+ $r->print(&Apache::lonhtmlcommon::end_pick_box());
+ $r->print(''
+ .' '
+ .' '
+ .'
');
}
- &usermenu($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,\@usersgroups);
+
+ # ----- End Parameter Selection
- $r->print(''.$message.'
');
+ # Display Messages
+ $r->print(''.$message.'
');
- $r->print(' ');
my @temp_pscat;
map {
@@ -1644,106 +2347,113 @@ sub assessparms {
my $csudom=$env{'user.domain'};
if ($parmlev eq 'full') {
- my $coursespan=$csec?8:5;
- my $userspan=3;
- if ($cgroup ne '') {
- $coursespan += 3;
- }
-
- $r->print('
');
- $r->print(' ');
- $r->print(''.&mt('Any User').' ');
- if ($uname) {
- if (@usersgroups > 1) {
- $userspan ++;
+#
+# 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(&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(<$lt{'pie'}
-$lt{'csv'} ($csuname $lt{'at'} $csudom)
- $lt{'ic'} $lt{'rl'}
-$lt{'ic'}
+
+ $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 ");
+ }
+ my %lt=&Apache::lonlocal::texthash(
+ 'pie' => "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:$csudom)
+ $lt{'ic'} $lt{'rl'}
+$lt{'ic'}
ENDTABLETWO
- if ($csec) {
- $r->print("".
- &mt("in Section")." $csec ");
- }
- if ($cgroup) {
- $r->print("".
- &mt("in Group")." $cgroup ");
- }
- $r->print(<print(''.
+ &mt("in Section")." $csec ");
+ }
+ if ($cgroup) {
+ $r->print(''.
+ &mt("in Group")." $cgroup ");
+ }
+ $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})) {
+ if ((!$pssymb &&
+ (($pschp eq 'all') || ($allmaps{$pschp} eq $mapp{$rid})))
+ ||
+ ($pssymb && $pssymb eq $symbp{$rid})) {
# ------------------------------------------------------ Entry for one resource
- if ($defbgone eq '"#E0E099"') {
- $defbgone='"#E0E0DD"';
+ if ($defbgone eq '#E0E099') {
+ $defbgone='#E0E0DD';
} else {
- $defbgone='"#E0E099"';
+ $defbgone='#E0E099';
}
- if ($defbgtwo eq '"#FFFF99"') {
- $defbgtwo='"#FFFFDD"';
+ if ($defbgtwo eq '#FFFF99') {
+ $defbgtwo='#FFFFDD';
} else {
- $defbgtwo='"#FFFF99"';
+ $defbgtwo='#FFFF99';
}
- if ($defbgthree eq '"#FFBB99"') {
- $defbgthree='"#FFBBDD"';
+ if ($defbgthree eq '#FFBB99') {
+ $defbgthree='#FFBBDD';
} else {
- $defbgthree='"#FFBB99"';
+ $defbgthree='#FFBB99';
}
my $thistitle='';
@@ -1755,12 +2465,28 @@ 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');
- $display{$_}=&Apache::lonnet::metadata($uri,$_.'.display');
+
+ my $parmdis=&Apache::lonnet::metadata($uri,$_.'.display');
+ if ($allparms{$name{$_}} ne '') {
+ my $identifier;
+ if ($parmdis =~ /(\s*\[Part.*)$/) {
+ $identifier = $1;
+ }
+ $display{$_} = $allparms{$name{$_}}.$identifier;
+ } else {
+ $display{$_} = $parmdis;
+ }
unless ($display{$_}) { $display{$_}=''; }
$display{$_}.=' ('.$name{$_}.')';
$default{$_}=&Apache::lonnet::metadata($uri,$_);
@@ -1770,16 +2496,16 @@ ENDTABLEHEADFOUR
}
my $totalparms=scalar keys %name;
if ($totalparms>0) {
- my $firstrow=1;
- my $title=&Apache::lonnet::gettitle($symbp{$rid});
- $r->print(''.
+ '>'.
join(' / ',split(/\//,$uri)).
' '.
"$title");
@@ -1787,15 +2513,15 @@ ENDTABLEHEADFOUR
$r->print(' ('.$thistitle.')');
}
$r->print('
');
- $r->print(''.$typep{$rid}.
' ');
- $r->print(''.$maptitles{$mapp{$rid}}.' ');
-
foreach (&keysinorder_bytype(\%name,\%keyorder)) {
+
unless ($firstrow) {
$r->print('');
} else {
@@ -1810,25 +2536,25 @@ ENDTABLEHEADFOUR
}
} # 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') {
- my $defbgone = '"E0E099"';
- my $defbgtwo = '"FFFF99"';
- my $defbgthree = '"FFBB99"';
+ my $defbgone = '#E0E099';
+ my $defbgtwo = '#FFFF99';
+ my $defbgthree = '#FFBB99';
my %maplist;
if ($pschp eq 'all') {
- %maplist = %allmaps;
+ %maplist = %allmaps;
} else {
%maplist = ($pschp => $mapp{$pschp});
}
#-------------------------------------------- for each map, gather information
my $mapid;
- foreach $mapid (sort {$maplist{$a} cmp $maplist{$b}} keys %maplist) {
+ foreach $mapid (sort {$maplist{$a} cmp $maplist{$b}} keys %maplist) {
my $maptitle = $maplist{$mapid};
#----------------------- loop through ids and get all parameter types for map
@@ -1840,16 +2566,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");
#--------------------------------------------------------------------
@@ -1859,31 +2585,40 @@ 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');
- $display{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
- 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
my $foldermap=&mt($maptitle=~/^uploaded/?'Folder':'Map');
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 {
@@ -1904,27 +2639,32 @@ ENDTABLEHEADFOUR
,''.$coursename.' '
)
." \n"
- );
+ );
#---------------------------------------------------------------- print table
- $r->print('
');
- $r->print(''.&mt('Parameter Name').' ');
- $r->print(''.&mt('Default Value').' ');
- $r->print(''.&mt('Parameter in Effect').' ');
+ $r->print(''.&Apache::loncommon::start_data_table()
+ .&Apache::loncommon::start_data_table_header_row()
+ .'
'.&mt('Parameter Name').' '
+ .''.&mt('Default Value').' '
+ .''.&mt('Parameter in Effect').' '
+ .&Apache::loncommon::end_data_table_header_row()
+ );
- foreach (&keysinorder(\%name,\%keyorder)) {
- $r->print('');
+ 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);
}
- $r->print("
");
+ $r->print(&Apache::loncommon::end_data_table().'
'
+ .''
+ );
} # end each map
} # end of $parmlev eq map
#--------------------------------- Entry for parm level general (Course level)
if ($parmlev eq 'general') {
- my $defbgone = '"E0E099"';
- my $defbgtwo = '"FFFF99"';
- my $defbgthree = '"FFBB99"';
+ my $defbgone = '#E0E099';
+ my $defbgtwo = '#FFFF99';
+ my $defbgthree = '#FFBB99';
#-------------------------------------------- for each map, gather information
my $mapid="0.0";
@@ -1935,10 +2675,10 @@ ENDTABLEHEADFOUR
my %display = ();
my %type = ();
my %default = ();
-
+
foreach (@ids) {
my $rid = $_;
-
+
my $uri=&Apache::lonnet::declutter($uris{$rid});
#--------------------------------------------------------------------
@@ -1949,684 +2689,74 @@ 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');
- $display{$tempkeyp}=&Apache::lonnet::metadata($uri,$fullkeyp.'.display');
- 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');
- }
+ 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 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
+
+$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");
}
-
+
if ($csec) {$r->print(&mt("Section")." $csec \n")};
if ($cgroup) {$r->print(&mt("Group")." $cgroup \n")};
$r->print(" \n");
#---------------------------------------------------------------- print table
- $r->print('
');
- $r->print(''.&mt('Parameter Name').' ');
- $r->print(''.&mt('Default Value').' ');
- $r->print(''.&mt('Parameter in Effect').' ');
+ $r->print(''.&Apache::loncommon::start_data_table()
+ .&Apache::loncommon::start_data_table_header_row()
+ .'
'.&mt('Parameter Name').' '
+ .''.&mt('Default Value').' '
+ .''.&mt('Parameter in Effect').' '
+ .&Apache::loncommon::end_data_table_header_row()
+ );
- foreach (&keysinorder(\%name,\%keyorder)) {
- $r->print('');
+ 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);
}
- $r->print("
");
+ $r->print(&Apache::loncommon::end_data_table()
+ .''
+ .''
+ );
} # end of $parmlev eq general
}
- $r->print(''.&Apache::loncommon::end_page());
+ $r->print('');
+ &endSettingsScreen($r);
+ $r->print(&Apache::loncommon::end_page());
} # end sub assessparms
-
-##################################################
-##################################################
-
-=pod
-
-=item crsenv
-
-Show and set course data and parameters. This is a large routine that should
-be simplified and shortened... someday.
-
-Inputs: $r
-
-Returns: nothing
-
-=cut
-
-##################################################
-##################################################
-sub crsenv {
- my $r=shift;
- my $setoutput='';
-
- my $breadcrumbs =
- &Apache::lonhtmlcommon::breadcrumbs('Edit Course Environment');
- my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
- my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
-
- my (%crsinfo,$chome);
-
- #
- # Go through list of changes
- foreach (keys %env) {
- next if ($_!~/^form\.(.+)\_setparmval$/);
- my $name = $1;
- my $value = $env{'form.'.$name.'_value'};
- if ($name eq 'newp') {
- $name = $env{'form.newp_name'};
- }
- if ($name eq 'url') {
- $value=~s/^\/res\///;
- my $bkuptime=time;
- my @tmp = &Apache::lonnet::get
- ('environment',['url'],$dom,$crs);
- $setoutput.=&mt('Backing up previous URL').': '.
- &Apache::lonnet::put
- ('environment',
- {'top level map backup '.$bkuptime => $tmp[1] },
- $dom,$crs).
- ' ';
- }
- #
- # Deal with modified default spreadsheets
- if ($name =~ /^spreadsheet_default_(classcalc|
- studentcalc|
- assesscalc)$/x) {
- my $sheettype = $1;
- if ($sheettype eq 'classcalc') {
- # no need to do anything since viewing the sheet will
- # cause it to be updated.
- } elsif ($sheettype eq 'studentcalc') {
- # expire all the student spreadsheets
- &Apache::lonnet::expirespread('','','studentcalc');
- } else {
- # expire all the assessment spreadsheets
- # this includes non-default spreadsheets, but better to
- # be safe than sorry.
- &Apache::lonnet::expirespread('','','assesscalc');
- # expire all the student spreadsheets
- &Apache::lonnet::expirespread('','','studentcalc');
- }
- }
- #
- # Deal with the enrollment dates
- if ($name =~ /^default_enrollment_(start|end)_date$/) {
- $value=&Apache::lonhtmlcommon::get_date_from_form($name.'_value');
- }
- #
- # Deal with the emails
- if ($name =~ /\.email$/) {
- foreach my $specifier (split(',',$value)) {
- my ($user,$sections_or_groups)=
- ($specifier=~/^([^\(]+)\(([^\)]+)\)/);
- if (!$sections_or_groups) {
- $user = $specifier;
- }
- my ($name,$domain) = split(':',$user);
- if (!defined($user) || !defined($domain)) {
- $setoutput.= ' '.
- &mt("Invalid email address specified, address must be of the form username:domain what was specified was ([_1])",$user).
- ' ';
- undef($value);
- } elsif (&Apache::lonnet::homeserver($user,$domain) eq 'no_host') {
- $setoutput.= ' '.
- &mt("Invalid email address specified, user [_1] is unknown.",$name).
- ' ';
- undef($value);
- }
- }
- }
- # Get existing cloners
- my @oldcloner = ();
- if ($name eq 'cloners') {
- my %clonenames=&Apache::lonnet::dump('environment',$dom,$crs,'cloners');
- if ($clonenames{'cloners'} =~ /,/) {
- @oldcloner = split/,/,$clonenames{'cloners'};
- } else {
- $oldcloner[0] = $clonenames{'cloners'};
- }
- }
- #
- # Let the user know we made the changes
- if ($name && defined($value)) {
- my %failed_cloners;
- if ($name eq 'cloners') {
- $value =~ s/\s//g;
- $value =~ s/^,//;
- $value =~ s/,$//;
- # check requested clones are valid users.
- %failed_cloners = &check_cloners(\$value,\@oldcloner);
- }
- my $put_result = &Apache::lonnet::put('environment',
- {$name=>$value},$dom,$crs);
- if ($put_result eq 'ok') {
- $setoutput.=&mt('Set').' '.$name.' '.&mt('to').' ';
- if ($name =~ /^default_enrollment_(start|end)_date$/) {
- $setoutput .= &Apache::lonlocal::locallocaltime($value);
- } elsif ($name eq 'categories') {
- $setoutput .= $env{'form.categories_display'};
- } else {
- $setoutput .= $value;
- }
- $setoutput .= ' . ';
- if ($name eq 'cloners') {
- &change_clone($value,\@oldcloner);
- }
- # Update environment and nohist_courseids.db
- if (($name eq 'description') || ($name eq 'cloners') ||
- ($name eq 'hidefromcat') || ($name eq 'categories')) {
- if ($chome eq '') {
- %crsinfo =
- &Apache::lonnet::courseiddump($dom,'.',1,'.','.',
- $crs,undef,undef,'.');
- $chome = &Apache::lonnet::homeserver($crs,$dom);
- }
- }
- if ($name eq 'description' && defined($value)) {
- &Apache::lonnet::appenv({'course.'.$env{'request.course.id'}.'.description' => $value});
- if (ref($crsinfo{$env{'request.course.id'}}) eq 'HASH') {
- $crsinfo{$env{'request.course.id'}}{'description'} = $value;
- my $putresult =
- &Apache::lonnet::courseidput($dom,\%crsinfo,
- $chome,'notime');
- }
- }
- if (($name eq 'cloners') || ($name eq 'hidefromcat') || ($name eq 'categories')) {
- if (ref($crsinfo{$env{'request.course.id'}}) eq 'HASH') {
- &Apache::lonnet::appenv({'course.'.$env{'request.course.id'}.'.'.$name => $value});
- $crsinfo{$env{'request.course.id'}}{$name} = $value;
- my $putresult =
- &Apache::lonnet::courseidput($dom,\%crsinfo,
- $chome,'notime');
- }
- }
- } else {
- $setoutput.=&mt('Unable to set').' '.$name.' '.&mt('to').
- ' '.$value.' '.&mt('due to').' '.$put_result.'. ';
- }
- if (($name eq 'cloners') && (keys(%failed_cloners) > 0)) {
- $setoutput.= &mt('Unable to include').': ';
- my @fails;
- my $num = 0;
- if (defined($failed_cloners{'format'})) {
- $fails[$num] .= ''.$failed_cloners{'format'}.
- ' , '.&mt('reason').' - '.
- &mt('Invalid format');
- $num ++;
- }
- if (defined($failed_cloners{'domain'})) {
- $fails[$num] .= ''.$failed_cloners{'domain'}.
- ' , '.&mt('reason').' - '.
- &mt('Domain does not exist');
- $num ++;
- }
- if (defined($failed_cloners{'newuser'})) {
- $fails[$num] .= ''.$failed_cloners{'newuser'}. ' , '.&mt('reason').' - '.
- &mt('LON-CAPA user(s) do(es) not exist.').
- '. '.&mt('Please ').
- ' '.
- &mt('add the user(s)').' , '.
- &mt('and then return to the ').
- ''.
- &mt('Course Parameters page').' '.
- &mt('to add the new user(s) to the list of possible cloners');
- }
- $setoutput .= join('; ',@fails).'. ';
- }
- }
- }
-
- my $start_table =&Apache::loncommon::start_data_table();
- my $start_header_row=&Apache::loncommon::start_data_table_header_row();
- my $end_header_row =&Apache::loncommon::end_data_table_header_row();
-# ------------------------- Re-init course environment entries for this session
-
- &Apache::lonnet::coursedescription($env{'request.course.id'},
- {'freshen_cache' => 1});
-
-# -------------------------------------------------------- Get parameters again
-
- my %values=&Apache::lonnet::dump('environment',$dom,$crs);
- my $SelectStyleFile=&mt('Select Style File');
- my $SelectSpreadsheetFile=&mt('Select Spreadsheet File');
- my $output='';
- my $can_categorize;
- if (! exists($values{'con_lost'})) {
- my %descriptions=
- ('url' => ''.&mt('Top Level Map').' '.
- '".
- &mt('Select Map').' '.
- &mt('Modification may make assessment data inaccessible!').
- ' ',
- 'description' => ''.&mt('Course Description').' ',
- 'courseid' => ''.&mt('Course ID or number').
- ' '.
- '('.&mt('internal, optional').')',
- 'cloners' => ''.&mt('Users allowed to clone course').' '
- .'("'.&mt('user:domain,user:domain,*:domain').' ") '
- .&mt('Users with active Course Coordinator role in this course are permitted to clone and need not be included.').' '
- .&mt('Use [_1] to allow course to be cloned by anyone in the specified domain.','"*:domain "').' '
- .&mt('Use [_1] to allow unrestricted cloning in all domains.','"* "'),
- 'grading' => ''.&mt('Grading').' '.
- &mt('[_1], [_2], or [_3]','"standard "','"external "','"spreadsheet "').&Apache::loncommon::help_open_topic('GradingOptions'),
- 'task_grading' => ''.&mt('Bridge Task Grading').' '
- .&mt('Instructors and TAs in sections, when grading bridge tasks, should be allowed to grade other sections.').' '
- .'('.&mt('[_1]: they are allowed (this is the default). [_2]: no, they can only grade their own section.','"any "','"section "').')',
- 'default_xml_style' => ''.&mt('Default XML Style File').' '.
- '$SelectStyleFile ",
- 'question.email' => ''.&mt('Feedback Addresses for Resource Content Question').' '
- .'("'.&mt('user:domain,user:domain(section;section;...;*;...),...').' ")',
- 'question.email.text' => ''.&mt('Custom Text for Resource Content Question Option in Feedback').' ',
- 'comment.email' => ''.&mt('Feedback Addresses for Course Content Comments').' '
- .'("'.&mt('user:domain,user:domain(section;section;...;*;...),...').' ")',
- 'comment.email.text' => ''.&mt('Custom Text for Course Content Option in Feedback').' ',
- 'policy.email' => ''.&mt('Feedback Addresses for Course Policy').' '
- .'("'.&mt('user:domain,user:domain(section;section;...;*;...),...').' ")',
- 'policy.email.text' => ''.&mt('Custom Text for Course Policy Option in Feedback').' ',
- 'hideemptyrows' => ''.&mt('Hide Empty Rows in Spreadsheets').' '
- .'('.&mt('[_1] for default hiding','"yes "').')',
- 'pageseparators' => ''.&mt('Visibly Separate Items on Pages').' '
- .'('.&mt('[_1] for visible separation.','"yes "').' '
- .&mt('Changes will not show until next login.').')',
- 'student_classlist_view' => ''.&mt('Allow students to view classlist.').' '
- .'('.&mt('[_1]: students can view all sections. [_2]: students can only view their own section. blank or [_3] prevents student view.','"all "','"section "','"disabled "').')',
- 'student_classlist_portfiles' => ''.&mt('Include link to accessible portfolio files').' '
- .'('.&mt('[_1] for link to each a listing of each student\'s files.','"yes "').')',
- 'student_classlist_opt_in' => ''.&mt("Student's agreement needed for listing in student-viewable roster").' '
- .'('.&mt('[_1] to require students to opt-in to listing in the roster (on the roster page).','"yes "').')',
- 'plc.roles.denied'=> ''.&mt('Disallow live chatroom use for Roles').' '
- .'('.&mt('[_1]: student, [_2]: TA, [_3]: instructor','"st "','"ta "','"in "').') '
- .'("'.&mt('role,role,...').' ") '
- .Apache::loncommon::help_open_topic("Course_Disable_Discussion"),
- 'plc.users.denied' =>
- ''.&mt('Disallow live chatroom use for Users').' '.
- '("'.&mt('user:domain,user:domain,...').' ")',
-
- 'pch.roles.denied'=> ''.&mt('Disallow Resource Discussion for Roles').' '
- .'('.&mt('[_1]: student, [_2]: TA, [_3]: instructor','"st "','"ta "','"in "')
- .'("'.&mt('role,role,...').' ") '
- .Apache::loncommon::help_open_topic("Course_Disable_Discussion"),
- 'pch.users.denied' =>
- ''.&mt('Disallow Resource Discussion for Users').' '.
- '("'.&mt('user:domain,user:domain,...').' ")',
- 'spreadsheet_default_classcalc'
- => ''.&mt('Default Course Spreadsheet').' '.
- '$SelectSpreadsheetFile ",
- 'spreadsheet_default_studentcalc'
- => ''.&mt('Default Student Spreadsheet').' '.
- '$SelectSpreadsheetFile ",
- 'spreadsheet_default_assesscalc'
- => ''.&mt('Default Assessment Spreadsheet').' '.
- '$SelectSpreadsheetFile ",
- 'allow_limited_html_in_feedback'
- => ''.&mt('Allow limited HTML in discussion posts').' '.
- '('.&mt('Set value to [_1] to allow.','"yes "').')',
- 'allow_discussion_post_editing'
- => ''.&mt('Allow users with specified roles to edit/delete their own discussion posts').' '
- .'('.&mt('[_1]: student, [_2]: TA, [_3]: instructor','"st "','"ta "','"in "').') '
- .'('.&mt('Set value to [_1] to allow all roles.','"yes "').')'
- .'("'.&mt('role:section,role:section,...').' ") '
- .'('.&mt('Example: "st:001,st:002,in,cc " would permit students in sections 001 and 002 and instructors in any section, and course coordinators to edit their own posts.').')',
- 'rndseed'
- => ''.&mt('Randomization algorithm used').' '
- .''
- .&mt('Modifying this will make problems have different numbers and answers!')
- .' ',
- 'receiptalg'
- => ''.&mt('Receipt algorithm used').' '.
- &mt('This controls how receipt numbers are generated.'),
- 'suppress_tries'
- => ''.&mt('Suppress number of tries in printing').' '.
- ' ('.&mt('[_1] to suppress, anything else to not suppress','"yes "').')',
- 'problem_stream_switch'
- => ''.&mt('Allow problems to be split over pages').' '.
- ' ('.&mt('[_1] if allowed, anything else if not','"yes "').')',
- 'default_paper_size'
- => ''.&mt('Default paper type').' '.
- ' ('.&mt('supported types').': Letter [8 1/2x11 in], Legal [8 1/2x14 in],'.
- ' Tabloid [11x17 in], Executive [7 1/2x10 in], A2 [420x594 mm],'.
- ' A3 [297x420 mm], A4 [210x297 mm], A5 [148x210 mm], A6 [105x148 mm])',
- 'print_header_format'
- => ' '.&mt('Print header format').' '
- .&mt('Substitutions: [_1]: student name, [_2]: course id, [_3]: assignment note. Numbers after the % limit the field size.','"%n "','"%c "','"%a "'),
- 'default_enrollment_start_date' => ''.&mt('Default beginning date for student access.').' ',
- 'default_enrollment_end_date' => ''.&mt('Default ending date for student access.').' ',
- 'nothideprivileged' => ''.&mt('Privileged users that should not be hidden on staff listings').' '
- .'("'.&mt('user:domain,user:domain,*:domain').' ")',
- 'languages' => ''.&mt('Languages used').' ',
- 'disable_receipt_display'
- => ''.&mt('Disable display of problem receipts').' '.
- ' ('.&mt('"[_1]" to disable, anything else if not','yes ').')',
- 'task_messages'
- => ''.&mt('Send message to student when clicking Done on Tasks').' ('.&mt('[_1] to send a message only to student, [_2] to send message to student and add record to user information page for instructors. Leave blank to disable.','"only_student "','"student_and_user_notes_screen "').')',
- 'disablesigfigs'
- => ''.&mt('Disable checking of Significant Figures').' '.
- ' ('.&mt('"[_1]" to disable, anything else if not','yes ').')',
- 'disableexampointprint'
- => ''.&mt('Disable automatically printing point values onto exams.').' '.
- ' ('.&mt('"[_1]" to disable, anything else if not','yes ').')',
- 'externalsyllabus'
- => ''.&mt('URL of Syllabus (not using internal handler)').' ',
- 'tthoptions'
- => ''.&mt('Default set of options to pass to tth/m when converting tex').' ',
-
- 'texengine'
- => ''.&mt('Force all students in the course to use a specific math rendering engine.').' '
- .'('.&mt('[_1], [_2] (Convert to Images), [_3] (TeX to HTML), or blank for student\'s preference','"jsMath "','"mimetex "','"tth "').')',
- 'timezone'
- => ''.&mt('Timezone in which the course takes place').' ',
-
- 'suppress_embed_prompt'
- => ''.&mt('Suppress prompt to upload items referenced in a web page being uploaded to portfolio, when current role is student.').' '.
- ' ('.&mt('[_1] to suppress, anything else to not suppress','"yes "').')',
- 'hidefromcat'
- => ''.&mt('Exclude from course catalog').' '.
- ' ('.&mt('[_1] to exclude, anything else to include - included if assigned an institutional code, or manually catagorized','"yes "').')',
- 'categories'
- => ''.&mt('Categorize course').' '.
- &mt('Display Categories').' ',
- 'datelocale'
- => ''.&mt('Locale used for course calendar').' ',
- );
- my @Display_Order = ('url','description','courseid','cloners');
- (my $can_toggle_cat,$can_categorize) = &can_modify_catsettings($dom);
- if ($can_toggle_cat) {
- push(@Display_Order,'hidefromcat');
- }
- if ($can_categorize) {
- push(@Display_Order,'categories');
- }
- push (@Display_Order,('grading',
- 'externalsyllabus',
- 'default_xml_style','pageseparators',
- 'question.email','question.email.text','comment.email',
- 'comment.email.text','policy.email','policy.email.text',
- 'student_classlist_view',
- 'student_classlist_opt_in',
- 'student_classlist_portfiles',
- 'plc.roles.denied','plc.users.denied',
- 'pch.roles.denied','pch.users.denied',
- 'allow_limited_html_in_feedback',
- 'allow_discussion_post_editing',
- 'languages',
- 'timezone',
- 'datelocale',
- 'nothideprivileged',
- 'rndseed',
- 'receiptalg',
- 'problem_stream_switch',
- 'suppress_tries',
- 'suppress_embed_prompt',
- 'default_paper_size',
- 'print_header_format',
- 'disable_receipt_display',
- 'spreadsheet_default_classcalc',
- 'spreadsheet_default_studentcalc',
- 'spreadsheet_default_assesscalc',
- 'hideemptyrows',
- 'default_enrollment_start_date',
- 'default_enrollment_end_date',
- 'tthoptions',
- 'texengine',
- 'disablesigfigs',
- 'disableexampointprint',
- 'task_messages','task_grading'));
- foreach my $parameter (sort(keys(%values))) {
- unless (($parameter =~ m/^internal\./)||($parameter =~ m/^metadata\./) ||
- ($parameter =~ m/^selfenroll_/) || ($parameter =~ /_selfenroll$/)
- || ($parameter eq 'type')) {
- if (! $descriptions{$parameter}) {
- $descriptions{$parameter}=$parameter;
- push(@Display_Order,$parameter);
- }
- }
- }
-
- foreach my $parameter (@Display_Order) {
- my $description = $descriptions{$parameter};
- # onchange is javascript to automatically check the 'Set' button.
- my $onchange = 'onFocus="javascript:window.document.forms'.
- "['envform'].elements['".$parameter."_setparmval']".
- '.checked=true;"';
- $output .= &Apache::loncommon::start_data_table_row().
- ''.$description.' ';
- if ($parameter =~ /^default_enrollment_(start|end)_date$/) {
- $output .= ''.
- &Apache::lonhtmlcommon::date_setter('envform',
- $parameter.'_value',
- $values{$parameter},
- $onchange).
- ' ';
- } elsif ($parameter eq 'timezone') {
- my $includeempty = 1;
- my $timezone = &Apache::lonlocal::gettimezone();
- $output .= ''.
- &Apache::loncommon::select_timezone($parameter.'_value',
- $timezone,
- $onchange,$includeempty).' ';
- } elsif ($parameter eq 'datelocale') {
- my $includeempty = 1;
- my $locale_obj = &Apache::lonlocal::getdatelocale();
- my $currdatelocale;
- if (ref($locale_obj)) {
- $currdatelocale = $locale_obj->id();
- }
- $output .= ''.
- &Apache::loncommon::select_datelocale($parameter.'_value',
- $currdatelocale,
- $onchange,$includeempty).' ';
- } elsif ($parameter eq 'categories') {
- my $catdisplay;
- if ($values{'categories'} ne '') {
- my @curritems = split(/\&/,$values{'categories'});
- foreach my $item (@curritems) {
- my ($name,$parent,$pos) = split(/:/,$item);
- $catdisplay .= &unescape($name).'&';
- }
- $catdisplay =~ s/\&$//;
- }
- $output .= ''.
- ' '.
- ' ';
- } else {
- $output .= ''.
- &Apache::lonhtmlcommon::textbox($parameter.'_value',
- $values{$parameter},
- 40,$onchange).' ';
- }
- $output .= ''.
- &Apache::lonhtmlcommon::checkbox($parameter.'_setparmval').
- ' ';
- $output .= &Apache::loncommon::end_data_table_row()."\n";
- }
- my $onchange = 'onFocus="javascript:window.document.forms'.
- '[\'envform\'].elements[\'newp_setparmval\']'.
- '.checked=true;"';
- $output.=&Apache::loncommon::start_data_table_row().
- ''.&mt('Create New Environment Variable').' '.
- ''.
- ' '.
- ' '.
- &Apache::loncommon::end_data_table_row()."\n";
- }
- my %lt=&Apache::lonlocal::texthash(
- 'par' => 'Parameter',
- 'val' => 'Value',
- 'set' => 'Set?',
- 'sav' => 'Save'
- );
-
- my $Parameter=&mt('Parameter');
- my $Value=&mt('Value');
- my $Set=&mt('Set');
- my ($jscript,$categorize_js);
- my $browse_js = &Apache::loncommon::browser_and_searcher_javascript('parmset');
- if ($can_categorize) {
- $categorize_js = <'."\n".
- $browse_js."\n".$categorize_js."\n".'';
- my $start_page =
- &Apache::loncommon::start_page('Set Course Environment',
- $jscript);
- my $end_page =
- &Apache::loncommon::end_page();
- my $end_table=&Apache::loncommon::end_data_table();
- $r->print(<
-$setoutput
-
-$start_table
-$start_header_row
-$lt{'par'} $lt{'val'} $lt{'set'}
-$end_header_row
-$output
-$end_table
-
-
-$end_page
-ENDENV
-}
-
-sub can_modify_catsettings {
- my ($dom) = @_;
- my %domconf = &Apache::lonnet::get_dom('configuration',['coursecategories'],$dom);
- my ($can_toggle_cat,$can_categorize);
- if (ref($domconf{'coursecategories'}) eq 'HASH') {
- if ($domconf{'coursecategories'}{'togglecats'} eq 'crs') {
- $can_toggle_cat = 1;
- }
- if ($domconf{'coursecategories'}{'categorize'} eq 'crs') {
- $can_categorize = 1;
- }
- }
- return ($can_toggle_cat,$can_categorize);
-}
-
-sub assign_course_categories {
- my ($r) = @_;
- my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
- my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
- my $hascats = 0;
- my $cathash;
- my %domconf = &Apache::lonnet::get_dom('configuration',['coursecategories'],$cdom);
- if (ref($domconf{'coursecategories'}) eq 'HASH') {
- $cathash = $domconf{'coursecategories'}{'cats'};
- if (ref($cathash) eq 'HASH') {
- $hascats = 1;
- }
- }
- my $catwin_js;
- if ($hascats) {
- my $alert = &mt('Use \"Save\" in the main window to save course categories');
- $catwin_js = <
-
-function updateCategories() {
- var newcategories = '';
- var unescapedcats = '';
- if (document.chgcats.usecategory.length) {
- for (var i=0; i 0) {
- newcategories = newcategories.slice(0,-1);
- }
- if (unescapedcats.length > 0) {
- unescapedcats = unescapedcats.slice(0,-3);
- }
- } else {
- if (document.chgcats.usecategory.checked == true) {
- newcategories = document.chgcats.usecategory.value;
- unescapedcats = document.chgcats.catname.value;
- }
- }
- opener.document.envform.categories_value.value = newcategories;
- opener.document.envform.categories_display.value = unescapedcats;
- opener.document.envform.categories_setparmval.checked = true;
- alert("$alert");
- self.close();
- return;
-}
-
-
-ENDSCRIPT
- } else {
- my $onload;
- }
- my $start_page =
- &Apache::loncommon::start_page('Course Categories',$catwin_js,
- {'only_body' => 1,});
- my $end_page = &Apache::loncommon::end_page();
- my $categoriesform = ''.&mt('Categorize Course').' ';
- if ($hascats) {
- my %currsettings =
- &Apache::lonnet::get('environment',['hidefromcat','categories'],$cdom,$cnum);
- $categoriesform .= &mt('Assign one or more categories to this course.').' '.
- ' ';
- } else {
- $categoriesform .= &mt('No categories defined for this domain');
- }
- $r->print($start_page.$categoriesform.$end_page);
- return;
-}
-
##################################################
# Overview mode
##################################################
@@ -2634,20 +2764,20 @@ my $tableopen;
sub tablestart {
if ($tableopen) {
- return '';
+ return '';
} else {
- $tableopen=1;
- return &Apache::loncommon::start_data_table().''.&mt('Parameter').' '.
- &mt('Delete').' '.&mt('Set to ...').' ';
+ $tableopen=1;
+ return &Apache::loncommon::start_data_table().''.&mt('Parameter').' '.
+ &mt('Delete').' '.&mt('Set to ...').' ';
}
}
sub tableend {
if ($tableopen) {
- $tableopen=0;
- return &Apache::loncommon::end_data_table();
+ $tableopen=0;
+ return &Apache::loncommon::end_data_table();
} else {
- return'';
+ return'';
}
}
@@ -2660,16 +2790,16 @@ 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};
+ }
+ }
+ }
}
return $resourcedata;
}
@@ -2686,88 +2816,120 @@ 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);
+ 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);
+ if ($cmd eq 'set') {
+ $data=$env{$key};
+ $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_yesno') {
+ if ($thiskey =~ /\.retrypartial$/) {
+ $name = 'retrypartial';
+ }
+ }
+ if ($name ne '') {
+ my ($needsrelease,$needsnewer);
+ $needsrelease = $Apache::lonnet::needsrelease{"parameter:$name:$data"};
+ if ($needsrelease) {
+ unless ($got_chostname) {
+ ($chostname,$cmajor,$cminor)=¶meter_release_vars();
+ $got_chostname = 1;
+ }
+ $needsnewer = ¶meter_releasecheck($name,$data,
+ $needsrelease,
+ $chostname,$cmajor,
+ $cminor);
+ }
+ if ($needsnewer) {
+ $r->print(' '.&oldversion_warning($name,$data,
+ $chostname,$cmajor,
+ $cminor,$needsrelease));
+ next;
+ }
+ }
+ } elsif ($cmd eq 'datepointer') {
+ $data=&Apache::lonhtmlcommon::get_date_from_form($env{$key});
+ $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) {
- $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;
- }
- }
- } 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');
- }
- }
- }
+ 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');
+ }
+ }
+ }
}
# 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 [_1] parameter(s)',$delentries).' ');
+ } 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 [_1] parameter(s)',$putentries/2).' ');
+ } else {
+ $r->print(''.
+ &mt('Error saving parameters').'
');
+ }
+ &Apache::lonnet::devalidatecourseresdata($crs,$dom);
}
}
@@ -2780,15 +2942,15 @@ sub parse_listdata_key {
my ($key,$listdata) = @_;
# split into student/section affected, and
# the realm (folder/resource part and parameter
- my ($student,$realm) =
- ($key=~/^\Q$env{'request.course.id'}\E\.\[([^\.]+)\]\.(.+)$/);
+ my ($student,$realm) =
+ ($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=~/^(.*)\.(.*)$/);
@@ -2809,135 +2971,136 @@ sub listdata {
my %keyorder=&standardkeyorder();
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);
- } 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);
- }
- }
-
- if (!$result) {
+ $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);
+ }
+ }
+
+ 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'}) {
+ 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;
- }
+ $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;
+ }
#
# 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().
+ &Apache::loncommon::start_data_table_row().
+ ' '.&mt($parmitem).
+ ' ');
+ $foundkeys++;
+ if (&isdateparm($thistype)) {
+ my $jskey='key_'.$pointer;
+ $pointer++;
+ $r->print(
+ &Apache::lonhtmlcommon::date_setter('parmform',
+ $jskey,
+ $$resourcedata{$thiskey},
+ '',1,'','').
' '.
-(($$resourcedata{$thiskey}!=0)?''.
-&mt('Shift all dates based on this date').' ':'').
+(($$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}));
+ } elsif ($thistype =~ m/^string/) {
+ $r->print(&string_selector($thistype,$thiskey,
+ $$resourcedata{$thiskey},$name));
+ } else {
+ $r->print(&default_selector($thiskey,$$resourcedata{$thiskey}));
+ }
+ $r->print(' ');
+ $r->print(''.&Apache::loncommon::end_data_table_row());
+ }
}
return $foundkeys;
}
@@ -2947,17 +3110,17 @@ sub date_interval_selector {
my ($thiskey, $showval) = @_;
my $result;
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]);
+ $result .= &Apache::loncommon::select_form($amount,$name.'_'.$thiskey,
+ \%select);
+ $result .= ' '.&mt($name);
}
$result .= ' ';
return $result;
@@ -2968,13 +3131,13 @@ sub get_date_interval_from_form {
my ($key) = @_;
my $seconds = 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})) {
+ $seconds += $env{'form.'.$name.'_'.$key} * $factor;
+ }
}
return $seconds;
}
@@ -2985,35 +3148,121 @@ sub default_selector {
return ' ';
}
-my %strings =
+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', 'Bubblesheet 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) = @_;
+
if (!exists($strings{$thistype})) {
- return &default_selector($thiskey,$showval);
+ return &default_selector($thiskey,$showval);
+ }
+
+ 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,
+ $chostname,$cmajor,
+ $cminor);
+ if ($needsnewer) {
+ $skiptype{$parmval} = 1;
+ }
+ }
+ }
}
+
my $result;
- foreach my $possibilities (@{ $strings{$thistype} }) {
- my ($name, $description) = @{ $possibilities };
- $result .= ' ';
+ 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;
}
@@ -3058,11 +3307,27 @@ sub newoverview {
my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
- my $start_page = &Apache::loncommon::start_page('Set Parameters');
+ &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',
+ 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);
+ &startSettingsScreen($r,'parmset');
$r->print(<
ENDOVER
my @ids=();
@@ -3088,11 +3353,12 @@ 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'; }
+ if (!@psprt) { $psprt[0]='all'; }
- my @selected_sections =
- &Apache::loncommon::get_env_multiple('form.Section');
+ my @selected_sections =
+ &Apache::loncommon::get_env_multiple('form.Section');
@selected_sections = ('all') if (! @selected_sections);
foreach my $sec (@selected_sections) {
if ($sec eq 'all') {
@@ -3104,37 +3370,41 @@ ENDOVER
my $pssymb='';
my $parmlev='';
-
+
unless ($env{'form.parmlev'}) {
$parmlev = 'map';
} else {
$parmlev = $env{'form.parmlev'};
}
- &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps,
- \%mapp, \%symbp,\%maptitles,\%uris,
- \%keyorder,\%defkeytype);
+ &extractResourceInformation(\@ids, \%typep,\%keyp, \%allparms, \%allparts, \%allmaps,
+ \%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('
- ');
- &parmmenu($r,\%allparms,\@pscat,\%keyorder);
- $r->print('
- '.
+ $r->print(&Apache::lonhtmlcommon::row_closure(1));
+ $r->print(&Apache::lonhtmlcommon::end_pick_box());
+ $r->print('');
+
+ $r->print('');
+ $r->print('
');
+ &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('
'.
''.&mt('Parts').' '.&mt('Section(s)').
' '.&mt('Group(s)').' ');
&partmenu($r,\%allparts,\@psprt);
@@ -3143,11 +3413,17 @@ ENDOVER
$r->print(' ');
&groupmenu($r,\@selected_groups);
$r->print('
');
- $r->print('
');
-
+ #$r->print('
');
+ $r->print(&Apache::lonhtmlcommon::row_closure(1));
+ $r->print(&Apache::lonhtmlcommon::end_pick_box());
+ $r->print('');
+
+ $r->print('');
+ $r->print('
');
my $sortorder=$env{'form.sortorder'};
unless ($sortorder) { $sortorder='realmstudent'; }
&sortmenu($r,$sortorder);
+ $r->print('
');
$r->print('
');
@@ -3163,19 +3439,21 @@ 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);
}
$r->print(&tableend().
- ((($env{'form.store'}) || ($env{'form.dis'}))?'
':'').
- ''.&Apache::loncommon::end_page());
+ ((($env{'form.store'}) || ($env{'form.dis'}))?'
':'').
+ '');
+ &endSettingsScreen($r);
+ $r->print(&Apache::loncommon::end_page());
}
sub secgroup_lister {
@@ -3218,13 +3496,14 @@ sub overview {
my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
+ &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=setoverview',
+ text=>"Overview Mode"});
my $start_page=&Apache::loncommon::start_page('Modify Parameters');
my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Overview');
- $r->print(<
-ENDOVER
+ $r->print($start_page.$breadcrumbs);
+ &startSettingsScreen($r,'parmset');
+ $r->print(''.
- &Apache::loncommon::end_page());
+ ($foundkeys?' ':''.&mt('There are no parameters.').' ').''.
+ &Apache::loncommon::end_page());
}
sub clean_parameters {
@@ -3252,6 +3531,8 @@ sub clean_parameters {
my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
+ &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=cleanparameters',
+ 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 '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(' ');
+
+ }
}
$r->print(&Apache::loncommon::end_data_table().''.
- ' '.
- '
'.
- &Apache::loncommon::end_page());
+ ' '.
+ '');
+ &endSettingsScreen($r);
+ $r->print(&Apache::loncommon::end_page());
}
sub date_shift_one {
@@ -3335,17 +3619,18 @@ sub date_shift_one {
my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
+ &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=dateshift1&timebase='.$env{'form.timebase'},
+ text=>"Shifting Dates"});
my $start_page=&Apache::loncommon::start_page('Shift Dates');
my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Shift');
- $r->print(<print($start_page.$breadcrumbs);
+ &startSettingsScreen($r,'parmset');
$r->print('