Commit e75c9988 authored by Zach Copley's avatar Zach Copley

Merge branch 'people_tags_rebase' into 1.0.x

Conflicts:
	EVENTS.txt
parents 396005ec fc21e5c7
......@@ -1116,6 +1116,156 @@ EndGroupProfileElements: Start showing stuff about the group on its profile page
- $action: action being executed (for output and params)
- $group: group for the page
StartShowProfileTagContent: When showing a people tag page
- $action: action being executed (for output and params)
EndShowProfileTagContent: After showing the contents of a people tag page
- $action: action being executed (for output and params)
StartShowTaggedProfilesMiniList: at the start of mini list of tagged profiles
- $action: action being executed (for output and params)
EndShowTaggedProfilesMiniList: at the end of mini list of tagged profiles
- $action: action being executed (for output and params)
StartShowProfileTagSubscribersMiniList: at the start of mini list of people tag subscribers
- $action: action being executed (for output and params)
EndShowProfileTagSubscribersMiniList: at the end of mini list of people tag subscribers
- $action: action being executed (for output and params)
StartTagProfileAction: When starting to show profile tagging page
- $action: action being executed (for output and params)
- $profile: profile being tagged
EndTagProfileAction: After showing profile tagging page
- $action: action being executed (for output and params)
- $profile: profile being tagged
StartProfileCompletionSearch: When starting a profile search for autocompletion
- $action: action being executed (for output and params)
- &$profile: result Profile objects
- $search_engine: the search engine
EndProfileCompletionSearch: After search results for profile autocompletion have been found
- $action: profilec completion action
- &$profile: current result Profile objects
- $search_engine: The search engine object
StartShowTagProfileForm: When showing people tagging form
- $action: action being executed (for output and params)
- $profile: profile being tagged
EndShowTagProfileForm: After showing people tagging form
- $action: action being executed (for output and params)
- $profile: profile being tagged
StartSavePeopletags: When starting to save people tags
- $action: action being executed (for output and params)
- $tagstring: string input, a list of tags
EndSavePeopletags: After saving people tags
- $action: action being executed (for output and params)
- $tagstring: string input, a list of tags
StartProfiletagGetUri: when generating the Uri for a people tag
- $profile_list: the people tag, a Profile_list object
- &$uri: the URI
EndProfiletagGetUri: after generating the uri for a people tag
- $profile_list: the people tag, a Profile_list object
- &$uri: the URI
StartUserPeopletagHomeUrl: when generating the homepage url for a people tag
- $profile_list: the people tag, a Profile_list object
- &$url: the URL
EndUserPeopletagHomeUrl: after generating the homepage url for a people tag
- $profile_list: the people tag, a Profile_list object
- &$url: the URL
StartProfiletagPermalink: when generating the permalink url for a people tag
- $profile_list: the people tag, a Profile_list object
- &$url: the URL
EndProfiletagPermalink: after generating the permalink url for a people tag
- $profile_list: the people tag, a Profile_list object
- &$url: the URL
StartTagProfile: when tagging a profile
- $tagger: profile tagging
- $tagged: profile being tagged
- $tag: the tag
EndTagProfile: after tagging a profile
- $newtag: the newly created Profile_tag object
StartUntagProfile: when deleting a people tag
- $ptag: the Profile_tag object being deleted
EndUntagProfile: after deleting a people tag
- $orig: a copy of the deleted Profile_tag object
StartSubscribePeopletag: when subscribing to a people tag
- $peopletag: Profile_list object being subscribed to
- $profile: subscriber's profile
EndSubscribePeopletag: after subscribing to a people tag
- $profile_list: the people tag, a Profile_list object: Profile_list object being subscribed to
- $profile: subscriber's profile
StartUnsubscribePeopletag: when unsubscribing to a people tag
- $profile_list: the people tag, a Profile_list object: Profile_list object being subscribed to
- $profile: subscriber's profile
EndUnsubscribePeopletag: after unsubscribing to a people tag
- $peopletag: Profile_list object being subscribed to
- $profile: subscriber's profile
StartActivityObjectFromPeopletag: while starting to create an ActivityObject from a people tag
- $profile_list: the people tag, a Profile_list object
- &$object: activity object
EndActivityObjectFromPeopletag: after making an ActivityObject from a people tag
- $profile_list: the people tag, a Profile_list object
- &$object: activity object
StartPeopletagGroupNav: Showing the people tag nav menu
- $menu: the menu widget; use $menu->action for output
EndPeopletagGroupNav: after showing the people tag nav menu
- $menu: the menu widget; use $menu->action for output
StartShowPeopletagItem: when showing a people tag
- $widget: PeopletagListItem widget
EndShowPeopletagItem: after showing a people tag
- $widget: PeopletagListItem widget
StartSubscribePeopletagForm: when showing people tag subscription form
- $action: action being executed (for output and params)
- $peopletag: people tag being subscribed to
EndSubscribePeopletagForm: after showing the people tag subscription form
- $action: action being executed (for output and params)
- $peopletag: people tag being subscribed to
StartShowPeopletags: when showing a textual list of people tags
- $widget: PeopletagsWidget; use $widget->out for output
- $tagger: profile of the tagger
- $tagged: profile tagged
EndShowPeopletags: after showing a textual list of people tags
- $widget: PeopletagsWidget; use $widget->out for output
- $tagger: profile of the tagger
- $tagged: profile tagged
StartProfileListItemTags: when showing people tags in a profile list item widget
- $widget: ProfileListItem widget
EndProfileListItemTags: after showing people tags in a profile list item widget
- $widget: ProfileListItem widget
StartActivityObjectOutputAtom: Called at start of Atom XML output generation for ActivityObject chunks, just inside the <activity:object>. Cancel the event to take over its output completely (you're responsible for calling the matching End event if so)
- $obj: ActivityObject
- $out: XMLOutputter to append custom output
......@@ -1160,7 +1310,7 @@ StartShowGroupProfileBlock: When showing the profile block for a group
- $out: XMLOutputter to append custom output
- $profile: the profile being shown
EndShowGroupProfileBlock: After showing showing the profile block for a group
EndShowGroupProfileBlock: After showing the profile block for a group
- $out: XMLOutputter to append custom output
- $group: the group being shown
......@@ -1183,3 +1333,4 @@ EndShowThreadedNoticeSub: when showing a reply to a notice
- $nli: parent noticelistitem
- $parent: parent notice
- $child: child notice
<?php
/**
* StatusNet - the distributed open-source microblogging tool
* Copyright (C) 2008-2010, StatusNet, Inc.
*
* Action to add a people tag to a user.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* PHP version 5
*
* @category Action
* @package StatusNet
* @author Shashi Gowda <connect2shashi@gmail.com>
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
* @link http://status.net/
*/
if (!defined('STATUSNET')) {
exit(1);
}
require_once INSTALLDIR . '/lib/togglepeopletag.php';
/**
*
* Action to tag a profile with a single tag.
*
* Takes parameters:
*
* - tagged: the ID of the profile being tagged
* - token: session token to prevent CSRF attacks
* - ajax: boolean; whether to return Ajax or full-browser results
* - peopletag_id: the ID of the tag being used
*
* Only works if the current user is logged in.
*
* @category Action
* @package StatusNet
* @author Shashi Gowda <connect2shashi@gmail.com>
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
* @link http://status.net/
*/
class AddpeopletagAction extends Action
{
var $user;
var $tagged;
var $peopletag;
/**
* Check pre-requisites and instantiate attributes
*
* @param Array $args array of arguments (URL, GET, POST)
*
* @return boolean success flag
*/
function prepare($args)
{
parent::prepare($args);
// CSRF protection
$token = $this->trimmed('token');
if (!$token || $token != common_session_token()) {
$this->clientError(_('There was a problem with your session token.'.
' Try again, please.'));
return false;
}
// Only for logged-in users
$this->user = common_current_user();
if (empty($this->user)) {
$this->clientError(_('Not logged in.'));
return false;
}
// Profile to subscribe to
$tagged_id = $this->arg('tagged');
$this->tagged = Profile::staticGet('id', $tagged_id);
if (empty($this->tagged)) {
$this->clientError(_('No such profile.'));
return false;
}
$id = $this->arg('peopletag_id');
$this->peopletag = Profile_list::staticGet('id', $id);
if (empty($this->peopletag)) {
$this->clientError(_('No such peopletag.'));
return false;
}
// OMB 0.1 doesn't have a mechanism for local-server-
// originated tag.
$omb01 = Remote_profile::staticGet('id', $tagged_id);
if (!empty($omb01)) {
$this->clientError(_('You cannot tag an OMB 0.1'.
' remote profile with this action.'));
return false;
}
return true;
}
/**
* Handle request
*
* Does the tagging and returns results.
*
* @param Array $args unused.
*
* @return void
*/
function handle($args)
{
// Throws exception on error
$ptag = Profile_tag::setTag($this->user->id, $this->tagged->id,
$this->peopletag->tag);
if (!$ptag) {
$user = User::staticGet('id', $id);
if ($user) {
$this->clientError(
sprintf(_('There was an unexpected error while tagging %s'),
$user->nickname));
} else {
$this->clientError(sprintf(_('There was a problem tagging %s.' .
'The remote server is probably not responding correctly, ' .
'please try retrying later.'), $this->profile->profileurl));
}
return false;
}
if ($this->boolean('ajax')) {
$this->startHTML('text/xml;charset=utf-8');
$this->elementStart('head');
$this->element('title', null, _('Subscribed'));
$this->elementEnd('head');
$this->elementStart('body');
$unsubscribe = new UntagButton($this, $this->tagged, $this->peopletag);
$unsubscribe->show();
$this->elementEnd('body');
$this->elementEnd('html');
} else {
$url = common_local_url('subscriptions',
array('nickname' => $this->user->nickname));
common_redirect($url, 303);
}
}
}
<?php
/**
* StatusNet, the distributed open-source microblogging tool
*
* Show, update or delete a list.
*
* PHP version 5
*
* LICENCE: This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* @category API
* @package StatusNet
* @author Shashi Gowda <connect2shashi@gmail.com>
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/
*/
if (!defined('STATUSNET')) {
exit(1);
}
require_once INSTALLDIR . '/lib/apibareauth.php';
class ApiListAction extends ApiBareAuthAction
{
/**
* The list in question in the current request
*/
var $list = null;
/**
* Is this an update request?
*/
var $update = false;
/**
* Is this a delete request?
*/
var $delete = false;
/**
* Set the flags for handling the request. Show list if this is a GET
* request, update it if it is POST, delete list if method is DELETE
* or if method is POST and an argument _method is set to DELETE. Act
* like we don't know if the current user has no access to the list.
*
* Takes parameters:
* - user: the user id or nickname
* - id: the id of the tag or the tag itself
*
* @return boolean success flag
*/
function prepare($args)
{
parent::prepare($args);
$this->delete = ($_SERVER['REQUEST_METHOD'] == 'DELETE' ||
($this->trimmed('_method') == 'DELETE' &&
$_SERVER['REQUEST_METHOD'] == 'POST'));
// update list if method is POST or PUT and $this->delete is not true
$this->update = (!$this->delete &&
in_array($_SERVER['REQUEST_METHOD'], array('POST', 'PUT')));
$this->user = $this->getTargetUser($this->arg('user'));
$this->list = $this->getTargetList($this->arg('user'), $this->arg('id'));
if (empty($this->list)) {
$this->clientError(_('Not found'), 404, $this->format);
return false;
}
return true;
}
/**
* Handle the request
*
* @return boolean success flag
*/
function handle($args)
{
parent::handle($args);
if($this->delete) {
$this->handleDelete();
return true;
}
if($this->update) {
$this->handlePut();
return true;
}
switch($this->format) {
case 'xml':
$this->showSingleXmlList($this->list);
break;
case 'json':
$this->showSingleJsonList($this->list);
break;
default:
$this->clientError(
_('API method not found.'),
404,
$this->format
);
break;
}
}
/**
* require authentication if it is a write action or user is ambiguous
*
*/
function requiresAuth()
{
return parent::requiresAuth() ||
$this->create || $this->delete;
}
/**
* Update a list
*
* @return boolean success
*/
function handlePut()
{
if($this->auth_user->id != $this->list->tagger) {
$this->clientError(
_('You can not update lists that don\'t belong to you.'),
401,
$this->format
);
}
$new_list = clone($this->list);
$new_list->tag = common_canonical_tag($this->arg('name'));
$new_list->description = common_canonical_tag($this->arg('description'));
$new_list->private = ($this->arg('mode') === 'private') ? true : false;
$result = $new_list->update($this->list);
if(!$result) {
$this->clientError(
_('An error occured.'),
503,
$this->format
);
}
switch($this->format) {
case 'xml':
$this->showSingleXmlList($new_list);
break;
case 'json':
$this->showSingleJsonList($new_list);
break;
default:
$this->clientError(
_('API method not found.'),
404,
$this->format
);
break;
}
}
/**
* Delete a list
*
* @return boolean success
*/
function handleDelete()
{
if($this->auth_user->id != $this->list->tagger) {
$this->clientError(
_('You can not delete lists that don\'t belong to you.'),
401,
$this->format
);
}
$record = clone($this->list);
$this->list->delete();
switch($this->format) {
case 'xml':
$this->showSingleXmlList($record);
break;
case 'json':
$this->showSingleJsonList($record);
break;
default:
$this->clientError(
_('API method not found.'),
404,
$this->format
);
break;
}
}
/**
* Indicate that this resource is not read-only.
*
* @return boolean is_read-only=false
*/
function isReadOnly($args)
{
return false;
}
/**
* When was the list (people tag) last updated?
*
* @return String time_last_modified
*/
function lastModified()
{
if(!empty($this->list)) {
return strtotime($this->list->modified);
}
return null;
}
/**
* An entity tag for this list
*
* Returns an Etag based on the action name, language, user ID and
* timestamps of the first and last list the user has joined
*
* @return string etag
*/
function etag()
{
if (!empty($this->list)) {
return '"' . implode(
':',
array($this->arg('action'),
common_language(),
$this->user->id,
strtotime($this->list->created),
strtotime($this->list->modified))
)
. '"';
}
return null;
}
}
<?php
/**
* StatusNet, the distributed open-source microblogging tool
*
* API method to check if a user belongs to a list.
*
* PHP version 5
*
* LICENCE: This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* @category API
* @package StatusNet
* @author Shashi Gowda <connect2shashi@gmail.com>
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/
*/
if (!defined('STATUSNET')) {
exit(1);
}
require_once INSTALLDIR . '/lib/apibareauth.php';
/**
* Action handler for Twitter list_memeber methods
*
* @category API
* @package StatusNet
* @author Shashi Gowda <connect2shashi@gmail.com>
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/
* @see ApiBareAuthAction
*/
class ApiListMemberAction extends ApiBareAuthAction
{
/**
* Set the flags for handling the request. Show the profile if this
* is a GET request AND the profile is a member of the list, add a member
* if it is a POST, remove the profile from the list if method is DELETE
* or if method is POST and an argument _method is set to DELETE. Act
* like we don't know if the current user has no access to the list.
*
* Takes parameters:
* - user: the user id or nickname
* - list_id: the id of the tag or the tag itself
* - id: the id of the member being looked for/added/removed
*
* @return boolean success flag
*/
function prepare($args)
{
parent::prepare($args);
$this->user = $this->getTargetUser($this->arg('id'));
$this->list = $this->getTargetList($this->arg('user'), $this->arg('list_id'));
if (empty($this->list)) {
$this->clientError(_('Not found'), 404, $this->format);
return false;
}
if (empty($this->user)) {
$this->clientError(_('No such user'), 404, $this->format);
return false;
}
return true;
}
/**
* Handle the request
*
* @return boolean success flag
*/
function handle($args)
{
parent::handle($args);
$arr = array('tagger' => $this->list->tagger,
'tag' => $this->list->tag,
'tagged' => $this->user->id);
$ptag = Profile_tag::pkeyGet($arr);
if(empty($ptag)) {
$this->clientError(
_('The specified user is not a member of this list'),
400,
$this->format