From 8eb6b143a1ed8212a8e16420a03bb4a185f358ec Mon Sep 17 00:00:00 2001 From: Mercier Pierre-Olivier Date: Wed, 2 Oct 2013 18:26:01 +0200 Subject: [PATCH] New process: get_csv to get grades --- process/launch.sh | 1 + process/projects/gen_grading.pl | 2 +- process/projects/get_csv.pl | 93 +++++++++++++++++++++++++++++++++ 3 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 process/projects/get_csv.pl diff --git a/process/launch.sh b/process/launch.sh index 96c1838..bd98c91 100755 --- a/process/launch.sh +++ b/process/launch.sh @@ -79,6 +79,7 @@ then noyce) launch_screen "lerdorf_process_files_intradata_get" "while true; do $PERL ~/liblerdorf/process/files/intradata_get.pl; done" launch_screen "lerdorf_process_projects_gen_grading" "while true; do $PERL ~/liblerdorf/process/projects/gen_grading.pl; done" + launch_screen "lerdorf_process_projects_get_csv" "while true; do $PERL ~/liblerdorf/process/projects/get_csv.pl; done" ;; ksh) diff --git a/process/projects/gen_grading.pl b/process/projects/gen_grading.pl index 61b8f33..dacdaeb 100644 --- a/process/projects/gen_grading.pl +++ b/process/projects/gen_grading.pl @@ -30,7 +30,7 @@ sub process if (! -d "$basedir/$year/$project_id") { log ERROR, "Unable to find $project_id in $year"; - return "Unable to find $project_id in $year"; + return "Unable to find $project_id in $year\n"; } my $grade = Grading->new(); diff --git a/process/projects/get_csv.pl b/process/projects/get_csv.pl new file mode 100644 index 0000000..29a4311 --- /dev/null +++ b/process/projects/get_csv.pl @@ -0,0 +1,93 @@ +#! /usr/bin/env perl + +use v5.10.1; +use strict; +use warnings; +use Carp; +use Pod::Usage; +use Text::ParseWords; +use XML::LibXML; + +use ACU::Log; +use ACU::LDAP; +use ACU::Process; + +our $basedir = "/intradata"; + +sub process +{ + my $given_args = shift; + my @args = shellwords(${ shift() }); + + my $project_id = shift @args; + my $year = shift @args // LDAP::get_year; + + # Project existing? + if (! -d "$basedir/$year/$project_id") + { + log ERROR, "Unable to find $project_id in $year"; + return "Unable to find $project_id in $year\n"; + } + + my %grades; + my @headers; + + opendir(my $dh, "$basedir/$year/$project_id/grades/") or croak "can't opendir $basedir/$year/$project_id/grades/: $!"; + for my $gfile (grep { ( ! /^\./ ) && -f "$basedir/$year/$project_id/grades/$_" } readdir($dh)) + { + my $login; + ($login = $gfile) =~ s/\.xml$//; + + open my $xml, "<", "$basedir/$year/$project_id/grades/$gfile" or die $!; + binmode $xml; + my $dom = XML::LibXML->load_xml(IO => $xml); + close $xml; + + my @ugrades = @headers; + for my $grade ($dom->documentElement()->getElementsByTagName("grade")) + { + my $i; + for ($i = 0; $i <= $#ugrades; $i++) + { + if ($ugrades[$i] == $grade->getAttribute("name")) + { + $ugrades[$i] = $grade->getAttribute("value"); + last; + } + } + + if ($i > $#ugrades) + { + push @headers, $grade->getAttribute("name"); + push @ugrades, $grade->getAttribute("value"); + } + } + + $grades{$login} = \@ugrades; + } + closedir $dh; + + # Print CSV + my $out = "login"; + + for my $header (@headers) { + $out .= ",$header"; + } + $out .= "\n"; + + for my $login (keys %grades) { + $out .= "$login"; + my @ugrades = \$grades{$login}; + for my $header (@headers) + { + my $g = shift @ugrades; + $out .= $g if ($g && $g ne $header); + $out .= ","; + } + $out .= "\n"; + } + + return $out; +} + +Process::register_no_parse("get_csv", \&process);