From: Bjørn Rustad Date: Mon, 12 Aug 2013 19:07:00 +0000 (+0200) Subject: Improved line/result/points support X-Git-Url: http://git.rustad.me/?a=commitdiff_plain;h=a19c944048eabdaf75978f8140f51065007406f2;p=duplo Improved line/result/points support --- diff --git a/duplo.sql b/duplo.sql index b184577..969c4af 100644 --- a/duplo.sql +++ b/duplo.sql @@ -53,7 +53,8 @@ CREATE TABLE line ( stage INTEGER REFERENCES stage, "type" line_type, name VARCHAR(64), - length REAL + length REAL, + category INTEGER, -- only one FINISH per stage ); @@ -67,7 +68,6 @@ CREATE TABLE rider_line ( line INTEGER REFERENCES line, "number" INTEGER NOT NULL, time INTERVAL, - category INTEGER, UNIQUE (rider, line) ); @@ -123,7 +123,7 @@ CREATE TABLE rider_stage ( -- 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 ( diff --git a/lib/Duplo.pm b/lib/Duplo.pm index 5303e08..a10f1dc 100644 --- a/lib/Duplo.pm +++ b/lib/Duplo.pm @@ -145,10 +145,10 @@ sub startup { ->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') @@ -211,6 +211,16 @@ sub startup { ->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('/') diff --git a/lib/Duplo/Race.pm b/lib/Duplo/Race.pm index 58158f5..ba6f615 100644 --- a/lib/Duplo/Race.pm +++ b/lib/Duplo/Race.pm @@ -161,7 +161,7 @@ sub director_race { ); } -sub rider_race { +sub rider { my $self = shift; my $dbh = $self->db(); my $race = $self->param('race'); diff --git a/lib/Duplo/Results.pm b/lib/Duplo/Results.pm index 28d9bf2..42df6f9 100644 --- a/lib/Duplo/Results.pm +++ b/lib/Duplo/Results.pm @@ -45,25 +45,24 @@ sub cdb_getlist { $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", }; }); @@ -189,10 +188,57 @@ sub import { 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; diff --git a/lib/Duplo/Stage.pm b/lib/Duplo/Stage.pm index c0a92d9..5993058 100644 --- a/lib/Duplo/Stage.pm +++ b/lib/Duplo/Stage.pm @@ -70,9 +70,62 @@ sub stage { 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, ); } diff --git a/templates/race/race.html.ep b/templates/race/race.html.ep index 462a8da..73fcfe9 100644 --- a/templates/race/race.html.ep +++ b/templates/race/race.html.ep @@ -140,7 +140,7 @@ $('.chosen-select').chosen(); - $(".rider_race_form").submit(function () { + $(".rider_race_form").submit(function () { $.post( '<%== url_for 'rider_race' %>', $(this).serialize(), @@ -148,7 +148,7 @@ alert(data) } ); - return false; - }); + return false; + }); }); diff --git a/templates/stage/stage.html.ep b/templates/stage/stage.html.ep index 95eb25c..11b81e3 100644 --- a/templates/stage/stage.html.ep +++ b/templates/stage/stage.html.ep @@ -20,7 +20,7 @@ -

Results

+

Stage results

% for my $rider (@{ $results }) { @@ -31,3 +31,85 @@ % }
+% if ($is_admin) { +

Import

+

Note: this will remove all finish line results that already exists for this stage.

+
+ + + + +
+% } + +

Intermediate results

+% for my $line (@{ $lines }) { +

<%= $line->{'type'} %> – <%= $line->{'name'} %>

+ +% my $num = 1; +% for my $rider (@{ $line->{'results'} }) { + + + + +% $num = $rider->{'number'} + 1; +% } +
<%= $rider->{'number'} %><%= $rider->{'name'} %>
+% if ($is_admin) { +
+ + + + +
+% } +% } + +% if ($is_admin) { +
+ + + + + +
+% } + + + +% if ($is_admin) { +
+ + + +
+% } +