[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>/) {