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" (
->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')
->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')
->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')
->via('get')
->to('rider#edit_form');
- $rider->route('/edit')
+ $rider->route('/')
->name('rider_edit')
->via('post')
->to('rider#edit');
->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('/')
->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+/);
->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('/')
->via('get')
->to('manager#new_team_form');
- $race->route('/team/new')
+ $race->route('/team')
->name('manager_new')
->via('post')
->to('manager#new_team');
->via('get')
->to('manager#edit_form');
- $team->route('/edit')
+ $team->route('/')
->name('manager_edit')
->via('post')
->to('manager#edit');
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');
is_owner => Duplo::is_owner($self, $user, $team),
stages => $stages,
stage_team => \%stage_team,
+ director => get_director($self, $team),
);
}
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 = ();
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);
", { Slice => {} });
my $proteams_ref = $dbh->selectall_hashref("
- SELECT DISTINCT
+ SELECT
t.team,
r.rider,
t.name AS team_name,
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,
", 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("
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) },
);
}
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;
$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+)/;
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');
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);
);
}
-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;
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');
<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>
%= $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>
<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>
% }
</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",
% layout 'default';
-% title 'New manager team';
+% title 'Import stuff';
<h2>Import team names</h2>
<form action="<%== url_for 'results_team_import' %>" method="post">
<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" />