--- loncom/interface/groupsort.pm 2005/06/09 22:06:09 1.33
+++ loncom/interface/groupsort.pm 2013/01/08 03:51:06 1.68.6.4
@@ -2,7 +2,7 @@
# The LON-CAPA group sort handler
# Allows for sorting prior to import into RAT.
#
-# $Id: groupsort.pm,v 1.33 2005/06/09 22:06:09 www Exp $
+# $Id: groupsort.pm,v 1.68.6.4 2013/01/08 03:51:06 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -37,154 +37,96 @@ use GDBM_File;
use Apache::loncommon;
use Apache::lonlocal;
use Apache::lonnet;
+use LONCAPA qw(:DEFAULT :match);
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 = LONCAPA::tempdir() .
+ "$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