--- loncom/interface/groupsort.pm 2006/03/26 19:44:45 1.41 +++ loncom/interface/groupsort.pm 2008/09/15 13:22:48 1.62 @@ -2,7 +2,7 @@ # The LON-CAPA group sort handler # Allows for sorting prior to import into RAT. # -# $Id: groupsort.pm,v 1.41 2006/03/26 19:44:45 banghart Exp $ +# $Id: groupsort.pm,v 1.62 2008/09/15 13:22:48 bisitz Exp $ # # Copyright Michigan State University Board of Trustees # @@ -37,153 +37,96 @@ use GDBM_File; use Apache::loncommon; use Apache::lonlocal; use Apache::lonnet; +use LONCAPA; my $iconpath; # variable to be accessible to multiple subroutines my %hash; # variable to tie to user specific database -sub readfromdb { - my ($r,$shash,$thash)=@_; - - my $diropendb; -# ------------------------------ which file do we open? Easy if explictly given - if ($env{'form.catalogmode'} eq 'groupsearch') { - $diropendb = - "/home/httpd/perl/tmp/$env{'user.domain'}_$env{'user.name'}_searchcat.db"; - } elsif ($env{'form.catalogmode'} eq 'groupimport') { - $diropendb = - "/home/httpd/perl/tmp/$env{'user.domain'}_$env{'user.name'}_indexer.db"; - } elsif ($env{'form.catalogmode'} eq 'groupsec') { - $diropendb = - "/home/httpd/perl/tmp/$env{'user.domain'}_$env{'user.name'}_groupsec.db"; - } else { -# --------------------- not explicitly given, choose the one most recently used - my @dbfn; - my @dbst; - - $dbfn[0] = - "/home/httpd/perl/tmp/$env{'user.domain'}_$env{'user.name'}_searchcat.db"; - $dbst[0]=-1; - if (-e $dbfn[0]) { - $dbst[0]=(stat($dbfn[0]))[9]; +sub update_actions_hash { + my ($hash) = @_; + # be careful in here, there is also a global %hash + my $acts=$env{'form.acts'}; + my @Acts=split(/b/,$acts); + my %ahash; + my %achash; + # some initial hashes for working with data + my $ac=0; + foreach (@Acts) { + my ($state,$ref)=split(/a/); + $ahash{$ref}=$state; + $achash{$ref}=$ac; + $ac++; + } + # sorting through the actions and changing the global database hash + foreach my $key (sort {$achash{$a}<=>$achash{$b}} (keys %ahash)) { + if ($ahash{$key} eq '1') { + $hash->{'store_'.$hash->{'pre_'.$key.'_link'}}= + $hash->{'pre_'.$key.'_title'}; + $hash->{'storectr_'.$hash->{'pre_'.$key.'_link'}}= + $hash->{'storectr'}+0; + $hash->{'storectr'}++; } - $dbfn[1] = - "/home/httpd/perl/tmp/$env{'user.domain'}_$env{'user.name'}_indexer.db"; - $dbst[1]=-1; - if (-e $dbfn[1]) { - $dbst[1]=(stat($dbfn[1]))[9]; - } - $dbfn[2] = - "/home/httpd/perl/tmp/$env{'user.domain'}_$env{'user.name'}_groupsec.db"; - $dbst[2]=-1; - if (-e $dbfn[2]) { - $dbst[2]=(stat($dbfn[2]))[9]; - } -# Expand here for more modes -# .... + if ($ahash{$key} eq '0') { + if ($hash->{'store_'.$hash->{'pre_'.$key.'_link'}}) { + delete($hash->{'store_'.$hash->{'pre_'.$key.'_link'}}); + delete($hash->{'storectr_'.$hash->{'pre_'.$key.'_link'}}); + } + } + } + # deleting the previously cached listing + foreach my $key (keys(%{ $hash })) { + next if ($key !~ /^pre_(\d+)_link/); + my $which = $1; + delete($hash->{'pre_'.$which.'_title'}); + delete($hash->{'pre_'.$which.'_link'}); + } +} -# Okay, find most recent existing +sub readfromdb { + my ($r,$resources)=@_; - my $newest=0; - $diropendb=''; - for (my $i=0; $i<=$#dbfn; $i++) { - if ($dbst[$i]>$newest) { - $newest=$dbst[$i]; - $diropendb=$dbfn[$i]; - } - } + my $diropendb = + "/home/httpd/perl/tmp/$env{'user.domain'}_$env{'user.name'}_sel_res.db"; - } # ----------------------------- diropendb is now the filename of the db to open if (tie(%hash,'GDBM_File',$diropendb,&GDBM_WRCREAT(),0640)) { - my $acts = $env{'form.acts'}; - my @Acts = split(/b/,$acts); - my %ahash; - my %achash; - my $ac = 0; - foreach (@Acts) { - my ($state,$ref) = split(/a/); - $ahash{$ref} = $state; - $achash{$ref} = $ac; - $ac++; - } - foreach (sort {$achash{$a} <=> $achash{$b}} (keys %ahash)) { - my $key = $_; - if ($ahash{$key} eq '1') { -# my $keyz=join("
",keys %hash); -# print "
$key
$keyz".$hash{'pre_'.$key.'_link'}."
\n"; - $hash{'store_'.$hash{'pre_'.$key.'_link'}} = - $hash{'pre_'.$key.'_title'}; - $hash{'storectr_'.$hash{'pre_'.$key.'_link'}} = - $hash{'storectr'}+0; - $hash{'storectr'}++; - } - if ($ahash{$key} eq '0') { - if ($hash{'store_'.$hash{'pre_'.$key.'_link'}}) { - delete $hash{'store_'.$hash{'pre_'.$key.'_link'}}; - } - } + &update_actions_hash(\%hash); + + my %temp_resources; + foreach my $key (keys(%hash)) { + next if ($key !~ /^store_/); + my ($url) = ($key =~ /^store_(.*)/); + $temp_resources{$hash{'storectr_'.$url}}{'url'}=$url; + $temp_resources{$hash{'storectr_'.$url}}{'title'}= + &Apache::lonnet::gettitle($url); } - foreach (keys %hash) { - if ($_ =~ /^store_/) { - my $key = $_; - $key =~ s/^store_//; - $$shash{$key} = $hash{'storectr_'.$key}; - if (&Apache::lonnet::gettitle($key) eq '') { - $$thash{$key} = $hash{'store_'.$key}; - } else { - $$thash{$key} = &Apache::lonnet::gettitle($key); - } - } + + # use the temp, since there might be gaps in the counting + foreach my $item (sort {$a <=> $b} (keys(%temp_resources))) { + push(@{ $resources },$temp_resources{$item}); } + if ($env{'form.oldval'}) { - my $newctr = 0; - my %chash; - foreach (sort {$$shash{$a} <=> $$shash{$b}} (keys %{$shash})) { - my $key = $_; - $newctr++; - $$shash{$key} = $newctr; - $hash{'storectr_'.$key} = $newctr; - $chash{$newctr} = $key; - } - my $oldval = $env{'form.oldval'}; - my $newval = $env{'form.newval'}; - if ($oldval != $newval) { - # when newval==0, then push down and delete - if ($newval!=0) { - $$shash{$chash{$oldval}} = $newval; - $hash{'storectr_'.$chash{$oldval}} = $newval; - } else { - $$shash{$chash{$oldval}} = $newctr; - $hash{'storectr_'.$chash{$oldval}} = $newctr; - } - if ($newval==0) { # push down - my $newval2=$newctr; - for my $idx ($oldval..($newval2-1)) { - $$shash{$chash{$idx+1}} = $idx; - $hash{'storectr_'.$chash{$idx+1}} = $idx; - } - delete $$shash{$chash{$oldval}}; - delete $hash{'storectr_'.$chash{$oldval}}; - delete $hash{'store_'.$chash{$oldval}}; - } elsif ($oldval < $newval) { # push down - for my $idx ($oldval..($newval-1)) { - $$shash{$chash{$idx+1}} = $idx; - $hash{'storectr_'.$chash{$idx+1}} = $idx; - } - } elsif ($oldval > $newval) { # push up - for my $idx (reverse($newval..($oldval-1))) { - $$shash{$chash{$idx}} = $idx+1; - $hash{'storectr_'.$chash{$idx}} = $idx+1; - } - } + my $res = splice(@{$resources},$env{'form.oldval'}-1,1); + if ($env{'form.newval'} == 0) { + # picked 'discard' + my $url = $res->{'url'}; + delete($hash{'storectr_'.$url}); + delete($hash{'store_'.$url}); + } else { + splice(@{$resources},$env{'form.newval'}-1,0,$res); } } + # store out new order + foreach my $which (0..$#$resources) { + my $url = $resources->[$which]{'url'}; + $hash{'storectr_'.$url} = $which; + } } else { $r->print('Unable to tie hash to db file'); } - untie %hash; - return ($shash,$thash); + untie(%hash); } @@ -201,7 +144,7 @@ sub cleanup { # -------------------------------------------------------------- Read from file sub readfromfile { - my ($r,$shash,$thash,$nhash)=@_; + my ($r,$resources)=@_; my $cont=&Apache::lonnet::getfile (&Apache::lonnet::filelocation('',$env{'form.readfile'})); if ($cont==-1) { @@ -210,7 +153,6 @@ sub readfromfile { } else { my $parser = HTML::TokeParser->new(\$cont); my $token; - my $n=1; while ($token = $parser->get_token) { if ($token->[0] eq 'S') { if ($token->[1] eq 'resource') { @@ -220,23 +162,42 @@ sub readfromfile { if ($token->[2]->{'type'} eq 'zombie') { next; } } - my $url=$token->[2]->{'src'}; my $name=$token->[2]->{'title'}; - $name=~s/ \[\((\d+)\,(\w+)\,(\w+)\)\]$//; + $name=~s/ \[\((\d+)\,($LONCAPA::username_re)\,($LONCAPA::domain_re)\)\]$//; + my $note; if ($1) { - $$nhash{$url}='
'.&mt('Removed by '). + $note = '
'.&mt('Removed by '). &Apache::loncommon::plainname($2,$3).', '. &Apache::lonlocal::locallocaltime($1); } $name=~s/\&colon\;/\:/g; - $$thash{$url}=$name; - $$shash{$url}=$n; - $n++; + push(@{$resources}, {'url' => $token->[2]->{'src'}, + 'title' => $name, + 'note' => $note, + 'id' => $token->[2]->{'id'},}); } } } } - return ($shash,$thash); +} + +# --------------------------------------------------------- Read from bookmarks + +sub readfrombookmarks { + my ($r,$resources)=@_; + my %bookmarks=&Apache::lonnet::dump('bookmarks'); +# the bookmark "hash" is just one entry +# it's a javascript program code with arguments like ('title','url'); + my @bookmarks=($bookmarks{'bookmarks'}=~/\((?:\'([^\']+)\'\,\'([^\']+)\'|\"([^\"]+)\"\,\"([^\"]+)\")\)\;/g); + for (my $index=0;$index<($#bookmarks+1)/2;$index++) { + if ($bookmarks[$index*2+1]) { + my $url = $bookmarks[$index*2+1]; + my $name = $bookmarks[$index*2]; + $name =~ s/^LON\-CAPA\s+//; + + push(@{$resources},{'url' => $url, 'title' => $name}); + } + } } # ---------------------------------------------------------------- Main Handler @@ -244,10 +205,7 @@ sub handler { my $r = shift; &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, - ['acts','catalogmode','mode','readfile','recover']); - # color scheme - my $fileclr = '#ffffe6'; - my $titleclr = '#ddffff'; + ['acts','mode','readfile','recover','bookmarks']); &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; @@ -257,7 +215,7 @@ sub handler { my $finishimport=''; my $begincondition=''; my $endcondition=''; - if ($env{'form.readfile'}) { + if (($env{'form.readfile'}) || ($env{'form.bookmarks'})) { $begincondition='if (eval("document.forms.groupsort.include"+num+".checked")) {'; $endcondition='}'; } @@ -268,8 +226,9 @@ function finish_import() { for (var num=0; numdir_config('lonDefDomain'); $iconpath = $r->dir_config('lonIconsURL') . "/"; - my %shash; # sort order (key is resource location, value is sort order) - my %thash; # title (key is resource location, value is title) - my %nhash; # notes (key is resource location); + my @resources; if ($env{'form.readfile'}) { - &readfromfile($r,\%shash,\%thash,\%nhash); + &readfromfile($r,\@resources); + } elsif ($env{'form.bookmarks'}) { + &readfrombookmarks($r,\@resources); } else { - &readfromdb($r,\%shash,\%thash); + &readfromdb($r,\@resources); } my $ctr = 0; - my $clen = scalar(keys %shash); - if (($clen > 1) || ($env{'form.readfile'})) { + my $clen = scalar(@resources); + if (($clen > 1) || ($env{'form.readfile'}) || ($env{'form.bookmarks'})) { my %lt=&Apache::lonlocal::texthash( 'fin'=> 'Finalize order of resources', - 'gb' => 'Go Back', - 'ns' => 'New Search', + 'ci' => 'Continue Import', + 'cs' => 'Continue Search', 'fi' => 'Finish Import', + 're' => 'Recover Checked', 'ca' => 'Cancel', 'co' => 'Change Order', 'ti' => 'Title', 'pa' => 'Path', 'in' => 'Include' ); - $r->print(&Apache::loncommon::start_page('Sort Imported Resources', - $js)); + my $title = ($env{'form.recover'}) ? 'Recover Removed Resources' + : 'Sort Imported Resources'; + $r->print(&Apache::loncommon::start_page($title, $js)); + $r->print(<$lt{'fin'}
@@ -370,39 +332,48 @@ END + END - # --- Expand here if "GO BACK" button desired - if ($env{'form.catalogmode'} eq 'groupimport') { - my $resurl = &Apache::loncommon::lastresurl(); + $r->print(&Apache::loncommon::inhibit_menu_check('input')); + # --- + + if ($env{'form.recover'}) { $r->print(<  +  + END - } - if ($env{'form.catalogmode'} eq 'groupsearch') { + } else { + # --- Continue Buttons + my $resurl = + &Apache::loncommon::escape_single(&Apache::loncommon::lastresurl()); $r->print(<  -END - } - # --- - - $r->print(<$lt{'fin'} +
+  +    +
+
END - $r->print("
"); - $r->print("\n"); - if ($env{'form.readfile'}) { - $r->print("\n"); + } + $r->print(&Apache::loncommon::start_data_table() + .&Apache::loncommon::start_data_table_header_row()); + if (($env{'form.readfile'}) || ($env{'form.bookmarks'})) { + $r->print("\n"); } else { - $r->print("\n"); + $r->print("\n"); } - $r->print("\n"); - $r->print("\n"); + $r->print("\n"); + $r->print(""); + $r->print(&Apache::loncommon::end_data_table_header_row() + ."\n"); } else { $r->print(&Apache::loncommon::start_page(undef,$js, {'only_body' => 1})); @@ -414,36 +385,42 @@ END END + $r->print(&Apache::loncommon::inhibit_menu_check('input')); + } - foreach (sort {$shash{$a}<=>$shash{$b}} (keys %shash)) { - my $key=$_; + foreach my $resource (@resources) { $ctr++; - my $iconname=&Apache::loncommon::icon($key); - if (($clen > 1) || ($env{'form.readfile'})) { - $r->print(""); - unless ($env{'form.readfile'}) { - $r->print(""); } - $r->print("\n"); + $r->print("" + .&Apache::loncommon::end_data_table_row() + ."\n"); } } - if (($clen > 1) || ($env{'form.readfile'})) { - $r->print("
$lt{'in'}$lt{'in'}$lt{'co'}$lt{'co'}$lt{'ti'}$lt{'pa'}
$lt{'ti'}$lt{'pa'}
"); - if ($env{'form.readfile'}) { + my $iconname=&Apache::loncommon::icon($resource->{'url'}); + if (($clen > 1) || ($env{'form.readfile'}) || ($env{'form.bookmarks'})) { + $r->print(&Apache::loncommon::start_data_table_row() + .""); + if (($env{'form.readfile'}) || ($env{'form.bookmarks'})) { $r->print(&checkbox($ctr-1)); } else { $r->print(&movers($clen,$ctr)); } } - $r->print(&hidden($ctr-1,$thash{$key},$key)); - if (($clen > 1) || ($env{'form.readfile'})) { + $r->print(&hidden($ctr-1,$resource->{'title'},$resource->{'url'}, + $resource->{'id'})); + if (($clen > 1) || ($env{'form.readfile'}) || ($env{'form.bookmarks'})) { $r->print("". + unless (($env{'form.readfile'}) || ($env{'form.bookmarks'})) { + $r->print("". &select_box($clen,$ctr). ""); + $r->print(""); $r->print(""); - $r->print(""); - $r->print("$thash{$key}$nhash{$key}\n"); - $r->print("$key
"); + $r->print($resource->{'title'}.$resource->{'notes'}."\n"); + $r->print($resource->{'url'}."
"); + if (($clen > 1) || ($env{'form.readfile'}) || ($env{'form.bookmarks'})) { + $r->print(&Apache::loncommon::end_data_table() + .""); } else { $r->print(< @@ -459,11 +436,13 @@ END # --------------------------------------- Hidden values (returns scalar string) sub hidden { - my ($sel,$title,$filelink) = @_; - my $string = ''; + my ($sel,$title,$filelink,$id) = @_; + my $string = ''; + $filelink=~s|^/ext/|http://|; $string .= ''; + &escape($filelink).'" />'; + $string .= ''; return $string; } 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.