--- rat/lonsequence.pm 2000/10/16 20:47:39 1.1 +++ rat/lonsequence.pm 2006/06/08 13:56:40 1.27 @@ -2,178 +2,351 @@ # # Sequence Handler # -# (Handler to resolve ambiguous file locations +# $Id: lonsequence.pm,v 1.27 2006/06/08 13:56:40 www Exp $ # -# (TeX Content Handler +# Copyright Michigan State University Board of Trustees # -# 05/29/00,05/30,10/11 Gerd Kortemeyer) +# This file is part of the LearningOnline Network with CAPA (LON-CAPA). # -# 10/11,10/12 Gerd Kortemeyer) +# LON-CAPA is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# LON-CAPA is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with LON-CAPA; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# /home/httpd/html/adm/gpl.txt +# +# http://www.lon-capa.org/ # -# 10/16 Gerd Kortemeyer -package Apache::lonambiguous; +package Apache::lonsequence; use strict; use Apache::lonnet; -use Apache::Constants qw(:common REDIRECT); +use Apache::Constants qw(:common :http REDIRECT); use GDBM_File; +use Apache::lonratedt; +use Apache::lonratsrv; +use Apache::lonpageflip; +use Apache::loncommon; +use Apache::lonlocal; + +my %selhash; +my $successtied; + +# ----------------------------------------- Attempt to read from resource space + +sub attemptread { + my $fn=shift; + &Apache::lonnet::repcopy($fn); + if (-e $fn) { + return &Apache::lonratedt::attemptread($fn); + } else { + return (); + } +} +sub mapread { + my $fn=shift; + &Apache::lonnet::repcopy($fn); + if (-e $fn) { + return &Apache::lonratedt::mapread($fn,''); + } else { + return (); + } +} + +# ---------------------------------------------------------------- View Handler -# ----------------------------------------------------------- Could not resolve +sub viewmap { + my ($r,$url)=@_; + + my $js; + if ($env{'form.forceselect'}) { + $js = (< + +function select_group() { + window.location="/adm/groupsort?catalogmode=groupsec&mode=rat&acts="+document.forms.fileattr.acts.value; +} + +function queue(val) { + if (eval("document.forms."+val+".filelink.checked")) { + var l=val.length; + var v=val.substring(4,l); + document.forms.fileattr.acts.value+='1a'+v+'b'; + } + else { + var l=val.length; + var v=val.substring(4,l); + document.forms.fileattr.acts.value+='0a'+v+'b'; + } +} + + +ENDSCRIPT + } + + $r->print(&Apache::loncommon::start_page('Map Contents',$js). + '

'.$url.'

'); +# ------------------ This is trying to select. Provide buttons and tie %selhash + if ($env{'form.forceselect'}) { $r->print(< + + + +ENDSELECT + my $diropendb = + "/home/httpd/perl/tmp/$env{'user.domain'}\_$env{'user.name'}_sel_res.db"; + if (tie(%selhash,'GDBM_File',$diropendb,&GDBM_WRCREAT(),0640)) { + if ($env{'form.launch'} eq '1') { + &start_fresh_session(); + } + $successtied=1; + +# - Evaluate actions from previous page (both cumulatively and chronologically) + if ($env{'form.catalogmode'} eq 'import') { + my $acts=$env{'form.acts'}; + my @Acts=split(/b/,$acts); + my %ahash; + my %achash; + my $ac=0; + # some initial hashes for working with data + foreach (@Acts) { + my ($state,$ref)=split(/a/); + $ahash{$ref}=$state; + $achash{$ref}=$ac; + $ac++; + } + # sorting through the actions and changing the tied database hash + foreach (sort {$achash{$a}<=>$achash{$b}} (keys %ahash)) { + my $key=$_; + if ($ahash{$key} eq '1') { + $selhash{'store_'.$selhash{'pre_'.$key.'_link'}}= + $selhash{'pre_'.$key.'_title'}; + $selhash{'storectr_'.$selhash{'pre_'.$key.'_link'}}= + $selhash{'storectr'}+0; + $selhash{'storectr'}++; + } + if ($ahash{$key} eq '0') { + if ($selhash{'store_'.$selhash{'pre_'.$key.'_link'}}) { + delete $selhash{'store_'.$selhash{'pre_'.$key.'_link'}}; + } + } + } + # deleting the previously cached listing + foreach (keys %selhash) { + if ($_ =~ /^pre_/ && $_ =~/link$/) { + my $key = $_; + $key =~ s/^pre_//; + $key =~ s/_[^_]*$//; + delete $selhash{'pre_'.$key.'_title'}; + delete $selhash{'pre_'.$key.'_link'}; + } + } + } +# - + } + } +# ----------------------------- successtied is now '1' if in working selectmode + my ($errtext,$fatal)=&mapread(&Apache::lonnet::filelocation('',$url),''); + if ($fatal==1) { + $r->print('

