]> git.rustad.me Git - duplo/commitdiff
Director improvements
authorBjørn Rustad <rustadbjornen@gmail.com>
Fri, 9 Aug 2013 23:50:53 +0000 (01:50 +0200)
committerBjørn Rustad <rustadbjornen@gmail.com>
Fri, 9 Aug 2013 23:50:53 +0000 (01:50 +0200)
12 files changed:
duplo.sql
lib/Duplo.pm
lib/Duplo/Manager.pm
lib/Duplo/Race.pm
lib/Duplo/Results.pm
lib/Duplo/Rider.pm
lib/Duplo/Stage.pm
templates/layouts/default.html.ep
templates/manager/edit_form.html.ep
templates/manager/team.html.ep
templates/race/race.html.ep
templates/results/import_form.html.ep

index 6859d16c4fcef4ae3fca5664b6601935e5bcbf19..b18457725dca8e470f9248884317340b625f4614 100644 (file)
--- a/duplo.sql
+++ b/duplo.sql
@@ -137,6 +137,16 @@ CREATE TABLE director_stage (
 
 GRANT SELECT, UPDATE, INSERT, DELETE ON director_stage TO duplo;
 
+CREATE TABLE director_race (
+       director INTEGER REFERENCES team,
+       race INTEGER REFERENCES race,
+       price INTEGER,
+
+       UNIQUE (director, race)
+);
+
+GRANT SELECT, UPDATE, INSERT, DELETE ON director_race TO duplo;
+
 CREATE EXTENSION pgcrypto;
 
 CREATE TABLE "user" (
index d05b4589b8474216e3041ad23d492834767365d4..5303e0891b68d2f1bf9b2ce7a558ec4a8f0cb322 100644 (file)
@@ -115,16 +115,6 @@ sub startup {
                ->via('get')
                ->to('rider#list');
 
-       $adm->route('/riders/import')
-               ->name('riders_import_form')
-               ->via('get')
-               ->to('rider#import_form');
-
-       $adm->route('/riders/import')
-               ->name('riders_import')
-               ->via('post')
-               ->to('rider#import');
-
        $adm->route('/results/import')
                ->name('results_import_form')
                ->via('get')
@@ -135,6 +125,11 @@ sub startup {
                ->via('post')
                ->to('results#team_import');
 
+       $adm->route('/results/rider_list_import')
+               ->name('results_rider_list_import')
+               ->via('post')
+               ->to('results#rider_list_import');
+
        $adm->route('/results/rider_import')
                ->name('results_rider_import')
                ->via('post')
@@ -155,11 +150,21 @@ sub startup {
                ->via('post')
                ->to('race#rider_race');
 
-       my $rider = $in->route('/rider/:rider', rider => qr/\d+/);
+       $adm->route('/director_race')
+               ->name('director_race')
+               ->via('post')
+               ->to('race#director_race');
+
+       $adm->route('/rider')
+               ->name('rider_new')
+               ->via('post')
+               ->to('rider#new_rider');
+
+       my $rider = $adm->route('/rider/:rider', rider => qr/\d+/);
 
        $rider->route('/')
                ->name('rider')
-               ->via('get', 'post')
+               ->via('get')
                ->to('rider#rider');
 
        $rider->route('/edit')
@@ -167,7 +172,7 @@ sub startup {
                ->via('get')
                ->to('rider#edit_form');
 
-       $rider->route('/edit')
+       $rider->route('/')
                ->name('rider_edit')
                ->via('post')
                ->to('rider#edit');
@@ -177,6 +182,11 @@ sub startup {
                ->via('get')
                ->to('race#list');
 
+       $adm->route('/race')
+               ->name('race_new')
+               ->via('post')
+               ->to('race#new_race');
+
        my $race = $in->route('/race/:race', race => qr/\d+/);
 
        $race->route('/')
@@ -184,15 +194,10 @@ sub startup {
                ->via('get')
                ->to('race#race');
 
-       $race->route('/riders')
-               ->name('race_riders')
-               ->via('get')
-               ->to('race#riders');
-
-       $race->route('/stage')
-               ->name('stage_post')
+       $adm->route('/stage')
+               ->name('stage_new')
                ->via('post')
-               ->to('stage#post');
+               ->to('stage#new_stage');
 
        my $stage = $in->route('/stage/:stage', stage => qr/\d+/);
 
@@ -201,6 +206,11 @@ sub startup {
                ->via('get')
                ->to('stage#stage');
 
+       $adm->route('/line')
+               ->name('line_new')
+               ->via('post')
+               ->to('line#new_line');
+
        my $line = $in->route('/line/:line', line => qr/\d+/);
 
        $line->route('/')
@@ -213,7 +223,7 @@ sub startup {
                ->via('get')
                ->to('manager#new_team_form');
 
-       $race->route('/team/new')
+       $race->route('/team')
                ->name('manager_new')
                ->via('post')
                ->to('manager#new_team');
@@ -231,7 +241,7 @@ sub startup {
                ->via('get')
                ->to('manager#edit_form');
 
-       $team->route('/edit')
+       $team->route('/')
                ->name('manager_edit')
                ->via('post')
                ->to('manager#edit');
index 00326691670b591d6d17389aa5821c7181207b01..35cb3bbf7a56a8ad9cb9372eede8c6538f36c06f 100644 (file)
@@ -2,6 +2,29 @@ package Duplo::Manager;
 use Mojo::Base 'Mojolicious::Controller';
 use Data::Dumper;
 
+sub get_director {
+       my $self = shift;
+       my $team = shift;
+       my $dbh  = $self->db();
+               
+       return $dbh->selectrow_hashref("
+               SELECT
+                 t.team,
+                 t.name,
+                 dr.price
+               FROM
+                 manager_team AS mt
+               JOIN
+                 team AS t
+               ON (mt.director = t.team)
+               JOIN
+                 director_race AS dr
+               ON (mt.race = dr.race AND mt.director = dr.director)
+               WHERE
+                 manager_team = ?
+               ", undef, $team);
+}
+
 sub new_team_form {
        my $self = shift;
        my $race = $self->param('race');
@@ -79,6 +102,7 @@ sub team {
                is_owner   => Duplo::is_owner($self, $user, $team),
                stages     => $stages,
                stage_team => \%stage_team,
+               director   => get_director($self, $team),
        );
 }
 
@@ -119,54 +143,34 @@ sub edit_form {
                  race = ?
                ", ['type', 'rider'], undef, $race);
 
-       my ($director_team, $director_name) = $dbh->selectrow_array("
-               SELECT
+       my $teams_ref = $dbh->selectall_arrayref("
+               SELECT DISTINCT
                  t.team,
                  t.name
                FROM
-                 manager_team AS mt
+                 rider_race AS rr
                JOIN
                  team AS t
-               ON (mt.director = t.team)
-               WHERE
-                 manager_team = ?
-               ", undef, $team);
-
-       my ($first) = $dbh->selectrow_array("
-               SELECT
-                 bool_and(
-                   NOW()::TIME < \"start\"
-                   AND NOW()::DATE < \"date\"
-                 )
-               FROM
-                 stage
+               ON (rr.team = t.team)
                WHERE
                  race = ?
-               AND
-                 date = (
-                   SELECT
-                     min(\"date\")
-                   FROM
-                     stage
-                   WHERE
-                     race = ?
-                 )
-               ", undef, $race, $race);
+               ", { Slice => {} }, $race);
 
        return $self->render(
-               team          => $team,
-               riders        => $riders_ref,
-               director_team => $director_team,
-               director_name => $director_name,
+               team     => $team,
+               teams    => $teams_ref,
+               riders   => $riders_ref,
+               director => get_director($self, $team),
        );
 }
 
 sub edit {
-       my $self = shift;
-       my $dbh  = $self->db();
-       my $team = $self->param('team');
-       my $user = $self->session('user');
-       my @riders = $self->param('rider');
+       my $self     = shift;
+       my $dbh      = $self->db();
+       my $team     = $self->param('team');
+       my $user     = $self->session('user');
+       my @riders   = $self->param('rider');
+       my $director = $self->param('director');
 
        my @errors = ();
 
@@ -204,6 +208,17 @@ sub edit {
                  rider_manager_team (rider, manager_team, stage)
                VALUES (?, ?, ?)
                ");
+
+       $dbh->do("
+               UPDATE
+                 manager_team
+               SET
+                 director = ?
+               WHERE
+                 manager_team = ?
+               AND
+                 director IS NULL
+               ", undef, $director, $team);
                  
        for my $rider (@riders) {
                $sth->execute($rider, $team, $stage);
index 63ba1e5e0179951422a41f2692784dcad9fc03cc..58158f53378ed59bceb5cb8710f2ac61cc27150d 100644 (file)
@@ -74,7 +74,7 @@ sub race {
                ", { Slice => {} });
 
        my $proteams_ref = $dbh->selectall_hashref("
-               SELECT DISTINCT
+               SELECT
                  t.team,
                  r.rider,
                  t.name AS team_name,
@@ -93,6 +93,16 @@ sub race {
                  race = ?
                ", ['team', 'rider'], undef, $race);
 
+       my $directors_ref = $dbh->selectall_hashref("
+               SELECT
+                 director,
+                 price
+               FROM
+                 director_race
+               WHERE
+                 race = ?
+               ", ['director'], undef, $race);
+
        my $my_team_ref = $dbh->selectrow_hashref("
                SELECT
                  manager_team,
@@ -106,24 +116,71 @@ sub race {
                ", undef, $race, $user);
                
        return $self->render(
-               race     => $race_ref,
-               stages   => $stages_ref,
-               teams    => $teams_ref,
-               proteams => $proteams_ref,
-               my_team  => $my_team_ref,
-               riders   => $riders_ref,
-               is_admin => Duplo::is_admin($self, $user),
+               race      => $race_ref,
+               stages    => $stages_ref,
+               teams     => $teams_ref,
+               proteams  => $proteams_ref,
+               my_team   => $my_team_ref,
+               riders    => $riders_ref,
+               directors => $directors_ref,
+       );
+}
+
+sub director_race {
+       my $self     = shift;
+       my $dbh      = $self->db();
+       my $race     = $self->param('race');
+       my $price    = $self->param('price');
+       my $director = $self->param('director');
+
+       eval {
+               $dbh->do("
+                       INSERT INTO
+                         director_race (director, race)
+                       VALUES (?, ?)
+                       ", undef, $director, $race);
+       };
+
+       $dbh->do("
+               UPDATE
+                 director_race
+               SET
+                 price = ?
+               WHERE
+                 director = ?
+               AND
+                 race = ?
+               ", undef, $price, $director, $race);
+
+       return $self->render(text => $price);
+
+       #FIXME
+       return $self->respond_to(
+               json => { json => { status => 'SUCCESS' } },
+               html => sub { $self->redirect_to('race', race => $race) },
        );
 }
 
 sub rider_race {
-       my $self  = shift;
-       my $dbh   = $self->db();
-       my $race  = $self->param('race');
-       my $price = $self->param('price');
-       my $type  = $self->param('type');
-       my $rider = $self->param('rider');
-       my $team  = $self->param('team');
+       my $self   = shift;
+       my $dbh    = $self->db();
+       my $race   = $self->param('race');
+       my $price  = $self->param('price');
+       my $type   = $self->param('type');
+       my $rider  = $self->param('rider');
+       my $team   = $self->param('team');
+       my $delete = $self->param('delete');
+
+       if (defined $delete) {
+               $dbh->do("
+                       DELETE FROM
+                         rider_race
+                       WHERE
+                         rider = ?
+                       AND
+                         race = ?
+                       ", undef, $rider, $race);
+       }
 
        if (defined $team) {
                $dbh->do("
@@ -168,51 +225,9 @@ sub rider_race {
                return $self->render(text => $type);
        }
 
-       return $self->render(text => 'SUCCESS');
-}
-
-sub riders {
-       my $self = shift;
-       my $race = $self->param('race');
-       my $type = $self->param('type');
-       my $team = $self->param('team');
-       my $dbh  = $self->db();
-       my @arr  = ();
-
-       my $sql = "
-               SELECT
-                 r.rider,
-                 r.name AS rider_name,
-                 rr.type,
-                 rr.price,
-                 t.team,
-                 t.name AS team_name
-               FROM
-                 rider_race AS rr
-               JOIN
-                 rider AS r
-               ON (rr.rider = r.rider)
-               JOIN
-                 team AS t
-               ON (rr.team = t.team)
-               WHERE
-                 1 = 1
-               ";
-                 
-       if (defined $type) {
-               $sql .= " AND rr.type = ? ";
-               push @arr, $type;
-       }
-
-       if (defined $team) {
-               $sql .= " AND t.team = ? ";
-               push @arr, $team;
-       }
-
-       my $riders_ref = $dbh->selectall_arrayref($sql, { Slice => {} }, @arr);
-
        return $self->respond_to(
-               json => { json => $riders_ref },
+               json => { json => { status => 'SUCCESS' } },
+               html => sub { $self->redirect_to('race', race => $race) },
        );
 }
 
index a029114ef57485f67058d957b105075fd8df5c8e..28d9bf23df13bbba6ba695a00f071d159bfbb218 100644 (file)
@@ -5,6 +5,17 @@ use Mojo::UserAgent;
 use Data::Dumper;
 use Encode qw(decode encode);
 
+sub cdb_getname {
+       my $id = shift;
+
+       my $ua = Mojo::UserAgent->new;
+       my $tx = $ua->get("http://cyclingdatabase.com/rider/a/$id");
+
+       my $name = decode('UTF-8', $tx->res->dom->at('span#rider-name')->text);
+
+       return $name;
+}
+
 sub cdb_getlist {
        my $self = shift;
        my $url  = shift;
@@ -34,13 +45,14 @@ 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+)/;
 
@@ -90,7 +102,7 @@ sub team_import {
        return $self->redirect_to('results_import_form');
 }
 
-sub rider_import {
+sub rider_list_import {
        my $self = shift;
        my $dbh  = $self->db();
        my $url  = $self->param('url');
@@ -149,10 +161,31 @@ sub rider_team_import {
        return $self->redirect_to('results_import_form');
 }
 
+sub rider_import {
+       my $self = shift;
+       my $dbh  = $self->db();
+       my $url  = $self->param('url');
+
+       my $ua = Mojo::UserAgent->new;
+       my $tx = $ua->get($url);
+
+       my $name = decode('UTF-8', $tx->res->dom->at('span#rider-name')->text);
+       my $id   = $tx->res->dom->at('input#rider-id')->{'value'};
+
+       $dbh->do("
+               INSERT INTO
+                 rider (name, cyclingdatabase_id)
+               VALUES (?, ?)
+               ", undef, $name, $id);
+
+       return $self->redirect_to('results_import_form');
+}
+
 sub import {
        my $self  = shift;
        my $dbh   = $self->db();
        my $stage = $self->param('stage');
+       my $url   = $self->param('url');
 
        my @list = cdb_getlist($self, $url);
 
index 34a4c12340960b4a4b4a39dc64c13f8133038158..8e77635695b4cbf890bfbd75d1e7e7b37cd52375 100644 (file)
@@ -66,44 +66,5 @@ sub rider {
        );
 }
 
-sub import_form {
-       my $self = shift;
-
-       return $self->render;
-}
-
-sub import {
-       my $self = shift;
-       my $dbh  = $self->db();
-       my $raw  = $self->param('riders');
-
-       my @errors = ();
-
-       $raw =~ s/\r//g;
-       my @names  = split '\n', $raw;
-       s/^\s*// for @names;
-       s/\s*$// for @names;
-
-       @names = grep /\S/, @names;
-       chomp @names;
-
-       my $sth = $dbh->prepare("
-               INSERT INTO
-                 rider (name)
-               VALUES (?)
-               ");
-
-       for my $name (@names) {
-               my $rows = $sth->execute($name);
-       }
-
-       if (scalar @errors > 0) {
-               $self->flash(errors => \@errors);
-               return $self->redirect_to('riders_import_form');
-       }
-
-       return $self->redirect_to('riders');
-}
-
 1;
 
index d9ff13128c3c2a10a386998b1ae099e4d907c2ff..c0a92d97492c9fd35e74905bcc4e362a5cf2fca3 100644 (file)
@@ -1,7 +1,7 @@
 package Duplo::Stage;
 use Mojo::Base 'Mojolicious::Controller';
 
-sub post {
+sub new_stage {
        my $self     = shift;
        my $dbh      = $self->db();
        my $race     = $self->param('race');
index 43a1454a7a2820e8d0ca8e1e0a13605ebd5d66c3..33c0127f0cc054822ea5ce2a1b4727b0956fc116 100644 (file)
@@ -22,6 +22,9 @@
         <ul class="nav navbar-nav pull-right">
           % if (defined $user) {
           <li><a href="#"><%= $user %></a></li>
+          % if ($is_admin) {
+          <li><a href="<%== url_for 'results_import_form' %>">Import</a></li>
+          % }
           % }
         </ul>
       </div>
index 2458cae6aab2380dc1123f64f3b61079e5071db1..1472f5be520b81f633b9ba16e415f346cc16c639 100644 (file)
   %= $rider_select->('CAPTAIN', 'Captain');
   %= $rider_select->('CAPTAIN', 'Captain');
 
+  <h3>Director</h3>
+  % if (defined $director->{'team'}) {
+  <p><%= $director->{'name'} %></p>
+  % } else {
+  <select name="director" data-placeholder="Director" class="chosen-select" style="width:350px;" tabindex="2">
+    % for my $team (@{ $teams }) {
+    <option value="<%= $team->{'team'} %>"><%= $team->{'name'} %></option>
+    % }
+  </select>
+  % }
+
   <input type="submit" value="Save" />
 </form>
 
index 2345954f9e9c20e12cfa282d9e9b2ef6588b996f..e2ee36a858b299c83637f313e6208370bcb1ecb7 100644 (file)
     <td><%= $rider->{'price'} %></td>
   </tr>
   % }
+  % if (defined $director->{'team'}) {
+  <tr>
+    <td>DIRECTOR</td>
+    <td><%= $director->{'name'} %></td>
+    <td></td>
+    <td><%= $director->{'price'} %></td>
+  </tr>
+  % }
 </table>
 % }
index 3a191066548a63a419e18153a17e167d6f8c9112..462a8dac361491eef6d8451b447bf74607e76da3 100644 (file)
@@ -36,7 +36,8 @@
   </tr>
   % }
 </table>
-<form class="form-inline" action="<%== url_for 'stage_post', $race => $race->{'race'} %>" method="post">
+<form class="form-inline" action="<%== url_for 'stage_new' %>" method="post">
+  <input type="hidden" name="race" value="<%= $race->{'race'} %>" />
   <input type="text" name="name" placeholder="Name" />
   <input type="date" name="date" />
   <label for="start">Start:</label>
   % my $team_name = $proteams->{$team}->{$k}->{'team_name'};
   <h4><%= $team_name %></h4>
 <table class="table">
+  <tr>
+    <td></td>
+    <td>Director</td>
+    <td><div class="director_price" id="<%= $team %>"><%= $directors->{$team}->{'price'} // 'NULL' %></div></td>
+    <td></td>
+  </tr>
   % for my $rider (keys %{ $proteams->{$team} }) {
   <tr>
-    <td><%= $proteams->{$team}->{$rider}->{'rider'} %></td>
     <td><div class="edit_type" id="<%= $proteams->{$team}->{$rider}->{'rider'} %>"><%= $proteams->{$team}->{$rider}->{'type'} // 'NULL' %></div></td>
     <td><%= $proteams->{$team}->{$rider}->{'rider_name'} %></td>
     <td><div class="edit_price" id="<%= $proteams->{$team}->{$rider}->{'rider'} %>"><%= $proteams->{$team}->{$rider}->{'price'} // '0' %></div></td>
+    <td>
+      <form action="<%== url_for 'rider_race' %>" method="post">
+        <input type="hidden" name="race" value="<%= $race->{'race'} %>" />
+        <input type="hidden" name="rider" value="<%= $proteams->{$team}->{$rider}->{'rider'} %>" />
+        <input type="hidden" name="delete" value="1" />
+        <input type="submit" value="-" />
+      </form>
+    </td>
   </tr>
   % }
 </table>
       submitdata: { race: "<%= $race->{'race'} %>" },
     });
 
+    $(".director_price").editable("<%== url_for 'director_race' %>", {
+      name: "price",
+      id: "director",
+      submitdata: { race: "<%= $race->{'race'} %>" },
+    });
+
     $(".edit_type").editable("<%== url_for 'rider_race' %>", {
       name: "type",
       id: "rider",
index afe18d7c4619fb8588daa14b522751af41569b08..8439362ab5a8aa45a14fb243141a86a99f88a612 100644 (file)
@@ -1,5 +1,5 @@
 % layout 'default';
-% title 'New manager team';
+% title 'Import stuff';
 
 <h2>Import team names</h2>
 <form action="<%== url_for 'results_team_import' %>" method="post">
@@ -7,7 +7,13 @@
   <input type="submit" name="submit" value="Import" />
 </form>
 
-<h2>Import rider names</h2>
+<h2>Import rider list</h2>
+<form action="<%== url_for 'results_rider_list_import' %>" method="post">
+  <label for="url">URL:</label><input type="text" name="url" />
+  <input type="submit" name="submit" value="Import" />
+</form>
+
+<h2>Import single rider</h2>
 <form action="<%== url_for 'results_rider_import' %>" method="post">
   <label for="url">URL:</label><input type="text" name="url" />
   <input type="submit" name="submit" value="Import" />