--- rat/lonsequence.pm 2002/08/12 18:21:42 1.13 +++ rat/lonsequence.pm 2007/01/16 21:19:11 1.30 @@ -2,7 +2,7 @@ # # Sequence Handler # -# $Id: lonsequence.pm,v 1.13 2002/08/12 18:21:42 albertel Exp $ +# $Id: lonsequence.pm,v 1.30 2007/01/16 21:19:11 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -26,15 +26,6 @@ # # http://www.lon-capa.org/ # -# (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; @@ -42,9 +33,11 @@ use strict; use Apache::lonnet; use Apache::Constants qw(:common :http REDIRECT); use GDBM_File; -use Apache::lonratedt; -use Apache::lonratsrv; -use Apache::lonpageflip; +use LONCAPA::map(); +use Apache::lonpageflip(); +use Apache::loncommon(); +use Apache::lonlocal; +use HTML::Entities(); my %selhash; my $successtied; @@ -55,7 +48,17 @@ sub attemptread { my $fn=shift; &Apache::lonnet::repcopy($fn); if (-e $fn) { - return &Apache::lonratedt::attemptread($fn); + return &LONCAPA::map::attemptread($fn); + } else { + return (); + } +} + +sub mapread { + my $fn=shift; + &Apache::lonnet::repcopy($fn); + if (-e $fn) { + return &LONCAPA::map::mapread($fn,''); } else { return (); } @@ -65,9 +68,11 @@ sub attemptread { sub viewmap { my ($r,$url)=@_; - $r->print(''); - if ($ENV{'form.forceselect'}) { $r->print(< + + my $js; + if ($env{'form.forceselect'}) { + $js = (< function select_group() { window.location="/adm/groupsort?catalogmode=groupsec&mode=rat&acts="+document.forms.fileattr.acts.value; @@ -89,9 +94,11 @@ function queue(val) { ENDSCRIPT } - $r->print(''); + + $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(<print(< ENDSELECT my $diropendb = - "/home/httpd/perl/tmp/$ENV{'user.domain'}\_$ENV{'user.name'}_groupsec.db"; + "/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') { + 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'}; + if ($env{'form.catalogmode'} eq 'import') { + my $acts=$env{'form.acts'}; my @Acts=split(/b/,$acts); my %ahash; my %achash; @@ -151,6 +158,10 @@ ENDSELECT } } # ----------------------------- 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($_)) { @@ -159,10 +170,15 @@ ENDSELECT $r->print('
'); } my ($title,$url)=split(/\:/,$_); - $title=~s/\&colon\;/\:/g; - $url=~s/\&colon\;/\:/g; - unless ($title) { $title=(split(/\//,$url))[-1] }; - unless ($title) { $title='Empty'; } + $title = &LONCAPA::map::qtescape($title); + unless ($title) { $title=(split(/\//,$url))[-1] }; + my $enc_title = &HTML::Entities::encode($title,'\'"<>&'); + unless ($title) { + $title=''.&mt('Empty').''; + $enc_title = &mt('Empty'); + } + $url = &LONCAPA::map::qtescape($url); + my $enc_url = &HTML::Entities::encode($url,'\'"<>&'); if ($url) { if ($successtied) { my $checked=''; @@ -171,16 +187,17 @@ ENDSELECT } $selhash{"pre_${idx}_link"}=$url; $selhash{"pre_${idx}_title"}=$title; - + + $url = &HTML::Entities::encode($url, '\'"<>&'); $r->print(< - +value='$enc_url' onClick='javascript:queue("form$idx")'$checked /> + ENDCHECKBOX } - $r->print(''); + $r->print(''); } - $r->print(&Apache::lonratsrv::qtescape($title)); + $r->print($enc_title); if ($url) { $r->print(''); } if ($successtied) { $r->print(''); @@ -189,7 +206,7 @@ ENDCHECKBOX } } } - $r->print(''); + $r->print(&Apache::loncommon::end_page()); if ($successtied) { untie %selhash; } @@ -214,7 +231,7 @@ 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; } @@ -230,10 +247,12 @@ sub handler { # ------------------------------------------------------------ Tie symb db file my $disurl=''; my $dismapid=''; + my $exitdisid = ''; + my $arrow_dir = ''; - if (($ENV{'request.course.fn'}) && (!$ENV{'form.forceselect'})) { + if (($env{'request.course.fn'}) && (!$env{'form.forceselect'})) { my $last; - if (tie(%hash,'GDBM_File',$ENV{'request.course.fn'}.'_symb.db', + if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db', &GDBM_READER(),0640)) { $last=$hash{'last_direction'}; untie(%hash); @@ -241,24 +260,34 @@ sub handler { 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', + 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, skip to next non-empty one - if ((!$disurl) && ($disid)) { + + +# ----------- 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, @@ -266,8 +295,13 @@ sub handler { 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); @@ -275,18 +309,48 @@ sub handler { } # 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'); + &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 { - $r->content_type('text/html'); + &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; - &viewmap($r,$requrl); + 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 { + &viewmap($r,$requrl); + } return OK; } } 500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.