diff --git a/process/files/intradata_get.pl b/process/files/intradata_get.pl index c76621a..8a48e91 100644 --- a/process/files/intradata_get.pl +++ b/process/files/intradata_get.pl @@ -6,15 +6,18 @@ use warnings; use Carp; use Pod::Usage; -use lib "../../"; - +use ACU::Config; use ACU::Log; use ACU::LDAP; use ACU::Grading; use ACU::Process; use ACU::Trace; -our $basedir = "/intradata"; +use intradata_get::defense; +use intradata_get::grades; +use intradata_get::project; + +our $intradata; my %actions = ( "defense" => { @@ -28,304 +31,12 @@ my %actions = ( "create" => \&update_project, "update" => \&update_project, "delete" => \&delete_project, + }, + "traces" => { + "update" => \&update_trace, } ); -sub create_tree($$) -{ - my $year = shift; - my $project_id = shift; - - if (! -d "$basedir/$year/") { - log ERROR, "No directory for year $year. Ask a root to create it."; - return "No directory for year $year. Ask a root to create it."; - } - - if (! -e "$basedir/$year/$project_id/") { - mkdir "$basedir/$year/$project_id/"; - } - - return 0; -} - - -sub grades_generate -{ - 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"; - } - - if (! -e "$basedir/$year/$project_id/grades/") { - mkdir "$basedir/$year/$project_id/grades/"; - } - - log DEBUG, "Generate list of students"; - - # Create list of students to generate - my @logins; - if ($args->{unamed}) - { - for (my $i = $args->{unamed}; $i > 0; $i--) { - push @logins, $args->{param}{$i}; - } - } - else - { - opendir(my $dh, "$basedir/$year/$project_id/traces/") or croak "can't opendir $basedir/$year/$project_id/traces/: $!"; - for my $dir (grep { ( ! /^\./ ) && -d "$basedir/$year/$project_id/traces/$_" } readdir($dh)) - { - opendir(my $dhm, "$basedir/$year/$project_id/traces/$dir") or croak "can't opendir $basedir/$year/$project_id/traces/$dir: $!"; - - for my $login (grep { ( ! /^\./ ) && -f "$basedir/$year/$project_id/traces/$dir/$_" } readdir($dhm)) - { - $login =~ s/\.xml$//; - if (! grep { /^\Q$login\E$/ } @logins) { - push @logins, $login; - } - } - - closedir $dhm; - } - closedir $dh; - } - - log TRACE, @logins; - - # Load grading file - my $grading; - if (exists $args->{files}{"grading.xml"}) { - $grading = $args->{files}{"grading.xml"}; - } - if (! $grading) { - log ERROR, "Invalid grading.xml received!"; - return "Invalid grading.xml received!"; - } - - $grading = Grading->new($grading); - - opendir(my $dh, "$basedir/$year/$project_id/traces/") or croak "can't opendir $basedir/$year/$project_id/traces/: $!"; - my @trace_dirs = grep { ( ! /^\./ ) && -d "$basedir/$year/$project_id/traces/$_" } readdir($dh); - closedir $dh; - - for my $login (@logins) - { - log DEBUG, "Generating grades for $login"; - for my $dir (@trace_dirs) - { - log DEBUG, "Generating grades from $dir"; - if (-f "$basedir/$year/$project_id/traces/$dir/$login.xml") - { - open my $xmltrace, "<", "$basedir/$year/$project_id/traces/$dir/$login.xml" or croak "traces/$dir/$login.xml: $!"; - binmode $xmltrace; - my $trace = Trace->new($xmltrace); - close $xmltrace; - - log DEBUG, "Fill from file: traces/$dir/$login.xml"; - log TRACE, $trace->getIds; - - $grading->fill($trace->getIds); - } - } - - log DEBUG, "Computed grades: ".$grading->compute($login); - - open my $xmlgrade, ">", "$basedir/$year/$project_id/grades/$login.xml" or croak "grades/$login.xml"; - binmode $xmlgrade; - print $xmlgrade $grading->computeXML($login); - close $xmlgrade; - - $grading->reset(); - } - - return "Ok"; -} - -sub grades_new_bonus -{ - my $args = shift; - - my $project_id = $args->{param}{id}; - my $delete = $args->{param}{delete}; - my $year = $args->{param}{year} // LDAP::get_year; - - if (! $project_id) { - log ERROR, "No project_id given."; - return "No project_id given"; - } - - if (! -e "$basedir/$year/$project_id/traces/") { - mkdir "$basedir/$year/$project_id/traces/"; - } - if (! -e "$basedir/$year/$project_id/traces/bonus/") { - mkdir "$basedir/$year/$project_id/traces/bonus/"; - } - - for my $kfile (keys %{ $args->{files} }) - { - log DEBUG, "Reading file $kfile"; - - my $kbonus = $kfile; - $kbonus =~ s/[^a-zA-Z0-9_-]/_/g; - - my @lines = split(/\n/, $args->{files}{$kfile}); - - log TRACE, $args->{files}{$kfile}; - log TRACE, @lines; - - my $value; - $value = 1 if (!$delete); - - # 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*([0-9.]+))?$/) - { - my $login = $1; - my $tvalue = $2 // $value; - my $trace; - - if ($delete) { - log DEBUG, "Deleting bonus for $login"; - } else { - log DEBUG, "Applying bonus for $login:$tvalue"; - } - - 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; - } - elsif ($delete) { - next; - } - else { - $trace = Trace->new(); - } - - if ($delete) { - if ($tvalue && $tvalue == $trace->getIds($kbonus)) { - $trace->delId($kbonus); - } else { - $trace->delId($kbonus); - } - } else { - $trace->addId($kbonus, $tvalue); - } - - log DEBUG, "Updating $basedir/$year/$project_id/traces/bonus/$login.xml"; - - 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"; -} - -sub update_defense -{ - 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 $defense_id = $args->{param}{defense_id}; - - if (! $defense_id) { - log ERROR, "No defense_id given."; - return "No defense_id given"; - } - - my $defense; - if (exists $args->{files}{"$defense_id.xml"}) { - $defense = $args->{files}{"$defense_id.xml"}; - } - if (! $defense) { - log ERROR, "Invalid $defense_id.xml received!"; - return "Invalid $defense_id.xml received!"; - } - - log INFO, "Update $year/$project_id/defenses/$defense_id.xml"; - - if (! -e "$basedir/$year/$project_id/defenses/") { - mkdir "$basedir/$year/$project_id/defenses/"; - } - if (! -e "$basedir/$year/$project_id/traces/") { - mkdir "$basedir/$year/$project_id/traces/"; - } - if (! -e "$basedir/$year/$project_id/traces/defense_$defense_id/") { - mkdir "$basedir/$year/$project_id/traces/defense_$defense_id/"; - my ($login, $pass, $uid, $gid) = getpwnam("www-data"); - chown $uid, $gid, "$basedir/$year/$project_id/traces/defense_$defense_id/"; - chmod 0775, "$basedir/$year/$project_id/traces/defense_$defense_id/"; - } - - open my $out, ">", "$basedir/$year/$project_id/defenses/$defense_id.xml"; - print $out $defense; - close $out; - - 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." -} sub process_get diff --git a/process/files/intradata_get/defense.pm b/process/files/intradata_get/defense.pm new file mode 100644 index 0000000..4f2e303 --- /dev/null +++ b/process/files/intradata_get/defense.pm @@ -0,0 +1,58 @@ +use v5.10.1; +use strict; +use warnings; +use Carp; + +use ACU::LDAP; + +sub update_defense +{ + 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 $defense_id = $args->{param}{defense_id}; + + if (! $defense_id) { + log ERROR, "No defense_id given."; + return "No defense_id given"; + } + + my $defense; + if (exists $args->{files}{"$defense_id.xml"}) { + $defense = $args->{files}{"$defense_id.xml"}; + } + if (! $defense) { + log ERROR, "Invalid $defense_id.xml received!"; + return "Invalid $defense_id.xml received!"; + } + + log INFO, "Update $year/$project_id/defenses/$defense_id.xml"; + + if (! -e "$main::intradata/$year/$project_id/defenses/") { + mkdir "$main::intradata/$year/$project_id/defenses/"; + } + if (! -e "$main::intradata/$year/$project_id/traces/") { + mkdir "$main::intradata/$year/$project_id/traces/"; + } + if (! -e "$main::intradata/$year/$project_id/traces/defense_$defense_id/") { + mkdir "$main::intradata/$year/$project_id/traces/defense_$defense_id/"; + my ($login, $pass, $uid, $gid) = getpwnam("www-data"); + chown $uid, $gid, "$main::intradata/$year/$project_id/traces/defense_$defense_id/"; + chmod 0775, "$main::intradata/$year/$project_id/traces/defense_$defense_id/"; + } + + open my $out, ">", "$main::intradata/$year/$project_id/defenses/$defense_id.xml"; + print $out $defense; + close $out; + + return "Ok"; +} + +1; diff --git a/process/files/intradata_get/grades.pm b/process/files/intradata_get/grades.pm new file mode 100644 index 0000000..8388072 --- /dev/null +++ b/process/files/intradata_get/grades.pm @@ -0,0 +1,203 @@ +use v5.10.1; +use strict; +use warnings; +use Carp; + +use ACU::Config; +use ACU::LDAP; +use ACU::Log; + +# Function to generate student grades +sub grades_generate +{ + 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"; + } + + if (! -e "$main::intradata/$year/$project_id/grades/") { + mkdir "$main::intradata/$year/$project_id/grades/"; + } + + log DEBUG, "Generate list of students"; + + # Create list of students to generate + my @logins; + if ($args->{unamed}) + { + for (my $i = $args->{unamed}; $i > 0; $i--) { + push @logins, $args->{param}{$i}; + } + } + else + { + opendir(my $dh, "$main::intradata/$year/$project_id/traces/") or croak "can't opendir $main::intradata/$year/$project_id/traces/: $!"; + for my $dir (grep { ( ! /^\./ ) && -d "$main::intradata/$year/$project_id/traces/$_" } readdir($dh)) + { + opendir(my $dhm, "$main::intradata/$year/$project_id/traces/$dir") or croak "can't opendir $main::intradata/$year/$project_id/traces/$dir: $!"; + + for my $login (grep { ( ! /^\./ ) && -f "$main::intradata/$year/$project_id/traces/$dir/$_" } readdir($dhm)) + { + $login =~ s/\.xml$//; + if (! grep { /^\Q$login\E$/ } @logins) { + push @logins, $login; + } + } + + closedir $dhm; + } + closedir $dh; + } + + log TRACE, @logins; + + # Load grading file + my $grading; + if (exists $args->{files}{"grading.xml"}) { + $grading = $args->{files}{"grading.xml"}; + } + if (! $grading) { + log ERROR, "Invalid grading.xml received!"; + return "Invalid grading.xml received!"; + } + + $grading = Grading->new($grading); + + opendir(my $dh, "$main::intradata/$year/$project_id/traces/") or croak "can't opendir $main::intradata/$year/$project_id/traces/: $!"; + my @trace_dirs = grep { ( ! /^\./ ) && -d "$main::intradata/$year/$project_id/traces/$_" } readdir($dh); + closedir $dh; + + for my $login (@logins) + { + log DEBUG, "Generating grades for $login"; + for my $dir (@trace_dirs) + { + log DEBUG, "Generating grades from $dir"; + if (-f "$main::intradata/$year/$project_id/traces/$dir/$login.xml") + { + open my $xmltrace, "<", "$main::intradata/$year/$project_id/traces/$dir/$login.xml" or croak "traces/$dir/$login.xml: $!"; + binmode $xmltrace; + my $trace = Trace->new($xmltrace); + close $xmltrace; + + log DEBUG, "Fill from file: traces/$dir/$login.xml"; + log TRACE, $trace->getIds; + + $grading->fill($trace->getIds); + } + } + + log DEBUG, "Computed grades: ".$grading->compute($login); + + open my $xmlgrade, ">", "$main::intradata/$year/$project_id/grades/$login.xml" or croak "grades/$login.xml"; + binmode $xmlgrade; + print $xmlgrade $grading->computeXML($login); + close $xmlgrade; + + $grading->reset(); + } + + return "Ok"; +} + + +sub grades_new_bonus +{ + my $args = shift; + + my $project_id = $args->{param}{id}; + my $delete = $args->{param}{delete}; + my $year = $args->{param}{year} // LDAP::get_year; + + if (! $project_id) { + log ERROR, "No project_id given."; + return "No project_id given"; + } + + if (! -e "$main::intradata/$year/$project_id/traces/") { + mkdir "$main::intradata/$year/$project_id/traces/"; + } + if (! -e "$main::intradata/$year/$project_id/traces/bonus/") { + mkdir "$main::intradata/$year/$project_id/traces/bonus/"; + } + + for my $kfile (keys %{ $args->{files} }) + { + log DEBUG, "Reading file $kfile"; + + my $kbonus = $kfile; + $kbonus =~ s/[^a-zA-Z0-9_-]/_/g; + + my @lines = split(/\n/, $args->{files}{$kfile}); + + log TRACE, $args->{files}{$kfile}; + log TRACE, @lines; + + my $value; + $value = 1 if (!$delete); + + # 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*([0-9.]+))?$/) + { + my $login = $1; + my $tvalue = $2 // $value; + my $trace; + + if ($delete) { + log DEBUG, "Deleting bonus for $login"; + } else { + log DEBUG, "Applying bonus for $login:$tvalue"; + } + + if (-e "$main::intradata/$year/$project_id/traces/bonus/$login.xml") { + open my $xml, "<", "$main::intradata/$year/$project_id/traces/bonus/$login.xml" or croak $!; + binmode $xml; + $trace = Trace->new($xml); + close $xml; + } + elsif ($delete) { + next; + } + else { + $trace = Trace->new(); + } + + if ($delete) { + if ($tvalue && $tvalue == $trace->getIds($kbonus)) { + $trace->delId($kbonus); + } else { + $trace->delId($kbonus); + } + } else { + $trace->addId($kbonus, $tvalue); + } + + log DEBUG, "Updating $main::intradata/$year/$project_id/traces/bonus/$login.xml"; + + open my $xml, ">", "$main::intradata/$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"; +} + +1; diff --git a/process/files/intradata_get/project.pm b/process/files/intradata_get/project.pm new file mode 100644 index 0000000..bec2e58 --- /dev/null +++ b/process/files/intradata_get/project.pm @@ -0,0 +1,65 @@ +use v5.10.1; +use strict; +use warnings; +use Carp; + +use ACU::Config; +use ACU::LDAP; +use ACU::Log; + +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, ">", "$main::intradata/$year/$project_id/butler.xml"; + print $out $butler; + close $out; + + return "Ok"; +} + + +sub delete_project +{ + log WARN, "delete_project: not implemented." +} + + +sub create_tree($$) +{ + my $year = shift; + my $project_id = shift; + + if (! -d "$main::intradata/$year/") + { + log ERROR, "No directory for year $year. Ask a root to create it."; + return "No directory for year $year. Ask a root to create it."; + } + + mkdir "$main::intradata/$year/$project_id/" if (! -e "$main::intradata/$year/$project_id/"); + + return 0; +} + +1;