The text below should be placed in a file on the course account; for example, in the test suite's provided
folder in a file called a0_require
.
#!/usr/bin/env perl use strict; use warnings; require '/u/isg/bin/perl/TermCode.pm'; use constant LOGGED_ASSIGN => 'a00'; use constant ERRCODE => 51; use constant REJMSG => 'Assignment ' . LOGGED_ASSIGN . ' has not yet received full public test marks.'; # Secret hack sauce. # These values must come from RST, as BitterSuite doesn't know them. # Generally we try to avoid reaching outside of a BitterSuite context... # mais, c'est la vie. my $course = $ENV{'course'}; my $student = $ENV{'student'}; # It's unfortunate that Perl doesn't just accept TermCode::FMT_REGISTRAR; # it is much cleaner, less prone to breaking, etc... #my $term = TermCode::current_termcode(TermCode::FMT_REGISTRAR); my $term = TermCode::current_termcode(2); my $pubtestlog = "/u/$course/course/publictests/" . $term . '/' . LOGGED_ASSIGN . '.completedrun.log'; my $passed = 0; if ( -e $pubtestlog) { open( PTL, $pubtestlog ) or print "Cannot open log: $!\n" and exit ERRCODE; while(my $pubtestline = <PTL>) { # If this student has a perfect mark recorded, then the requirement # has been met; terminate the loop # NOTE: As we know the value of $student will not change for the # lifetime of this program, we set this regex to compile only once. if ($pubtestline =~ /^\s*\d+\s*${student}\s*\S*\s*([0-9.]+)\s*\/\s*([0-9.]+)\s*$/o) { if ($1 == $2) { $passed = 1; last; } } } close( PTL ); } # unless the student passed the required assignment, reject all # submission attempts unless ($passed) { print REJMSG . "\n"; exit ERRCODE; } exit 0;
Then the following options should be active:
(language filter) (test-action submit-style-filter) (external-cmd "a0_require")
This will reject all files submitted by the user unless it finds the user has obtained a perfect mark on an assignment called a00.