stage INTEGER REFERENCES stage,
"type" line_type,
name VARCHAR(64),
- length REAL
+ length REAL,
+ category INTEGER,
-- only one FINISH per stage
);
line INTEGER REFERENCES line,
"number" INTEGER NOT NULL,
time INTERVAL,
- category INTEGER,
UNIQUE (rider, line)
);
-- check that rider is in race
);
-GRANT SELECT, UPDATE, INSERT, DELETE ON rider_race TO duplo;
+GRANT SELECT, UPDATE, INSERT, DELETE ON rider_stage TO duplo;
-- Bare for poengene...
CREATE TABLE director_stage (
->via('post')
->to('results#import');
- $adm->route('/rider_race')
+ $adm->route('/race/rider')
->name('rider_race')
->via('post')
- ->to('race#rider_race');
+ ->to('race#rider');
$adm->route('/director_race')
->name('director_race')
->via('post')
->to('line#new_line');
+ $adm->route('/line/rider')
+ ->name('rider_line')
+ ->via('post')
+ ->to('line#rider');
+
+ $adm->route('/calculate')
+ ->name('points_calculate')
+ ->via('post')
+ ->to('points#calculate');
+
my $line = $in->route('/line/:line', line => qr/\d+/);
$line->route('/')
);
}
-sub rider_race {
+sub rider {
my $self = shift;
my $dbh = $self->db();
my $race = $self->param('race');
$pos += 0;
+ my $name = decode('UTF-8', $tr->td->[2]->a->text);
my $team = decode('UTF-8', $tr->td->[3]->a->text);
my $time = decode('UTF-8', $tr->td->[4]->text);
my ($rider_id) = $tr->td->[2]->a->{'href'}
=~ /\/rider\/[^\/]*\/(\d+)/;
- my $name = cdb_getname($rider_id);
-
my ($team_id) = $tr->td->[3]->a->{'href'}
=~ /\/team\/[^\/]*\/(\d+)/;
push @list, {
- dnf => $dnf,
- pos => $pos,
- name => $name,
- team => $team,
+ dnf => $dnf,
+ pos => $pos,
+ name => $name,
+ team => $team,
rider_id => $rider_id,
- team_id => $team_id,
- time => $time,
+ team_id => $team_id,
+ time => $time . ".000",
};
});
my @list = cdb_getlist($self, $url);
+ $dbh->do("
+ INSERT INTO
+ line (stage, \"type\", name)
+ SELECT ?, ?, ?
+ WHERE NOT EXISTS (
+ SELECT 1 FROM line
+ WHERE stage = ?
+ AND \"type\" = 'FINISH'
+ )
+ ", undef, $stage, 'FINISH', 'Finish', $stage);
+
+ my ($line) = $dbh->selectrow_array("
+ SELECT
+ line
+ FROM
+ line
+ WHERE
+ stage = ?
+ AND
+ \"type\" = 'FINISH'
+ ", undef, $stage);
+
+ $dbh->do("
+ DELETE FROM
+ rider_line
+ WHERE
+ line = ?
+ ", undef, $line);
+
+ #FIXME: Should complain if rider is not found
+
my $sth = $dbh->prepare("
INSERT INTO
- rider_line (
+ rider_line (rider, line, \"number\", time)
+ SELECT rider, ?, ?, ?
+ FROM
+ rider
+ WHERE
+ rider.name = ?
");
+
+ for my $rider (@list) {
+ $sth->execute(
+ $line,
+ $rider->{'pos'},
+ $rider->{'time'},
+ $rider->{'name'}
+ ) unless $rider->{'dnf'};
+ }
+
+ return $self->redirect_to('stage', stage => $stage);
}
1;
l.stage = ?
", { Slice => {} }, $stage);
+ my $lines_ref = $dbh->selectall_arrayref("
+ SELECT
+ line,
+ name,
+ type
+ FROM
+ line
+ WHERE
+ stage = ?
+ AND
+ \"type\" <> 'FINISH'
+ ORDER BY
+ length
+ ASC
+ ", { Slice => {} }, $stage);
+
+ my $sth = $dbh->prepare("
+ SELECT
+ r.rider,
+ r.name,
+ rl.\"number\",
+ rl.time
+ FROM
+ rider_line AS rl
+ JOIN
+ line AS l
+ ON (rl.line = l.line)
+ JOIN
+ rider AS r
+ ON (rl.rider = r.rider)
+ JOIN
+ stage AS s
+ ON (l.stage = s.stage)
+ WHERE
+ l.line = ?
+ ");
+
+ for my $line (@{ $lines_ref }) {
+ $line->{'results'} = $dbh->selectall_arrayref(
+ $sth, { Slice => {} }, $line->{'line'}
+ );
+ }
+
+ my $riders_ref = $dbh->selectall_arrayref("
+ SELECT
+ rider,
+ name
+ FROM
+ rider
+ ", { Slice => {} });
+
return $self->render(
stage => $stage_ref,
results => $results_ref,
+ lines => $lines_ref,
+ riders => $riders_ref,
);
}
$('.chosen-select').chosen();
- $(".rider_race_form").submit(function () {
+ $(".rider_race_form").submit(function () {
$.post(
'<%== url_for 'rider_race' %>',
$(this).serialize(),
alert(data)
}
);
- return false;
- });
+ return false;
+ });
});
</script>
</dt>
</dl>
-<h3>Results</h3>
+<h3>Stage results</h3>
<table class="table table-condensed">
% for my $rider (@{ $results }) {
<tr>
% }
</table>
+% if ($is_admin) {
+<h4>Import</h4>
+<p>Note: this will remove all finish line results that already exists for this stage.</p>
+<form class="form-inline" action="<%== url_for 'results_import' %>" method="post">
+ <input type="hidden" name="stage" value="<%= $stage->{'stage'} %>" />
+ <label for="url">URL:</label><input type="text" name="url" />
+ <label for="after_restday">After restday:</label><input type="checkbox" name="after_restday" value="1" />
+ <input type="submit" value="Import" />
+</form>
+% }
+
+<h3>Intermediate results</h3>
+% for my $line (@{ $lines }) {
+<h4><%= $line->{'type'} %> – <%= $line->{'name'} %></h4>
+<table class="table table-condensed">
+% my $num = 1;
+% for my $rider (@{ $line->{'results'} }) {
+<tr>
+ <td><%= $rider->{'number'} %></td>
+ <td><%= $rider->{'name'} %></td>
+</tr>
+% $num = $rider->{'number'} + 1;
+% }
+</table>
+% if ($is_admin) {
+<form class="form-inline rider_line_form" action="<%== url_for 'rider_line' %>" method="post">
+ <input type="hidden" name="number" value="<%= $num %>" />
+ <input type="hidden" name="line" value="<%= $line->{'line'} %>" />
+ <select name="rider" class="chosen-select" data-placeholder="Rider">
+ % for my $rider (@{ $riders }) {
+ <option value="<%= $rider->{'rider'} %>"><%= $rider->{'name'} %></option>
+ % }
+ </select>
+ <input type="submit" value="Add" />
+</form>
+% }
+% }
+
+% if ($is_admin) {
+<form class="form-inline" action="<%== url_for 'line_new' %>" method="post">
+ <input type="hidden" name="stage" value="<%= $stage->{'stage'} %>" />
+ <label for="name">Name:</label><input type="text" name="name" />
+ <select name="type">
+ <option value="" disabled selected>Line type</option>
+ <option value="FINISH">Finish</option>
+ <option value="SPRINT">Sprint</option>
+ <option value="MOUNTAIN">Mountain</option>
+ </select>
+ <label for="length">Length:</label><input type="text" name="length" />
+ <input type="submit" value="Create" />
+</form>
+% }
+
+<script type="text/javascript">
+ $(document).ready(function() {
+ $(".rider_line_form").submit(function () {
+ var that = this;
+ $.post(
+ '<%== url_for 'rider_line' %>',
+ $(this).serialize(),
+ function(data) {
+ alert(data);
+ $(that).children("input[type='hidden'][name='number']").val(
+ function(index, value) { return + value + 1; }
+ );
+ }
+ );
+ return false;
+ });
+
+ $('.chosen-select').chosen();
+ });
+</script>
+
+% if ($is_admin) {
+<form class="form-inline" action="<%== url_for 'points_calculate' %>" method="post">
+ <input type="hidden" name="stage" value="<%= $stage->{'stage'} %>" />
+ <label for="after_restday">After restday:</label><input type="checkbox" name="after_restday" value="1" />
+ <input type="submit" value="Calculate points" />
+</form>
+% }
+