diff options
-rw-r--r-- | data/tpl/defs.pl | 6 | ||||
-rw-r--r-- | data/tpl/main | 6 | ||||
-rw-r--r-- | data/tpl/rlist | 1 | ||||
-rw-r--r-- | data/tpl/useredit | 3 | ||||
-rw-r--r-- | data/tpl/vnpage | 15 | ||||
-rw-r--r-- | lib/ChangeLog | 2 | ||||
-rw-r--r-- | lib/VNDB.pm | 2 | ||||
-rw-r--r-- | lib/VNDB/Util/DB.pm | 67 | ||||
-rw-r--r-- | lib/VNDB/VN.pm | 2 | ||||
-rw-r--r-- | lib/VNDB/VNLists.pm | 77 | ||||
-rw-r--r-- | lib/global.pl | 7 | ||||
-rw-r--r-- | static/files/def.js | 6 | ||||
-rw-r--r-- | util/dump.sql | 10 | ||||
-rw-r--r-- | util/updates/update_1.20.sql | 19 |
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">< + 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> ></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 = ''; + |