--- rat/lonsequence.pm 2002/05/23 10:19:30 1.8 +++ rat/lonsequence.pm 2006/01/05 20:57:55 1.25 @@ -2,7 +2,7 @@ # # Sequence Handler # -# $Id: lonsequence.pm,v 1.8 2002/05/23 10:19:30 www Exp $ +# $Id: lonsequence.pm,v 1.25 2006/01/05 20:57:55 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -28,13 +28,6 @@ # # (Handler to resolve ambiguous file locations # -# (TeX Content Handler -# -# 05/29/00,05/30,10/11 Gerd Kortemeyer) -# -# 10/11,10/12 Gerd Kortemeyer) -# -# 10/16 Gerd Kortemeyer package Apache::lonsequence; @@ -44,19 +37,12 @@ use Apache::Constants qw(:common :http R use GDBM_File; use Apache::lonratedt; use Apache::lonratsrv; +use Apache::lonpageflip; +use Apache::loncommon; +use Apache::lonlocal; -# ----------------------------------------------------------- Could not resolve - -sub getlost { - my ($r,$errmsg)=@_; - $r->content_type('text/html'); - $r->send_http_header; - $r->print( - 'Unknown Error

'. - 'LON-CAPA

Could not handle sequence resource reference.

'.$errmsg. - ''); -} - +my %selhash; +my $successtied; # ----------------------------------------- Attempt to read from resource space @@ -70,16 +56,26 @@ sub attemptread { } } +sub mapread { + my $fn=shift; + &Apache::lonnet::repcopy($fn); + if (-e $fn) { + return &Apache::lonratedt::mapread($fn,''); + } else { + return (); + } +} + # ---------------------------------------------------------------- View Handler sub viewmap { - my ($r,$url,$adv,$errtext)=@_; + my ($r,$url)=@_; $r->print(''); - if ($ENV{'form.forceselect'}) { $r->print(<print(< function select_group() { - window.location="/adm/groupsort?catalogmode=groupimport&mode=rat&acts="+document.forms.fileattr.acts.value; + window.location="/adm/groupsort?catalogmode=groupsec&mode=rat&acts="+document.forms.fileattr.acts.value; } function queue(val) { @@ -95,40 +91,99 @@ function queue(val) { } } - - ENDSCRIPT } - $r->print(''.&buttons($adv)); - if ($ENV{'form.forceselect'}) { $r->print(<print(&Apache::loncommon::bodytag('Map Contents').'

'.$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'}_groupsec.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 'groupimport') { + 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'}; + } + } + } +# - + } } - if ($errtext) { - $r->print($errtext.'
'); +# ----------------------------- 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 ($ENV{'form.forceselect'}) { + 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='Empty'; } + unless ($title) { $title=''.&mt('Empty').''; } if ($url) { - if ($ENV{'form.forceselect'}) { + if ($successtied) { + my $checked=''; + if ($selhash{'store_'.$url}) { + $checked=" checked"; + } + $selhash{"pre_${idx}_link"}=$url; + $selhash{"pre_${idx}_title"}=$title; + $r->print(< +value='$url' onClick='javascript:queue("form$idx")'$checked> ENDCHECKBOX } @@ -136,7 +191,7 @@ ENDCHECKBOX } $r->print(&Apache::lonratsrv::qtescape($title)); if ($url) { $r->print(''); } - if ($ENV{'form.forceselect'}) { + if ($successtied) { $r->print(''); } else { $r->print('
'); @@ -144,101 +199,152 @@ ENDCHECKBOX } } $r->print(''); + if ($successtied) { + untie %selhash; + } } +# ----------------------------------------------------------- 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']); + ['forceselect','launch']); my %hash; my %bighash; my $requrl=$r->uri; + $successtied=0; # ------------------------------------------------------------ Tie symb db file - if ($ENV{'request.course.fn'}) { + 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)) { + 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,$direction)=(split(/\_\_\_/,$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)) { + if (tie(%bighash,'GDBM_File',$env{'request.course.fn'}.'.db', + &GDBM_READER(),0640)) { my $disid=''; - my $whatend=''; + my $randomout =''; + if ($direction eq 'back') { $disid=$bighash{'map_finish_'.$requrl}; - $whatend='End'; } else { $disid=$bighash{'map_start_'.$requrl}; - $whatend='Beginning'; - } - my $disurl=''; - my $dismapid=''; + } 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); } - my $symb=''; - my $sequencetitle=''; - unless($disurl) { - if ($symb=&Apache::lonnet::symbread()) { - my ($mapurl,$mapid)=split(/\_\_\_/,$symb); - $sequencetitle=$bighash{'title_'. - $bighash{'map_pc_/res/'.$mapurl}.'.'. - $mapid}; + + +# ----------- 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; + # --------------------------------------- Untie hash, make sure to come by here untie(%bighash); - if ($disurl) { + } + } + +# 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 => $dismapid, - 'last_known' => &Apache::lonnet::declutter($disurl)); - $r->content_type('text/html'); - $r->header_out(Location => 'http://'.$ENV{'HTTP_HOST'}.$disurl); - return REDIRECT; - } else { -# ---------- Does not have first or last resource, try to find out where we are - unless ($symb) { - $r->internal_redirect('/adm/ambiguous'); - } - $r->content_type('text/html'); - $r->send_http_header; - $r->print(< -

$whatend of

-

$sequencetitle

- -ENDSYMB - return OK + &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', + 'emfo' => 'Empty Folder/Sequence', + 'nere' => 'Next resource could not be displayed', + 'goba' => 'Go Back', + 'nacc' => 'Navigate Course Content', + ); + my $warnmsg = '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 $bodytag=&Apache::loncommon::bodytag('Empty Folder/Sequence'); + $r->print(<$lt{'emfo'} +$bodytag +

$lt{'nere'}

+

$warnmsg

+ + + +ENDNONE } else { - &getlost($r,'Could not access course structure.'); - return OK; + &viewmap($r,$requrl); } - } else { - $ENV{'user.error.msg'}="$requrl:bre:0:0:Course not initialized"; - return HTTP_NOT_ACCEPTABLE; + return OK; } - - return OK; } 1;