From: Bjørn Rustad Date: Fri, 9 Aug 2013 23:50:53 +0000 (+0200) Subject: Director improvements X-Git-Url: http://git.rustad.me/?a=commitdiff_plain;h=03b1f772ec3923f2bca6ffdcc8b237b585d23932;p=duplo Director improvements --- diff --git a/duplo.sql b/duplo.sql index 6859d16..b184577 100644 --- 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" ( diff --git a/lib/Duplo.pm b/lib/Duplo.pm index d05b458..5303e08 100644 --- a/lib/Duplo.pm +++ b/lib/Duplo.pm @@ -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'); diff --git a/lib/Duplo/Manager.pm b/lib/Duplo/Manager.pm index 0032669..35cb3bb 100644 --- a/lib/Duplo/Manager.pm +++ b/lib/Duplo/Manager.pm @@ -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); diff --git a/lib/Duplo/Race.pm b/lib/Duplo/Race.pm index 63ba1e5..58158f5 100644 --- a/lib/Duplo/Race.pm +++ b/lib/Duplo/Race.pm @@ -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) }, ); } diff --git a/lib/Duplo/Results.pm b/lib/Duplo/Results.pm index a029114..28d9bf2 100644 --- a/lib/Duplo/Results.pm +++ b/lib/Duplo/Results.pm @@ -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); diff --git a/lib/Duplo/Rider.pm b/lib/Duplo/Rider.pm index 34a4c12..8e77635 100644 --- a/lib/Duplo/Rider.pm +++ b/lib/Duplo/Rider.pm @@ -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; diff --git a/lib/Duplo/Stage.pm b/lib/Duplo/Stage.pm index d9ff131..c0a92d9 100644 --- a/lib/Duplo/Stage.pm +++ b/lib/Duplo/Stage.pm @@ -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'); diff --git a/templates/layouts/default.html.ep b/templates/layouts/default.html.ep index 43a1454..33c0127 100644 --- a/templates/layouts/default.html.ep +++ b/templates/layouts/default.html.ep @@ -22,6 +22,9 @@ diff --git a/templates/manager/edit_form.html.ep b/templates/manager/edit_form.html.ep index 2458cae..1472f5b 100644 --- a/templates/manager/edit_form.html.ep +++ b/templates/manager/edit_form.html.ep @@ -34,6 +34,17 @@ %= $rider_select->('CAPTAIN', 'Captain'); %= $rider_select->('CAPTAIN', 'Captain'); +

Director

+ % if (defined $director->{'team'}) { +

<%= $director->{'name'} %>

+ % } else { + + % } + diff --git a/templates/manager/team.html.ep b/templates/manager/team.html.ep index 2345954..e2ee36a 100644 --- a/templates/manager/team.html.ep +++ b/templates/manager/team.html.ep @@ -17,5 +17,13 @@ <%= $rider->{'price'} %> % } + % if (defined $director->{'team'}) { + + DIRECTOR + <%= $director->{'name'} %> + + <%= $director->{'price'} %> + + % } % } diff --git a/templates/race/race.html.ep b/templates/race/race.html.ep index 3a19106..462a8da 100644 --- a/templates/race/race.html.ep +++ b/templates/race/race.html.ep @@ -36,7 +36,8 @@ % } -
+ + @@ -75,12 +76,25 @@ % my $team_name = $proteams->{$team}->{$k}->{'team_name'};

<%= $team_name %>

+ + + + + + % for my $rider (keys %{ $proteams->{$team} }) { - + % }
Director
<%= $directors->{$team}->{'price'} // 'NULL' %>
<%= $proteams->{$team}->{$rider}->{'rider'} %>
<%= $proteams->{$team}->{$rider}->{'type'} // 'NULL' %>
<%= $proteams->{$team}->{$rider}->{'rider_name'} %>
<%= $proteams->{$team}->{$rider}->{'price'} // '0' %>
+ + + + + + +
@@ -112,6 +126,12 @@ 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", diff --git a/templates/results/import_form.html.ep b/templates/results/import_form.html.ep index afe18d7..8439362 100644 --- a/templates/results/import_form.html.ep +++ b/templates/results/import_form.html.ep @@ -1,5 +1,5 @@ % layout 'default'; -% title 'New manager team'; +% title 'Import stuff';

Import team names

@@ -7,7 +7,13 @@
-

Import rider names

+

Import rider list

+
+ + +
+ +

Import single rider