From 5d6f09f838392f1e2c072f44f904b5f9eab95f45 Mon Sep 17 00:00:00 2001 From: Yorhel Date: Tue, 7 Jul 2009 14:54:46 +0200 Subject: Posts browser on user pages (/u+/posts) --- lib/VNDB/DB/Discussions.pm | 32 +++++++++++++++++---- lib/VNDB/Handler/Discussions.pm | 4 +-- lib/VNDB/Handler/Users.pm | 61 ++++++++++++++++++++++++++++++++++++++++- lib/VNDB/Util/CommonHTML.pm | 6 ++++ 4 files changed, 94 insertions(+), 9 deletions(-) (limited to 'lib') diff --git a/lib/VNDB/DB/Discussions.pm b/lib/VNDB/DB/Discussions.pm index 78a462df..58cc5f61 100644 --- a/lib/VNDB/DB/Discussions.pm +++ b/lib/VNDB/DB/Discussions.pm @@ -153,25 +153,45 @@ sub dbThreadCount { } -# Options: tid, num, what, page, results +# Options: tid, num, what, order, uid, hide, page, results +# what: user thread sub dbPostGet { my($self, %o) = @_; $o{results} ||= 50; $o{page} ||= 1; + $o{what} ||= ''; + $o{order} ||= 'tp.num ASC'; my %where = ( - 'tp.tid = ?' => $o{tid}, + $o{tid} ? ( + 'tp.tid = ?' => $o{tid} ) : (), $o{num} ? ( 'tp.num = ?' => $o{num} ) : (), + $o{uid} ? ( + 'tp.uid = ?' => $o{uid} ) : (), + $o{hide} ? ( + 'tp.hidden = FALSE' => 1 ) : (), + $o{hide} && $o{what} =~ /thread/ ? ( + 't.hidden = FALSE' => 1 ) : (), + ); + + my @select = ( + qw|tp.num tp.date tp.edited tp.msg tp.hidden|, + $o{what} =~ /user/ ? qw|tp.uid u.username| : (), + $o{what} =~ /thread/ ? (qw|tp.tid t.title|, 't.hidden AS thread_hidden') : (), + ); + my @join = ( + $o{what} =~ /user/ ? 'JOIN users u ON u.id = tp.uid' : (), + $o{what} =~ /thread/ ? 'JOIN threads t ON t.id = tp.tid' : (), ); my($r, $np) = $self->dbPage(\%o, q| - SELECT tp.num, tp.date, tp.edited, tp.msg, tp.hidden, tp.uid, u.username + SELECT !s FROM threads_posts tp - JOIN users u ON u.id = tp.uid + !s !W - ORDER BY tp.num ASC|, - \%where, + ORDER BY !s|, + join(', ', @select), join(' ', @join), \%where, $o{order} ); return wantarray ? ($r, $np) : $r; diff --git a/lib/VNDB/Handler/Discussions.pm b/lib/VNDB/Handler/Discussions.pm index 45a2e24e..eff8212e 100644 --- a/lib/VNDB/Handler/Discussions.pm +++ b/lib/VNDB/Handler/Discussions.pm @@ -26,7 +26,7 @@ sub thread { my $t = $self->dbThreadGet(id => $tid, what => 'boardtitles')->[0]; return 404 if !$t->{id} || $t->{hidden} && !$self->authCan('boardmod'); - my $p = $self->dbPostGet(tid => $tid, results => 25, page => $page); + my $p = $self->dbPostGet(tid => $tid, results => 25, page => $page, what => 'user'); return 404 if !$p->[0]; $self->htmlHeader(title => $t->{title}); @@ -142,7 +142,7 @@ sub edit { my $t = $tid && $self->dbThreadGet(id => $tid, what => 'boards')->[0]; return 404 if $tid && !$t->{id}; - my $p = $num && $self->dbPostGet(tid => $tid, num => $num)->[0]; + my $p = $num && $self->dbPostGet(tid => $tid, num => $num, what => 'user')->[0]; return 404 if $num && !$p->{num}; # are we allowed to perform this action? diff --git a/lib/VNDB/Handler/Users.pm b/lib/VNDB/Handler/Users.pm index 895a6fbe..deaf19e1 100644 --- a/lib/VNDB/Handler/Users.pm +++ b/lib/VNDB/Handler/Users.pm @@ -16,6 +16,7 @@ YAWF::register( qr{u/newpass/sent} => \&newpass_sent, qr{u/register} => \®ister, qr{u([1-9]\d*)/edit} => \&edit, + qr{u([1-9]\d*)/posts} => \&posts, qr{u([1-9]\d*)/del(/[od])?} => \&delete, qr{u/(all|[0a-z])} => \&list, ); @@ -101,9 +102,14 @@ sub userpage { Tr ++$i % 2 ? (class => 'odd') : (); td 'Forum stats'; - td sprintf '%d post%s, %d new thread%s', + td; + txt sprintf '%d post%s, %d new thread%s. ', $u->{postcount}, $u->{postcount} != 1 ? 's' : '', $u->{threadcount}, $u->{threadcount} != 1 ? 's' : ''; + if($u->{postcount}) { + a href => "/u$uid/posts"; lit 'Browse posts »'; end; + } + end; end; end; end; @@ -380,6 +386,59 @@ sub edit { } +sub posts { + my($self, $uid) = @_; + + # fetch user info (cached if uid == loggedin uid) + my $u = $self->authInfo->{id} && $self->authInfo->{id} == $uid ? $self->authInfo : $self->dbUserGet(uid => $uid)->[0]; + return 404 if !$u->{id}; + + my $f = $self->formValidate( + { name => 'p', required => 0, default => 1, template => 'int' } + ); + + my($posts, $np) = $self->dbPostGet(uid => $uid, hide => 1, what => 'thread', page => $f->{p}, order => 'tp.date DESC'); + + $self->htmlHeader(title => "Posts made by $u->{username}"); + $self->htmlMainTabs(u => $u, 'posts'); + div class => 'mainbox'; + h1 "Posts made by $u->{username}"; + if(!@$posts) { + p "\u$u->{username} hasn't made any posts yet."; + } + end; + + $self->htmlBrowse( + items => $posts, + class => 'uposts', + options => $f, + nextpage => $np, + pageurl => "/u$uid/posts", + header => [ + [ '' ], + [ '' ], + [ 'Date' ], + sub { td; a href => '#', id => 'history_comments', 'expand'; txt 'Title'; end; } + ], + row => sub { + my($s, $n, $l) = @_; + Tr $n % 2 ? (class => 'odd') : (); + td class => 'tc1'; a href => "/t$l->{tid}.$l->{num}", 't'.$l->{tid}; end; + td class => 'tc2'; a href => "/t$l->{tid}.$l->{num}", '.'.$l->{num}; end; + td class => 'tc3', date $l->{date}; + td class => 'tc4'; a href => "/t$l->{tid}.$l->{num}", $l->{title}; end; + end; + Tr class => $n % 2 ? 'editsum odd hidden' : 'editsum hidden'; + td colspan => 4; + lit bb2html $l->{msg}, 150; + end; + end; + }, + ) if @$posts; + $self->htmlFooter; +} + + sub delete { my($self, $uid, $act) = @_; return $self->htmlDenied if !$self->authCan('usermod'); diff --git a/lib/VNDB/Util/CommonHTML.pm b/lib/VNDB/Util/CommonHTML.pm index 646c052a..a6aa1dd3 100644 --- a/lib/VNDB/Util/CommonHTML.pm +++ b/lib/VNDB/Util/CommonHTML.pm @@ -48,10 +48,16 @@ sub htmlMainTabs { li $sel eq 'list' ? (class => 'tabselected') : (); a href => "/$id/list", 'list'; end; + } + if($type eq 'u') { li $sel eq 'tags' ? (class => 'tabselected') : (); a href => "/$id/tags", 'tags'; end; + + li $sel eq 'posts' ? (class => 'tabselected') : (); + a href => "/$id/posts", 'posts'; + end; } if($type eq 'v' && $self->authCan('tag') && !$obj->{hidden}) { -- cgit v1.2.3