'.&mt('Map contents are not shown in order.').'


'); + } + my $idx=0; + foreach (&attemptread(&Apache::lonnet::filelocation('',$url))) { + if (defined($_)) { + $idx++; + if ($successtied) { + $r->print('
'); + } + my ($title,$url)=split(/\:/,$_); + $title=~s/\&colon\;/\:/g; + $url=~s/\&colon\;/\:/g; + unless ($title) { $title=(split(/\//,$url))[-1] }; + unless ($title) { $title=''.&mt('Empty').''; } + if ($url) { + if ($successtied) { + my $checked=''; + if ($selhash{'store_'.$url}) { + $checked=" checked"; + } + $selhash{"pre_${idx}_link"}=$url; + $selhash{"pre_${idx}_title"}=$title; + + $r->print(< + +ENDCHECKBOX + } + $r->print(''); + } + $r->print(&Apache::lonratsrv::qtescape($title)); + if ($url) { $r->print(''); } + if ($successtied) { + $r->print(''); + } else { + $r->print('
'); + } + } + } + $r->print(&Apache::loncommon::end_page()); + if ($successtied) { + untie %selhash; + } +} -sub getlost { - my ($r,$errmsg)=@_; - $r->content_type('text/html'); - $r->send_http_header; - $r->print( - 'Unknown Error

'. - 'LON-CAPA

Could not handle ambiguous resource reference.

'.$errmsg. - ''); +# ----------------------------------------------------------- Clean out selhash +sub start_fresh_session { + foreach (keys %selhash) { + if ($_ =~ /^pre_/) { + delete $selhash{$_}; + } + if ($_ =~ /^store/) { + delete $selhash{$_}; + } + } } + # ================================================================ Main Handler sub handler { my $r=shift; if ($r->header_only) { - $r->content_type('text/html'); + &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; return OK; } + + &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, + ['forceselect','launch']); + my %hash; my %bighash; -# ----------------------------------------------------------------- Tie db file - if ($ENV{'request.course.fn'}) { - my $envkey; - if (tie(%bighash,'GDBM_File',$ENV{'request.course.fn'}.'.db', - &GDBM_READER,0640)) { - foreach $envkey (keys %ENV) { - if ($envkey=~/^form\.(\d+)\.(\d+)$/) { - my $mapid=$1; - my $resid=$2; - my $resurl=$bighash{'src_'.$mapid.'.'.$resid}; - &Apache::lonnet::symblist($bighash{'map_id_'.$mapid}, - $resurl => $resid); - $r->header_out(Location => - 'http://'.$ENV{'HTTP_HOST'}.$resurl); - return REDIRECT; - } - } - untie(%bighash); - } else { - &getlost($r,'Could not access course structure.'); - return OK; - } - } else { - $ENV{'user.error.msg'}="$requrl:bre:0:0:Course not initialized"; - return HTTP_NOT_ACCEPTABLE; - } - - return OK; - -# ================================================================= TRASH BELOW + my $requrl=$r->uri; -# ---------------------------------------------------------- Do we have a case? + $successtied=0; +# ------------------------------------------------------------ Tie symb db file + my $disurl=''; + my $dismapid=''; + my $exitdisid = ''; + my $arrow_dir = ''; + + if (($env{'request.course.fn'}) && (!$env{'form.forceselect'})) { + my $last; + if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db', + &GDBM_READER(),0640)) { + $last=$hash{'last_direction'}; + untie(%hash); + } + my $direction=''; + my $prevmap=''; + if ($last) { + ($prevmap,undef,$direction)=&Apache::lonnet::decode_symb($last); + } +# ------------------------------------------------------------- Tie big db file + if (tie(%bighash,'GDBM_File',$env{'request.course.fn'}.'.db', + &GDBM_READER(),0640)) { + my $disid=''; + my $randomout =''; + + if ($direction eq 'back') { + $disid=$bighash{'map_finish_'.$requrl}; + } else { + $disid=$bighash{'map_start_'.$requrl}; + } + if ($disid) { + $disurl=$bighash{'src_'.$disid}; + $dismapid=(split(/\./,$disid))[1]; + if (!$env{'request.role.adv'}) { + $randomout = $bighash{'randomout_'.$disid}; + } + } elsif (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db', + &GDBM_READER(),0640)) { + $last=$hash{'last_known'}; + untie(%hash); + } + + +# ----------- If this is an empty one, or hidden, skip to next non-empty or non-hidden one + while ( ((!$disurl) && ($disid)) || ($randomout && $disid) ) { + $direction=($direction?$direction:'forward'); + ($disid,$requrl)= + &Apache::lonpageflip::fullmove($disid, + &Apache::lonnet::declutter($requrl),$direction); + if ($disid) { + $disurl=$bighash{'src_'.$disid}; + $dismapid=(split(/\./,$disid))[1]; + if (!$env{'request.role.adv'}) { + $randomout = $bighash{'randomout_'.$disid}; + } + } + } + $exitdisid = $disid; + $arrow_dir = $direction; - my $thisfn; - unless (($thisfn=$ENV{'request.ambiguous'})&&($ENV{'request.course.fn'})) { - &getlost($r,'Could not find information on resource.'); - return OK; +# --------------------------------------- Untie hash, make sure to come by here + untie(%bighash); + } } - -# ---------------------------------- Should this file have been part of a page? - $thisfn=&Apache::lonnet::declutter($thisfn); - my %hash; - my $syval=''; - - if (tie(%hash,'GDBM_File',$ENV{'request.course.fn'}.'_symb.db', - &GDBM_READER,0640)) { - $syval=$hash{$thisfn}; - untie(%hash); - } - -# ---------------------------------------------------------- There was an entry - - if ($syval) { - - if ($syval=~/\_$/) { -# ----------------------------------- Okay, this should have appeared on a page - $syval=~s/\_\_\_$//; - $r->content_type('text/html'); - $r->header_out(Location => - 'http://'.$ENV{'HTTP_HOST'}.'/res/'.$syval); - return REDIRECT; +# now either disurl is set (going to first page), or we need another display + if ($disurl) { +# -------------------------------------------------- Has first or last resource + &Apache::lonnet::symblist($requrl,$disurl => [$disurl,$dismapid], + 'last_known' => [$disurl,$dismapid]); + &Apache::loncommon::content_type($r,'text/html'); + $r->header_out(Location => 'http://'.$ENV{'HTTP_HOST'}.$disurl); + return REDIRECT; + } else { + &Apache::loncommon::content_type($r,'text/html'); + $r->send_http_header; + if ($exitdisid eq '' && $arrow_dir ne '') { + my %lt =&Apache::lonlocal::texthash( + 'back' => 'beginning', + 'forward' => 'end', + 'nere' => 'Next resource could not be displayed', + 'goba' => 'Go Back', + 'nacc' => 'Navigate Course Content', + ); + my $warnmsg = &mt('As all folders and sequences '); + if ($arrow_dir eq 'forward') { + $warnmsg .= &mt('following the current resource were empty').','; + } elsif ($arrow_dir eq 'back') { + $warnmsg .= &mt('preceding the current resource were empty').','; + } + $warnmsg .= &mt('you have now reached the').' '.$lt{$arrow_dir}.' '.&mt('of the course.'); + my $start_page= + &Apache::loncommon::start_page('Empty Folder/Sequence'); + my $end_page= + &Apache::loncommon::end_page(); + $r->print(<$lt{'nere'} +

