]> git.rustad.me Git - duplo/commitdiff
Improved line/result/points support
authorBjørn Rustad <rustadbjornen@gmail.com>
Mon, 12 Aug 2013 19:07:00 +0000 (21:07 +0200)
committerBjørn Rustad <rustadbjornen@gmail.com>
Mon, 12 Aug 2013 19:07:00 +0000 (21:07 +0200)
duplo.sql
lib/Duplo.pm
lib/Duplo/Race.pm
lib/Duplo/Results.pm
lib/Duplo/Stage.pm
templates/race/race.html.ep
templates/stage/stage.html.ep

index b18457725dca8e470f9248884317340b625f4614..969c4af1c7cb5562e89e39f2d62ad3cab6c4b694 100644 (file)
--- 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 (
index 5303e0891b68d2f1bf9b2ce7a558ec4a8f0cb322..a10f1dc38b1e9fd197ff6d1e133f1c8a17865e07 100644 (file)
@@ -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('/')
index 58158f53378ed59bceb5cb8710f2ac61cc27150d..ba6f615b3a9ed49fdc68d0a35b6a5672f24db025 100644 (file)
@@ -161,7 +161,7 @@ sub director_race {
        );
 }
 
-sub rider_race {
+sub rider {
        my $self   = shift;
        my $dbh    = $self->db();
        my $race   = $self->param('race');
index 28d9bf23df13bbba6ba695a00f071d159bfbb218..42df6f9bc60eda26bab1a7bf24ed17d4f59cd7e2 100644 (file)
@@ -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;
index c0a92d97492c9fd35e74905bcc4e362a5cf2fca3..5993058dffb91fd88f4d9b9927b4bf7fb3cce546 100644 (file)
@@ -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,
        );
 }
 
index 462a8dac361491eef6d8451b447bf74607e76da3..73fcfe97fa6b1c322bbc22a66e6a284d1d428c47 100644 (file)
 
     $('.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>
index 95eb25c66a55e249ec032995387baf8124fdd2b4..11b81e309f31bac0500d3fbcf9b4dd22016c5072 100644 (file)
@@ -20,7 +20,7 @@
   </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>
+% }
+