'grading',
'maxtries' => 'tries',
'hinttries' => 'tries',
+ 'randomizeontries' => 'tries',
'type' => 'problem_appearance',
'problemstatus' => 'problem_appearance',
'display' => 'problem_appearance',
@@ -1685,13 +1689,13 @@ sub displaymenu {
}
sub mapmenu {
- my ($r,$allmaps,$pschp,$maptitles, $symbp)=@_;
+ 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,undef,undef);
+ my $it=$navmap->getIterator(undef,undef,undef,1,1,undef);
my $curRes;
my $depth = 0;
my %parent = ();
@@ -1736,35 +1740,58 @@ sub mapmenu {
$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 = ' ';
- $r->print(&Apache::loncommon::start_data_table()
- .&Apache::loncommon::start_data_table_row()
- .''.$icon
- .' '
- .' '
- .&mt('All Maps or Folders')
- .' '
- .&Apache::loncommon::end_data_table_row()
+ my $whitespace =
+ ' ';
+
+ # Info about selectable folders/maps
+ $r->print(
+ ''
+ .&mt('You can only select those maps and folders which can be currently parameterized.')
+ # .' '.&Apache::loncommon::help_open_topic('...') # Later: Add further help
+ .'
'
+ );
+
+
+ $r->print(&Apache::loncommon::start_data_table());
+
+ # Display row: "All Maps or Folders"
+ $r->print(
+ &Apache::loncommon::start_data_table_row()
+ .''
+ .''
+ .' print(' checked="checked"') if ($pschp eq 'all' || !$pschp);
+ $r->print(
+ ' value="all" /> '.$icon.' '
+ .&mt('All Maps or Folders')
+ .' '
+ .' '
+ .&Apache::loncommon::end_data_table_row()
);
- my $whitespace = ' ';
+
+ # Display row: "Main Course Documents"
if (exists($$allmaps{1})) {
- $r->print(&Apache::loncommon::start_data_table_row()
- .''.$icon
- .' '
- .' print(
+ &Apache::loncommon::start_data_table_row()
+ .''
+ .''
+ .' print(' checked="checked"');
- }
- $r->print('/>'
- .$$maptitles{1}
- .($$allmaps{1} !~/^uploaded/?' ['.$$allmaps{1}.']':'')
- .' '
- .' '
- .&Apache::loncommon::end_data_table_row()
+ $r->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
@@ -1780,22 +1807,32 @@ sub mapmenu {
my $symb_name = $$symbp{$id};
my ($front, $tail) = split (/___${resid}___/, $symb_name);
$symb_name = $tail;
- $r->print(&Apache::loncommon::start_data_table_row()
- .''.$indent.$icon
- .' '
- .' print(
+ &Apache::loncommon::start_data_table_row()
+ .''
+ .''
);
- if ($pschp eq $allmaps_inverted{$symb_name}) {
- $r->print(' checked="checked"');
+ # 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('/>'
- .$treeinfo->{$id}->{name}
- .($$allmaps{$mapid}!~/^uploaded/?' ['.$$allmaps{$mapid}.']':'')
- .' '
- .' '
- .&Apache::loncommon::end_data_table_row()
+ $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());
}
}
@@ -2052,7 +2089,7 @@ sub assessparms {
$message="\n\n".&mt("Full Name").": ".
$name{'firstname'}.' '.$name{'middlename'}.' '
.$name{'lastname'}.' '.$name{'generation'}.
- " \n".&mt('ID').": ".$name{'id'}.'
';
+ " \n".&mt('Student/Employee ID').": ".$name{'id'}.'
';
}
@usersgroups = &Apache::lonnet::get_users_groups(
$udom,$uname,$env{'request.course.id'});
@@ -2080,10 +2117,14 @@ sub assessparms {
my @markers=split(/\&\&\&/,$env{'form.pres_marker'});
my @values=split(/\&\&\&/,$env{'form.pres_value'});
my @types=split(/\&\&\&/,$env{'form.pres_type'});
+ 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);
if ($markers[$i] =~ /^[\d.]+\&0_availablestudent\&(1|2|3)$/) {
- my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
- my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
my (@ok_slots,@fail_slots,@del_slots);
my $courseopt=&Apache::lonnet::get_courseresdata($cnum,$cdom);
my ($level,@all) =
@@ -2113,21 +2154,42 @@ sub assessparms {
}
}
}
+ } elsif ($markers[$i] =~ /_type\&\d+$/) {
+ $needsrelease =
+ $Apache::lonnet::needsrelease{'parameter:type:'.$values[$i]};
+ if ($needsrelease) {
+ unless ($got_chostname) {
+ ($chostname,$cmajor,$cminor) = &questiontype_release_vars();
+ $got_chostname = 1;
+ }
+ $needsnewer = &questiontype_releasecheck($values[$i],
+ $needsrelease,
+ $chostname,
+ $cmajor,$cminor);
+ }
+ }
+ if ($needsnewer) {
+ $message .= &oldversion_warning($values[$i],$chostname,$cmajor,
+ $cminor,$needsrelease);
+ } else {
+ $message.=&storeparm(split(/\&/,$markers[$i]),
+ $values[$i],
+ $types[$i],
+ $uname,$udom,$csec,$cgroup);
+ $totalstored ++;
}
- $message.=&storeparm(split(/\&/,$markers[$i]),
- $values[$i],
- $types[$i],
- $uname,$udom,$csec,$cgroup);
}
# ---------------------------------------------------------------- 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
@@ -2226,14 +2288,18 @@ COURSECONTENTSCRIPT
# 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(&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());
$r->print(&Apache::lonhtmlcommon::row_title(&mt('Select Parts to View')).
- ''.&mt('Show all parts').': ');
+ ''.
+ ' '.
+ &mt('Show all parts').
+ ' ');
&usermenu($r,$uname,$id,$udom,$csec,$cgroup,$parmlev,\@usersgroups);
$r->print(&Apache::lonhtmlcommon::row_closure(1));
$r->print(&Apache::lonhtmlcommon::end_pick_box());
@@ -2284,7 +2350,6 @@ COURSECONTENTSCRIPT
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",
@@ -2300,7 +2365,7 @@ COURSECONTENTSCRIPT
);
$r->print(<$lt{'pie'}
-$lt{'csv'} ($csuname $lt{'at'} $csudom)
+$lt{'csv'} ($csuname:$csudom)
$lt{'ic'} $lt{'rl'}
$lt{'ic'}
@@ -2718,8 +2783,9 @@ sub storedata {
undef %newdata;
my @deldata=();
undef @deldata;
- foreach (keys %env) {
- if ($_=~/^form\.([a-z]+)\_(.+)$/) {
+ 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);
@@ -2730,11 +2796,29 @@ sub storedata {
if ($cmd eq 'set' || $cmd eq 'datepointer' || $cmd eq 'dateinterval') {
my ($data, $typeof, $text);
if ($cmd eq 'set') {
- $data=$env{$_};
+ $data=$env{$key};
$typeof=$env{'form.typeof_'.$thiskey};
$text = &mt('Saved modified parameter for');
+ if ($typeof eq 'string_questiontype') {
+ my ($needsrelease,$needsnewer);
+ $needsrelease = $Apache::lonnet::needsrelease{'parameter:type:'.$data};
+ if ($needsrelease) {
+ unless ($got_chostname) {
+ ($chostname,$cmajor,$cminor)=&questiontype_release_vars();
+ $got_chostname = 1;
+ }
+ $needsnewer = &questiontype_releasecheck($data,$needsrelease,
+ $chostname,$cmajor,
+ $cminor);
+ }
+ if ($needsnewer) {
+ $r->print(' '.&oldversion_warning($data,$chostname,$cmajor,
+ $cminor,$needsrelease));
+ next;
+ }
+ }
} elsif ($cmd eq 'datepointer') {
- $data=&Apache::lonhtmlcommon::get_date_from_form($env{$_});
+ $data=&Apache::lonhtmlcommon::get_date_from_form($env{$key});
$typeof=$env{'form.typeof_'.$thiskey};
$text = &mt('Saved modified date for');
} elsif ($cmd eq 'dateinterval') {
@@ -2989,7 +3073,7 @@ sub date_interval_selector {
my %select = ((map {$_ => $_} (0..$max)),
'select_form_order' => [0..$max]);
$result .= &Apache::loncommon::select_form($amount,$name.'_'.$thiskey,
- %select);
+ \%select);
$result .= ' '.&mt($name);
}
$result .= ' ';
@@ -3028,8 +3112,24 @@ my %strings =
[ 'answer', 'Yes, and show correct answer if they exceed the maximum number of tries.' ],
[ 'no', 'No, don\'t show correct/incorrect feedback.' ],
[ 'no_feedback_ever', 'No, show no feedback at all.' ]],
+ 'string_questiontype'
+ => [[ 'problem', 'Standard Problem'],
+ [ 'survey', 'Survey'],
+ [ 'anonsurveycred', 'Anonymous Survey (credit for submission)'],
+ [ 'exam', 'Exam'],
+ [ 'anonsurvey', 'Anonymous Survey'],
+ [ 'randomizetry', 'New Randomization Each N Tries (default N=1)'],
+ [ 'practice', 'Practice'],
+ [ 'surveycred', 'Survey (credit for submission)']],
);
+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) = @_;
@@ -3038,15 +3138,73 @@ sub string_selector {
return &default_selector($thiskey,$showval);
}
+ my %skiptype;
+ if ($thistype eq 'string_questiontype') {
+ my ($got_chostname,$chostname,$cmajor,$cminor);
+ foreach my $possibilities (@{ $strings{$thistype} }) {
+ next unless (ref($possibilities) eq 'ARRAY');
+ my ($name, $description) = @{ $possibilities };
+ my $needsrelease=$Apache::lonnet::needsrelease{'parameter:type:'.$name};
+ if ($needsrelease) {
+ unless ($got_chostname) {
+ ($chostname,$cmajor,$cminor)=&questiontype_release_vars();
+ $got_chostname = 1;
+ }
+ my $needsnewer=&questiontype_releasecheck($name,$needsrelease,
+ $chostname,$cmajor,
+ $cminor);
+ if ($needsnewer) {
+ $skiptype{$name} = 1;
+ }
+ }
+ }
+ }
+
my $result;
- foreach my $possibilities (@{ $strings{$thistype} }) {
- my ($name, $description) = @{ $possibilities };
- $result .= ' 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 .= ' ';
}
- $result .= ' />'.&mt($description).' ';
+ if ($result) {
+ $result = '';
}
return $result;
}
@@ -3505,12 +3663,6 @@ ENDMAINFORMHEAD
linktitle => "Restrict metadata for this $lc_crstype." ,
icon =>'contact-new.png' ,
},
- { linktext => "Manage $crstype Slots",
- url => '/adm/slotrequest?command=showslots',
- permission => $vgr,
- linktitle => "Manage slots for this $lc_crstype." ,
- icon => 'rsrv.png' ,
- },
{ linktext => 'Reset Student Access Times',
url => '/adm/helper/resettimes.helper',
permission => $mgr,
@@ -4404,6 +4556,49 @@ sub check_for_course_info {
return 0;
}
+sub questiontype_release_vars {
+ my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ my $chome = $env{'course.'.$env{'request.course.id'}.'.home'};
+ my $chostname = &Apache::lonnet::hostname($chome);
+ my ($cmajor,$cminor) =
+ split(/\./,&Apache::lonnet::get_server_loncaparev($cdom,$chome));
+ return ($chostname,$cmajor,$cminor);
+}
+
+sub questiontype_releasecheck {
+ my ($questiontype,$needsrelease,$chostname,$cmajor,$cminor) = @_;
+ my $needsnewer;
+ my ($needsmajor,$needsminor) = split(/\./,$needsrelease);
+ if (($cmajor < $needsmajor) ||
+ ($cmajor == $needsmajor && $cminor < $needsminor)) {
+ $needsnewer = 1;
+ } else {
+ &Apache::lonnet::update_released_required($Apache::lonnet::needsrelease{'parameter:type:'.$questiontype});
+ }
+ return $needsnewer;
+}
+
+sub oldversion_warning {
+ my ($questiontype,$chostname,$cmajor,$cminor,$needsrelease) = @_;
+ my $desc;
+ if (ref($strings{'string_questiontype'}) eq 'ARRAY') {
+ foreach my $possibilities (@{ $strings{'string_questiontype'} }) {
+ next unless (ref($possibilities) eq 'ARRAY');
+ my ($name, $description) = @{ $possibilities };
+ if ($name eq $questiontype) {
+ $desc = $description;
+ last;
+ }
+ }
+ }
+ return ''.
+ &mt('Question Type was [_1]not[_2] set to [_3].',
+ '',' ','"'.$desc.'"').' '.
+ &mt('LON-CAPA version ([_1]) installed on home server ([_2]) does not meet version requirements ([_3] or newer).',
+ $cmajor.'.'.$cminor,$chostname,
+ $needsrelease).
+ '
';
+}
sub handler {
my $r=shift;