$warnmsg

+ +$end_page +ENDNONE } else { -# There is not really a problem (???), but cannot go back without endless loop - &getlost($r,'The nature of the problem is unclear'); - return OK; + &viewmap($r,$requrl); } - } - -# ------------------------------------------------ Would be standalone resource - - if (tie(%bighash,'GDBM_File',$ENV{'request.course.fn'}.'.db', - &GDBM_READER,0640)) { -# ---------------------------------------------- Get ID(s) for current resource - my $ids=$bighash{'ids_/res/'.$thisfn}; - if ($ids) { -# ------------------------------------------------------------------- Has ID(s) - my @possibilities=split(/\,/,$ids); - my $couldbe=''; - map { - if (&Apache::lonnet::allowed('bre',$bighash{'src_'.$_})) { - if ($couldbe) { - $couldbe.=','.$_; - } else { - $couldbe=$_; - } - } - } @possibilities; - if ($couldbe) { - @possibilities=split(/\,/,$couldbe); - if ($#possibilities>0) { -# ----------------------------------------------- Okay, really multiple choices - $r->content_type('text/html'); - $r->send_http_header; - $r->print(<Choose Location - -

LON-CAPA

-The resource you had been accessing appears more than once in this course, -and LON-CAPA has insufficient session information to determine which instance -of the resource you meant. -

-Please click on the instance of the resource you intended to access: -

-

- - - - -ENDSTART - map { - my $mapurl=$bighash{'map_id_'.(split(/\./,$_))[0]}; - $r->print(''); - } @possibilities; - $r->print('
 TitleTypePart of ...
'.$bighash{'title_'.$_}. - ''.$bighash{'type_'.$_}. - ''.$mapurl. - '
'); - untie(%bighash); - return OK; - } - } - } - untie(%bighash); - } - -# ------------------------------------ This handler should not have been called - &getlost($r,'Invalid call of handler'); - return OK; + return OK; + } } 1;