--- 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('
'. + ''. + '
'.&mt('Currently set date:').''. + &Apache::lonlocal::locallocaltime($env{'form.timebase'}).'
'.&mt('Shifted date:').''. + &Apache::lonhtmlcommon::date_setter('shiftform', + 'timeshifted', + $env{'form.timebase'},, + ''). + '
'. + ''. + ''. + '
'); + $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