Add a ?poster= argument which can be used in communities to pull up
entries per-user.
Patch from LiveJournal. Packaged for Dreamwidth by <user
name="sophie">.
X-Hg-Repo: dw-free
Subject: dw-free: http://bugs.dwscoalition.org/show_bug.cgi?id=1585
From: fu
changeset b5dd5b6b8dfe in /home/hg/repos/dw-free
details: http://hg.dwscoalition.org/dw-free?cmd=changeset;node=b5dd5b6b8dfe
description:
http://bugs.dwscoalition.org/show_bug.cgi?id=1585
?mode=all / ?mode=and (same thing) to supplement ?mode=or (default) for
tags.
Patch from LiveJournal, packaged for Dreamwidth by <user
name="kareila">.
diffs (159 lines):
diff -r 40b50d31b671 -r b5dd5b6b8dfe cgi-bin/DW/Logic/LogItems.pm
--- a/cgi-bin/DW/Logic/LogItems.pm Tue Nov 16 18:52:05 2010 +0800
+++ b/cgi-bin/DW/Logic/LogItems.pm Tue Nov 16 20:33:40 2010 +0800
@@ -345,6 +345,7 @@ sub watch_items
# -- viewall: if set, no security is used.
# -- dateformat: if "S2", uses S2's 'alldatepart' format.
# -- itemids: optional arrayref onto which itemids should be pushed
+# -- posterid: optional, return (community) posts made by this
poster only
# returns: array of hashrefs containing keys:
# -- itemid (the jitemid)
# -- posterid
@@ -440,13 +441,43 @@ sub recent_items
# if we need to get by tag, get an itemid list now
my $jitemidwhere = '';
- if (ref $args{tagids} eq 'ARRAY' && @{$args{tagids}}) {
- # select jitemids uniquely
- my $in = join(',', map { $_+0 } @{$args{tagids}});
- my $jitemids = $logdb->selectcol_arrayref(qq{
- SELECT DISTINCT jitemid FROM logtagsrecent WHERE journalid = ?
AND kwid IN ($in)
- }, undef, $userid);
- die $logdb->errstr if $logdb->err;
+ if ( ref $args{tagids} eq 'ARRAY' && @{ $args{tagids} } ) {
+
+ my $jitemids;
+
+ # $args{tagmode} = $args{getargs}->{mode} eq 'and' ? 'and' : 'or';
+
+ if ( $args{tagmode} eq 'and' ) {
+
+ my $limit = $LJ::TAG_INTERSECTION;
+ my $need = scalar @{ $args{tagids} };
+ $#{ $args{tagids} } = $limit - 1 if $need > $limit;
+
+ my $in = join( ',', map { $_+0 } @{ $args{tagids} } );
+ my $sth = $logdb->prepare( "SELECT jitemid, kwid FROM
logtagsrecent WHERE journalid = ? AND kwid IN ($in)" );
+ $sth->execute( $userid );
+ die $logdb->errstr if $logdb->err;
+
+ my %mix;
+ while ( my $row = $sth->fetchrow_arrayref ) {
+ my ( $jitemid ) = @$row;
+ $mix{$jitemid}++;
+ }
+
+ foreach my $jitemid ( keys %mix ) {
+ delete $mix{$jitemid} if $mix{$jitemid} < $need;
+ }
+
+ $jitemids = [ keys %mix ];
+
+ } else { # mode: 'or'
+ # select jitemids uniquely
+ my $in = join( ',', map { $_+0 } @{ $args{tagids} } );
+ $jitemids = $logdb->selectcol_arrayref( qq{
+ SELECT DISTINCT jitemid FROM logtagsrecent WHERE journalid
= ? AND kwid IN ($in)
+ }, undef, $userid );
+ die $logdb->errstr if $logdb->err;
+ }
# set $jitemidwhere iff we have jitemids
if (@$jitemids) {
@@ -506,13 +537,20 @@ sub recent_items
$sql_select = "AND $sort_key <= $notafter";
}
+ my $posterwhere;
+ if ( $args{posterid} && $args{posterid} =~ /^(\d+)$/ ) {
+ $posterwhere = " AND posterid=$1";
+ } else {
+ $posterwhere = "";
+ }
+
$sql = qq{
SELECT jitemid AS 'itemid', posterid, security, $extra_sql
DATE_FORMAT(eventtime, "$dateformat") AS 'alldatepart', anum,
DATE_FORMAT(logtime, "$dateformat") AS 'system_alldatepart',
allowmask, eventtime, logtime
FROM log2 USE INDEX ($sort_key)
- WHERE journalid=$userid $sql_select $secwhere $jitemidwhere
$securitywhere
+ WHERE journalid=$userid $sql_select $secwhere $jitemidwhere
$securitywhere $posterwhere
ORDER BY journalid, $sort_key
$sql_limit
};
diff -r 40b50d31b671 -r b5dd5b6b8dfe cgi-bin/LJ/S2/RecentPage.pm
--- a/cgi-bin/LJ/S2/RecentPage.pm Tue Nov 16 18:52:05 2010 +0800
+++ b/cgi-bin/LJ/S2/RecentPage.pm Tue Nov 16 20:33:40 2010 +0800
@@ -120,6 +120,11 @@ sub RecentPage
$remote->view_priv_check( $u, $get->{viewall}, 'lastn' );
}
+ my $posteru_filter;
+ if ( defined( $get->{poster} ) ) {
+ $posteru_filter = LJ::load_user( $get->{poster} );
+ }
+
## load the itemids
my @itemids;
my $err;
@@ -131,11 +136,13 @@ sub RecentPage
itemshow => $itemshow + 1,
skip => $skip,
tagids => $opts->{tagids},
+ tagmode => $opts->{tagmode},
security => $opts->{securityfilter},
itemids => \...@itemids,
dateformat => 'S2',
order => ( $u->is_community || $u->is_syndicated ) ? 'logtime'
: '',
err => \$err,
+ posterid => $posteru_filter ? $posteru_filter->id : undef,
);
my $is_prev_exist = scalar @items - $itemshow > 0 ? 1 : 0;
@@ -230,7 +237,8 @@ sub RecentPage
style => $mine
|| "",
s2id => LJ::eurl( $get->{s2id} )
|| "",
tag => LJ::eurl( $get->{tag} )
|| "",
- security => LJ::eurl( $get->{security} )
|| "" } );
+ security => LJ::eurl( $get->{security} )
|| "",
+ poster => $posteru_filter ?
$posteru_filter->user : "" } );
$nav->{'forward_count'} = $itemshow;
$p->{head_content} .= qq{<link rel="next" href="$nav->{forward_url}"
/>\n}
}
@@ -251,7 +259,8 @@ sub RecentPage
style => $mine
|| "",
s2id => LJ::eurl( $get->{s2id} )
|| "",
tag => LJ::eurl( $get->{tag} )
|| "",
- security => LJ::eurl( $get->{security}
) || "" } );
+ security => LJ::eurl( $get->{security}
) || "",
+ poster => $posteru_filter ?
$posteru_filter->user : "" } );
$nav->{'backward_skip'} = $newskip;
}
$p->{head_content} .= qq{<link rel="prev" href="$nav->{backward_url}"
/>\n};
diff -r 40b50d31b671 -r b5dd5b6b8dfe cgi-bin/LJ/User.pm
--- a/cgi-bin/LJ/User.pm Tue Nov 16 18:52:05 2010 +0800
+++ b/cgi-bin/LJ/User.pm Tue Nov 16 20:33:40 2010 +0800
@@ -9303,6 +9303,11 @@ sub make_journal {
unless $kwref{$_};
push @{$opts->{tagids}}, $kwref{$_};
}
+
+ my $tagmode = $opts->{getargs}->{mode} || '';
+ $opts->{tagmode} = $tagmode eq 'and' ? 'and' : 'or';
+ # also allow mode=all (equivalent to 'and')
+ $opts->{tagmode} = 'and' if $tagmode eq 'all';
}
# validate the security filter
diff -r 40b50d31b671 -r b5dd5b6b8dfe cgi-bin/ljfeed.pl
--- a/cgi-bin/ljfeed.pl Tue Nov 16 18:52:05 2010 +0800
+++ b/cgi-bin/ljfeed.pl Tue Nov 16 20:33:40 2010 +0800
@@ -117,6 +117,7 @@ sub make_feed
itemshow => 25,
order => 'logtime',
tagids => $opts->{tagids},
+ tagmode => $opts->{tagmode},
itemids => \...@itemids,
friendsview => 1, # this returns rlogtimes
dateformat => 'S2', # S2 format time format is easier
_______________________________________________
dw-changelog mailing list
[email protected]
http://lists.dwscoalition.org/mailman/listinfo/dw-changelog