Merge branch 'lists_fixes' into 1.0.x

This commit is contained in:
Zach Copley 2011-04-15 20:50:04 +00:00
commit da6822c1f0
7 changed files with 132 additions and 68 deletions

View File

@ -189,7 +189,7 @@ class ApiListsAction extends ApiBareAuthAction
// there is no argument named count // there is no argument named count
$count = 20; $count = 20;
$profile = $this->user->getProfile(); $profile = $this->user->getProfile();
$fn = array($profile, 'getOwnedTags'); $fn = array($profile, 'getLists');
list($this->lists, list($this->lists,
$this->next_cursor, $this->next_cursor,

View File

@ -70,7 +70,7 @@ class PeopletagautocompleteAction extends Action
} }
$profile = $this->user->getProfile(); $profile = $this->user->getProfile();
$tags = $profile->getOwnedTags(common_current_user()); $tags = $profile->getLists(common_current_user());
$this->tags = array(); $this->tags = array();
while ($tags->fetch()) { while ($tags->fetch()) {
@ -88,7 +88,7 @@ class PeopletagautocompleteAction extends Action
$this->tags[] = $arr; $this->tags[] = $arr;
} }
$tags->free(); $tags = NULL;
return true; return true;
} }

View File

@ -114,7 +114,7 @@ class PeopletagsbyuserAction extends OwnerDesignAction
$user = common_current_user(); $user = common_current_user();
if ($this->arg('public')) { if ($this->arg('public')) {
$this->tags = $this->tagger->getOwnedTags(false, $offset, $limit); $this->tags = $this->tagger->getLists(false, $offset, $limit);
} else if ($this->arg('private')) { } else if ($this->arg('private')) {
if (empty($user)) { if (empty($user)) {
// TRANS: Error message displayed when trying to perform an action that requires a logged in user. // TRANS: Error message displayed when trying to perform an action that requires a logged in user.
@ -128,7 +128,7 @@ class PeopletagsbyuserAction extends OwnerDesignAction
$this->clientError(_('You cannot view others\' private lists'), 403); $this->clientError(_('You cannot view others\' private lists'), 403);
} }
} else { } else {
$this->tags = $this->tagger->getOwnedTags(common_current_user(), $offset, $limit); $this->tags = $this->tagger->getLists(common_current_user(), $offset, $limit);
} }
return true; return true;
} }

View File

@ -321,36 +321,66 @@ class Profile extends Memcached_DataObject
return false; return false;
} }
function getOwnedTags($auth_user, $offset=0, $limit=null, $since_id=0, $max_id=0) function getLists($auth_user, $offset=0, $limit=null, $since_id=0, $max_id=0)
{ {
$tags = new Profile_list(); $ids = array();
$tags->tagger = $this->id;
if (($auth_user instanceof User || $auth_user instanceof Profile) && $keypart = sprintf('profile:lists:%d', $this->id);
$auth_user->id === $this->id) {
// no condition, get both private and public tags $idstr = self::cacheGet($keypart);
if ($idstr !== false) {
$ids = explode(',', $idstr);
} else { } else {
$tags->private = false; $list = new Profile_list();
} $list->selectAdd();
$list->selectAdd('id');
$tags->selectAdd('id as "cursor"'); $list->tagger = $this->id;
$list->selectAdd('id as "cursor"');
if ($since_id>0) { if ($since_id>0) {
$tags->whereAdd('id > '.$since_id); $list->whereAdd('id > '.$since_id);
} }
if ($max_id>0) { if ($max_id>0) {
$tags->whereAdd('id <= '.$max_id); $list->whereAdd('id <= '.$max_id);
} }
if($offset>=0 && !is_null($limit)) { if($offset>=0 && !is_null($limit)) {
$tags->limit($offset, $limit); $list->limit($offset, $limit);
} }
$tags->orderBy('id DESC'); $list->orderBy('id DESC');
$tags->find();
return $tags; if ($list->find()) {
while ($list->fetch()) {
$ids[] = $list->id;
}
}
self::cacheSet($keypart, implode(',', $ids));
}
$showPrivate = (($auth_user instanceof User ||
$auth_user instanceof Profile) &&
$auth_user->id === $this->id);
$lists = array();
foreach ($ids as $id) {
$list = Profile_list::staticGet('id', $id);
if (!empty($list) &&
($showPrivate || !$list->private)) {
if (!isset($list->cursor)) {
$list->cursor = $list->id;
}
$lists[] = $list;
}
}
return new ArrayWrapper($lists);
} }
function getOtherTags($auth_user=null, $offset=0, $limit=null, $since_id=0, $max_id=0) function getOtherTags($auth_user=null, $offset=0, $limit=null, $since_id=0, $max_id=0)
@ -1323,42 +1353,4 @@ class Profile extends Memcached_DataObject
} }
return $profile; return $profile;
} }
function getLists()
{
$ids = array();
$keypart = sprintf('profile:lists:%d', $this->id);
$idstr = self::cacheGet($keypart);
if ($idstr !== false) {
$ids = explode(',', $idstr);
} else {
$list = new Profile_list();
$list->selectAdd();
$list->selectAdd('id');
$list->tagger = $this->id;
if ($list->find()) {
while ($list->fetch()) {
$ids[] = $list->id;
}
}
self::cacheSet($keypart, implode(',', $ids));
}
$lists = array();
foreach ($ids as $id) {
$list = Profile_list::staticGet('id', $id);
if (!empty($list) &&
($showPrivate || !$list->private)) {
$lists[] = $list;
}
}
return new ArrayWrapper($lists);
}
} }

