diff --git a/ACU/Trace.pm b/ACU/Trace.pm index aaa4189..5516bcb 100644 --- a/ACU/Trace.pm +++ b/ACU/Trace.pm @@ -11,7 +11,7 @@ use open qw(:encoding(UTF-8) :std); use XML::LibXML; use XML::SAX::ParserFactory; -sub new ($$) +sub new { my $class = shift; my $self = { @@ -22,7 +22,9 @@ sub new ($$) }; bless $self, $class; - $self->_initialize(@_); + if ($#_ >= 0) { + $self->_initialize(@_); + } return $self; } @@ -104,6 +106,44 @@ sub getIds ($) return %{ $self->{ids} }; } +sub addId($$;$) +{ + my $self = shift; + my $key = shift; + my $value = shift // 1; + + $self->{ids}{$key} = $value; +} + +sub toString ($;$) +{ + my $self = shift; + my $main_grp = shift // "bonus_malus"; + + my $doc = XML::LibXML::Document->new('1.0'); + + my $root = $doc->createElement("trace"); + + my $group = $doc->createElement("group"); + $group->addChild( $doc->createAttribute("id", $main_grp) ); + + for my $k (keys %{ $self->{ids} }) { + my $e = $doc->createElement("eval"); + my $v = $doc->createElement("value"); + + $e->addChild( $doc->createAttribute("id", $k) ); + $v->appendText( $self->{ids}{$k} ); + + $e->appendChild( $v ); + $group->appendChild( $e ); + } + + $root->appendChild( $group ); + $doc->setDocumentElement( $root ); + + return $doc->toString(); +} + package TraceHandler; @@ -162,7 +202,7 @@ sub start_element } else { $self->{inValue} = NO_ID_VALUE; } - + $self->{values} = ""; } elsif ($element->{Name} ne "group" && $element->{Name} ne "name" && $element->{Name} ne "statut" && $element->{Name} ne "status" && $element->{Name} ne "log") { diff --git a/process/files/intradata_get.pl b/process/files/intradata_get.pl index 86a5636..603b9ee 100644 --- a/process/files/intradata_get.pl +++ b/process/files/intradata_get.pl @@ -14,13 +14,16 @@ use ACU::Process; our $basedir = "/intradata"; my %actions = ( + "defense" => { + "update" => \&update_defense, + }, + "grades" => { + "new_bonus" => \&grades_new_bonus, + }, "project" => { "create" => \&update_project, "update" => \&update_project, "delete" => \&delete_project, - }, - "defense" => { - "update" => \&update_defense, } ); @@ -42,7 +45,7 @@ sub create_tree($$) } -sub update_project +sub grades_new_bonus { my $args = shift; @@ -54,22 +57,57 @@ sub update_project return "No project_id given"; } - my $butler; - if (exists $args->{files}{"butler.xml"}) { - $butler = $args->{files}{"butler.xml"}; + if (! -e "$basedir/$year/$project_id/traces/") { + mkdir "$basedir/$year/$project_id/traces/"; } - if (! $butler) { - log ERROR, "Invalid butler.xml received!"; - return "Invalid butler.xml received!"; + if (! -e "$basedir/$year/$project_id/traces/bonus/") { + mkdir "$basedir/$year/$project_id/traces/bonus/"; } - log INFO, "Update $year/$project_id/butler.xml"; + for my $kfile (keys %{ $args->{files} }) + { + my $kbonus = $kfile; + $kbonus =~ s/[^a-zA-Z0-9_-]/_/g; - return $_ if (create_tree($year, $project_id)); + my @lines = ($args->{files}{$kfile} =~ tr/\n//); - open my $out, ">", "$basedir/$year/$project_id/butler.xml"; - print $out $butler; - close $out; + my $value = 1; + # Looking for a global value + if ($lines[0] =~ /^\d+$/) { + $value = $1; + log INFO, "Setting global value to $value"; + shift @lines; + } + + for my $line (@lines) + { + if ($line =~ /^([a-z0-9_-]+)(?:\s*:\s*(\d+))?$/) + { + my $login = $1; + my $tvalue = $2 // $value; + my $trace; + + if (-e "$basedir/$year/$project_id/traces/bonus/$login.xml") { + open my $xml, "<", "$basedir/$year/$project_id/traces/bonus/$login.xml" or croak $!; + binmode $xml; + $trace = Trace->new($xml); + close $xml; + } + else { + $trace = Trace->new(); + } + + $trace->addId($kbonus, $tvalue); + + open my $xml, ">", "$basedir/$year/$project_id/traces/bonus/$login.xml" or croak $!; + print $xml $trace->toString(); + close $xml + } + else { + log WARN, "Invalid login $line, line skiped"; + } + } + } return "Ok"; } @@ -124,6 +162,38 @@ sub update_defense return "Ok"; } +sub update_project +{ + my $args = shift; + + my $project_id = $args->{param}{id}; + my $year = $args->{param}{year} // LDAP::get_year; + + if (! $project_id) { + log ERROR, "No project_id given."; + return "No project_id given"; + } + + my $butler; + if (exists $args->{files}{"butler.xml"}) { + $butler = $args->{files}{"butler.xml"}; + } + if (! $butler) { + log ERROR, "Invalid butler.xml received!"; + return "Invalid butler.xml received!"; + } + + log INFO, "Update $year/$project_id/butler.xml"; + + return $_ if (create_tree($year, $project_id)); + + open my $out, ">", "$basedir/$year/$project_id/butler.xml"; + print $out $butler; + close $out; + + return "Ok"; +} + sub delete_project { log WARN, "delete_project: not implemented."