summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/tpl/defs.pl6
-rw-r--r--data/tpl/main6
-rw-r--r--data/tpl/rlist1
-rw-r--r--data/tpl/useredit3
-rw-r--r--data/tpl/vnpage15
-rw-r--r--lib/ChangeLog2
-rw-r--r--lib/VNDB.pm2
-rw-r--r--lib/VNDB/Util/DB.pm67
-rw-r--r--lib/VNDB/VN.pm2
-rw-r--r--lib/VNDB/VNLists.pm77
-rw-r--r--lib/global.pl7
-rw-r--r--static/files/def.js6
-rw-r--r--util/dump.sql10
-rw-r--r--util/updates/update_1.20.sql19
14 files changed, 212 insertions, 11 deletions
diff --git a/data/tpl/defs.pl b/data/tpl/defs.pl
index 27d1443d..a7355840 100644
--- a/data/tpl/defs.pl
+++ b/data/tpl/defs.pl
@@ -216,6 +216,7 @@ sub ttabs { # [vrpu], obj, sel
$t eq 'u' ? (
$o->{flags} & $VNDB::UFLAGS->{list} ? ( $s eq 'list' ? 'list' : '<a href="/%s/list">list</a>', ) : (),
+ $o->{flags} & $VNDB::UFLAGS->{list} ? ( $s eq 'wish' ? 'wishlist' : '<a href="/%s/wish">wishlist</a>', ) : (),
) : (),
$t ne 'r' ? (
@@ -296,8 +297,9 @@ my %pagetitles = (
$p{tedit}{t} ? 'Reply to thread' : 'Start a new thread' },
userpage => sub {
return 'User: '.$p{userpage}{user}{username} },
- vnlist => sub {
- return $p{vnlist}{user}{username} eq $p{AuthUsername} ? 'My visual novel list' : ($p{vnlist}{user}{username}.'\'s visual novel list'); },
+ vnlist => 'My visual novel list (old)',
+ wlist => sub {
+ return $p{wlist}{user}{username} eq $p{AuthUsername} ? 'My wishlist' : ($p{wlist}{user}{username}.'\'s wishlist'); },
rlist => sub {
return $p{rlist}{user}{username} eq $p{AuthUsername} ? 'My visual novel list' : ($p{rlist}{user}{username}.'\'s visual novel list'); },
useredit => sub {
diff --git a/data/tpl/main b/data/tpl/main
index 9dd70b24..762fdb58 100644
--- a/data/tpl/main
+++ b/data/tpl/main
@@ -18,7 +18,7 @@
<link rel="icon" href="/favicon.gif" type="image/gif" />
<meta name="robots" content="noindex, nofollow" />
[[ } elsif(
- grep($p{$_}, qw| userlist userpage userlogin userreg userpass vnlist rlist hist |)
+ grep($p{$_}, qw| userlist userpage userlogin userreg userpass vnlist rlist wlist hist |)
|| ($p{ttag} && $p{ttag}{iid})
|| ($p{vnpage} && $p{vnpage}{page} eq 'stats')
|| grep { $p{$_} && $p{$_}{change} } qw|vnpage ppage rpage|
@@ -66,6 +66,7 @@
[[ if($p{ppage}) { %d = %{$p{ppage}}; ]] [[+ ppage ]][[ } ]]
[[ if($p{vnlist}) { %d = %{$p{vnlist}}; ]] [[+ vnlist ]][[ }# ]]
[[ if($p{rlist}) { %d = %{$p{rlist}}; ]] [[+ rlist ]][[ }# ]]
+[[ if($p{wlist}) { %d = %{$p{wlist}}; ]] [[+ wlist ]][[ }# ]]
[[ if($p{hist}) { %d = %{$p{hist}}; ]] [[+ hist ]][[ }# ]]
[[ if($p{rpage}) { %d = %{$p{rpage}}; ]] [[+ rpage ]][[ } ]]
[[ if($p{docs}) { %d = %{$p{docs}}; ]] [[+ docs ]][[ } ]]
@@ -107,10 +108,11 @@
<h2>User menu</h2>
<ul>
<li><a href="/u[[= $p{AuthId} ]]">[[: $p{AuthUsername} ]]</a> ([[: $p{AuthRankname} ]])</li>
- <!--<li><a href="/u[[= $p{AuthId} ]]/edit">My profile</a></li>-->
+ <li><a href="/u[[= $p{AuthId} ]]/edit">My profile</a></li>
<li><a href="/u[[= $p{AuthId} ]]/list">My visual novel list</a></li>
[[ if($p{AuthOldList}) { ]]-
<li><a href="/u[[= $p{AuthId} ]]/vlist">My visual novel list (old)</a></li>[[ } ]]-
+ <li><a href="/u[[= $p{AuthId} ]]/wish">My wishlist</a></li>
<li><a href="/t/u[[= $p{AuthId} ]]">My messages</a></li>
<li><a href="/u[[= $p{AuthId} ]]/hist">My recent changes</a></li>
[[ if($p{Authedit}) { ]]-
diff --git a/data/tpl/rlist b/data/tpl/rlist
index f586a92b..e95286f3 100644
--- a/data/tpl/rlist
+++ b/data/tpl/rlist
@@ -60,7 +60,6 @@
<select id="vnlistchange" name="vnlistchange" class="right">
<option value="n">- with selected -</option>
<option value="d">Delete</option>
- <!--<option value="-2">Update personal note</option>-->
<optgroup label="Update release status:">
[[ for (0..$#$VNDB::RSTAT) { ]]-
<option value="r[[= $_ ]]">[[: $VNDB::RSTAT->[$_] ]]</option>
diff --git a/data/tpl/useredit b/data/tpl/useredit
index f9db7c61..e6243fb5 100644
--- a/data/tpl/useredit
+++ b/data/tpl/useredit
@@ -20,7 +20,8 @@
{ type => 'pass', name => 'Confirm', short => 'pass2' },
{ type => 'sub', title => 'Miscellaneous options', short => 'misc' },
- { type => 'check', short => 'plist', name => sprintf 'Allow other people to see my visual novel list (<a href="/u%d/list">/u%1$d/list</a>)', $d{user} },
+ { type => 'check', short => 'plist', name => sprintf
+ 'Allow other people to see my visual novel list (<a href="/u%d/list">/u%1$d/list</a>) and wishlist (<a href="/u%1$d/wish">/u%1$d/wish</a>)', $d{user} },
{ type => 'check', short => 'pign_nsfw', name => 'Disable warnings for images that are not safe for work.' },
$d{adm} ? (
diff --git a/data/tpl/vnpage b/data/tpl/vnpage
index 1077c202..39374ed8 100644
--- a/data/tpl/vnpage
+++ b/data/tpl/vnpage
@@ -13,7 +13,9 @@
-[[ if($p{AuthLoggedin}) { ]]
<p class="mod">&lt;
+ user options -
<a href="/u[[= $p{AuthId} ]]/list" rel="voteDD" class="dropdown">[[= $d{vote}{vid} ? 'your vote: '.$d{vote}{vote} : 'vote' ]]</a>
+ - <a href="/u[[= $p{AuthId} ]]/wish" rel="wishDD" class="dropdown">[[= $d{wlist}{vid} ? 'wishlist: '.lc($$VNDB::WSTAT[$d{wlist}{wstat}]) : 'wishlist' ]]</a>
&gt;</p>
[[ } ]]-
@@ -176,6 +178,19 @@ if($d{vn}{length} || $d{vn}{alias} || @links || $prod) { ]]
[[ } ]]
</ul>
</div>
+
+<div class="dropdown" id="wishDD">
+ <ul>
+ [[ for (0..$#$VNDB::WSTAT) {
+ if($d{wlist}{vid} && $d{wlist}{wstat} == $_) { ]]-
+ <li><b>[[: $$VNDB::WSTAT[$_] ]]</b></li>
+ [[ } else { ]]-
+ <li><a href="/v[[= $d{vn}{id} ]]/wish?w=[[= $_ ]]">[[: $$VNDB::WSTAT[$_] ]]</a></li>
+ [[ } } if($d{wlist}{vid}) { ]]-
+ <li><a href="/v[[= $d{vn}{id} ]]/wish?w=-1">remove</a></li>
+ [[ } ]]
+ </ul>
+</div>
[[ } ]]
diff --git a/lib/ChangeLog b/lib/ChangeLog
index 75e5cf19..5d3ea76a 100644
--- a/lib/ChangeLog
+++ b/lib/ChangeLog
@@ -5,6 +5,7 @@ TODO:
+ Remove all references to an item when it's hidden
(preferably with the option to re-add them when unhiding)
+ Add a link for the hidden 'h' option at /hist
+ + Add icons for the rlist, vlist and wlist statusses
1.20 - ?
- Admins can change someone's username
@@ -22,6 +23,7 @@ TODO:
votes' option)
- Merged Votes.pm into VNLists.pm
- Auto-expand edit summary form when adding a release
+ - Added wishlist
1.19 - 2008-07-08 (r62)
- Integrated discussion board
diff --git a/lib/VNDB.pm b/lib/VNDB.pm
index 668c29a8..be5446e0 100644
--- a/lib/VNDB.pm
+++ b/lib/VNDB.pm
@@ -46,6 +46,7 @@ my %VNDBuris = ( # wildcards: * -> (.+), + -> ([0-9]+)
del => sub { shift->UsrDel(shift) },
list => sub { shift->RList(shift) },
vlist => sub { shift->VNMyList(shift) },
+ wish => sub { shift->WList(shift) },
hist => {'*'=> sub { shift->History('u', shift, $_[1]) } },
},
# visual novels
@@ -60,6 +61,7 @@ my %VNDBuris = ( # wildcards: * -> (.+), + -> ([0-9]+)
rg => sub { shift->VNPage(shift, shift) },
edit => sub { shift->VNEdit(shift) },
vote => sub { shift->VNVote(shift) },
+ wish => sub { shift->WListMod(shift) },
add => sub { shift->REdit('v', shift) },
lock => sub { shift->VNLock(shift) },
hide => sub { shift->VNHide(shift) },
diff --git a/lib/VNDB/Util/DB.pm b/lib/VNDB/Util/DB.pm
index 76a9a790..34ca9ca0 100644
--- a/lib/VNDB/Util/DB.pm
+++ b/lib/VNDB/Util/DB.pm
@@ -16,6 +16,7 @@ $VERSION = $VNDB::VERSION;
DBGetUser DBAddUser DBUpdateUser DBDelUser
DBGetVotes DBVoteStats DBAddVote DBDelVote
DBGetVNList DBDelVNList
+ DBGetWishList DBEditWishList DBDelWishList
DBGetRList DBGetRLists DBEditRList DBDelRList
DBGetVN DBAddVN DBEditVN DBHideVN DBUndefRG DBVNCache
DBGetRelease DBAddRelease DBEditRelease DBHideRelease
@@ -358,6 +359,7 @@ sub DBDelUser { # uid
$s->DBExec($_, $id) for (
q|DELETE FROM vnlists WHERE uid = %d|,
q|DELETE FROM rlists WHERE uid = %d|,
+ q|DELETE FROM wlists WHERE uid = %d|,
q|DELETE FROM votes WHERE uid = %d|,
q|UPDATE changes SET requester = 0 WHERE requester = %d|,
q|UPDATE threads_posts SET uid = 0 WHERE uid = %d|,
@@ -509,6 +511,71 @@ sub DBDelVNList { # uid, @vid # uid = 0 to delete all
#-----------------------------------------------------------------------------#
+# U S E R W I S H L I S T S #
+#-----------------------------------------------------------------------------#
+
+
+sub DBGetWishList { # %options->{ uid vid what order page results }
+ my($s, %o) = @_;
+
+ $o{order} ||= 'wl.wstat ASC';
+ $o{page} ||= 1;
+ $o{results} ||= 50;
+ $o{what} ||= '';
+
+ my %where = (
+ 'wl.uid = %d' => $o{uid},
+ $o{vid} ? ( 'wl.vid = %d' => $o{vid} ) : (),
+ );
+
+ my $select = 'wl.vid, wl.wstat, wl.added';
+ my @join;
+ if($o{what} =~ /vn/) {
+ $select .= ', vr.title';
+ push @join, 'JOIN vn v ON v.id = wl.vid',
+ 'JOIN vn_rev vr ON vr.id = v.latest';
+ }
+
+ my $r = $s->DBAll(qq|
+ SELECT $select
+ FROM wlists wl
+ @join
+ WHERE !W
+ ORDER BY %s
+ LIMIT %d OFFSET %d|,
+ \%where,
+ $o{order},
+ $o{results}+(wantarray?1:0), $o{results}*($o{page}-1)
+ );
+ return $r if !wantarray;
+ return ($r, 0) if $#$r < $o{results};
+ pop @$r;
+ return ($r, 1);
+}
+
+
+sub DBEditWishList { # %options->{ uid vid wstat }
+ my($s, %o) = @_;
+ $s->DBExec(q|UPDATE wlists SET wstat = %d WHERE uid = %d AND vid IN(!l)|,
+ $o{wstat}, $o{uid}, ref($o{vid}) eq 'ARRAY' ? $o{vid} : [ $o{vid} ])
+ ||
+ $s->DBExec(q|INSERT INTO wlists (uid, vid, wstat)
+ VALUES(%d, %d, %d)|,
+ @o{qw| uid vid wstat |});
+}
+
+
+sub DBDelWishList { # uid, vids
+ my($s, $uid, $vid) = @_;
+ $s->DBExec(q|DELETE FROM wlists WHERE uid = %d AND vid IN(!l)|, $uid, $vid);
+}
+
+
+
+
+
+
+#-----------------------------------------------------------------------------#
# U S E R R E L E A S E L I S T S #
#-----------------------------------------------------------------------------#
diff --git a/lib/VNDB/VN.pm b/lib/VNDB/VN.pm
index c94705cc..40702107 100644
--- a/lib/VNDB/VN.pm
+++ b/lib/VNDB/VN.pm
@@ -50,7 +50,7 @@ sub VNPage {
$self->ResAddTpl(vnpage => {
vote => $self->AuthInfo->{id} ? $self->DBGetVotes(uid => $self->AuthInfo->{id}, vid => $id)->[0] : {},
- list => $self->AuthInfo->{id} ? $self->DBGetVNList(uid => $self->AuthInfo->{id}, vid => $id)->[0] : {},
+ wlist => $self->AuthInfo->{id} ? $self->DBGetWishList(uid => $self->AuthInfo->{id}, vid => $id)->[0] : {},
vn => $v,
rel => $rel,
prev => $c,
diff --git a/lib/VNDB/VNLists.pm b/lib/VNDB/VNLists.pm
index a50df2e4..0b7a5207 100644
--- a/lib/VNDB/VNLists.pm
+++ b/lib/VNDB/VNLists.pm
@@ -7,7 +7,7 @@ use Exporter 'import';
use vars ('$VERSION', '@EXPORT');
$VERSION = $VNDB::VERSION;
-@EXPORT = qw| VNMyList VNVote RListMod RList |;
+@EXPORT = qw| VNMyList VNVote RListMod RList WListMod WList |;
sub VNMyList {
@@ -152,4 +152,79 @@ sub RList {
}
+sub WListMod {
+ my $self = shift;
+ my $vid = shift;
+
+ my $f = $self->FormCheck(
+ { name => 'w', required => 1, enum => [ -1..$#$VNDB::RSTAT ] },
+ );
+
+ return $self->ResNotFound if $f->{_err};
+ return $self->ResDenied if !$self->AuthInfo->{id};
+
+ if($f->{w} == -1) {
+ $self->DBDelWishList($self->AuthInfo->{id}, [ $vid ]);
+ } else {
+ $self->DBEditWishList(
+ uid => $self->AuthInfo->{id},
+ vid => $vid,
+ wstat => $f->{w}
+ );
+ }
+
+ return $self->ResRedirect('/v'.$vid, 'temp');
+}
+
+
+sub WList {
+ my $self = shift;
+ my $uid = shift;
+
+ my $u = $self->DBGetUser(uid => $uid)->[0];
+ return $self->ResNotFound if !$uid || !$u || (($self->AuthInfo->{id}||0) != $uid && !($u->{flags} & $VNDB::UFLAGS->{list}));
+
+ my $f = $self->FormCheck(
+ { name => 's', required => 0, default => 'title', enum => [ qw|title wstat added| ] },
+ { name => 'o', required => 0, default => 'a', enum => [ 'a','d' ] },
+ { name => 'p', required => 0, template => 'int', default => 1 },
+ );
+ return $self->ResNotFound if $f->{_err};
+
+ if($self->ReqMethod eq 'POST') {
+ return $self->ResDenied if $uid != $self->AuthInfo->{id};
+ my $frm = $self->FormCheck(
+ { name => 'sel', required => 1, multi => 1, template => 'int' },
+ { name => 'vnlistchange', required => 1, enum => [ 'd', '0'.."$#$VNDB::WLIST" ] },
+ );
+ if(!$frm->{_err} && @{$frm->{sel}}) {
+ $self->DBDelWishList($uid, $frm->{sel}) if $frm->{vnlistchange} eq 'd';
+ $self->DBEditWishList(
+ uid => $uid,
+ vid => $frm->{sel},
+ wstat => $frm->{vnlistchange}
+ ) if $frm->{vnlistchange} ne 'd';
+ }
+ }
+
+ my $order = $f->{s} . ($f->{o} eq 'a' ? ' ASC' : ' DESC');
+ $order .= ', title' . ($f->{o} eq 'a' ? ' ASC' : ' DESC') if $f->{s} eq 'wstat';
+ my($list, $np) = $self->DBGetWishList(
+ uid => $u->{id},
+ order => $order,
+ results => 50,
+ what => 'vn',
+ page => $f->{p},
+ );
+
+ $self->ResAddTpl(wlist => {
+ npage => $np,
+ page => $f->{p},
+ list => $list,
+ order => [ $f->{s}, $f->{o} ],
+ user => $u,
+ });
+}
+
+
1;
diff --git a/lib/global.pl b/lib/global.pl
index 1d18b075..cb1dd446 100644
--- a/lib/global.pl
+++ b/lib/global.pl
@@ -172,6 +172,13 @@ our $VSTAT = [
'Dropped',
];
+our $WSTAT = [
+ 'High',
+ 'Medium',
+ 'Low',
+ 'AVOID!',
+];
+
# OLD
our $LSTAT = [
diff --git a/static/files/def.js b/static/files/def.js
index 486c7a4a..96c7fcf2 100644
--- a/static/files/def.js
+++ b/static/files/def.js
@@ -284,20 +284,20 @@ DOMLoad(function() {
});
}
- // mass-change rlist status
+ // mass-change rlist or wlist status
if(x('vnlistchange')) {
x('vnlistchange').onchange = function() {
var val = this.options[this.selectedIndex].value;
if(val == 'n')
return;
- var l = x('rli').getElementsByTagName('input');
+ var l = (x('rli')||x('twl')).getElementsByTagName('input');
var y; var ch=0;
for(y=0;y<l.length;y++)
if(l[y].type == 'checkbox' && l[y].checked)
ch++;
if(!ch)
return alert('Nothing selected...');
- if(val == 'd' && !confirm('Are you sure you want to remove the selected items from your visual novel list?'))
+ if(val == 'd' && !confirm('Are you sure you want to remove the selected items from your list?'))
return;
document.forms[1].submit();
}
diff --git a/util/dump.sql b/util/dump.sql
index 54dd9f6b..884c06e8 100644
--- a/util/dump.sql
+++ b/util/dump.sql
@@ -233,6 +233,14 @@ CREATE TABLE votes (
PRIMARY KEY(vid, uid)
);
+-- wlists
+CREATE TABLE wlists (
+ uid integer NOT NULL DEFAULT 0,
+ vid integer NOT NULL DEFAULT 0,
+ wstat smallint NOT NULL DEFAULT 0,
+ added bigint NOT NULL DEFAULT DATE_PART('epoch', NOW()),
+ PRIMARY KEY(uid, vid)
+);
@@ -274,6 +282,8 @@ ALTER TABLE vnlists ADD FOREIGN KEY (uid) REFERENCES users
ALTER TABLE vnlists ADD FOREIGN KEY (vid) REFERENCES vn (id) DEFERRABLE INITIALLY DEFERRED;
ALTER TABLE votes ADD FOREIGN KEY (uid) REFERENCES users (id) DEFERRABLE INITIALLY DEFERRED;
ALTER TABLE votes ADD FOREIGN KEY (vid) REFERENCES vn (id) DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE wlists ADD FOREIGN KEY (uid) REFERENCES users (id) DEFERRABLE INITIALLY DEFERRED;
+ALTER TABLE wlists ADD FOREIGN KEY (vid) REFERENCES vn (id) DEFERRABLE INITIALLY DEFERRED;
diff --git a/util/updates/update_1.20.sql b/util/updates/update_1.20.sql
index 4abd2211..ee155f48 100644
--- a/util/updates/update_1.20.sql
+++ b/util/updates/update_1.20.sql
@@ -15,3 +15,22 @@ CREATE TABLE rlists (
PRIMARY KEY(uid, rid)
) WITHOUT OIDS;
+
+-- wishlist
+CREATE TABLE wlists (
+ uid integer NOT NULL DEFAULT 0 REFERENCES users (id) DEFERRABLE INITIALLY DEFERRED,
+ vid integer NOT NULL DEFAULT 0 REFERENCES vn (id) DEFERRABLE INITIALLY DEFERRED,
+ wstat smallint NOT NULL DEFAULT 0,
+ added bigint NOT NULL DEFAULT DATE_PART('epoch', NOW()),
+ PRIMARY KEY(uid, vid)
+) WITHOUT OIDS;
+
+
+-- move 'Wishlist' and 'Blacklist' statuses of the old VNList to the new wishlist
+INSERT INTO wlists (uid, vid, wstat, added)
+ (SELECT uid, vid, CASE WHEN status = 0 THEN 1 ELSE 3 END, date
+ FROM vnlists
+ WHERE status < 2);
+
+DELETE FROM vnlists WHERE status < 2 AND comments = '';
+