--- loncom/homework/lonhomework.pm 2004/12/20 12:16:47 1.188 +++ loncom/homework/lonhomework.pm 2005/01/31 21:57:32 1.196 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # The LON-CAPA Homework handler # -# $Id: lonhomework.pm,v 1.188 2004/12/20 12:16:47 foxr Exp $ +# $Id: lonhomework.pm,v 1.196 2005/01/31 21:57:32 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -54,74 +54,29 @@ use Apache::loncommon(); use Apache::lonlocal; use Time::HiRes qw( gettimeofday tv_interval ); use Apache::lonnet(); -# -# FIXME!!!!!!! -# Be nice if someone -# - Took credit/blame for this module. -# - At least commented the purpose of each major -# sub -# - Even better commented the major blocks. -# -# I'll have a go at it for what I need. -# ?'s- mean maybe this is right. -# The number of ?'s represents the rough level -# of doubt I have about rightness, with ??? representing -# uncertainty based on the first blush interpretation. -# ?? - I have some code to back up this interpretation. -# ? - I"m pretty sure I understand the code that backs up this -# interpretation. -# ???? - Absolutely clueless. -# . - I'm pretty sure the interpretation is correct. -# RF. - - -# 'Exported' Variables: - -# viewgrades is 'F' if users are not allowed to view the grades.. T otherwise. -$Apache::lonhomework::viewgrades = 'F'; # By default cannot. +# FIXME - improve commenting -# Internal variables. - -my $DEBUG=0; # set nonzero to enable debugging. BEGIN { &Apache::lonxml::register_insert(); } -# -# Issue debug log messages. -# Parameters: -# The log message to issue. -# Implicit Inputs: -# DEBUG - If non zero the message is issued, otherwise not. -# -sub Debug { - my ($message) = @_; - - if($DEBUG) { - my @call_context = caller(1); - my $prefix = "$call_context[3]:$call_context[2]:: "; - &Apache::lonnet::logthis($prefix.$message); - } -} # -# I believe this sub defines how to render the -# problem based on the context of the rendering? +# Decides what targets to render for. # Implicit inputs: # Various session environment variables: -# request.state - State of the resource actually ?? -# published - Examining in resource space. -# uploaded - Not sure how this happens????? -# contruct - Rendering in construction space for viewing. -# form.grade_target - +# request.state - published - is a /res/ resource +# uploaded - is a /uploaded/ resource +# contruct - is a /priv/ resource +# form.grade_target - a form parameter requesting a specific target sub get_target { - &Debug("request.state = $ENV{'request.state'}"); + &Apache::lonxml::debug("request.state = $ENV{'request.state'}"); if( defined($ENV{'form.grade_target'})) { - &Debug("form.grade_target = $ENV{'form.grade_target'}"); + &Apache::lonxml::debug("form.grade_target= $ENV{'form.grade_target'}"); } else { - &Debug("form.grade_target "); + &Apache::lonxml::debug("form.grade_target "); } if (($ENV{'request.state'} eq "published") || ($ENV{'request.state'} eq "uploaded")) { @@ -160,7 +115,8 @@ sub get_target { } else { return ('web','answer'); } - } elsif ( $ENV{'form.problemmode'} eq &mt('Edit') ) { + } elsif ( $ENV{'form.problemmode'} eq &mt('Edit') || + $ENV{'form.problemmode'} eq 'Edit') { if ( $ENV{'form.submitted'} eq 'edit' ) { if ( $ENV{'form.submit'} eq &mt('Submit Changes and View') ) { return ('modified','web','answer'); @@ -364,7 +320,7 @@ sub check_access { &Apache::lonxml::debug("looking for accesstime $first_access"); if (!$first_access) { $status='NOT_YET_VIEWED'; - $datemsg=' '.$interval.' seconds'; + $datemsg=&seconds_to_human_length($interval); } else { my $newdate=localtime($first_access+$interval); if (time > ($first_access+$interval)) { @@ -392,6 +348,25 @@ sub check_access { return ($status,$datemsg); } +sub seconds_to_human_length { + my ($length)=@_; + + my $seconds=$length%60; $length=int($length/60); + my $minutes=$length%60; $length=int($length/60); + my $hours=$length%24; $length=int($length/24); + my $days=$length; + + my $timestr; + if ($days > 0) { $timestr.=&mt('[quant,_1,day]',$days); } + if ($hours > 0) { $timestr.=($timestr?", ":""). + &mt('[quant,_1,hour]',$hours); } + if ($minutes > 0) { $timestr.=($timestr?", ":""). + &mt('[quant,_1,minute]',$minutes); } + if ($seconds > 0) { $timestr.=($timestr?", ":""). + &mt('[quant,_1,second]',$seconds); } + return $timestr; +} + sub showhash { my (%hash) = @_; &showhashsubset(\%hash,'.'); @@ -402,10 +377,11 @@ sub showarray { my ($array)=@_; my $string="("; foreach my $elm (@{ $array }) { - if (ref($elm)) { - if ($elm =~ /ARRAY/ ) { - $string.=&showarray($elm); - } + if (ref($elm) eq 'ARRAY') { + $string.=&showarray($elm); + } elsif (ref($elm) eq 'HASH') { + $string.= "HASH --- \n
"; + $string.= &showhashsubset($elm,'.'); } else { $string.="$elm," } @@ -419,20 +395,15 @@ sub showhashsubset { my ($hash,$keyre) = @_; my $resultkey; foreach $resultkey (sort keys %$hash) { - if ($resultkey =~ /$keyre/) { - if (ref($$hash{$resultkey})) { - if ($$hash{$resultkey} =~ /ARRAY/ ) { - &Apache::lonxml::debug("$resultkey ---- ". - &showarray($$hash{$resultkey})); - } elsif ($$hash{$resultkey} =~ /HASH/ ) { - &Apache::lonxml::debug("$resultkey ---- $$hash{$resultkey}"); - &showhashsubset($$hash{$resultkey},'.'); - } else { - &Apache::lonxml::debug("$resultkey ---- $$hash{$resultkey}"); - } - } else { - &Apache::lonxml::debug("$resultkey ---- $$hash{$resultkey}"); - } + if ($resultkey !~ /$keyre/) { next; } + if (ref($$hash{$resultkey}) eq 'ARRAY' ) { + &Apache::lonxml::debug("$resultkey ---- ". + &showarray($$hash{$resultkey})); + } elsif (ref($$hash{$resultkey}) eq 'HASH' ) { + &Apache::lonxml::debug("$resultkey ---- $$hash{$resultkey}"); + &showhashsubset($$hash{$resultkey},'.'); + } else { + &Apache::lonxml::debug("$resultkey ---- $$hash{$resultkey}"); } } &Apache::lonxml::debug("\n
restored values^
\n"); @@ -468,6 +439,8 @@ sub setupheader { if (!$Apache::lonxml::debug && ($ENV{'REQUEST_METHOD'} eq 'GET')) { &Apache::loncommon::no_cache($request); } +# $request->set_last_modified(&Apache::lonnet::metadata($request->uri, +# 'lastrevisiondate')); $request->send_http_header; return OK if $request->header_only; return '' @@ -671,10 +644,10 @@ sub editxmlmode { } return ''; } + # # Render the page in whatever target desired. # - sub renderpage { my ($request,$file) = @_; @@ -843,18 +816,14 @@ sub handler { $Apache::lonxml::debug=$ENV{'user.debug'}; $ENV{'request.uri'}=$request->uri; &setuppermissions(); - &Apache::lonxml::debug("Permissions:$Apache::lonhomework::browse:$Apache::lonhomework::viewgrades:"); # some times multiple problemmodes are submitted, need to select # the last one - &Apache::lonxml::debug("Problem Mode ".$ENV{'form.problemmode'}); - if ( defined($ENV{'form.problemmode'}) && - ref($ENV{'form.problemmode'}) ) { - &Apache::lonxml::debug("Problem Mode ".join(",",@$ENV{'form.problemmode'})); + if ( defined($ENV{'form.problemmode'}) && ref($ENV{'form.problemmode'}) ) { my $mode=$ENV{'form.problemmode'}->[-1]; undef $ENV{'form.problemmode'}; $ENV{'form.problemmode'}=$mode; } - &Apache::lonxml::debug("Problem Mode ".$ENV{'form.problemmode'}); + my $file=&Apache::lonnet::filelocation("",$request->uri); #check if we know where we are @@ -866,11 +835,13 @@ sub handler { if ( &Apache::lonnet::mod_perl_version() == 2 ) { &Apache::lonnet::cleanenv(); } - $request->internal_redirect('/adm/ambiguous'); return; + &Apache::lonnet::logthis(&Apache::lonnet::mod_perl_version()); + $request->internal_redirect('/adm/ambiguous'); return OK; } } if (&setupheader($request)) { return OK; } - + &Apache::lonxml::debug("Permissions:$Apache::lonhomework::browse:$Apache::lonhomework::viewgrades:"); + &Apache::lonxml::debug("Problem Mode ".$ENV{'form.problemmode'}); my ($symb) = &Apache::lonxml::whichuser(); &Apache::lonxml::debug('symb is '.$symb); if ($ENV{'request.state'} eq "construct" || $symb eq '') { @@ -891,7 +862,8 @@ sub handler { #&view_or_edit_menu($request); $ENV{'form.problemmode'}='View'; &renderpage($request,$file); - } elsif ($ENV{'form.problemmode'} eq &mt('EditXML')) { + } elsif ($ENV{'form.problemmode'} eq &mt('EditXML') || + $ENV{'form.problemmode'} eq 'EditXML') { &editxmlmode($request,$file); } elsif ($ENV{'form.problemmode'} eq &mt('Calculate answers')) { &analyze($request,$file);