2 package Gruntmaster
::Data
;
4 # Created by DBIx::Class::Schema::Loader
5 # DO NOT MODIFY THE FIRST PART OF THIS FILE
10 use base
'DBIx::Class::Schema';
12 __PACKAGE__
->load_namespaces;
15 # Created by DBIx::Class::Schema::Loader v0.07039 @ 2014-03-05 13:11:39
16 # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:dAEmtAexvUaNXLgYz2rNEg
18 our $VERSION = '5999.000_007';
20 use Lingua
::EN
::Inflect qw
/PL_N/;
21 use JSON qw
/decode_json/;
22 use Sub
::Name qw
/subname/;
24 use constant PROBLEM_PUBLIC_COLUMNS
=> [qw
/id author writer level name owner private statement timeout olimit value/];
25 use constant USER_PUBLIC_COLUMNS
=> [qw
/id admin name town university level/];
26 use constant JOBS_PER_PAGE
=> 10;
29 our ($name, $sub) = @_;
31 *$name = subname
$name => $sub
35 for my $rs (qw
/contest contest_problem job open problem user/) {
36 my $rsname = ucfirst $rs;
37 $rsname =~ s/_([a-z])/\u$1/g;
38 dynsub PL_N
($rs) => sub { $_[0]->resultset($rsname) };
39 dynsub
$rs => sub { $_[0]->resultset($rsname)->find($_[1]) };
44 my $rs = $_[0]->users->search(undef, {order_by
=> 'name', columns
=> USER_PUBLIC_COLUMNS
});
45 [ map +{ $_->get_columns }, $rs->all ]
50 +{ $self->users->find($id, {columns
=> USER_PUBLIC_COLUMNS
})->get_columns }
54 my ($self, %args) = @_;
55 my $rs = $self->problems->search(undef, {order_by
=> 'me.name', columns
=> PROBLEM_PUBLIC_COLUMNS
, prefetch
=> 'owner'});
56 $rs = $rs->search({-or => ['contest_problems.contest' => undef, 'contest.stop' => {'<=', time}], 'me.private' => 0}, {join => {'contest_problems' => 'contest'}, distinct
=> 1}) unless $args{contest
};
57 $rs = $rs->search({'contest_problems.contest' => $args{contest
}}, {join => 'contest_problems'}) if $args{contest
};
58 $rs = $rs->search({'me.owner' => $args{owner
}}) if $args{owner
};
60 $params{contest
} = $args{contest
} if $args{contest
};
62 $params{$_->level} //= [];
63 push $params{$_->level}, {$_->get_columns, owner_name
=> $_->owner->name} ;
69 my ($self, $id, $contest, $user) = @_;
70 my $pb = $self->problems->find($id, {columns
=> PROBLEM_PUBLIC_COLUMNS
, prefetch
=> 'owner'});
71 my $running = $contest && $self->contest($contest)->is_running;
73 $self->opens->create({
80 +{ $pb->get_columns, owner_name
=> $pb->owner->name, cansubmit
=> $contest ?
$running : 1 }
84 my ($self, %args) = @_;
85 my $rs = $self->contests->search(undef, {order_by
=> {-desc
=> 'start'}, prefetch
=> 'owner'});
86 $rs = $rs->search({owner
=> $args{owner
}}) if $args{owner
};
89 my $state = $_->is_pending ?
'pending' : $_->is_running ?
'running' : 'finished';
90 $params{$state} //= [];
91 push $params{$state}, { $_->get_columns, started
=> !$_->is_pending, owner_name
=> $_->owner->name };
98 my $ct = $self->contest($id);
99 +{ $ct->get_columns, started
=> !$ct->is_pending, owner_name
=> $ct->owner->name }
103 my ($self, %args) = @_;
105 my $rs = $self->jobs->search(undef, {order_by
=> {-desc
=> 'me.id'}, prefetch
=> ['problem', 'owner'], rows
=> JOBS_PER_PAGE
, offset
=> ($args{page
} - 1) * JOBS_PER_PAGE
});
106 $rs = $rs->search({owner
=> $args{owner
}}) if $args{owner
};
107 $rs = $rs->search({contest
=> $args{contest
}}) if $args{contest
};
108 $rs = $rs->search({problem
=> $args{problem
}}) if $args{problem
};
110 my %params = $_->get_columns;
111 $params{owner_name
} = $_->owner->name;
112 $params{problem_name
} = $_->problem->name;
113 $params{results
} &&= decode_json
$params{results
};
114 $params{size
} = length $params{source
};
115 delete $params{source
};
121 my ($self, $id) = @_;
122 my $job = $self->jobs->find($id, {prefetch
=> ['problem', 'owner']});
123 my %params = $job->get_columns;
124 $params{owner_name
} = $job->owner->name;
125 $params{problem_name
} = $job->problem->name;
126 $params{results
} &&= decode_json
$params{results
};
127 $params{size
} = length $params{source
};
128 delete $params{source
};
140 Gruntmaster::Data - Gruntmaster 6000 Online Judge -- database interface and tools
144 my $db = Gruntmaster::Data->connect('dbi:Pg:');
146 my $problem = $db->problem('my_problem');
147 $problem->update({timeout => 2.5}); # Set time limit to 2.5 seconds
148 $problem->rerun; # And rerun all jobs for this problem
152 my $contest = $db->contests->create({ # Create a new contest
154 name => 'My Awesome Contest',
158 $db->contest_problems->create({ # Add a problem to the contest
159 contest => 'my_contest',
160 problem => 'my_problem',
163 say 'The contest has not started yet' if $contest->is_pending;
167 my @jobs = $db->jobs->search({contest => 'my_contest', owner => 'MGV'})->all;
168 $_->rerun for @jobs; # Rerun all jobs sent by MGV in my_contest
172 Gruntmaster::Data is the interface to the Gruntmaster 6000 database. Read the L<DBIx::Class> documentation for usage information.
174 In addition to the typical DBIx::Class::Schema methods, this module contains several convenience methods:
180 Equivalent to C<< $schema->resultset('Contest') >>
182 =item contest_problems
184 Equivalent to C<< $schema->resultset('ContestProblem') >>
188 Equivalent to C<< $schema->resultset('Job') >>
192 Equivalent to C<< $schema->resultset('Problem') >>
196 Equivalent to C<< $schema->resultset('User') >>
200 Equivalent to C<< $schema->resultset('Contest')->find($id) >>
204 Equivalent to C<< $schema->resultset('Job')->find($id) >>
208 Equivalent to C<< $schema->resultset('Problem')->find($id) >>
212 Equivalent to C<< $schema->resultset('User')->find($id) >>
216 Returns a list of users as an arrayref containing hashrefs.
218 =item user_entry($id)
220 Returns a hashref with information about the user $id.
222 =item problem_list([%args])
224 Returns a list of problems grouped by level. A hashref with levels as keys.
226 Takes the following arguments:
232 Only show problems owned by this user
236 Only show problems in this contest
240 =item problem_entry($id, [$contest, $user])
242 Returns a hashref with information about the problem $id. If $contest and $user are present, problem open data is updated.
244 =item contest_list([%args])
246 Returns a list of contests grouped by state. A hashref with the following keys:
252 An arrayref of hashrefs representing pending contests
256 An arrayref of hashrefs representing running contests
260 An arrayref of hashrefs representing finished contests
264 Takes the following arguments:
270 Only show contests owned by this user.
274 =item contest_entry($id)
276 Returns a hashref with information about the contest $id.
278 =item job_list([%args])
280 Returns a list of jobs as an arrayref containing hashrefs. Takes the following arguments:
286 Only show jobs submitted by this user.
290 Only show jobs submitted in this contest.
294 Only show jobs submitted for this problem.
298 Show this page of results. Defaults to 1. Pages have 10 entries, and the first page has the most recent jobs.
304 Returns a hashref with information about the job $id.
310 Marius Gavrilescu E<lt>marius@ieval.roE<gt>
312 =head1 COPYRIGHT AND LICENSE
314 Copyright (C) 2014 by Marius Gavrilescu
316 This library is free software; you can redistribute it and/or modify
317 it under the same terms as Perl itself, either Perl version 5.18.1 or,
318 at your option, any later version of Perl 5 you may have available.