[LON-CAPA-cvs] cvs: loncom /interface printout.pl
foxr
lon-capa-cvs@mail.lon-capa.org
Mon, 02 May 2005 21:57:45 -0000
foxr Mon May 2 17:57:45 2005 EDT
Modified files:
/loncom/interface printout.pl
Log:
Add messaging to course coordinators in the event LaTeX failed.
The student is also informed that the messages was sent.
Index: loncom/interface/printout.pl
diff -u loncom/interface/printout.pl:1.76 loncom/interface/printout.pl:1.77
--- loncom/interface/printout.pl:1.76 Thu Apr 7 02:56:23 2005
+++ loncom/interface/printout.pl Mon May 2 17:57:44 2005
@@ -1,7 +1,7 @@
#!/usr/bin/perl
# CGI-script to run LaTeX, dvips, ps2ps, ps2pdf etc.
#
-# $Id: printout.pl,v 1.76 2005/04/07 06:56:23 albertel Exp $
+# $Id: printout.pl,v 1.77 2005/05/02 21:57:44 foxr Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -35,8 +35,147 @@
use Apache::lonnet();
use Apache::loncommon;
use Apache::lonlocal;
+use Apache::lonmsg;
+use LONCAPA::Enrollment;
use strict;
+
+# Get the list of course coordinators authorized on this course:
+#Parameters:
+# id - Course id.
+# dom - Domain of course.
+#Returns:
+# A (possibly empty) list of course coordinators. Each course coordinator
+# is given as user:domain
+#
+sub get_cc_list {
+ my ($id, $dom) = @_;
+ my @personel = &Apache::lonnet::getkeys('nohist_userroles', $dom, $id);
+ my @coordinators;
+ foreach my $person (@personel) {
+ my @info = split(/:/, $person);
+ my $role = $info[0];
+ my $user = $info[1];
+ my $udom = $info[2];
+ if ($role eq 'cc') {
+ my $isactive = &LONCAPA::Enrollment::check_user_status($udom, $user, $dom, $id, 'cc');
+ if ($isactive eq 'ok') {
+ push @coordinators, $user.':'.$udom;
+ }
+ }
+ }
+ return (@coordinators);
+}
+#
+# Determine if a user is operating as a student for this course/domain.
+#
+#
+#Parameters:
+# course - The course id.
+# cdom - The course domain.
+#
+#Implicit:
+# $env{request.role} contains the role under which this user operated this
+# this request.
+sub is_student {
+ my ($course, $cdom) = @_;
+ my $active_role = $env{'request.role'};
+ my @role_fields = split(/\//, $active_role);
+
+
+ if ( ($role_fields[0] eq 'st.') && ($role_fields[1] eq $cdom) &&
+ ($role_fields[2] eq $course)) {
+ return 1;
+ } else {
+ return 0;
+ }
+
+
+}
+
+#
+# Debugging: Dump the environment for debugging.
+#
+sub dumpenv {
+ print "<br>-------------------<br>";
+ foreach my $key (sort (keys %env)) {
+ print "<br>$key -> $env{$key}";
+ }
+ print "<br>-------------------<br>";
+}
+
+#
+# This sub sends a message to the appropriate person if there was an error
+# rendering the latex At present, there's only one case to consider:
+# a student printing inside a course results in messages to the course coordinator.
+#Parmaeters:
+# identifier - The unique identifier of this cgi request.
+# logfile - The contents of the log file (included in the message).
+# texfile - reference to an array containing the LaTeX input file
+# (included in the message).
+#Implicit inputs:
+# From the environment:
+# cgi.$identifier.user - User doing the printing.
+# cgi.$identifier.domain - Domain the user is logged in on with printing.
+# cgi.$identifier.courseid - Id of the course (if this is a course).
+# cgi.$identifier.coursedom- Domain in which course was constituted.
+# cgi.$identifier.resources - List of resource URL's for which the print
+# was attempted.
+#
+sub send_error_mail {
+ my ($identifier,$logfile, $texfile) = @_;
+ my $user = $env{"cgi.$identifier.user"};
+ my $domain = $env{"cgi.$identifier.domain"};
+ my $courseid = $env{"cgi.$identifier.courseid"};
+ my $coursedom= $env{"cgi.$identifier.coursedom"};
+ my $resources= $env{"cgi.$identifier.resources"};
+
+ # &dumpenv();
+
+
+
+ # Only continue if there is a user, domain, courseid, course domain
+ # and resources:
+
+ if(defined($user) && defined($domain) && defined($courseid) &&
+ defined($coursedom) && defined($resources) ){
+
+ my @cclist = &get_cc_list($courseid, $coursedom);
+
+ # Only mail if the conditions are ripe for it:
+ # The user is a student in the course:
+ #
+
+ if (&is_student( $courseid, $coursedom)) {
+ # build the subject and message body:
+ print "sending message to course coordinators.<br>";
+
+ my $subject = "Print failed for $user".'@'.$domain;
+ my $message .= "Print failed to render LaTeX for $user".'@'."$domain\n";
+ $message .= " User was attempting to print: \n";
+ $message .= " $resources\n";
+ $message .= "--------------------LaTeX logfile:------------ \n";
+ $message .= $logfile;
+ $message .= "-----------------LaTeX source file: ------------\n";
+
+ foreach my $line (@$texfile) {
+ $message .= "$line\n";
+ }
+ foreach my $dest (@cclist) {
+ my @destinfo = split(/:/,$dest);
+ my $user = $destinfo[0];
+ my $dom = $destinfo[1];
+
+ &Apache::lonmsg::user_normal_msg($user, $dom,
+ $subject, $message);
+
+ # No point in looking at the return status as there's no good
+ # error action I can think of right now (log maybe?).
+ }
+ }
+ }
+}
+
$|=1;
if (! &LONCAPA::loncgi::check_cookie_and_load_env()) {
print <<END;
@@ -243,6 +382,7 @@
}
print "</pre>\n";
if ($advanced_role) {
+ print "<br> Advanced role <br>";
print "<b><big>The link to ";
$logfilename=~s/\/home\/httpd//;
print "<a href=\"$logfilename\">Your log file </a></big></b>";
@@ -260,6 +400,15 @@
$texfile=~s/\/home\/httpd//;
print "<a href=\"$texfile\">Your original LaTeX file </a></big></b>";
print "\n";
+ } else { # Student role...
+ # at this point:
+ # $body_log_file - contains the log file.
+ # $name_file - is the name of the LaTeX file.
+ # $identifier - is the unique LaTeX identifier.l
+
+ my $tex_handle = IO::File->new($name_file);
+ my @tex_contents = <$tex_handle>;
+ &send_error_mail($identifier, $body_log_file, \@tex_contents);
}
} elsif ($body_log_file=~m/<inserted text>/) {