--- loncom/interface/lonparmset.pm 2007/10/17 00:27:44 1.383
+++ loncom/interface/lonparmset.pm 2008/04/05 16:10:52 1.394
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Handler to set parameters for assessments
#
-# $Id: lonparmset.pm,v 1.383 2007/10/17 00:27:44 albertel Exp $
+# $Id: lonparmset.pm,v 1.394 2008/04/05 16:10:52 www Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -2026,6 +2026,8 @@ sub crsenv {
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) {
@@ -2120,19 +2122,37 @@ sub crsenv {
my $put_result = &Apache::lonnet::put('environment',
{$name=>$value},$dom,$crs);
if ($put_result eq 'ok') {
- $setoutput.=&mt('Set').' '.$name.' '.&mt('to').' '.$value.'.
';
+ $setoutput.=&mt('Set').' '.$name.' '.&mt('to').' ';
+ if ($name =~ /^default_enrollment_(start|end)_date$/) {
+ $setoutput .= &Apache::lonlocal::locallocaltime($value);
+ } else {
+ $setoutput .= $value;
+ }
+ $setoutput .= '.
';
if ($name eq 'cloners') {
&change_clone($value,\@oldcloner);
}
# Update environment and nohist_courseids.db
- if ($name eq 'description' && defined($value)) {
- my %crsinfo =
- &Apache::lonnet::courseiddump($dom,'.',1,'.','.',
+ if ($name eq 'description' || $name eq 'cloners') {
+ if ($chome eq '') {
+ %crsinfo =
+ &Apache::lonnet::courseiddump($dom,'.',1,'.','.',
$crs,undef,undef,'Course');
- &Apache::lonnet::appenv('course.'.$env{'request.course.id'}.'.description' => $value);
+ $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 $chome = &Apache::lonnet::homeserver($crs,$dom);
+ my $putresult =
+ &Apache::lonnet::courseidput($dom,\%crsinfo,
+ $chome,'notime');
+ }
+ }
+ if ($name eq 'cloners') {
+ if (ref($crsinfo{$env{'request.course.id'}}) eq 'HASH') {
+ $crsinfo{$env{'request.course.id'}}{'cloners'} = $value;
my $putresult =
&Apache::lonnet::courseidput($dom,\%crsinfo,
$chome,'notime');
@@ -2318,6 +2338,7 @@ Use * to allow unrestricted cloning in a
'texengine'
=> ''.&mt('Force all students in the course to use a specific math rendering engine.').'
'.&mt('(Valid options are [_1].)','"tth", "jsMath", "mimetex"').'',
+
);
my @Display_Order = ('url','description','courseid','cloners','grading',
'externalsyllabus',
@@ -2503,16 +2524,28 @@ sub storedata {
if ($tuname) {
$tkey=~s/\.\[useropt\:$tuname\:$tudom\]\./\./;
}
- if ($cmd eq 'set') {
- my $data=$env{$_};
- my $typeof=$env{'form.typeof_'.$thiskey};
- if ($$olddata{$thiskey} ne $data) {
+ 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('
'.&mt('Saved modified parameter for').' '.
+ $r->print('
'.$text.' '.
&Apache::loncommon::plainname($tuname,$tudom));
} else {
$r->print('
'.
@@ -2537,26 +2570,6 @@ sub storedata {
} else {
push (@deldata,$thiskey,$thiskey.'.type');
}
- } elsif ($cmd eq 'datepointer') {
- my $data=&Apache::lonhtmlcommon::get_date_from_form($env{$_});
- my $typeof=$env{'form.typeof_'.$thiskey};
- 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('
'.&mt('Saved modified date for').' '.&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;
- }
- }
}
}
}
@@ -2607,8 +2620,8 @@ sub parse_listdata_key {
$realm=~s/\.type//;
}
# split into resource+part and parameter name
- my ($res, $parm) = ($realm=~/^(.*)\.(.*)$/);
- my ($res, $part) = ($res =~/^(.*)\.(.*)$/);
+ my ($res, $parm) = ($realm=~/^(.*)\.(.*)$/);
+ ($res, my $part) = ($res =~/^(.*)\.(.*)$/);
return ($student,$res,$part,$parm);
}
@@ -2737,8 +2750,13 @@ sub listdata {
$$resourcedata{$thiskey},
'',1,'','').
'
'.
+(($$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}));
@@ -2753,9 +2771,47 @@ sub listdata {
return $foundkeys;
}
+
+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);
+ }
+ $result .= '
';
+ return $result;
+
+}
+
+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;
+ }
+ }
+ return $seconds;
+}
+
+
sub default_selector {
my ($thiskey, $showval) = @_;
- return '
' ;
+ return '
';
}
my %strings =
@@ -2765,6 +2821,7 @@ my %strings =
[ '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.' ]],
);
@@ -2790,6 +2847,41 @@ sub string_selector {
return $result;
}
+#
+# Shift all start and end dates by $shift
+#
+
+sub dateshift {
+ my ($shift)=@_;
+ my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
+ my %data=&Apache::lonnet::dump('resourcedata',$dom,$crs);
+# ugly retro fix for broken version of types
+ foreach my $key (keys %data) {
+ if ($key=~/\wtype$/) {
+ my $newkey=$key;
+ $newkey=~s/type$/\.type/;
+ $data{$newkey}=$data{$key};
+ delete $data{$key};
+ }
+ }
+ my %storecontent=();
+# go through all parameters and look for dates
+ foreach my $key (keys %data) {
+ if ($data{$key.'.type'}=~/^date_(start|end)$/) {
+ my $newdate=$data{$key}+$shift;
+ $storecontent{$key}=$newdate;
+ }
+ }
+ my $reply=&Apache::lonnet::cput
+ ('resourcedata',\%storecontent,$dom,$crs);
+ if ($reply eq 'ok') {
+ &log_parmset(\%storecontent);
+ }
+ &Apache::lonnet::devalidatecourseresdata($crs,$dom);
+ return $reply;
+}
+
sub newoverview {
my ($r) = @_;
@@ -3067,6 +3159,51 @@ ENDOVER
&Apache::loncommon::end_page());
}
+sub date_shift_one {
+ my ($r) = @_;
+ my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
+
+ my $start_page=&Apache::loncommon::start_page('Shift Dates');
+ my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Shift');
+ $r->print(<
print('');
+ $r->print(&Apache::loncommon::end_page());
+}
+
+sub date_shift_two {
+ my ($r) = @_;
+ my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
+ my $start_page=&Apache::loncommon::start_page('Shift Dates');
+ my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs('Shift');
+ $r->print(<print(&mt('Shifting all dates such that [_1] becomes [_2]',
+ &Apache::lonlocal::locallocaltime($env{'form.timebase'}),
+ &Apache::lonlocal::locallocaltime($timeshifted)));
+ my $delta=$timeshifted-$env{'form.timebase'};
+ &dateshift($delta);
+ $r->print(&Apache::loncommon::end_page());
+}
+
sub parse_key {
my ($key) = @_;
my %data;
@@ -3467,7 +3604,7 @@ sub order_meta_fields {
my $ordered_fields = join ",", @neworder;
my $put_result = &Apache::lonnet::put('environment',
{'metadata.addedorder'=>$ordered_fields},$dom,$crs);
- &Apache::lonnet::appenv('course.'.$env{'request.course.id'}.'.metadata.addedorder' => $ordered_fields);
+ &Apache::lonnet::appenv({'course.'.$env{'request.course.id'}.'.metadata.addedorder' => $ordered_fields});
}
my $fields = &get_added_meta_fieldnames($env{'request.course.id'});
my $ordered_fields;
@@ -4092,7 +4229,7 @@ sub handler {
'pres_marker',
'pres_value',
'pres_type',
- 'udom','uname','symb','serial']);
+ 'udom','uname','symb','serial','timebase']);
&Apache::lonhtmlcommon::clear_breadcrumbs();
@@ -4172,6 +4309,14 @@ sub handler {
&Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=cleanparameters',
text=>"Clean Parameters"});
&clean_parameters($r);
+ } elsif ($env{'form.action'} eq 'dateshift1' && $parm_permission) {
+ &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=dateshift1&timebase='.$env{'form.timebase'},
+ text=>"Shifting Dates"});
+ &date_shift_one($r);
+ } elsif ($env{'form.action'} eq 'dateshift2' && $parm_permission) {
+ &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/parmset?action=dateshift1&timebase='.$env{'form.timebase'},
+ text=>"Shifting Dates"});
+ &date_shift_two($r);
}
} else {
# ----------------------------- Not in a course, or not allowed to modify parms