[LON-CAPA-cvs] cvs: modules /gci Autoreport.pl

gci gci@source.lon-capa.org
Mon, 11 Jan 2010 02:58:15 -0000


gci		Mon Jan 11 02:58:15 2010 EDT

  Added files:                 
    /modules/gci	Autoreport.pl 
  Log:
  - Script (run from cron as user www) to check for closed Concept Tests for which
    message need to be sent with link to Statistics page. 
  
  

Index: modules/gci/Autoreport.pl
+++ modules/gci/Autoreport.pl
#!/usr/bin/perl
#
# Automated Report Availability 
#
# $Id: Autoreport.pl,v 1.1 2010/01/11 02:58:15 gci Exp $
# Run as www. Call this from an entry in /etc/cron.d/loncapa
#
# www /home/httpd/perl/Autoreport.pl
#

    use strict;
    use lib '/home/httpd/lib/perl';
    use Apache::lonnet;
    use Apache::loncommon;
    use Apache::lonmsg;
    use Apache::lonlocal;
    use LONCAPA::Configuration;
    use LONCAPA qw(:DEFAULT :match);

# Determine the library server's domain and hostID
    my $perlvarref = &LONCAPA::Configuration::read_conf('loncapa.conf');
    my $logfile = $$perlvarref{'lonDaemons'}.'/logs/autoreport.log';
    my @hostids = &Apache::lonnet::current_machine_ids();

# Determine the present time;
    my $now = time();
    my $output;
    $env{'user.domain'} = 'gci';
    # Initialize language handler
    &Apache::lonlocal::get_language_handle();
    # Determine the courses
    my %courses = 
        &Apache::lonnet::courseiddump('gcitest','.',1,'.','.','.',1,\@hostids,'Course');
    foreach my $key (sort(keys(%courses))) {
        my %args = (
                     one_time => 1,
                   );
# Get course settings
        my %settings = &Apache::lonnet::coursedescription($key,\%args);
        my $cnum = $settings{'num'};
        next if ($settings{'domain'} ne 'gcitest');
        next if ($settings{'internal.autoreportmailsent'});
        my $courseopt=&Apache::lonnet::get_courseresdata($cnum,'gcitest');
        my $duedate = $courseopt->{$key.'.0.duedate'};
        my %courseenv;
        if ($duedate < $now) {
            my $numsent = &send_message($settings{'internal.courseowner'},
                                     $settings{'description'},$cnum,'gcitest');
            $output .= &mt('[quant,_1,message] sent with statistics link for concept test: [_2] owned by [_3].',$numsent,$settings{'description'}.' ('.$cnum.':gcitest)',$settings{'internal.courseowner'})."\n";
            $courseenv{'internal.autoreportmailsent'} = 1;
            my $putresult = &Apache::lonnet::put('environment',\%courseenv,'gcitest',$cnum);
            if ($putresult eq 'ok') {
                $output .= &mt('autoreportmailsent item set to [_1] for [_2].',$courseenv{'internal.autoreportmailsent'},$settings{'description'}.' ('.$cnum.':gcitest)')."\n\n";
            } else {
                $output .= &mt('An error - [_1] occurred storing autoreportmailsent in the course environment for [_2].',$putresult,$settings{'description'}.' ('.$cnum.':gcitest)')."\n\n";
            }
        }
    }
    delete($env{'user.domain'});
    if ($output) {
        if (open (my $fh,">>$logfile")) {
            print $fh "********************\n".localtime(time)." Autoreport messages start --\n".$output."-- ".localtime(time).' '.&mt('Autoreport messages end')."\n*******************\n\n";
            close($fh);
        }
    }

sub send_message {
    my ($owner,$cdesc,$cnum,$dom) = @_;
    my ($ownername,$ownerdom) = split(':',$owner);
    my $numsent = 0;
    if (($ownername =~ /^$match_username$/) &&
        ($ownerdom =~ /^$match_domain$/)) {
        $env{'form.can_reply'} = 'N';
        $env{'user.name'} = $ownername;
        $env{'user.domain'} = $ownerdom;
        $env{'user.home'} = &Apache::lonnet::homeserver($env{'user.name'},$env{'user.domain'});
        $env{'request.course.id'} = $dom.'_'.$cnum;
        my $subject = &mt('GCI Concept Test Report in [_1]',$cdesc);
        my $message = &mt('Aggregated test performance data are available from the Overall Statistics Page of your GCI Concept Test: [_1]:',$cdesc).'<br /><br />'."\n\n".
                      &mt('The following link will take you to the statistics page for the Concept Test: ').'<br /><br />'."\n\n".
                      'http://jefferson.lite.msu.edu/adm/login?username='.$ownername.'&symb=%2fadm%2fstatistics&role=cc.%2f'.$dom.'%2f'.$cnum."\n\n";
        my @recusers;
        my @recudoms;
        my %cc_hash = &Apache::lonnet::get_my_roles($cnum,$dom,'','',['cc']);
        my @to_notify;
        my $msgcc = {};
        foreach my $key (keys(%cc_hash)) {
            if ($key =~ /^($match_username:$match_domain):cc$/) {
                my $cc = $1;
                unless (grep(/^\Q$cc\E/,@to_notify)) {
                    push(@to_notify,$cc);
                }
            }
        }
        if (@to_notify) {
            foreach my $cc (@to_notify) {
                my ($ccname,$ccdom) = split(/:/,$cc);
                unless((grep(/^\Q$ccname\E$/,@recusers)) && (grep(/^\Q$ccdom\E$/,@recudoms))) {
                    push(@recusers,$ccname);
                    push(@recudoms,$ccdom);
                    $msgcc->{$ccname.':'.$ccdom}='';
                    $numsent ++;
                }
            }
        }
        if ($numsent) {
            my %reciphash = (
                             cc => $msgcc,
                            );
            my %sentmessage;
            my $stamp = time;
            my $msgcount = &Apache::lonmsg::get_uniq();
            &Apache::lonmsg::process_sent_mail($subject,'',$numsent,$stamp,$env{'user.name'},$env{'user.domain'},$msgcount,$cnum,$$,$message,\@recusers,\@recudoms);
            my ($recipid,$recipstatus) =
                &Apache::lonmsg::store_recipients($subject,
                    $env{'user.name'},$env{'user.domain'},\%reciphash);
            foreach my $recip (sort(keys(%{$msgcc}))) {
                my ($ccname,$ccdom) = split(/:/,$recip);
                my $status =
                    &Apache::lonmsg::user_normal_msg($ccname,$ccdom,$subject,$message,undef,undef,undef,1,\%sentmessage,undef,undef,undef,1,$recipid);
            }
            delete($env{'form.can_reply'});
        }
        delete($env{'user.name'});
        delete($env{'user.home'});
        delete($env{'request.course.id'});
    }
    return $numsent;
}