--- rat/lonsequence.pm 2004/07/06 15:27:00 1.18 +++ rat/lonsequence.pm 2009/02/16 13:52:04 1.37 @@ -2,7 +2,7 @@ # # Sequence Handler # -# $Id: lonsequence.pm,v 1.18 2004/07/06 15:27:00 raeburn Exp $ +# $Id: lonsequence.pm,v 1.37 2009/02/16 13:52:04 bisitz Exp $ # # Copyright Michigan State University Board of Trustees # @@ -26,15 +26,8 @@ # # 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,11 +35,12 @@ 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 Apache::loncommon; +use LONCAPA::map(); +use Apache::lonpageflip(); +use Apache::loncommon(); +use Apache::groupsort(); use Apache::lonlocal; +use HTML::Entities(); my %selhash; my $successtied; @@ -54,10 +48,10 @@ my $successtied; # ----------------------------------------- Attempt to read from resource space sub attemptread { - my $fn=shift; + my ($fn,$unsorted)=@_; &Apache::lonnet::repcopy($fn); if (-e $fn) { - return &Apache::lonratedt::attemptread($fn); + return &LONCAPA::map::attemptread($fn,$unsorted); } else { return (); } @@ -67,7 +61,7 @@ sub mapread { my $fn=shift; &Apache::lonnet::repcopy($fn); if (-e $fn) { - return &Apache::lonratedt::mapread($fn,''); + return &LONCAPA::map::mapread($fn,''); } else { return (); } @@ -77,9 +71,11 @@ sub mapread { sub viewmap { my ($r,$url)=@_; - $r->print('<html>'); - if ($ENV{'form.forceselect'}) { $r->print(<<ENDSCRIPT); -<script> + + my $js; + if ($env{'form.forceselect'}) { + $js = (<<ENDSCRIPT); +<script type="text/javascript"> function select_group() { window.location="/adm/groupsort?catalogmode=groupsec&mode=rat&acts="+document.forms.fileattr.acts.value; @@ -101,9 +97,11 @@ function queue(val) { </script> ENDSCRIPT } - $r->print(&Apache::loncommon::bodytag('Map Contents').'<h1>'.$url.'</h1>'); + + $r->print(&Apache::loncommon::start_page('Map Contents',$js). + '<h1>'.$url.'</h1>'); # ------------------ This is trying to select. Provide buttons and tie %selhash - if ($ENV{'form.forceselect'}) { $r->print(<<ENDSELECT); + if ($env{'form.forceselect'}) { $r->print(<<ENDSELECT); <form name=fileattr><input type=hidden name=acts value=''> <input type="button" name="close" value='CLOSE' onClick="self.close()"> <input type="button" name="groupimport" value='GROUP IMPORT' @@ -111,61 +109,26 @@ onClick="javascript:select_group()"> </form> 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'}; - 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'}}; - } - } + if ($env{'form.catalogmode'} eq 'import') { + &Apache::groupsort::update_actions_hash(\%selhash); } - # 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('<p><b><font color="red">'.&mt('Map contents are not shown in order.').'</font></b></p><br />'); + $r->print('<p class="LC_warning">' + .&mt('Map contents are not shown in order.') + .'</p><br />'); } my $idx=0; foreach (&attemptread(&Apache::lonnet::filelocation('',$url))) { @@ -175,10 +138,15 @@ ENDSELECT $r->print('<form name="form'.$idx.'">'); } my ($title,$url)=split(/\:/,$_); - $title=~s/\&colon\;/\:/g; - $url=~s/\&colon\;/\:/g; - unless ($title) { $title=(split(/\//,$url))[-1] }; - unless ($title) { $title='<i>'.&mt('Empty').'</i>'; } + $title = &LONCAPA::map::qtescape($title); + unless ($title) { $title=(split(/\//,$url))[-1] }; + my $enc_title = &HTML::Entities::encode($title,'\'"<>&'); + unless ($title) { + $title='<i>'.&mt('Empty').'</i>'; + $enc_title = &mt('Empty'); + } + $url = &LONCAPA::map::qtescape($url); + my $enc_url = &HTML::Entities::encode($url,'\'"<>&'); if ($url) { if ($successtied) { my $checked=''; @@ -187,16 +155,17 @@ ENDSELECT } $selhash{"pre_${idx}_link"}=$url; $selhash{"pre_${idx}_title"}=$title; - + + $url = &HTML::Entities::encode($url, '\'"<>&'); $r->print(<<ENDCHECKBOX); <input type='checkbox' name='filelink' -value='$url' onClick='javascript:queue("form$idx")'$checked> -<input type='hidden' name='title' value='$title'> +value='$enc_url' onClick='javascript:queue("form$idx")'$checked /> +<input type='hidden' name='title' value='$enc_title' /> ENDCHECKBOX } - $r->print('<a href="'.&Apache::lonratsrv::qtescape($url).'">'); + $r->print('<a href="'.$enc_url.'">'); } - $r->print(&Apache::lonratsrv::qtescape($title)); + $r->print($enc_title); if ($url) { $r->print('</a>'); } if ($successtied) { $r->print('</form>'); @@ -205,7 +174,7 @@ ENDCHECKBOX } } } - $r->print('</body></html>'); + $r->print(&Apache::loncommon::end_page()); if ($successtied) { untie %selhash; } @@ -249,9 +218,9 @@ sub handler { 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); @@ -259,10 +228,10 @@ 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 =''; @@ -275,8 +244,10 @@ sub handler { if ($disid) { $disurl=$bighash{'src_'.$disid}; $dismapid=(split(/\./,$disid))[1]; - $randomout = $bighash{'randomout_'.$disid}; - } elsif (tie(%hash,'GDBM_File',$ENV{'request.course.fn'}.'_symb.db', + 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); @@ -292,6 +263,9 @@ sub handler { if ($disid) { $disurl=$bighash{'src_'.$disid}; $dismapid=(split(/\./,$disid))[1]; + if (!$env{'request.role.adv'}) { + $randomout = $bighash{'randomout_'.$disid}; + } } } $exitdisid = $disid; @@ -305,42 +279,43 @@ 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)); + &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); + $r->header_out(Location => &Apache::lonnet::absolute_url($ENV{'SERVER_NAME'}). + $disurl); return REDIRECT; } else { &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; - if ($exitdisid eq '') { + 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 '; + 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 $bodytag=&Apache::loncommon::bodytag(&mt('emfo')); + my $start_page= + &Apache::loncommon::start_page('Empty Folder/Sequence'); + my $end_page= + &Apache::loncommon::end_page(); $r->print(<<ENDNONE); -<head><title>$lt{'emfo'}</title></head> -$bodytag +$start_page <h3>$lt{'nere'}</h3> <p>$warnmsg</p> <ul> <li><a href="javascript:history.go(-1)">$lt{'goba'}</a></li> <li><a href="/adm/navmaps">$lt{'nacc'}</a></li> </ul> -</body> - </html> +$end_page ENDNONE } else { &viewmap($r,$requrl); @@ -352,7 +327,35 @@ ENDNONE 1; __END__ +=head1 NAME + +Apache::lonsequence + +=head1 SYNOPSIS + +Handler for showing sequence objects of +educational resources. + +This is part of the LearningOnline Network with CAPA project +described at http://www.lon-capa.org. + +=head1 SUBROUTINES + +=over + +=item handler() + +=item viewmap() + +=item attemptread() + +=item mapread() + +=item start_fresh_session() + +=back +=cut