fu: Close-up of Fu, bringing a scoop of water to her mouth (Default)
fu ([personal profile] fu) wrote in [site community profile] changelog2011-03-01 07:18 am

[dw-free] separate interest search results for communities vs. users

[commit: http://hg.dwscoalition.org/dw-free/rev/684da270b0c6]

http://bugs.dwscoalition.org/show_bug.cgi?id=1200

Merge the results for communities and users, add ability to filter by
account type (communities only, personal journals only, openid journals
only)

Patch by [personal profile] kareila.

Files modified:
  • bin/upgrading/en.dat
  • cgi-bin/DW/Controller/Search/Interests.pm
  • views/interests/int.tt
  • views/interests/int.tt.text
--------------------------------------------------------------------------------
diff -r 0c3f9b7f8c34 -r 684da270b0c6 bin/upgrading/en.dat
--- a/bin/upgrading/en.dat	Tue Mar 01 14:45:13 2011 +0800
+++ b/bin/upgrading/en.dat	Tue Mar 01 15:18:23 2011 +0800
@@ -2558,7 +2558,11 @@ s2theme.themename.default=(Unnamed - [[t
 
 s2theme.themename.notheme=(Layout Default)
 
+search.user.commdesc=Community Description:
+
 search.user.journal=Journal:
+
+search.user.journaltitle=Journal Title:
 
 search.user.name=Name:
 
diff -r 0c3f9b7f8c34 -r 684da270b0c6 cgi-bin/DW/Controller/Search/Interests.pm
--- a/cgi-bin/DW/Controller/Search/Interests.pm	Tue Mar 01 14:45:13 2011 +0800
+++ b/cgi-bin/DW/Controller/Search/Interests.pm	Tue Mar 01 15:18:23 2011 +0800
@@ -303,49 +303,81 @@ sub interest_handler {
             # can't trust LJ::load_userids to maintain sort order
         };
 
+        # filtering by account type
+        $rv->{type_list} = [ 'none', 'P', 'C', 'I' ];
+
+        my $type = $args->{type};
+        $type = 'none' unless $type && $type =~ /^[PCI]$/;
+        my $typefilter = sub { return $type eq 'none' ? 1 :
+                               $_[0]->journaltype eq $type };
+
+        # get top 500 user and/or community results
+        my $us = {};
+
+        unless ( $type eq 'C' ) {  # unless no users needed
+            $us = $int_query->( "userinterests" );
+            $rv->{comm_count} = 1;  # reset later if comms loaded
+        }
+
+        unless ( $type =~ /^[PI]$/ ) {  # unless no comms needed
+            my $cus = $int_query->( "comminterests" );
+            $rv->{comm_count} = scalar values %$cus;
+
+            # combine the two sets of results
+            @{ $us }{ keys %$cus } = values %$cus;
+        }
+
         my $should_show = sub {
             return $_[0]->should_show_in_search_results( for => $remote );
         };
 
-        # community results
-        if ( LJ::is_enabled( 'interests-community' ) ) {
-            my $us = $int_query->( "comminterests" );
-            my $updated = LJ::get_timeupdate_multi( keys %$us );
-            my $def_upd = sub { $updated->{$_[0]->userid} || 0 };
-            # let undefined values be zero for sorting purposes
-            my @cl = sort { $def_upd->($b) <=> $def_upd->($a) || $a->user cmp $b->user }
-                     grep { $_ && $should_show->( $_ ) } values %$us;
-            $rv->{int_comms} = { count => scalar @cl, data => [] };
-            foreach ( @cl ) {
-                my $updated = $updated->{$_->id}
-                            ? LJ::diff_ago_text( $updated->{$_->id} )
+        my $updated = LJ::get_timeupdate_multi( keys %$us );
+        my $def_upd = sub { $updated->{$_[0]->userid} || 0 };
+        # let undefined values be zero for sorting purposes
+
+        my @ul = sort { $def_upd->($b) <=> $def_upd->($a) || $a->user cmp $b->user }
+                 grep { $_ && $typefilter->( $_ ) && $should_show->( $_ ) }
+                 values %$us;
+        $rv->{type_count} = scalar @ul if $intcount != scalar @ul;
+
+        # construct filter links
+        $rv->{type_link} = sub {
+            return '' if $type eq $_[0];  # no link for active selection
+            my $typearg = $_[0] eq 'none' ? '' : $_[0];
+            return LJ::page_change_getargs( type => $typearg );
+        };
+
+        if ( @ul ) {
+            # pagination
+            my $curpage = $args->{page} || 1;
+            my %items = LJ::paging( \@ul, $curpage, 30 );
+            my @data;
+
+            # subset of users to display on this page
+            foreach my $u ( @{ $items{items} } ) {
+                my $desc = LJ::ehtml( $u->prop( 'journaltitle' ) );
+                my $label = LJ::Lang::ml( 'search.user.journaltitle' );
+
+                # community promo desc overrides journal title
+                if ( $u->is_comm && LJ::is_enabled( 'community_themes' ) &&
+                        ( my $prop_theme = $u->prop( "comm_theme" ) ) ) {
+                    $label = LJ::Lang::ml( 'search.user.commdesc' );
+                    $desc = LJ::ehtml( $prop_theme );
+                }
+
+                my $userpic = $u->userpic;
+                $userpic = $userpic ? $userpic->imgtag_lite : '';
+
+                my $updated = $updated->{$u->id}
+                            ? LJ::diff_ago_text( $updated->{$u->id} )
                             : undef;
-                my $prop_theme = $_->prop("comm_theme");
-                my $theme = LJ::is_enabled('community_themes') && $prop_theme
-                          ? LJ::ehtml( $prop_theme )
-                          : undef;
-                push @{ $rv->{int_comms}->{data} },
-                      { u => $_, updated => $updated, theme => $theme };
+                push @data, { u => $u, updated => $updated, icon => $userpic,
+                              desc => $desc, desclabel => $label };
             }
+
+            $rv->{navbar} = LJ::paging_bar( $items{page}, $items{pages} );
+            $rv->{data} = \@data;
         }
-
-        # user results
-        my $us = $int_query->( "userinterests" );
-        my @ul = grep { $_
-                        && ! $_->is_community            # not communities
-                        && $should_show->( $_ )          # and should show to the remote user
-                      } values %$us;
-        my $navbar;
-        my $results =
-            LJ::user_search_display( users      => \@ul,
-                                     timesort   => 1,
-                                     perpage    => 50,
-                                     curpage    => exists $args->{page} ?
-                                                   $args->{page} : 1,
-                                     navbar     => \$navbar );
-
-        $rv->{int_users} = { count => scalar( @ul ), navbar => $navbar,
-                             results => $results };
 
         # check to see if the remote user already has the interest
         $rv->{not_interested} = ! $remote->interests->{$interest}
diff -r 0c3f9b7f8c34 -r 684da270b0c6 views/interests/int.tt
--- a/views/interests/int.tt	Tue Mar 01 14:45:13 2011 +0800
+++ b/views/interests/int.tt	Tue Mar 01 15:18:23 2011 +0800
@@ -14,7 +14,13 @@
 [%- sections.head = BLOCK %]
 <style type='text/css'>
     div.tagcloud a { text-decoration: none; }
-    ul.contentlist li { padding-bottom: 3px; }
+    ul.contentlist { list-style-type: none; }
+    ul.contentlist li { padding-bottom: 1em; font-size: 125%; clear: both; }
+    ul.contentlist .userpic-img { border: 1px solid #000; }
+    .imgpos { float: left; width: 100px; min-height: 4em; text-align: right;
+              margin: 0 .5em .5em 0; }
+    .navbar { text-align: center; clear: both; }
+    .typefilter { font-weight: bold; font-size: 125%; margin: 1em 0; }
 </style>
 [% END -%]
 
@@ -37,44 +43,62 @@
 <input type="text" name="fromuser" size="20" />&nbsp;
 <input type='submit' value='[% "interests.enmasse.btn" | ml %]' />
 </form></td></tr></table>
+<h1>[% ".header" | ml(interest = e_int) %]</h1>
+<div class='typefilter'>[% '.filterlink.label' | ml %]&nbsp;
+[%- FOREACH type = type_list -%]
+    [%- link = type_link(type) -%]
+    [%- IF type != 'none' ; '&nbsp;|&nbsp;' ; END -%]
+    [%- IF link %]<a href="[% link | html %]">[% END -%]
+    [%- ".filterlink.$type" | ml -%]
+    [%- IF link ; '</a>' ; END -%]
+[%- END -%]
+</div>
 [%- IF intcount -%]
-    [%- IF int_comms.count -%]
-        <h1>[% ".communities.header" | ml(interest = e_int) %]</h1>
-        <p class='matches'><b>[% '.matches2' | ml(num = int_comms.count) %]</b>
-        <ul class='contentlist'>
-        [%- FOREACH int_comms.data -%]
-            <li class='commname'>[% u.ljuser_display %] - [% u.name_html %]
-            <small class='lastupdated'>(
-                [%- IF updated; '.lastupdated.true' | ml(time = updated) -%]
-                [%- ELSE; '.lastupdated.false' | ml; END -%]
-            )</small>
-            [%- IF theme -%]
-                <br />&nbsp;&nbsp;&nbsp;<em>[% theme %]</em>
-            [%- END -%]
-            </li>
-        [%- END -%]
-        </ul></p>
-    [%- ELSE -%]
-        <h1>[% '.nocomms.header' | ml %]</h1><p>
-        [%- '.nocomms.text' | ml(aopts = "href='$site.root/community/create'",
-                                int = interest) %]</p>
-    [%- END -%]
-    <h1>[% ".users.header" | ml(interest = e_int) %]</h1>
     <p class='interestinfo'>
     [%- IF not_interested -%]
         [%- '.addint2' | ml(aopts = "href='$site.root/interests?mode=add&amp;intid=$intid'") -%]
     [%- END -%]
     [% '.morestuff2' | ml(aopts = "href='$site.root/interests'") %]</p>
-    <p class='matches'><b>[% '.matches2' | ml(num = int_users.count) %]</b></p>
-    <div style='text-align: center'>[% int_users.navbar %]</div><br />
-    [% int_users.results %]
-    <div style='text-align: center; clear: both'>[% int_users.navbar %]</div><br />
+    [%- UNLESS comm_count -%]
+        <p class='interestinfo'>
+        [%- '.nocomms' | ml(aopts = "href='$site.root/community/create'",
+                            int = e_int) %]</p>
+    [%- END -%]
+    <p class='matches'><b>
+    [%- IF type_count -%]
+        [% '.filtered' | ml(num = intcount, count = type_count) %]</p>
+    [%- ELSE -%]
+        [% '.matches2' | ml(num = intcount) %]
+    [%- END -%]
+    </b></p>
+    [%- IF data -%]
+        <div class='navbar'>[% navbar %]</div><br />
+
+        <ul class='contentlist'>
+        [%- FOREACH data -%]
+            <li><span class="imgpos">
+            <a href='[% u.allpics_base %]'>[% icon %]</a></span>
+            [% u.ljuser_display %] - [% u.name_html %]
+            [%- IF desc -%]
+                <br />&nbsp;&nbsp;&nbsp;<i>[% desclabel %]</i> [% desc %]
+            [%- END -%]
+            <br />&nbsp;&nbsp;&nbsp;<small class='lastupdated'>(
+                [%- IF updated; '.lastupdated.true' | ml(time = updated) -%]
+                [%- ELSE; '.lastupdated.false' | ml; END -%]
+            )</small></li>
+        [%- END -%]
+        </ul>
+
+        <div class='navbar'>[% navbar %]</div>
+    [%- ELSE -%]
+        <p>[% '.nomatch' | ml(link = type_link('none')) %]</p>
+    [%- END -%]
 [%- ELSE -%]
-    <h1>[% '.nocomms.header' | ml %]</h1><p>
-    [%- '.nocomms.text' | ml(aopts = "href='$site.root/community/create'",
-                            int = e_int) %]</p>
-    <h1>[% '.nousers.header' | ml %]</h1><p>
-    [%- '.nousers.text2' | ml(int = e_int,
+    <p class='interestinfo'>
+    [%- '.nocomms' | ml(aopts = "href='$site.root/community/create'",
+                        int = e_int) %]</p>
+    <p class='interestinfo'>
+    [%- '.nousers' | ml(int = e_int,
         aopts_add = "href='$site.root/interests?mode=addnew&amp;keyword=$e_int'",
         aopts_int = "href='$site.root/interests'") %]</p>
 [%- END -%]
diff -r 0c3f9b7f8c34 -r 684da270b0c6 views/interests/int.tt.text
--- a/views/interests/int.tt.text	Tue Mar 01 14:45:13 2011 +0800
+++ b/views/interests/int.tt.text	Tue Mar 01 15:18:23 2011 +0800
@@ -1,7 +1,19 @@
 ;; -*- coding: utf-8 -*-
 .addint2=If you're also interested in this, would you like to be <a [[aopts]]>added to this list</a>?
 
-.communities.header=Results for communities listing an interest in "[[interest]]"
+.filtered=[[num]] [[?num|match|matches]], showing [[count]] [[?count|result|results]]:
+
+.filterlink.C=Communities Only
+
+.filterlink.I=OpenIDs Only
+
+.filterlink.label=Show:
+
+.filterlink.none=All Account Types
+
+.filterlink.P=Users Only
+
+.header=Search results for "[[interest]]"
 
 .lastupdated.false=Never updated
 
@@ -11,14 +23,10 @@
 
 .morestuff2=You can find more fun stuff on the <a [[aopts]]>interests page</a>.
 
-.nocomms.header=Relevant communities
+.nocomms=There are no communities interested in "<b>[[int]]</b>." You can <a [[aopts]]>create one</a>!
 
-.nocomms.text=There are no communities interested in "<b>[[int]]</b>." You can <a [[aopts]]>create one</a>!
+.nomatch=No matching users for the specified account type. <a href="[[link]]">View all accounts with this interest.</a>
 
-.nousers.header=Interested users
-
-.nousers.text2=There are no users interested in "<b>[[int]]</b>". If you are interested in this, <a [[aopts_add]]>click here to add the interest to your profile</a>. More fun stuff can be found on the <a [[aopts_int]]>interests page</a>.
+.nousers=There are no users interested in "<b>[[int]]</b>". If you are interested in this, <a [[aopts_add]]>click here to add the interest to your profile</a>. More fun stuff can be found on the <a [[aopts_int]]>interests page</a>.
 
 .title=Interests
-
-.users.header=Results for people interested in "[[interest]]"
--------------------------------------------------------------------------------

Post a comment in response:

This account has disabled anonymous posting.
If you don't have an account you can create one now.
No Subject Icon Selected
More info about formatting

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org