--- loncom/interface/loncommon.pm 2004/11/23 07:29:24 1.234
+++ loncom/interface/loncommon.pm 2005/03/10 00:21:48 1.255
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# a pile of common routines
#
-# $Id: loncommon.pm,v 1.234 2004/11/23 07:29:24 raeburn Exp $
+# $Id: loncommon.pm,v 1.255 2005/03/10 00:21:48 matthew Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -547,7 +547,7 @@ END
$result .= "\n";
@@ -557,7 +557,7 @@ END
my $seconddefault = $hashref->{$firstdefault}->{'default'};
foreach my $value (sort(keys(%select2))) {
$result.=" \n";
}
$result .= "\n";
@@ -687,25 +687,38 @@ sub help_open_menu {
"
".
"
$text";
}
+ my $html=&Apache::lonxml::xmlbegin();
my $helpicon=&lonhttpdurl("/adm/lonIcons/helpgateway.gif");
$template .= <<"ENDTEMPLATE";
@@ -884,6 +897,8 @@ sub define_excel_formats {
$format->{'h1'} = $workbook->add_format(bold=>1, size=>18);
$format->{'h2'} = $workbook->add_format(bold=>1, size=>16);
$format->{'h3'} = $workbook->add_format(bold=>1, size=>14);
+ $format->{'h4'} = $workbook->add_format(bold=>1, size=>12);
+ $format->{'i'} = $workbook->add_format(italic=>1);
$format->{'date'} = $workbook->add_format(num_format=>
'mm/dd/yyyy hh:mm:ss');
return $format;
@@ -894,6 +909,49 @@ sub define_excel_formats {
=pod
+=item &create_workbook
+
+Create an Excel worksheet. If it fails, output message on the
+request object and return undefs.
+
+Inputs: Apache request object
+
+Returns (undef) on failure,
+ Excel worksheet object, scalar with filename, and formats
+ from &Apache::loncommon::define_excel_formats on success
+
+=cut
+
+###############################################################
+###############################################################
+sub create_workbook {
+ my ($r) = @_;
+ #
+ # Create the excel spreadsheet
+ my $filename = '/prtspool/'.
+ $ENV{'user.name'}.'_'.$ENV{'user.domain'}.'_'.
+ time.'_'.rand(1000000000).'.xls';
+ my $workbook = Spreadsheet::WriteExcel->new('/home/httpd'.$filename);
+ if (! defined($workbook)) {
+ $r->log_error("Error creating excel spreadsheet $filename: $!");
+ $r->print('
'.&mt("Unable to create new Excel file. ".
+ "This error has been logged. ".
+ "Please alert your LON-CAPA administrator").
+ '
');
+ return (undef);
+ }
+ #
+ $workbook->set_tempdir('/home/httpd/perl/tmp');
+ #
+ my $format = &Apache::loncommon::define_excel_formats($workbook);
+ return ($workbook,$filename,$format);
+}
+
+###############################################################
+###############################################################
+
+=pod
+
=item * change_content_javascript():
This and the next function allow you to create small sections of an
@@ -1033,7 +1091,7 @@ sub multiple_select_form {
$output.="\n\n";
@@ -1064,7 +1122,7 @@ sub select_form {
}
foreach (@keys) {
$selectform.="\n";
}
$selectform.="";
@@ -1101,7 +1159,7 @@ sub select_level_form {
my $selectform = "";
@@ -1131,7 +1189,7 @@ sub select_dom_form {
my $selectdomain = "";
@@ -1230,9 +1288,11 @@ Outputs:
###############################################################
###############################################################
sub decode_user_agent {
+ my ($r)=@_;
my @browsertype=split(/\&/,$Apache::lonnet::perlvar{"lonBrowsDet"});
my %mathcap=split(/\&/,$$Apache::lonnet::perlvar{"lonMathML"});
my $httpbrowser=$ENV{"HTTP_USER_AGENT"};
+ if (!$httpbrowser && $r) { $httpbrowser=$r->header_in('User-Agent'); }
my $clientbrowser='unknown';
my $clientversion='0';
my $clientmathml='';
@@ -2285,7 +2345,7 @@ sub get_student_view {
if (defined($moreenv)) {
%form=(%form,%{$moreenv});
}
- if ($target eq 'tex') {$form{'grade_target'} = 'tex';}
+ if (defined($target)) { $form{'grade_target'} = $target; }
$feedurl=&Apache::lonnet::clutter($feedurl);
my $userview=&Apache::lonnet::ssi_body($feedurl,%form);
$userview=~s/\]*\>//gi;
@@ -2325,7 +2385,7 @@ sub get_student_answers {
=item * &submlink()
-Inputs: $text $uname $udom $symb
+Inputs: $text $uname $udom $symb $target
Returns: A link to grades.pm such as to see the SUBM view of a student
@@ -2333,15 +2393,64 @@ Returns: A link to grades.pm such as to
###############################################
sub submlink {
- my ($text,$uname,$udom,$symb)=@_;
+ my ($text,$uname,$udom,$symb,$target)=@_;
+ if (!($uname && $udom)) {
+ (my $cursymb, my $courseid,$udom,$uname)=
+ &Apache::lonxml::whichuser($symb);
+ if (!$symb) { $symb=$cursymb; }
+ }
+ if (!$symb) { $symb=&Apache::lonnet::symbread(); }
+ $symb=&Apache::lonnet::escape($symb);
+ if ($target) { $target="target=\"$target\""; }
+ return ''.$text.'';
+}
+##############################################
+
+=pod
+
+=item * &pgrdlink()
+
+Inputs: $text $uname $udom $symb $target
+
+Returns: A link to grades.pm such as to see the PGRD view of a student
+
+=cut
+
+###############################################
+sub pgrdlink {
+ my $link=&submlink(@_);
+ $link=~s/(&command=submission)/$1&showgrading=yes/;
+ return $link;
+}
+##############################################
+
+=pod
+
+=item * &pprmlink()
+
+Inputs: $text $uname $udom $symb $target
+
+Returns: A link to parmset.pm such as to see the PPRM view of a
+student andn resource
+
+=cut
+
+###############################################
+sub pprmlink {
+ my ($text,$uname,$udom,$symb,$target)=@_;
if (!($uname && $udom)) {
(my $cursymb, my $courseid,$udom,$uname)=
&Apache::lonxml::whichuser($symb);
if (!$symb) { $symb=$cursymb; }
}
- if (!$symb) { $symb=&symbread(); }
- return ''.$text.'';
+ if (!$symb) { $symb=&Apache::lonnet::symbread(); }
+ $symb=&Apache::lonnet::escape($symb);
+ if ($target) { $target="target=\"$target\""; }
+ return ''.$text.'';
}
##############################################
@@ -2569,6 +2678,13 @@ a:focus { color: red; background: yellow
END
+ if ($ENV{'environment.texengine'} eq 'jsMath') {
+ $bodytag.=''."\n".
+ ''."\n";
+ }
+
my $upperleft='';
if ($bodyonly) {
@@ -2599,26 +2715,45 @@ ENDROLE
$font.'">'.$title.'';
if ($customtitle) {
$titleinfo = $customtitle;
- }
+ }
+
if ($ENV{'request.state'} eq 'construct') {
my ($uname,$thisdisfn)=
($ENV{'request.filename'} =~ m|^/home/([^/]+)/public_html/(.*)|);
my $formaction='/priv/'.$uname.'/'.$thisdisfn;
$formaction=~s/\/+/\//g;
- $titleinfo = ''
- .&Apache::lonmenu::constspaceform();
-
- &Apache::lonhtmlcommon::store_recent('construct',$formaction,$formaction);
- if ($thisdisfn!~m|/$|) { $forcereg=1; }
- }
+ unless ($customtitle) { #this is for resources; directories have customtitle, and crumbs and select recent are created in lonpubdir.pm
+ my $parentpath = '';
+ my $lastitem = '';
+ if ($thisdisfn =~ m-(.+/)([^/]*)$-) {
+ $parentpath = $1;
+ $lastitem = $2;
+ } else {
+ $lastitem = $thisdisfn;
+ }
+ $titleinfo = &Apache::loncommon::help_open_menu('','','','',3,'Authoring').
+ 'Construction Space: '.
+ ''
+ .&Apache::lonmenu::constspaceform();
- return $bodytag.&Apache::lonmenu::menubuttons($forcereg,'web',
- $forcereg).
- '
'.$titleinfo.'
'.$roleinfo.'
';
+ }
+ $forcereg=1;
+ }
+ my $titletable = '
'.
+ '
'.
+ $titleinfo.'
'.$roleinfo.'
';
+ if ($ENV{'request.state'} eq 'construct') {
+ $bodytag .= &Apache::lonmenu::menubuttons($forcereg,'web',$forcereg,$titletable);
+ } else {
+ $bodytag .= &Apache::lonmenu::menubuttons($forcereg,'web',$forcereg).
+ $titletable;
+ }
+ return $bodytag;
}
#
@@ -2628,6 +2763,17 @@ ENDROLE
if ($customtitle) {
$titleinfo = $customtitle;
}
+ #
+ # Extra info if you are the DC
+ my $dc_info = '';
+ if ($ENV{'user.adv'} && exists($ENV{'user.role.dc./'.
+ $ENV{'course.'.$ENV{'request.course.id'}.
+ '.domain'}.'/'})) {
+ my $cid = $ENV{'request.course.id'};
+ $dc_info.= $cid.' '.$ENV{'course.'.$cid.'.internal.coursecode'};
+ $dc_info = '('.$dc_info.')';
+ }
+ #
return(<
@@ -2637,7 +2783,7 @@ $upperleft
-$titleinfo
+$titleinfo $dc_info
$ENV{'environment.firstname'}
@@ -2657,6 +2803,40 @@ ENDBODY
}
###############################################
+###############################################
+
+=pod
+
+=back
+
+=head1 HTTP Helpers
+
+=over 4
+
+=item * &endbodytag()
+
+Returns a uniform footer for LON-CAPA web pages.
+
+Inputs:
+
+=over 4
+
+=back
+
+Returns: A uniform footer for LON-CAPA web pages.
+
+=cut
+
+sub endbodytag {
+ my $endbodytag='';
+ if ($ENV{'environment.texengine'} eq 'jsMath') {
+ $endbodytag=''.
+ "\n".$endbodytag;
+ }
+ return $endbodytag;
+}
+
+###############################################
=pod
@@ -2704,52 +2884,37 @@ Returns number of sections.
###############################################
sub get_sections {
my ($cdom,$cnum,$sectioncount,$possible_roles) = @_;
+ if (!($cdom && $cnum)) { return 0; }
my $cid = $cdom.'_'.$cnum;
my $numsections = 0;
- if ($cdom && $cnum) {
- if (!defined($possible_roles) || (grep/^st$/,@$possible_roles)) {
- my ($classlist) = &Apache::loncoursedata::get_classlist($cid,$cdom,$cnum);
- my $sec_index = &Apache::loncoursedata::CL_SECTION();
- my $status_index = &Apache::loncoursedata::CL_STATUS();
- while (my ($student,$data) = each %$classlist) {
- my ($section,$status) = ($data->[$sec_index],
- $data->[$status_index]);
- unless ($section eq '' || $section =~ /^\s*$/) {
- if (!defined($$sectioncount{$section})) {
- $$sectioncount{$section} = 1;
- $numsections ++;
- } else {
- $$sectioncount{$section} ++;
- }
- }
- }
- }
- my %courseroles = &Apache::lonnet::dump('nohist_userroles',$cdom,$cnum);
- foreach my $user (sort keys %courseroles) {
- if ($user =~ /^(\w{2})/) {
- my $role = $1;
- if (!defined($possible_roles) || (grep/^$role$/,@$possible_roles)) {
- if ($role eq 'cr') {
- if ($user =~ m-^$role/[^/]*/[^/]*/[^/]*:[^:]*:[^:]*:(\w+)-) {
- if (!defined($$sectioncount{$1})) {
- $$sectioncount{$1} = 1;
- $numsections ++;
- } else {
- $$sectioncount{$1} ++;
- }
- }
- }
- if ($user =~ /^$role:[^:]*:[^:]*:(\w+)/) {
- if (!defined($$sectioncount{$1})) {
- $$sectioncount{$1} = 1;
- $numsections ++;
- } else {
- $$sectioncount{$1} ++;
- }
- }
- }
- }
- }
+
+ if (!defined($possible_roles) || (grep/^st$/,@$possible_roles)) {
+ my ($classlist) = &Apache::loncoursedata::get_classlist($cid,$cdom,$cnum);
+ my $sec_index = &Apache::loncoursedata::CL_SECTION();
+ my $status_index = &Apache::loncoursedata::CL_STATUS();
+ while (my ($student,$data) = each %$classlist) {
+ my ($section,$status) = ($data->[$sec_index],
+ $data->[$status_index]);
+ unless ($section eq '-1' || $section =~ /^\s*$/) {
+ if (!defined($$sectioncount{$section})) { $numsections++; }
+ $$sectioncount{$section}++;
+ }
+ }
+ }
+ my %courseroles = &Apache::lonnet::dump('nohist_userroles',$cdom,$cnum);
+ foreach my $user (sort(keys(%courseroles))) {
+ if ($user !~ /^(\w{2})/) { next; }
+ my ($role) = ($user =~ /^(\w{2})/);
+ if ($possible_roles && !(grep(/^$role$/,@$possible_roles))) { next; }
+ my $section;
+ if ($role eq 'cr' &&
+ $user =~ m-^$role/[^/]*/[^/]*/[^/]*:[^:]*:[^:]*:(\w+)-) {
+ $section=$1;
+ }
+ if ($user =~ /^$role:[^:]*:[^:]*:(\w+)/) { $section=$1; }
+ if (!defined($section) || $section eq '-1') { next; }
+ if (!defined($$sectioncount{$section})) { $numsections++; }
+ $$sectioncount{$section}++;
}
return $numsections;
}
@@ -2891,6 +3056,7 @@ sub no_cache {
sub content_type {
my ($r,$type,$charset) = @_;
+ if ($ENV{'browser.mathml'} && $type eq 'text/html') { $type='text/xml'; }
unless ($charset) {
$charset=&Apache::lonlocal::current_encoding;
}
@@ -3028,7 +3194,12 @@ needs $ENV{'form.upfile'} and $ENV{'form
sub upfile_record_sep {
if ($ENV{'form.upfiletype'} eq 'xml') {
} else {
- return split(/\n/,$ENV{'form.upfile'});
+ my @records;
+ foreach my $line (split(/\n/,$ENV{'form.upfile'})) {
+ if ($line=~/^\s*$/) { next; }
+ push(@records,$line);
+ }
+ return @records;
}
}
@@ -3186,7 +3357,7 @@ sub csv_print_select_table {
$r->print('');
foreach (sort({$a <=> $b} keys(%sone))) {
$r->print('');
}
$r->print('
'."\n");
@@ -3230,7 +3401,7 @@ sub csv_samples_select_table {
foreach (@$d) {
my ($value,$display,$defaultcol)=@{ $_ };
$r->print('');
}
$r->print('
');
@@ -3361,6 +3532,9 @@ they are plotted. If undefined, default
=item @Values: An array of array references. Each array reference holds data
to be plotted in a stacked bar chart.
+=item If the final element of @Values is a hash reference the key/value
+pairs will be added to the graph definition.
+
=back
Returns:
@@ -3834,7 +4008,7 @@ sub icon {
$curfext.".gif";
}
}
- return $iconname;
+ return &lonhttpdurl($iconname);
}
sub lonhttpdurl {
@@ -3872,7 +4046,7 @@ sub escape_double {
# Escapes the last element of a full URL.
sub escape_url {
my ($url) = @_;
- my @urlslices = split(/\//, $url);
+ my @urlslices = split(/\//, $url,-1);
my $lastitem = &Apache::lonnet::escape(pop(@urlslices));
return join('/',@urlslices).'/'.$lastitem;
}