File:  [LON-CAPA] / loncom / interface / groupsort.pm
Revision 1.27: download - view: text, annotated - select for diffs
Mon May 10 08:34:50 2004 UTC (20 years ago) by taceyjo1
Branches: MAIN
CVS tags: HEAD
Here is the fix for bug 2884 that is better and fixes the problem
without slowing everything down, leaving the 1.101 in there as it
seems
to be good.  If these changes seem to open up some type of blackhole
of
some sort or anything else that is no good, just let me know.

Teaches groupsort about metadata to sort it's self out.  Tested and
works ok.

# The LearningOnline Network with CAPA
# The LON-CAPA group sort handler
# Allows for sorting prior to import into RAT.
#
# $Id: groupsort.pm,v 1.27 2004/05/10 08:34:50 taceyjo1 Exp $
# 
# Copyright Michigan State University Board of Trustees
#
# This file is part of the LearningOnline Network with CAPA (LON-CAPA).
#
# LON-CAPA is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# LON-CAPA is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with LON-CAPA; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#
# /home/httpd/html/adm/gpl.txt
#
# http://www.lon-capa.org/
#
# YEAR=2001
# YEAR=2002
#
###

package Apache::groupsort;

use strict;

use Apache::Constants qw(:common);
use GDBM_File;
use Apache::loncommon;
use Apache::lonlocal;
use Apache::lonnet;

my %hash; # variable to tie to user specific database
my $iconpath; # variable to be accessible to multiple subroutines

sub cleanup {
    if (tied(%hash)){
	&Apache::lonnet::logthis('Cleanup groupsort: hash');
        unless (untie(%hash)) {
	    &Apache::lonnet::logthis('Failed cleanup groupsort: hash');
        }
    }
}

# ---------------------------------------------------------------- Main Handler
sub handler {
    my $r = shift;
 
   &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
                                           ['acts','catalogmode','mode']);
    # color scheme
    my $fileclr = '#ffffe6';
    my $titleclr = '#ddffff';

    &Apache::loncommon::content_type($r,'text/html');
    $r->send_http_header;
    return OK if $r->header_only;

# finish_import looks different for graphical or "simple" RAT
    my $finishimport='';
    if ($ENV{'form.mode'} eq 'simple' || $ENV{'form.mode'} eq '') {
        $finishimport=(<<ENDSMP);
function finish_import() {
    opener.document.forms.simpleedit.importdetail.value='';
    for (var num=0; num<document.forms.groupsort.fnum.value; num++) {
	opener.document.forms.simpleedit.importdetail.value+='&'+
              escape(eval("document.forms.groupsort.title"+num+".value"))+'='+
	      escape(eval("document.forms.groupsort.filelink"+num+".value"));
    }
    opener.document.forms.simpleedit.submit();
    self.close();
}
ENDSMP
    } else {
        $finishimport=(<<ENDADV);
function finish_import() {
    var linkflag=false;
    for (var num=0; num<document.forms.groupsort.fnum.value; num++) {
	insertRowInLastRow();
	placeResourceInLastRow(
	       eval("document.forms.groupsort.title"+num+".value"),
 	       eval("document.forms.groupsort.filelink"+num+".value"),
	       linkflag
	);
        linkflag=true;
    }
    opener.editmode=0;
    opener.notclear=0;
    opener.linkmode=0;
    opener.draw();
    self.close();
}
ENDADV
    }

# output start of web page

    $r->print(<<END);
<html>
<head>
<title>The LearningOnline Network With CAPA Group Sorter</title>
<script language='javascript'>
function insertRowInLastRow() {
    opener.insertrow(opener.maxrow);
    opener.addobj(opener.maxrow,'e&2');
}
function placeResourceInLastRow (title,url,linkflag) {
    opener.newresource(opener.maxrow,2,opener.escape(title),
		       opener.escape(url),'false','normal');
    opener.save();
    opener.mostrecent=opener.obj.length-1;
    if (linkflag) {
	opener.joinres(opener.linkmode,opener.mostrecent,0);
    }
    opener.linkmode=opener.mostrecent;
}
$finishimport
function selectchange(val) {
    var newval=0+eval("document.forms.groupsort.alt"+val+".selectedIndex");
    orderchange(val,newval);
}
function move(val,newval) {
    orderchange(val,newval);
}
function orderchange(val,newval) {
    document.forms.groupsort.oldval.value=val;
    document.forms.groupsort.newval.value=newval;
    document.forms.groupsort.submit();
}
</script>
</head>
END
    # read pertinent machine configuration
    my $domain  = $r->dir_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 $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";
    }
# --------------------- not explicitly given, choose the one most recently used
    else { # choose last accessed
        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];
	}
	$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
# ....

# Okay, find most recent existing

        my $newest=0;
        $diropendb='';
        for (my $i=0; $i<=$#dbfn; $i++) {
	    if ($dbst[$i]>$newest) {
		$newest=$dbst[$i];
                $diropendb=$dbfn[$i];
            }
        }

    }
