version 1.40, 2002/06/25 16:31:51
|
version 1.55, 2002/08/21 17:18:08
|
Line 33
|
Line 33
|
# 12/25,12/28 Gerd Kortemeyer |
# 12/25,12/28 Gerd Kortemeyer |
# YEAR=2002 |
# YEAR=2002 |
# 1/4 Gerd Kortemeyer |
# 1/4 Gerd Kortemeyer |
|
# 6/24,7/2 H. K. Ng |
|
|
# Makes a table out of the previous attempts |
# Makes a table out of the previous attempts |
# Inputs result_from_symbread, user, domain, course_id |
# Inputs result_from_symbread, user, domain, course_id |
Line 40
|
Line 41
|
|
|
# POD header: |
# POD header: |
|
|
|
=pod |
|
|
=head1 NAME |
=head1 NAME |
|
|
Apache::loncommon - pile of common routines |
Apache::loncommon - pile of common routines |
Line 65 Current things done:
|
Line 68 Current things done:
|
This is part of the LearningOnline Network with CAPA project |
This is part of the LearningOnline Network with CAPA project |
described at http://www.lon-capa.org. |
described at http://www.lon-capa.org. |
|
|
=head2 Subroutines |
=head2 General Subroutines |
|
|
=over 4 |
=over 4 |
|
|
Line 76 package Apache::loncommon;
|
Line 79 package Apache::loncommon;
|
|
|
use strict; |
use strict; |
use Apache::lonnet(); |
use Apache::lonnet(); |
use POSIX qw(strftime); |
use GDBM_File; |
|
use POSIX qw(strftime mktime); |
use Apache::Constants qw(:common); |
use Apache::Constants qw(:common); |
use Apache::lonmsg(); |
use Apache::lonmsg(); |
|
|
my $readit; |
my $readit; |
|
|
|
=pod |
|
|
|
=item Global Variables |
|
|
|
=over 4 |
|
|
|
=cut |
# ----------------------------------------------- Filetypes/Languages/Copyright |
# ----------------------------------------------- Filetypes/Languages/Copyright |
my %language; |
my %language; |
my %cprtag; |
my %cprtag; |
my %fe; my %fd; |
my %fe; my %fd; |
my %fc; |
my %category_extensions; |
|
|
# -------------------------------------------------------------- Thesaurus data |
# ---------------------------------------------- Thesaurus variables |
my @therelated; |
|
my @theword; |
=pod |
my @thecount; |
|
my %theindex; |
=item %Keywords |
my $thetotalcount; |
|
my $thefuzzy=2; |
A hash used by &keyword to determine if a word is considered a keyword. |
my $thethreshold=0.1/$thefuzzy; |
|
my $theavecount; |
=item $thesaurus_db_file |
|
|
|
Scalar containing the full path to the thesaurus database. |
|
|
|
=cut |
|
|
|
my %Keywords; |
|
my $thesaurus_db_file; |
|
|
|
|
|
=pod |
|
|
|
=back |
|
|
|
=cut |
|
|
# ----------------------------------------------------------------------- BEGIN |
# ----------------------------------------------------------------------- BEGIN |
|
|
|
=pod |
|
|
=item BEGIN() |
=item BEGIN() |
|
|
Initialize values from language.tab, copyright.tab, filetypes.tab, |
Initialize values from language.tab, copyright.tab, filetypes.tab, |
and filecategories.tab. |
thesaurus.tab, and filecategories.tab. |
|
|
=cut |
=cut |
|
|
# ----------------------------------------------------------------------- BEGIN |
# ----------------------------------------------------------------------- BEGIN |
|
|
BEGIN { |
BEGIN { |
|
# Variable initialization |
|
$thesaurus_db_file = $Apache::lonnet::perlvar{'lonTabDir'}."/thesaurus.db"; |
|
# |
unless ($readit) { |
unless ($readit) { |
# ------------------------------------------------------------------- languages |
# ------------------------------------------------------------------- languages |
{ |
{ |
Line 144 BEGIN {
|
Line 174 BEGIN {
|
while (<$fh>) { |
while (<$fh>) { |
next if /^\#/; |
next if /^\#/; |
chomp; |
chomp; |
my ($key,$val)=(split(/\s+/,$_,2)); |
my ($extension,$category)=(split(/\s+/,$_,2)); |
push @{$fc{$key}},$val; |
push @{$category_extensions{lc($category)}},$extension; |
} |
} |
} |
} |
} |
} |
Line 165 BEGIN {
|
Line 195 BEGIN {
|
} |
} |
} |
} |
} |
} |
# -------------------------------------------------------------- Thesaurus data |
|
{ |
|
my $fh=Apache::File->new($Apache::lonnet::perlvar{'lonTabDir'}. |
|
'/thesaurus.dat'); |
|
if ($fh) { |
|
while (<$fh>) { |
|
my ($tword,$tindex,$tcount,$trelated)=split(/\@/,$_); |
|
$theindex{$tword}=$tindex; |
|
$theword[$tindex]=$tword; |
|
$thecount[$tindex]=$tcount; |
|
$thetotalcount+=$tcount; |
|
$therelated[$tindex]=$trelated; |
|
} |
|
} |
|
$theavecount=$thetotalcount/$#thecount; |
|
} |
|
&Apache::lonnet::logthis( |
&Apache::lonnet::logthis( |
"<font color=yellow>INFO: Read file types and thesaurus</font>"); |
"<font color=yellow>INFO: Read file types</font>"); |
$readit=1; |
$readit=1; |
} |
} # end of unless($readit) |
|
|
} |
} |
# ============================================================= END BEGIN BLOCK |
# ============================================================= END BEGIN BLOCK |
|
############################################################### |
|
## HTML and Javascript Helper Functions ## |
|
############################################################### |
|
|
|
=pod |
|
|
|
=item browser_and_searcher_javascript |
|
|
|
Returns scalar containing javascript to open a browser window |
|
or a searcher window. Also creates |
|
|
|
=over 4 |
|
|
|
=item openbrowser(formname,elementname,only,omit) [javascript] |
|
|
|
inputs: formname, elementname, only, omit |
|
|
|
formname and elementname indicate the name of the html form and name of |
|
the element that the results of the browsing selection are to be placed in. |
|
|
|
Specifying 'only' will restrict the browser to displaying only files |
|
with the given extension. Can be a comma seperated list. |
|
|
|
Specifying 'omit' will restrict the browser to NOT displaying files |
|
with the given extension. Can be a comma seperated list. |
|
|
|
=item opensearcher(formname, elementname) [javascript] |
|
|
|
Inputs: formname, elementname |
|
|
|
formname and elementname specify the name of the html form and the name |
|
of the element the selection from the search results will be placed in. |
|
|
|
=back |
|
|
|
=cut |
|
|
|
############################################################### |
|
sub browser_and_searcher_javascript { |
|
return <<END; |
|
var editbrowser = null; |
|
function openbrowser(formname,elementname,only,omit) { |
|
var url = '/res/?'; |
|
if (editbrowser == null) { |
|
url += 'launch=1&'; |
|
} |
|
url += 'catalogmode=interactive&'; |
|
url += 'mode=edit&'; |
|
url += 'form=' + formname + '&'; |
|
if (only != null) { |
|
url += 'only=' + only + '&'; |
|
} |
|
if (omit != null) { |
|
url += 'omit=' + omit + '&'; |
|
} |
|
url += 'element=' + elementname + ''; |
|
var title = 'Browser'; |
|
var options = 'scrollbars=1,resizable=1,menubar=0'; |
|
options += ',width=700,height=600'; |
|
editbrowser = open(url,title,options,'1'); |
|
editbrowser.focus(); |
|
} |
|
var editsearcher; |
|
function opensearcher(formname,elementname) { |
|
var url = '/adm/searchcat?'; |
|
if (editsearcher == null) { |
|
url += 'launch=1&'; |
|
} |
|
url += 'catalogmode=interactive&'; |
|
url += 'mode=edit&'; |
|
url += 'form=' + formname + '&'; |
|
url += 'element=' + elementname + ''; |
|
var title = 'Search'; |
|
var options = 'scrollbars=1,resizable=1,menubar=0'; |
|
options += ',width=700,height=600'; |
|
editsearcher = open(url,title,options,'1'); |
|
editsearcher.focus(); |
|
} |
|
END |
|
} |
|
|
|
|
|
|
|
############################################################### |
|
|
|
=pod |
|
|
=item linked_select_forms(...) |
=item linked_select_forms(...) |
|
|
Line 213 linked_select_forms takes the following
|
Line 313 linked_select_forms takes the following
|
|
|
=item $hashref, a reference to a hash containing the data for the menus. |
=item $hashref, a reference to a hash containing the data for the menus. |
|
|
|
=back |
|
|
Below is an example of such a hash. Only the 'text', 'default', and |
Below is an example of such a hash. Only the 'text', 'default', and |
'select2' keys must appear as stated. keys(%menu) are the possible |
'select2' keys must appear as stated. keys(%menu) are the possible |
values for the first select menu. The text that coincides with the |
values for the first select menu. The text that coincides with the |
first menu values is given in $menu{$choice1}->{'text'}. The values |
first menu value is given in $menu{$choice1}->{'text'}. The values |
and text for the second menu are given in the hash pointed to by |
and text for the second menu are given in the hash pointed to by |
$menu{$choice1}->{'select2'}. |
$menu{$choice1}->{'select2'}. |
|
|
my %menu = ( A1 => { text =>"Choice A1" , |
my %menu = ( A1 => { text =>"Choice A1" , |
default => "B3", |
default => "B3", |
select2 => { |
select2 => { |
B1 => "Choice B1", |
B1 => "Choice B1", |
Line 251 $menu{$choice1}->{'select2'}.
|
Line 353 $menu{$choice1}->{'select2'}.
|
} |
} |
); |
); |
|
|
=back |
|
|
|
=cut |
=cut |
|
|
# ------------------------------------------------ |
# ------------------------------------------------ |
Line 337 END
|
Line 437 END
|
|
|
############################################################### |
############################################################### |
|
|
|
=pod |
|
|
|
=item help_open_topic($topic, $text, $stayOnPage, $width, $height) |
|
|
|
Returns a string corresponding to an HTML link to the given help $topic, where $topic corresponds to the name of a .tex file in /home/httpd/html/adm/help/tex, with underscores replaced by spaces. |
|
|
|
$text will optionally be linked to the same topic, allowing you to link text in addition to the graphic. If you do not want to link text, but wish to specify one of the later parameters, pass an empty string. |
|
|
|
$stayOnPage is a value that will be interpreted as a boolean. If true, the link will not open a new window. If false, the link will open a new window using Javascript. (Default is false.) |
|
|
|
$width and $height are optional numerical parameters that will override the width and height of the popped up window, which may be useful for certain help topics with big pictures included. |
|
|
|
=cut |
|
|
|
sub help_open_topic { |
|
my ($topic, $text, $stayOnPage, $width, $height) = @_; |
|
$text = "" if (not defined $text); |
|
$stayOnPage = 0 if (not defined $stayOnPage); |
|
$width = 350 if (not defined $width); |
|
$height = 400 if (not defined $height); |
|
my $filename = $topic; |
|
$filename =~ s/ /_/g; |
|
|
|
my $template = ""; |
|
my $link; |
|
|
|
if (!$stayOnPage) |
|
{ |
|
$link = "javascript:void(open('/adm/help/${filename}.hlp', 'Help_for_$topic', 'menubar=0,toolbar=1,scrollbars=1,width=$width,height=$height'))"; |
|
} |
|
else |
|
{ |
|
$link = "/adm/help/${filename}.hlp"; |
|
} |
|
|
|
# Add the text |
|
if ($text ne "") |
|
{ |
|
$template .= "<a href=\"$link\">$text</a> "; |
|
} |
|
|
|
# Add the graphic |
|
$template .= <<"ENDTEMPLATE"; |
|
<a href="$link"><image src="/adm/help/gif/smallHelp.gif" border="0" alt="(Help: $topic)"></a> |
|
ENDTEMPLATE |
|
|
|
return $template; |
|
|
|
} |
|
|
|
=pod |
|
|
=item csv_translate($text) |
=item csv_translate($text) |
|
|
Translate $text to allow it to be output as a 'comma seperated values' |
Translate $text to allow it to be output as a 'comma seperated values' |
Line 352 sub csv_translate {
|
Line 504 sub csv_translate {
|
} |
} |
|
|
############################################################### |
############################################################### |
|
|
############################################################### |
|
## Home server <option> list generating code ## |
## Home server <option> list generating code ## |
############################################################### |
############################################################### |
#------------------------------------------- |
#------------------------------------------- |
|
|
|
=pod |
|
|
=item get_domains() |
=item get_domains() |
|
|
Returns an array containing each of the domains listed in the hosts.tab |
Returns an array containing each of the domains listed in the hosts.tab |
Line 378 sub get_domains {
|
Line 530 sub get_domains {
|
|
|
#------------------------------------------- |
#------------------------------------------- |
|
|
|
=pod |
|
|
=item select_dom_form($defdom,$name) |
=item select_dom_form($defdom,$name) |
|
|
Returns a string containing a <select name='$name' size='1'> form to |
Returns a string containing a <select name='$name' size='1'> form to |
Line 402 sub select_dom_form {
|
Line 556 sub select_dom_form {
|
|
|
#------------------------------------------- |
#------------------------------------------- |
|
|
=item get_home_servers($domain) |
=pod |
|
|
|
=item get_library_servers($domain) |
|
|
Returns a hash which contains keys like '103l3' and values like |
Returns a hash which contains keys like '103l3' and values like |
'kirk.lite.msu.edu'. All of the keys will be for machines in the |
'kirk.lite.msu.edu'. All of the keys will be for machines in the |
Line 411 given $domain.
|
Line 567 given $domain.
|
=cut |
=cut |
|
|
#------------------------------------------- |
#------------------------------------------- |
sub get_home_servers { |
sub get_library_servers { |
my $domain = shift; |
my $domain = shift; |
my %home_servers; |
my %library_servers; |
foreach (keys(%Apache::lonnet::libserv)) { |
foreach (keys(%Apache::lonnet::libserv)) { |
if ($Apache::lonnet::hostdom{$_} eq $domain) { |
if ($Apache::lonnet::hostdom{$_} eq $domain) { |
$home_servers{$_} = $Apache::lonnet::hostname{$_}; |
$library_servers{$_} = $Apache::lonnet::hostname{$_}; |
} |
} |
} |
} |
return %home_servers; |
return %library_servers; |
} |
} |
|
|
#------------------------------------------- |
#------------------------------------------- |
|
|
|
=pod |
|
|
=item home_server_option_list($domain) |
=item home_server_option_list($domain) |
|
|
returns a string which contains an <option> list to be used in a |
returns a string which contains an <option> list to be used in a |
Line 434 returns a string which contains an <opti
|
Line 592 returns a string which contains an <opti
|
#------------------------------------------- |
#------------------------------------------- |
sub home_server_option_list { |
sub home_server_option_list { |
my $domain = shift; |
my $domain = shift; |
my %servers = &get_home_servers($domain); |
my %servers = &get_library_servers($domain); |
my $result = ''; |
my $result = ''; |
foreach (sort keys(%servers)) { |
foreach (sort keys(%servers)) { |
$result.= |
$result.= |
Line 456 sub home_server_option_list {
|
Line 614 sub home_server_option_list {
|
## formname = the name given in the <form> tag. |
## formname = the name given in the <form> tag. |
#------------------------------------------- |
#------------------------------------------- |
|
|
|
=pod |
|
|
=item authform_xxxxxx |
=item authform_xxxxxx |
|
|
The authform_xxxxxx subroutines provide javascript and html forms which |
The authform_xxxxxx subroutines provide javascript and html forms which |
Line 657 END
|
Line 817 END
|
## End Authentication changing form generation functions ## |
## End Authentication changing form generation functions ## |
############################################################### |
############################################################### |
|
|
|
############################################################### |
|
## Thesaurus Functions ## |
|
############################################################### |
|
|
|
=pod |
|
|
|
=item initialize_keywords |
|
|
|
Initializes the package variable %Keywords if it is empty. Uses the |
|
package variable $thesaurus_db_file. |
|
|
|
=cut |
|
|
|
################################################### |
|
|
|
sub initialize_keywords { |
|
return 1 if (scalar keys(%Keywords)); |
|
# If we are here, %Keywords is empty, so fill it up |
|
# Make sure the file we need exists... |
|
if (! -e $thesaurus_db_file) { |
|
&Apache::lonnet::logthis("Attempt to access $thesaurus_db_file". |
|
" failed because it does not exist"); |
|
return 0; |
|
} |
|
# Set up the hash as a database |
|
my %thesaurus_db; |
|
if (! tie(%thesaurus_db,'GDBM_File', |
|
$thesaurus_db_file,&GDBM_READER(),0640)){ |
|
&Apache::lonnet::logthis("Could not tie \%thesaurus_db to ". |
|
$thesaurus_db_file); |
|
return 0; |
|
} |
|
# Get the average number of appearances of a word. |
|
my $avecount = $thesaurus_db{'average.count'}; |
|
# Put keywords (those that appear > average) into %Keywords |
|
while (my ($word,$data)=each (%thesaurus_db)) { |
|
my ($count,undef) = split /:/,$data; |
|
$Keywords{$word}++ if ($count > $avecount); |
|
} |
|
untie %thesaurus_db; |
|
# Remove special values from %Keywords. |
|
foreach ('total.count','average.count') { |
|
delete($Keywords{$_}) if (exists($Keywords{$_})); |
|
} |
|
return 1; |
|
} |
|
|
|
################################################### |
|
|
|
=pod |
|
|
|
=item keyword($word) |
|
|
|
Returns true if $word is a keyword. A keyword is a word that appears more |
|
than the average number of times in the thesaurus database. Calls |
|
&initialize_keywords |
|
|
|
=cut |
|
|
# ---------------------------------------------------------- Is this a keyword? |
################################################### |
|
|
sub keyword { |
sub keyword { |
my $newword=shift; |
return if (!&initialize_keywords()); |
$newword=~s/\W//g; |
my $word=lc(shift()); |
$newword=~tr/A-Z/a-z/; |
$word=~s/\W//g; |
my $tindex=$theindex{$newword}; |
return exists($Keywords{$word}); |
if ($tindex) { |
|
if ($thecount[$tindex]>$theavecount) { |
|
return 1; |
|
} |
|
} |
|
return 0; |
|
} |
} |
|
|
|
################################################### |
|
# Old code, to be removed soon # |
|
################################################### |
# -------------------------------------------------------- Return related words |
# -------------------------------------------------------- Return related words |
|
#sub related { |
|
# my $newword=shift; |
|
# $newword=~s/\W//g; |
|
# $newword=~tr/A-Z/a-z/; |
|
# my $tindex=$theindex{$newword}; |
|
# if ($tindex) { |
|
# my %found=(); |
|
# foreach (split(/\,/,$therelated[$tindex])) { |
|
## - Related word found |
|
# my ($ridx,$rcount)=split(/\:/,$_); |
|
## - Direct relation index |
|
# my $directrel=$rcount/$thecount[$tindex]; |
|
# if ($directrel>$thethreshold) { |
|
# foreach (split(/\,/,$therelated[$ridx])) { |
|
# my ($rridx,$rrcount)=split(/\:/,$_); |
|
# if ($rridx==$tindex) { |
|
## - Determine reverse relation index |
|
# my $revrel=$rrcount/$thecount[$ridx]; |
|
## - Calculate full index |
|
# $found{$ridx}=$directrel*$revrel; |
|
# if ($found{$ridx}>$thethreshold) { |
|
# foreach (split(/\,/,$therelated[$ridx])) { |
|
# my ($rrridx,$rrrcount)=split(/\:/,$_); |
|
# unless ($found{$rrridx}) { |
|
# my $revrevrel=$rrrcount/$thecount[$ridx]; |
|
# if ( |
|
# $directrel*$revrel*$revrevrel>$thethreshold |
|
# ) { |
|
# $found{$rrridx}= |
|
# $directrel*$revrel*$revrevrel; |
|
# } |
|
# } |
|
# } |
|
# } |
|
# } |
|
# } |
|
# } |
|
# } |
|
# } |
|
# return (); |
|
#} |
|
|
sub related { |
############################################################### |
my $newword=shift; |
|
$newword=~s/\W//g; |
=pod |
$newword=~tr/A-Z/a-z/; |
|
my $tindex=$theindex{$newword}; |
=item get_related_words |
if ($tindex) { |
|
my %found=(); |
Look up a word in the thesaurus. Takes a scalar arguement and returns |
foreach (split(/\,/,$therelated[$tindex])) { |
an array of words. If the keyword is not in the thesaurus, an empty array |
# - Related word found |
will be returned. The order of the words returned is determined by the |
my ($ridx,$rcount)=split(/\:/,$_); |
database which holds them. |
# - Direct relation index |
|
my $directrel=$rcount/$thecount[$tindex]; |
Uses global $thesaurus_db_file. |
if ($directrel>$thethreshold) { |
|
foreach (split(/\,/,$therelated[$ridx])) { |
=cut |
my ($rridx,$rrcount)=split(/\:/,$_); |
|
if ($rridx==$tindex) { |
############################################################### |
# - Determine reverse relation index |
|
my $revrel=$rrcount/$thecount[$ridx]; |
sub get_related_words { |
# - Calculate full index |
my $keyword = shift; |
$found{$ridx}=$directrel*$revrel; |
my %thesaurus_db; |
if ($found{$ridx}>$thethreshold) { |
if (! -e $thesaurus_db_file) { |
foreach (split(/\,/,$therelated[$ridx])) { |
&Apache::lonnet::logthis("Attempt to access $thesaurus_db_file ". |
my ($rrridx,$rrrcount)=split(/\:/,$_); |
"failed because the file does not exist"); |
unless ($found{$rrridx}) { |
return (); |
my $revrevrel=$rrrcount/$thecount[$ridx]; |
} |
if ( |
if (! tie(%thesaurus_db,'GDBM_File', |
$directrel*$revrel*$revrevrel>$thethreshold |
$thesaurus_db_file,&GDBM_READER(),0640)){ |
) { |
return (); |
$found{$rrridx}= |
} |
$directrel*$revrel*$revrevrel; |
my @Words=(); |
} |
if (exists($thesaurus_db{$keyword})) { |
} |
$_ = $thesaurus_db{$keyword}; |
} |
(undef,@Words) = split/:/; # The first element is the number of times |
} |
# the word appears. We do not need it now. |
} |
for (my $i=0;$i<=$#Words;$i++) { |
} |
($Words[$i],undef)= split/\,/,$Words[$i]; |
} |
|
} |
} |
} |
} |
return (); |
untie %thesaurus_db; |
|
return @Words; |
} |
} |
|
|
|
############################################################### |
|
## End Thesaurus Functions ## |
|
############################################################### |
|
|
# ---------------------------------------------------------------- Language IDs |
# ---------------------------------------------------------------- Language IDs |
sub languageids { |
sub languageids { |
return sort(keys(%language)); |
return sort(keys(%language)); |
Line 739 sub copyrightdescription {
|
Line 999 sub copyrightdescription {
|
|
|
# ------------------------------------------------------------- File Categories |
# ------------------------------------------------------------- File Categories |
sub filecategories { |
sub filecategories { |
return sort(keys(%fc)); |
return sort(keys(%category_extensions)); |
} |
} |
|
|
# -------------------------------------- File Types within a specified category |
# -------------------------------------- File Types within a specified category |
sub filecategorytypes { |
sub filecategorytypes { |
return @{$fc{lc(shift(@_))}}; |
return @{$category_extensions{lc($_[0])}}; |
} |
} |
|
|
# ------------------------------------------------------------------ File Types |
# ------------------------------------------------------------------ File Types |
Line 774 sub filedescriptionex {
|
Line 1034 sub filedescriptionex {
|
# $username,$domain - that of the student |
# $username,$domain - that of the student |
# $course - course name |
# $course - course name |
# $getattempt - leave blank if want all attempts, else put something. |
# $getattempt - leave blank if want all attempts, else put something. |
|
# $regexp - regular expression. If string matches regexp send to |
|
# $gradesub - routine that process the string if it matches regexp |
# |
# |
# output |
# output |
# formatted as a table all the attempts, if any. |
# formatted as a table all the attempts, if any. |
# |
# |
sub get_previous_attempt { |
sub get_previous_attempt { |
my ($symb,$username,$domain,$course,$getattempt)=@_; |
my ($symb,$username,$domain,$course,$getattempt,$regexp,$gradesub)=@_; |
my $prevattempts=''; |
my $prevattempts=''; |
|
no strict 'refs'; |
if ($symb) { |
if ($symb) { |
my (%returnhash)= |
my (%returnhash)= |
&Apache::lonnet::restore($symb,$course,$domain,$username); |
&Apache::lonnet::restore($symb,$course,$domain,$username); |
Line 792 sub get_previous_attempt {
|
Line 1055 sub get_previous_attempt {
|
$lasthash{$_}=$returnhash{$version.':'.$_}; |
$lasthash{$_}=$returnhash{$version.':'.$_}; |
} |
} |
} |
} |
$prevattempts='<table border="0" width="100%"><tr><td bgcolor="#000000">'; |
$prevattempts='<table border="0" width="100%"><tr><td bgcolor="#777777">'; |
$prevattempts.='<table border="0" width="100%"><tr bgcolor="#e6ffff"><td>History</td>'; |
$prevattempts.='<table border="0" width="100%"><tr bgcolor="#e6ffff"><td>History</td>'; |
foreach (sort(keys %lasthash)) { |
foreach (sort(keys %lasthash)) { |
my ($ign,@parts) = split(/\./,$_); |
my ($ign,@parts) = split(/\./,$_); |
if (@parts) { |
if ($#parts > 0) { |
my $data=$parts[-1]; |
my $data=$parts[-1]; |
pop(@parts); |
pop(@parts); |
$prevattempts.='<td>Part '.join('.',@parts).'<br />'.$data.' </td>'; |
$prevattempts.='<td>Part '.join('.',@parts).'<br />'.$data.' </td>'; |
} else { |
} else { |
$prevattempts.='<td>'.$ign.' </td>'; |
if ($#parts == 0) { |
|
$prevattempts.='<th>'.$parts[0].'</th>'; |
|
} else { |
|
$prevattempts.='<th>'.$ign.'</th>'; |
|
} |
} |
} |
} |
} |
if ($getattempt eq '') { |
if ($getattempt eq '') { |
Line 826 sub get_previous_attempt {
|
Line 1093 sub get_previous_attempt {
|
} else { |
} else { |
$value=$lasthash{$_}; |
$value=$lasthash{$_}; |
} |
} |
|
if ($_ =~/$regexp$/ && (defined &$gradesub)) {$value = &$gradesub($value)} |
$prevattempts.='<td>'.$value.' </td>'; |
$prevattempts.='<td>'.$value.' </td>'; |
} |
} |
$prevattempts.='</tr></table></td></tr></table>'; |
$prevattempts.='</tr></table></td></tr></table>'; |
Line 878 sub get_student_answers {
|
Line 1146 sub get_student_answers {
|
foreach my $element (@elements) { |
foreach my $element (@elements) { |
$ENV{'form.grade_'.$element}=$old{$element}; |
$ENV{'form.grade_'.$element}=$old{$element}; |
} |
} |
$userview=~s/\<body[^\>]*\>//gi; |
|
$userview=~s/\<\/body\>//gi; |
|
$userview=~s/\<html\>//gi; |
|
$userview=~s/\<\/html\>//gi; |
|
$userview=~s/\<head\>//gi; |
|
$userview=~s/\<\/head\>//gi; |
|
$userview=~s/action\s*\=/would_be_action\=/gi; |
|
return $userview; |
return $userview; |
} |
} |
|
|
############################################### |
############################################### |
|
|
=item get_unprocessed_cgi($query,$possible_names) |
|
|
|
Modify the %ENV hash to contain unprocessed CGI form parameters held in |
sub timehash { |
$query. The parameters listed in $possible_names (an array reference), |
my @ltime=localtime(shift); |
will be set in $ENV{'form.name'} if they do not already exist. |
return ( 'seconds' => $ltime[0], |
|
'minutes' => $ltime[1], |
|
'hours' => $ltime[2], |
|
'day' => $ltime[3], |
|
'month' => $ltime[4]+1, |
|
'year' => $ltime[5]+1900, |
|
'weekday' => $ltime[6], |
|
'dayyear' => $ltime[7]+1, |
|
'dlsav' => $ltime[8] ); |
|
} |
|
|
|
sub maketime { |
|
my %th=@_; |
|
return POSIX::mktime( |
|
($th{'seconds'},$th{'minutes'},$th{'hours'}, |
|
$th{'day'},$th{'month'}-1,$th{'year'}-1900,0,0,$th{'dlsav'})); |
|
} |
|
|
Typically called with $ENV{'QUERY_STRING'} as the first parameter. |
|
$possible_names is an ref to an array of form element names. As an example: |
|
get_unprocessed_cgi($ENV{'QUERY_STRING'},['uname','udom']); |
|
will result in $ENV{'form.uname'} and $ENV{'form.udom'} being set. |
|
|
|
=cut |
sub findallcourses { |
|
my %courses=(); |
|
my $now=time; |
|
foreach (keys %ENV) { |
|
if ($_=~/^user\.role\.\w+\.\/(\w+)\/(\w+)/) { |
|
my ($starttime,$endtime)=$ENV{$_}; |
|
my $active=1; |
|
if ($starttime) { |
|
if ($now<$starttime) { $active=0; } |
|
} |
|
if ($endtime) { |
|
if ($now>$endtime) { $active=0; } |
|
} |
|
if ($active) { $courses{$1.'_'.$2}=1; } |
|
} |
|
} |
|
return keys %courses; |
|
} |
|
|
############################################### |
############################################### |
|
|
|
sub bodytag { |
|
my ($title,$function,$addentries)=@_; |
|
unless ($function) { |
|
$function='student'; |
|
if ($ENV{'request.role'}=~/^(cc|in|ta|ep)/) { |
|
$function='coordinator'; |
|
} |
|
if ($ENV{'request.role'}=~/^(su|dc|ad|li)/) { |
|
$function='admin'; |
|
} |
|
if (($ENV{'request.role'}=~/^(au|ca)/) || |
|
($ENV{'REQUEST_URI'}=~/^(\/priv|\~)/)) { |
|
$function='author'; |
|
} |
|
} |
|
my $img=''; |
|
my $pgbg=''; |
|
my $tabbg=''; |
|
my $font=''; |
|
my $link=''; |
|
my $alink='#CC0000'; |
|
my $vlink=''; |
|
if ($function eq 'admin') { |
|
$img='admin'; |
|
$pgbg='#FFFFCC'; |
|
$tabbg='#CCCC99'; |
|
$font='#772200'; |
|
$link='#663300'; |
|
$vlink='#666600'; |
|
} elsif ($function eq 'coordinator') { |
|
$img='coordinator'; |
|
$pgbg='#CCFFFF'; |
|
$tabbg='#CCCCFF'; |
|
$font='#000044'; |
|
$link='#003333'; |
|
$vlink='#006633'; |
|
} elsif ($function eq 'author') { |
|
$img='author'; |
|
$pgbg='#CCFFFF'; |
|
$tabbg='#CCFFCC'; |
|
$font='#004400'; |
|
$link='#003333'; |
|
$vlink='#006666'; |
|
} else { |
|
$img='student'; |
|
$pgbg='#FFFFAA'; |
|
$tabbg='#FF9900'; |
|
$font='#991100'; |
|
$link='#993300'; |
|
$vlink='#996600'; |
|
} |
|
# role and realm |
|
my ($role,$realm) |
|
=&Apache::lonnet::plaintext((split(/\./,$ENV{'request.role'}))[0]); |
|
# realm |
|
if ($ENV{'request.course.id'}) { |
|
$realm= |
|
$ENV{'course.'.$ENV{'request.course.id'}.'.description'}; |
|
} |
|
unless ($realm) { $realm=' '; } |
|
# Set messages |
|
my $messages=localtime(); |
|
# Output |
|
return(<<ENDBODY); |
|
<body bgcolor="$pgbg" text="$font" alink="$alink" vlink="$vlink" link="$link" |
|
$addentries> |
|
<table width="100%" cellspacing="0" border="0" cellpadding="0"> |
|
<tr><td bgcolor="$font"> |
|
<img src="/adm/lonInterFace/$img.jpg" /></td> |
|
<td bgcolor="$font"><font color='$pgbg'>$messages</font></td> |
|
</tr> |
|
<tr> |
|
<td rowspan="3" bgcolor="$tabbg"> |
|
<font size="5"><b>$title</b></font> |
|
<td bgcolor="$tabbg" align="right"> |
|
<font size="2"> |
|
$ENV{'environment.firstname'} |
|
$ENV{'environment.middlename'} |
|
$ENV{'environment.lastname'} |
|
$ENV{'environment.generation'} |
|
</font> |
|
</td> |
|
</tr> |
|
<tr><td bgcolor="$tabbg" align="right"> |
|
<font size="2">$role</font> |
|
</td></tr> |
|
<tr> |
|
<td bgcolor="$tabbg" align="right"><font size="2">$realm</font> </td></tr> |
|
</table><br> |
|
ENDBODY |
|
} |
|
############################################### |
|
|
sub get_unprocessed_cgi { |
sub get_unprocessed_cgi { |
my ($query,$possible_names)= @_; |
my ($query,$possible_names)= @_; |
# $Apache::lonxml::debug=1; |
# $Apache::lonxml::debug=1; |
Line 955 sub add_to_env {
|
Line 1337 sub add_to_env {
|
} |
} |
} |
} |
|
|
#---CSV Upload/Handling functions |
=pod |
|
|
# ========================================================= Store uploaded file |
=back |
# needs $ENV{'form.upfile'} |
|
# return $datatoken to be put into hidden field |
=head2 CSV Upload/Handling functions |
|
|
|
=over 4 |
|
|
|
=item upfile_store($r) |
|
|
|
Store uploaded file, $r should be the HTTP Request object, |
|
needs $ENV{'form.upfile'} |
|
returns $datatoken to be put into hidden field |
|
|
|
=cut |
|
|
sub upfile_store { |
sub upfile_store { |
my $r=shift; |
my $r=shift; |
Line 978 sub upfile_store {
|
Line 1370 sub upfile_store {
|
return $datatoken; |
return $datatoken; |
} |
} |
|
|
# ================================================= Load uploaded file from tmp |
=item load_tmp_file($r) |
# needs $ENV{'form.datatoken'} |
|
# sets $ENV{'form.upfile'} to the contents of the file |
Load uploaded file from tmp, $r should be the HTTP Request object, |
|
needs $ENV{'form.datatoken'}, |
|
sets $ENV{'form.upfile'} to the contents of the file |
|
|
|
=cut |
|
|
sub load_tmp_file { |
sub load_tmp_file { |
my $r=shift; |
my $r=shift; |
Line 995 sub load_tmp_file {
|
Line 1391 sub load_tmp_file {
|
$ENV{'form.upfile'}=join('',@studentdata); |
$ENV{'form.upfile'}=join('',@studentdata); |
} |
} |
|
|
# ========================================= Separate uploaded file into records |
=item upfile_record_sep() |
# returns array of records |
|
# needs $ENV{'form.upfile'} |
Separate uploaded file into records |
# needs $ENV{'form.upfiletype'} |
returns array of records, |
|
needs $ENV{'form.upfile'} and $ENV{'form.upfiletype'} |
|
|
|
=cut |
|
|
sub upfile_record_sep { |
sub upfile_record_sep { |
if ($ENV{'form.upfiletype'} eq 'xml') { |
if ($ENV{'form.upfiletype'} eq 'xml') { |
Line 1007 sub upfile_record_sep {
|
Line 1406 sub upfile_record_sep {
|
} |
} |
} |
} |
|
|
# =============================================== Separate a record into fields |
=item record_sep($record) |
# needs $ENV{'form.upfiletype'} |
|
# takes $record as arg |
Separate a record into fields $record should be an item from the upfile_record_sep(), needs $ENV{'form.upfiletype'} |
|
|
|
=cut |
|
|
sub record_sep { |
sub record_sep { |
my $record=shift; |
my $record=shift; |
my %components=(); |
my %components=(); |
Line 1054 sub record_sep {
|
Line 1456 sub record_sep {
|
return %components; |
return %components; |
} |
} |
|
|
# =============================== HTML code to select file and specify its type |
=item upfile_select_html() |
|
|
|
return HTML code to select file and specify its type |
|
|
|
=cut |
|
|
sub upfile_select_html { |
sub upfile_select_html { |
return (<<'ENDUPFORM'); |
return (<<'ENDUPFORM'); |
<input type="file" name="upfile" size="50"> |
<input type="file" name="upfile" size="50"> |
Line 1067 sub upfile_select_html {
|
Line 1474 sub upfile_select_html {
|
ENDUPFORM |
ENDUPFORM |
} |
} |
|
|
# ===================Prints a table of sample values from each column uploaded |
=item csv_print_samples($r,$records) |
# $r is an Apache Request ref |
|
# $records is an arrayref from &Apache::loncommon::upfile_record_sep |
Prints a table of sample values from each column uploaded $r is an |
|
Apache Request ref, $records is an arrayref from |
|
&Apache::loncommon::upfile_record_sep |
|
|
|
=cut |
|
|
sub csv_print_samples { |
sub csv_print_samples { |
my ($r,$records) = @_; |
my ($r,$records) = @_; |
my (%sone,%stwo,%sthree); |
my (%sone,%stwo,%sthree); |
Line 1092 sub csv_print_samples {
|
Line 1504 sub csv_print_samples {
|
$r->print('</tr></table><br />'."\n"); |
$r->print('</tr></table><br />'."\n"); |
} |
} |
|
|
# ======Prints a table to create associations between values and table columns |
=item csv_print_select_table($r,$records,$d) |
# $r is an Apache Request ref |
|
# $records is an arrayref from &Apache::loncommon::upfile_record_sep |
Prints a table to create associations between values and table columns. |
# $d is an array of 2 element arrays (internal name, displayed name) |
$r is an Apache Request ref, |
|
$records is an arrayref from &Apache::loncommon::upfile_record_sep, |
|
$d is an array of 2 element arrays (internal name, displayed name) |
|
|
|
=cut |
|
|
sub csv_print_select_table { |
sub csv_print_select_table { |
my ($r,$records,$d) = @_; |
my ($r,$records,$d) = @_; |
my $i=0;my %sone; |
my $i=0;my %sone; |
Line 1119 sub csv_print_select_table {
|
Line 1536 sub csv_print_select_table {
|
return $i; |
return $i; |
} |
} |
|
|
# ===================Prints a table of sample values from the upload and |
=item csv_samples_select_table($r,$records,$d) |
# can make associate samples to internal names |
|
# $r is an Apache Request ref |
Prints a table of sample values from the upload and can make associate samples to internal names. |
# $records is an arrayref from &Apache::loncommon::upfile_record_sep |
|
# $d is an array of 2 element arrays (internal name, displayed name) |
$r is an Apache Request ref, |
|
$records is an arrayref from &Apache::loncommon::upfile_record_sep, |
|
$d is an array of 2 element arrays (internal name, displayed name) |
|
|
|
=cut |
|
|
sub csv_samples_select_table { |
sub csv_samples_select_table { |
my ($r,$records,$d) = @_; |
my ($r,$records,$d) = @_; |
my %sone; my %stwo; my %sthree; |
my %sone; my %stwo; my %sthree; |
Line 1154 sub csv_samples_select_table {
|
Line 1576 sub csv_samples_select_table {
|
1; |
1; |
__END__; |
__END__; |
|
|
|
=pod |
|
|
|
=back |
|
|
|
=head2 Access .tab File Data |
|
|
|
=over 4 |
|
|
=item languageids() |
=item languageids() |
|
|
returns list of all language ids |
returns list of all language ids |
Line 1192 returns description for a specified file
|
Line 1622 returns description for a specified file
|
returns description for a specified file type with |
returns description for a specified file type with |
extra formatting |
extra formatting |
|
|
|
=back |
|
|
|
=head2 Alternate Problem Views |
|
|
|
=over 4 |
|
|
=item get_previous_attempt() |
=item get_previous_attempt() |
|
|
return string with previous attempt on problem |
return string with previous attempt on problem |
Line 1204 show a snapshot of what student was look
|
Line 1640 show a snapshot of what student was look
|
|
|
show a snapshot of how student was answering problem |
show a snapshot of how student was answering problem |
|
|
=item get_unprocessed_cgi() |
=back |
|
|
|
=head2 HTTP Helper |
|
|
|
=over 4 |
|
|
get unparsed CGI parameters |
=item get_unprocessed_cgi($query,$possible_names) |
|
|
|
Modify the %ENV hash to contain unprocessed CGI form parameters held in |
|
$query. The parameters listed in $possible_names (an array reference), |
|
will be set in $ENV{'form.name'} if they do not already exist. |
|
|
|
Typically called with $ENV{'QUERY_STRING'} as the first parameter. |
|
$possible_names is an ref to an array of form element names. As an example: |
|
get_unprocessed_cgi($ENV{'QUERY_STRING'},['uname','udom']); |
|
will result in $ENV{'form.uname'} and $ENV{'form.udom'} being set. |
|
|
=item cacheheader() |
=item cacheheader() |
|
|