73
doc-src/lists Normal file
View File

@ -0,0 +1,73 @@
<!-- Copyright 2008-2010 StatusNet Inc. and contributors. -->
<!-- Document licensed under Creative Commons Attribution 3.0 Unported. See -->
<!-- http://creativecommons.org/licenses/by/3.0/ for details. -->
%%site.name%% supports
[tags](http://en.wikipedia.org/wiki/Tag_(metadata)) to help you
organize your activities here. You can use tags for people and for
notices.
Tagging a notice
----------------
You can tag a notice using a *hashtag*; a # character followed by
letters and numbers as well as '.', '-', and '_'. Note that accented
latin characters are not supported, and non-roman scripts are right out.
The HTML for the notice will link to a stream of all the other notices
with that tag. This can be a great way to keep track of a conversation.
The most popular current tags on the site can be found in the [public
tag cloud](%%action.publictagcloud%%). Their size shows their
popularity and recency.
Tagging yourself
----------------
You can also add tags for yourself on your [profile
settings](%%action.profilesettings%%) page or by using the edit tags
button on your profile page. Use single words to
describe yourself, your experiences and your interest. The tags will
become links on your profile page to a list of all the users on the
site who use that same tag. It can be a nice way to find people who
are related to you geographically or who have a common interest.
Tagging others
--------------
You can also tag other users by using the edit tags button next to
their profile. Such tags are called *people tags*. Once you have
created a people tag, you can add or remove users from it using the
tag's edit form. This makes it easy to organize your subscriptions
into groups and sort through them separately. Also, it will let
you create custom lists of people that others can subscribe to.
You can also send a notice "to the attention of" your subscribers
whom you've marked with a particular tag (note: *not* people who've
marked themselves with that tag). "@#family hello" will send a
notice to all your subscribers you've marked with the tag 'family'.
Private and public people tags
------------------------------
A private people tag is only visible to the creator, it cannot be
subscribed to, but the timeline can be viewed. To create a new
private prepend a '.' to the tag in the tags editing box. To set
an existing public tag as private or vice-versa, go to the tag's
edit page.
The most used public tags are displayed in the
[public people tag cloud](%%action.publicpeopletagcloud%%). Their
size shows their frequency of use.
Remote people tags
------------------
You can even [tag remote users](%%action.profilesettings%%). Just
enter the remote profile's URI and click on the "Fetch" button to
fetch the profile, you can then add tags and save them.
Subscribing to the timeline of a people tag on another server also
works. Just copy the URL of the people tag's timeline page to the
[OStatus subscription](%%action.ostatussub%%) form.

View File

@ -51,7 +51,7 @@ class ListsNav extends Menu
$user = common_current_user(); $user = common_current_user();
$this->lists = $profile->getOwnedTags($user); $this->lists = $profile->getLists($user);
} }
function show() function show()

View File

@ -279,9 +279,8 @@ class ProfileAction extends OwnerDesignAction
function showLists() function showLists()
{ {
$cur = common_current_user(); $cur = common_current_user();
$showPrivate = (!empty($cur) && $cur->id == $this->profile->id);
$lists = $this->profile->getLists($showPrivate); $lists = $this->profile->getLists($cur);
if ($lists->N > 0) { if ($lists->N > 0) {
$this->elementStart('div', array('id' => 'entity_lists', $this->elementStart('div', array('id' => 'entity_lists',