summaryrefslogtreecommitdiff
path: root/lib/VNWeb
diff options
context:
space:
mode:
authorYorhel <git@yorhel.nl>2021-08-09 10:33:57 +0200
committerYorhel <git@yorhel.nl>2021-08-09 10:34:54 +0200
commit02448a7dd976344d29f698b84027686a6e64c673 (patch)
tree93328f73f0e509569cc17fb3194858111da289ca /lib/VNWeb
parent5e7673e4543c104985c23ff1b21c949cbf14d48a (diff)
VNLengthVote: Add support for multiple release selection
Using a Postgres array for this is ugly, but releases are purely informative so no strong need for referential integrity. Also, display languages in length vote listing.
Diffstat (limited to 'lib/VNWeb')
-rw-r--r--lib/VNWeb/VN/Length.pm14
-rw-r--r--lib/VNWeb/VN/Page.pm5
2 files changed, 14 insertions, 5 deletions
diff --git a/lib/VNWeb/VN/Length.pm b/lib/VNWeb/VN/Length.pm
index eeff981f..e64a620a 100644
--- a/lib/VNWeb/VN/Length.pm
+++ b/lib/VNWeb/VN/Length.pm
@@ -52,7 +52,11 @@ sub listing_ {
} if $mode ne 'v';
td_ class => 'tc3'.($_->{ignore}?' grayedout':''), sub { vnlength_ $_->{length} };
td_ class => 'tc4'.($_->{ignore}?' grayedout':''), ['Slow','Normal','Fast']->[$_->{speed}];
- td_ class => 'tc5', sub { a_ href => "/$_->{rid}", $_->{rid} };
+ td_ class => 'tc5', sub {
+ my %l = map +($_,1), map $_->{lang}->@*, $_->{rel}->@*;
+ abbr_ class => "icons lang $_", title => $LANGUAGE{$_}, '' for sort keys %l;
+ join_ ',', sub { a_ href => "/$_->{id}", $_->{id} }, sort { idcmp $a->{id}, $b->{id} } $_->{rel}->@*;
+ };
td_ class => 'tc6', sub { lit_ bb_format $_->{notes}, inline => 1 };
td_ class => 'tc7', sub {
select_ name => "$_->{vid}-$_->{uid}", sub {
@@ -119,7 +123,8 @@ TUWF::get qr{/(?:(?<thing>$RE{vid}|$RE{uid})/)?lengthvotes}, sub {
my $count = tuwf->dbVali('SELECT COUNT(*) FROM vn_length_votes l WHERE', $where);
my $lst = tuwf->dbPagei({results => $opt->{s}->results, page => $opt->{p}},
- 'SELECT l.uid, l.vid, l.length, l.speed, l.notes, l.rid, ', sql_totime('l.date'), 'AS date, l.ignore OR u.perm_lengthvote IS NOT DISTINCT FROM false AS ignore',
+ 'SELECT l.uid, l.vid, l.length, l.speed, l.notes, l.rid::text[] AS rel, '
+ , sql_totime('l.date'), 'AS date, l.ignore OR u.perm_lengthvote IS NOT DISTINCT FROM false AS ignore',
$mode ne 'u' ? (', ', sql_user()) : (),
$mode ne 'v' ? ', v.title, v.original' : (), '
FROM vn_length_votes l
@@ -128,6 +133,8 @@ TUWF::get qr{/(?:(?<thing>$RE{vid}|$RE{uid})/)?lengthvotes}, sub {
'WHERE', $where,
'ORDER BY', $opt->{s}->sql_order(),
);
+ $_->{rel} = [ map +{ id => $_ }, $_->{rel}->@* ] for @$lst;
+ enrich_flatten lang => id => id => 'SELECT id, lang FROM releases_lang WHERE id IN', map $_->{rel}, @$lst;
my $title = 'Length votes'.($mode ? ($mode eq 'v' ? ' for ' : ' by ').$o->{title} : '');
framework_ title => $title, dbobj => $o, sub {
@@ -166,7 +173,7 @@ our $LENGTHVOTE = form_compile any => {
uid => { vndbid => 'u' },
vid => { vndbid => 'v' },
vote => { type => 'hash', required => 0, keys => {
- rid => { vndbid => 'r' },
+ rid => { type => 'array', minlength => 1, values => { vndbid => 'r' } },
length => { uint => 1, range => [1,32767] },
speed => { uint => 1, enum => [0,1,2] },
notes => { required => 0, default => '' },
@@ -178,6 +185,7 @@ elm_api VNLengthVote => undef, $LENGTHVOTE, sub {
return elm_Unauth if !can_vote() || $data->{uid} ne auth->uid;
my %where = ( uid => $data->{uid}, vid => $data->{vid} );
tuwf->dbExeci('DELETE FROM vn_length_votes WHERE', \%where) if !$data->{vote};
+ $data->{vote}{rid} = sql sql_array($data->{vote}{rid}->@*), '::vndbid[]' if $data->{vote};
tuwf->dbExeci(
'INSERT INTO vn_length_votes', { %where, $data->{vote}->%* },
'ON CONFLICT (uid, vid) DO UPDATE SET', $data->{vote}
diff --git a/lib/VNWeb/VN/Page.pm b/lib/VNWeb/VN/Page.pm
index 78f93dc8..60876e1e 100644
--- a/lib/VNWeb/VN/Page.pm
+++ b/lib/VNWeb/VN/Page.pm
@@ -161,13 +161,14 @@ sub infobox_length_ {
my $stats = tuwf->dbRowi('
SELECT count(*) as count
- , percentile_cont(0.5) WITHIN GROUP (ORDER BY l.length + (l.length/4 * (l.speed-1))) AS median
+ , percentile_cont(', \0.5, ') WITHIN GROUP (ORDER BY l.length + (l.length/(1+1+1+1) * (l.speed-1))) AS median
FROM vn_length_votes l
LEFT JOIN users u ON u.id = l.uid
WHERE u.perm_lengthvote IS DISTINCT FROM false AND NOT l.ignore AND l.vid =', \$v->{id});
return if !$v->{length} && !$stats->{count} && !VNWeb::VN::Length::can_vote();
- my $my = VNWeb::VN::Length::can_vote() && tuwf->dbRowi('SELECT rid, length, speed, notes FROM vn_length_votes WHERE vid =', \$v->{id}, 'AND uid =', \auth->uid);
+ my $my = VNWeb::VN::Length::can_vote()
+ && tuwf->dbRowi('SELECT rid::text[] AS rid, length, speed, notes FROM vn_length_votes WHERE vid =', \$v->{id}, 'AND uid =', \auth->uid);
tr_ sub {
td_ 'Play time';