# ----------------------------- 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("<br />",keys %hash);
#		print "<br />$key<br />$keyz".$hash{'pre_'.$key.'_link'}."<br />\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'}};
		}
	    }
	}
	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); }
	    }
	}
	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;
		    }
		}
	    }
	}
    } else {
	$r->print('Unable to tie hash to db file</body></html>');
	return OK;
    }
    untie %hash;
    my $ctr = 0;
    my $clen = scalar(keys %shash);
    if ($clen > 1) {
	my %lt=&Apache::lonlocal::texthash(
		'fin'=> 'Finalize order of resources',
		'gb' => 'Go Back',
		'ns' => 'New Search',
		'fi' => 'Finish Import',
		'ca' => 'Cancel',
		'co' => 'Change Order',
		'ti' => 'Title',
		'pa' => 'Path'
		);
	$r->print(&Apache::loncommon::bodytag('Sort Imported Resources'));
	$r->print(<<END);
<b><font color="#888888">$lt{'fin'}</font></b>
<form method='post' action='/adm/groupsort' name='groupsort'
      enctype='application/x-www-form-urlencoded'>
<input type="hidden" name="fnum" value="$clen" />
<input type="hidden" name="oldval" value="" />
<input type="hidden" name="newval" value="" />
<input type="hidden" name="mode" value="$ENV{'form.mode'}" />
END

        # --- Expand here if "GO BACK" button desired
        if ($ENV{'form.catalogmode'} eq 'groupimport') {
	    $r->print(<<END);
<input type="button" name="alter" value="$lt{'gb'}"
 onClick="window.location='/res/?catalogmode=groupimport'" />&nbsp;
END
        }
	if ($ENV{'form.catalogmode'} eq 'groupsearch') {
	    $r->print(<<END);
<input type="button" name="alter" value="$lt{'ns'}"
 onClick="window.location='/adm/searchcat?catalogmode=groupsearch&cleargroupsort=1'" />&nbsp;
END
        }
        # ---

	$r->print(<<END);
<input type="button" name="alter" value="$lt{'fi'}"
 onClick="finish_import()" />&nbsp;
<input type="button" name="alter" value="$lt{'ca'}" onClick="self.close()" />
END
        $r->print("<table border='0'><tr><td bgcolor='#eeeeee'>");
	$r->print("<table border=0><tr>\n");
	$r->print("<td colspan='2' bgcolor='$titleclr'><b>$lt{'co'}</b></td>\n");
	$r->print("<td colspan='2' bgcolor='$titleclr'><b>$lt{'ti'}</b></td>\n");
	$r->print("<td bgcolor='$titleclr'><b>$lt{'pa'}</b></td></tr>\n");
    } else {
	$r->print(<<END);
<body>
<form method='post' action='/adm/groupsort' name='groupsort'
      enctype='application/x-www-form-urlencoded'>
<input type="hidden" name="fnum" value="$clen" />
<input type="hidden" name="oldval" value="" />
<input type="hidden" name="newval" value="" />
<input type="hidden" name="mode" value="$ENV{'form.mode'}" />
END
    }
    foreach (sort {$shash{$a}<=>$shash{$b}} (keys %shash)) {
	my $key=$_;
	$ctr++;
	my $iconname=&Apache::loncommon::icon($key);
	if ($clen > 1) {
	    $r->print("<tr><td bgcolor='$fileclr'>");
	    $r->print(&movers($clen,$ctr));
	}
	$r->print(&hidden($ctr-1,$thash{$key},$key));
	if ($clen > 1) {
	    $r->print("</td><td bgcolor='$fileclr'>");
	    $r->print(&select_box($clen,$ctr));
	    $r->print("</td><td bgcolor='$fileclr'>");
	    $r->print("<img src='$iconname' />");
	    $r->print("</td><td bgcolor='$fileclr'>");
	    $r->print("$thash{$key}</td><td bgcolor='$fileclr'>\n");
	    $r->print("$key</td></tr>\n");
	} 
    }
    if ($clen > 1) {
	$r->print("</table></td></tr></table></form>");
    } else {
	$r->print(<<END);
<script type="text/javascript">
    finish_import();
</script>
END
    }
    $r->print(<<END);
</body>
</html>
END

    return OK;
}

# --------------------------------------- Hidden values (returns scalar string)
sub hidden {
    my ($sel,$title,$filelink) = @_;
    my $string = '<input type="hidden" name="title'.$sel.'" value="'.$title.
	'" />';
    $string .= '<input type="hidden" name="filelink'.$sel.'" value="'.
	$filelink.'" />';
    return $string;
}

# --------------------------------------- Moving arrows (returns scalar string)
sub movers {
    my ($total,$sel) = @_;
    my $dsel = $sel-1;
    my $usel = $sel+1;
    $usel = 1 if $usel > $total;
    $dsel = $total if $dsel < 1;
    my $string;
    $string = (<<END);
<table border='0' cellspacing='0' cellpadding='0'>
<tr><td><a href='javascript:move($sel,$dsel)'>
<img src="${iconpath}move_up.gif" alt='UP' border='0' /></a></td></tr>
<tr><td><a href='javascript:move($sel,$usel)'>
<img src="${iconpath}move_down.gif" alt='DOWN' border='0' /></a></td></tr>
</table>
END
    return $string;
}

# ------------------------------------------ Select box (returns scalar string)
sub select_box {
    my ($total,$sel) = @_;
    my $string;
    $string = '<select name="alt'.$sel.'"';
    $string .= " onChange='selectchange($sel)'>";
    $string .= "<option name='o0' value='0'>remove</option>";
    for my $cur (1..$total) {
	$string .= "<option name='o$cur' value='$cur'";
	if ($cur == $sel) {
	    $string .= "selected";
	}
	$string .= ">$cur</option>";
    }
    $string .= "</select>\n";
    return $string;
}

1;

__END__

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>